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.
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() é 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)
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
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.