Query Object(Objeto de Pesquisa) é um padrão de projeto que visa libertar o programador de conhecer e/ou usar uma linguagem de pesquisa de dados como SQL ou uma API proprietária de um fornecedor de tecnologia.
Você tem um mecanismo de pesquisa de dados: um banco relacional, por exemplo. Você envia comandos para esse mecanismo através de uma linguagem própria (SQL) ou uma API própria. Você não quer que o seu sistema dependa dessa linguagem ou você não quer usar essa linguagem para especificar os parâmetros da pesquisa. Você pode não ter, ou querer, uma equipe que entenda ou domine essa linguagem. Ela pode ser muito complexa ou repetitiva destruindo a sua produtividade. A construção da frase pode ser dinâmica ou depender de condições que tornam a sua escrita desconexa. Os motivos podem ser vários.
O padrão propõe que se utilize um objeto para conter todos os detalhes (parâmetros) necessários a construir a frase. A execução é deixada a um Interpreter. Um Interpreter é um objeto que interpretará o Query Objet e o transformará na frase da linguagem ou executá mecanismos da API subjacente como se fosse utilizada diretamente.
O Query Objet funciona como uma especificação desacoplada da linguagem final. Isto permite que a mesma especificação seja usada por interpretadores diferentes para atuar em contextos diferentes. Por exemplo, o mesmo objeto de pesquisa poderia ser traduzido numa frase SQL, numa frase EQL ou numa frase XPath. O mesmo objeto poderia ser utilizado como filtro de uma coleção em memória transformando-o num objeto que processe uma Collection
. O detalhe de um objeto de pesquisa no mundo OO e relacional resume-se a especificar uma relação entre o valor presente num campo e um valor passado. A relação é normalmente de 2 tipos:
-
Comparação – operações de igualdade ou relação de ordenação. As operações que comparam valores null
são também comuns
-
Inclusão – operações que determinam se o valor está contido numa lista de valores. Esta lista pode ser fixa ou ela própria resulta de uma pesquisa.
Mais tipos podem ser adicionados como operações de agregação (somas) ou de determinação de extremos(máximo, mínimo). As operações sobre valores podem operar sobre valores fixos ou dinâmicos(resultantes de outras pesquisas) ou ainda sobre valores contidos em entidades que têm uma relação com a entidade pesquisada (join).