DB4O - Data Base For Objects
Native Queries – Parte 1 (por Jeudí Prando)
Antes de iniciar o artigo irei definir uma classe para servir de exemplo nos tópicos que serão apresentados.
public class Pessoa
{
private string _nome;
private string _sobreNome;
private string _sexo;
public Pessoa()
{
this._nome = “”;
this._sobreNome = “”;
this._sexo = “”;
}
public Pessoa(string nome, string sobreNome, string sexo)
{
this._nome = nome;
this._sobreNome = sobreNome;
this._sexo = sexo;
}
public string Nome
{
get{ return this._nome; }
set{ this._nome = value; }
}
public string SobreNome
{
get{ return this._sobreNome; }
set{ this._sobreNome = value; }
}
public string Sexo
{
get{ return this._sexo; }
set{ this._sexo = value; }
}
}
Pronto agora que a nossa classe modelo esta definida vamos ao que interessa.
DB4O nos fornece três tipos de pesquisa
• Query-By-Example (QBE)
• SODA API.
• Native Queries (NQ)
Como neste artigo o meu foco é o Native Querie não falarei sobre os outros tipos de pesquisa
O tipo de pesquisa Native Queries (NQ) é o sistema de pesquisa principal do DB4O, recomendada para o uso geral.
Não seria agradável se pudesse realizar pesquisas utilizando as regras da linguagem de programação que você esta utilizando?
Não seria agradável se todas as suas pesquisas fossem fortemente tipadas?
Não seria agradável se você pudesse utilizar todo o poder da Linguagem Orientada a Objeto para realizar as suas pesquisas?
Utilize Native Queries(NQ)!
Native Queries é a principal sistema de pesquisa do DB4O e é o sistema de pesquisa recomendado para utilizar em sua aplicação.
As pesquisas em Native Querie utilizam a semântica da linguagem de programação que você esta utilizando, é uma escolha segura para o futuro.
Native Queries (NQ) é fortemente tipado.
Native Queries estão disponíveis para todas as plataformas suportadas por DB4O.
Native Querie fornecem a habilidade de executar uma ou mais linhas de código de encontro a todos as instancias de um objeto em um repositório de objetos
As expressões de Native Queries devem retornar verdadeiro para recuperar os objetos que esta sendo testado pela expressão.
DB4O tentará otimizar as expressões de Native Queries e executá-la de encontro aos índices e a busca é otimizada de forma a instanciar de verdade
somente os objetos que irão fazer parte da lista.
Essas expressões são exatamente as mesmas que você utiliza em um "if", por exemplo, se retornar verdadeiro o objeto é adicionado a lista se retornar
falso o objeto não é adicionado a lista.
Um exemplo de Expressões de Native Queries:
IList iLista = db.Query(delegate(Pessoa pessoa)
{
return (pessoa.Nome.Contains("a"));
}
);
Esta é a expressão da nossa Native Querie utilizada neste exemplo:
delegate(Pessoa pessoa)
{
return (pessoa.Nome.Contains("a"));
}
Esta expressão juntamente com o metodo Query, esta dizendo que é para percorrer todos os objetos do tipo Pessoa "delegate(Pessoa pessoa)" dentro do nosso repositório de objetos.
A cada objeto percorrido será instanciado no atributo pessoa dentro do delegate"delegate(Pessoa "pessoa")", e será testado conforme o código que vem da sua própria linguagem de programação,
no nosso caso, procura por pessoas que contenham a letra "a" no nome "pessoa.Nome.Contains("a")", se o objeto pessoa atualmente instanciado em "pessoa" tiver a letra "a" no nome a expressão
retornará verdadeiro, fazendo com que o atual objeto pessoa faça parte da lista que será montada ao termino do percorrer e validar todos os objetos do nosso repositório de objetos, no nosso
caso os objetos do tipo pessoa, gerando assim o nosso famoso "Result Set".
vamos ver alguns exemplos, utilizando nossa classe modelo:
/// vamos instanciar algumas pessoas
Pessoa fulano = new Pessoa();
fulano.Nome = "Fulano";
fulano.Sexo = "M";
Pessoa beltrano = new Pessoa("Beltrano","","M");
Pessoa ciclana = new Pessoa("Ciclana","","F");
/// vamos iniciar a comunicação com o nosso repositório de objetos
IObjectContainer db = Db4oFactory.OpenFile("dados.yap");
/// persistindo as pessoas instanciadas
db.set(fulano);
db.set(beltrano);
db.set(ciclana);
agora vamos recuperar todas as pessoas do sexo Feminino, utilizado Native Querie
IList lista = db.Query(delegate(Pessoa pessoa){ return pessoa.Sexo = "F"});
neste caso seria retornado somente o objeto Pessoa "ciclana"
se eu quisesse utilizar o poder que se tem de uma linguagem orientada a objeto poderíamos fazer um Método que busque
todas as pessoas de um sexo especificado. Ex:
public List RecuperarListaPessoaDeterminadoSexo(string sexo)
{
/// vamos iniciar a comunicação com o nosso repositório de objetos
IObjectContainer db = Db4oFactory.OpenFile("dados.yap");
/// vamos recuperar as pessoas de um sexo especificado através do parâmetro "sexo"
return new List(db.Query(delegate(Pessoa pessoa){ return pessoa.Sexo = sexo}));
}
agora ao executar o método
RecuperarListaPessoasDeterminadoSexo("M");
seria retornado uma lista contendo os objetos Pessoas: Fulano e Beltrano
poderíamos estender este artigo realizando muitas variações de consulta utilizando Native Queries, mas esta variação
é devida a liberdade que a linguagem orientada a objeto te dá...
Por exemplo poderíamos utilizar a ordenação no List, buscar pessoas que iniciem ou não contenham sobre nome e assim
por diante...
Mas o meu objetivo neste artigo é passar um pouco de noção do que é Native Querie, como Utilizar, como montar expressões,
como o mesmo funciona e não falar sobre orientação a objeto apesar do assunto esta contido em Native Queries
espero ter ajudado alguém! rss
Boa Sorte!