software‎ > ‎módulos‎ > ‎engine‎ > ‎artigos‎ > ‎

IQuery: Uma visão geral da sintaxe


Introdução

A idéia do IQuery é baseada na ferramenta LINQ. A idéia por traz do LINQ é trazer os comandos de consulta ao banco de dados para a linguagem. Comandos SQLs são armazenados em Strings, não fazem parte da linguagem.

Estrutura básica da sintaxe

Há dois tipos de métodos no IQuery(): Os métodos declarativos e os de processamento. Os métodos declarativos servem para montar a consulta e os executivos servem para executar alguma operação com o IQuery, como por exemplo executar a consulta.
Os métodos declarativos básicos mais usados no IQuery são .from(), .where() e .column(). Veja o exemplo abaixo:
IQuery.from( 123 /*Classe que será consultada*/ )
.where( CLAUSULA_WHERE )
.column( COLUNAS )

Há também outros métodos declarativos menos usados. São eles: o innerJoin() e o leftOuterJoin(). Veremos alguns exemplos sobre o uso deles. Voltando ao exemplo acima, falta falar sobre os parâmetros dos métodos .where() e .column().

O método .where()

O método .where() é usado para aplicar filtros na consulta do IQuery. Este método recebe um único parâmetro que é um objeto literal ou um array. Vamos direto ao exemplo para ficar mais claro.

Suponhamos que você deseja fazer o seguinte filtro:
Where CHCRIACAO = 123

Você deverá usar o método .where() da seguinte forma:
.where( {field: "CHCRIACAO", operator: "=", value: 123} )

No exemplo acima foi passado um objeto literal como parâmetro do método .where(). Vejamos agora o caso em que será necessário passar um vetor invés de um objeto literal.
Suponhamos que agora você deseje fazer um filtro com dois ou mais campos. Algo assim:
Where CHCRIACAO = 123
And EMISSAO >= '01/01/2011'
And BAIXADO is Null

Você deverá usar o método .where() da seguinte forma:
.where([
   {field: "CHCRIACAO", operator: "=", value: 123},
   "and",
   {field: "EMISSAO", operator: ">=", value: new Date(2011, 0, 1)}
   "and",

   {field: "BAIXADO", operator: "=", value: null}
])

Note que só pelo fato de ter colocar o valor null no terceiro filtro, o SQL correspondente será gerado com is Null. Então conclui-se que o IQuery pode mudar a cláusula where do comando SQL gerado de acordo com o valor passado para o filtro.
Vejamos o que acontece quando passamos um vetor ou uma instância do objeto IQuery como valor de filtro:

Passando o vetor para o filtro
.where([
  {field: "CHCRIACAO", operator: "=", value: [123, 456, 789]},
  "and",
  {field: "BAIXADO", operator: "=", value: null}
])

O SQL correspondente será algo assim:
Where CHCRIACAO in (123, 456, 789)
And BAIXADO is Null

Passando um outro IQuery para o filtro
var vinculos = IQuery.from(-1897052338 /* Vínculos de Movimentações */)
.where([{field: "crpedido", operator: "=", value: 111}])
.column([{field: "chcriacao"}])

var pedidos = IQuery.from(-2008879000 /* Pedidos ou Provisões */)
.where([{field: "chcriacao", operator: "=", value: vinculos}])
.column([{field: "chave"}])
pedidos.toSql();

O SQL do where gerado pelo IQuery pedidos será algo assim:
Where CHCRIACAO in (Select CHCRIACAO From VINCULAMOVIMENTAC Where CRPEDIDO = 111)


O método .column()

Assim como o método .where(), este método também recebe um único parâmetro que é um objeto literal ou um vetor de objetos literais. Vamos aos exemplos:

Se usar um único objeto literal como parâmetro
.column({field: "chave"})

Será gerado
Select chave


Agora se usar um vetor de objetos literais
.column([{field: "chave"}, {field: "emissao"}])

Será gerado
Select chave, emissao

Usando alias e coalesce
.column({field: "chave", alias: "CHAVE_PEDIDO", coalesceValue: 1})


O código acima gera algo assim:
select coalesce(chave, 1) as CHAVE_PEDIDO


Conclusão

Esta é apenas uma visão geral do que o IQuery pode fazer. Não deixe de ler também os exemplos do uso do IQuery. Lá mostra, por exemplo, o código IQuery de como usar os métodos innerJoin() e leftOuterJoin() que não foram contemplados neste artigo.