Operadores lógicos OData no Pesquisa de IA do Azure  – and, or, not

Expressões de filtro OData no Pesquisa de IA do Azure  são expressões boolianas avaliadas como true ou false. Você pode escrever um filtro complexo escrevendo uma série de filtros mais simples e compondo-os usando os operadores lógicos da álgebra booliana:

  • and: um operador binário que será avaliado como true se as subexpressões esquerda e direita forem avaliadas como true.
  • or: um operador binário que será avaliado como true se uma das subexpressões esquerda ou direita for avaliada como true.
  • not: um operador unário que será avaliado como true se a subexpressão for avaliada como false e vice-versa.

Em conjunto com os operadores de coleção any e all, eles permitem que você construa filtros que podem expressar critérios de pesquisa muito complexos.

Sintaxe

A EBNF (forma estendida de Backus-Naur) a seguir define a gramática de uma expressão OData que usa operadores lógicos.

logical_expression ::=
    boolean_expression ('and' | 'or') boolean_expression
    | 'not' boolean_expression

Um diagrama de sintaxe interativa também está disponível:

Observação

Confira Referência de sintaxe de expressão OData para Pesquisa de IA do Azure  para ver a EBNF completa.

Há duas formas de expressões lógicas: binária (and/or), em que há duas subexpressões, e unária (not), em que há apenas uma. As subexpressões podem ser expressões boolianas de qualquer tipo:

  • Campos ou variáveis de intervalo do tipo Edm.Boolean
  • Funções que retornam valores do tipo Edm.Boolean, como geo.intersects ou search.ismatch
  • Expressões de comparação, como rating gt 4
  • Expressões de coleção, como Rooms/any(room: room/Type eq 'Deluxe Room')
  • Os literais boolianos true ou false.
  • Outras expressões lógicas construídas usando and, or e not.

Importante

Há algumas situações em que nem todos os tipos de subexpressão podem ser usados com and/or, especialmente dentro de expressões lambda. Consulte Operadores de coleção OData no Pesquisa de IA do Azure  para obter detalhes.

Operadores lógicos e null

A maioria das expressões boolianas, como funções e comparações, não pode produzir valores null, e os operadores lógicos não podem ser aplicados diretamente ao literal null (por exemplo, x and null não é permitido). No entanto, os campos boolianos podem ser null. Sendo assim, você precisa estar ciente de como os operadores and, or e not se comportam na presença de null. Isso é resumido na seguinte tabela, em que b é um campo do tipo Edm.Boolean:

Expressão Resultado quando b é null
b false
not b true
b eq true false
b eq false false
b eq null true
b ne true true
b ne false true
b ne null false
b and true false
b and false false
b or true true
b or false false

Quando um campo booleano b aparece sozinho em uma expressão de filtro, ele se comporta como se tivesse sido escrito b eq true. Portanto, se b for null, a expressão é avaliada como false. Da mesmo modo, not b comporta-se como not (b eq true). Portanto, ele é avaliado como true. Dessa forma, os campos null se comportam da mesma maneira que false. Isso é consistente com o modo como eles se comportam quando combinados com outras expressões usando and e or, conforme mostrado na tabela acima. Apesar disso, uma comparação direta com false (b eq false) ainda será avaliada como false. Em outras palavras, null não é igual a false, embora ambos se comportem da mesma maneira em expressões boolianas.

Exemplos

Corresponder documentos em que o campo rating está entre 3 e 5, inclusive:

    rating ge 3 and rating le 5

Corresponder documentos em que todos os elementos do campo ratings são menores que três ou maiores que cinco:

    ratings/all(r: r lt 3 or r gt 5)

Corresponder documentos em que o campo location está dentro do polígono fornecido, e o documento não contém o termo "público".

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))') and not search.ismatch('public')

Corresponder documentos para hotéis em Vancouver, Canadá, em que há um quarto de luxo com uma taxa base inferior a 160:

    Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)

Próximas etapas