sexta-feira, novembro 24, 2006

Simples, mas prático

Galera, vou postar um exemplo bem simples de como realizar
dois tipo diferentes de busca aproximada utilizando metodos
nativos do DB4o, sem precisar fazer nada de novo.

Nossa classe de dominio:


public class Regra {
private String padrao;
private String tratamento;
private String modulo;
public String getModulo() {
return modulo;
}
public void setModulo(String modulo) {
this.modulo = modulo;
}
public String getPadrao() {
return padrao;
}
public void setPadrao(String padrao) {
this.padrao = padrao;
}
public String getTratamento() {
return tratamento;
}
public void setTratamento(String tratamento) {
this.tratamento = tratamento;
}
}


Parte 2: DAO

Nossa classe DAO:



import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.query.Constraint;
import com.db4o.query.Query;

import dominio.Palavra;
import dominio.Regra;

public class DAORegra {

public ObjectContainer db;

public DAORegra(){

}

public void open(String idioma){
this.db = Db4o.openFile("memoria/regras/"+idioma+".regras");
}

public void close(){
this.db.close();
}

public void store(String padrao, String tratamento,String modulo){
Regra regra = new Regra();

if(!padrao.equalsIgnoreCase("") && !tratamento.equalsIgnoreCase("")){


regra.setPadrao(padrao.toUpperCase());

ObjectSet result = db.get(regra);

if(result.size() != 0){
regra = (Regra) result.next();
}

regra.setModulo(modulo);
regra.setPadrao(padrao.toUpperCase());
regra.setTratamento(tratamento.toUpperCase());
db.set(regra);
db.commit();
}


}



public String[] getRegras(String padrao, String tratamento,String modulo){
Regra regra = new Regra();

Query query=db.query();
query.constrain(Regra.class);

Constraint constrPadrao=null,constrModulo=null,constrTratamento=null;

constrPadrao=query.descend("modulo").constrain(modulo);


if(!padrao.equalsIgnoreCase("")){
constrPadrao=query.descend("padrao").constrain(padrao.toUpperCase()).startsWith(true);
}

if(!tratamento.equalsIgnoreCase("")){
constrPadrao=query.descend("tratamento").constrain(tratamento.toUpperCase()).startsWith(true);
}

ObjectSet result = query.execute();


String[] regras = new String[result.size()];

if(result.size() == 0){
regras = new String[1];
regras[0] = "Nao Encontrada nenhuma ocorrência";
}else{
for(int i=0;i
regra = (Regra) result.next();
regras[i] = regra.getPadrao()+" : "+regra.getTratamento();
}
}

return regras;
}

public void delete(String padrao, String tratamento,String modulo){
Regra regra = new Regra();
regra.setModulo(modulo);

if(!padrao.equalsIgnoreCase("") && !tratamento.equalsIgnoreCase("")){

regra.setPadrao(padrao.toUpperCase());
regra.setTratamento(tratamento.toUpperCase());

ObjectSet result = db.get(regra);

if(result.size() != 0){
regra = (Regra) result.next();
db.delete(regra);
db.commit();
}
}

}

public Regra existeRegraIgual(String padrao){
Regra regra = new Regra();

Query query=db.query();
query.constrain(Regra.class);

Constraint constr=null;
constr=query.descend("padrao").constrain(padrao);

ObjectSet result = query.execute();

regra = (Regra) result.next();

return regra;
}

public int existeRegra(String padrao){
Regra regra = new Regra();

Query query=db.query();
query.constrain(Regra.class);

Constraint constr=null;
constr=query.descend("padrao").constrain(padrao.toUpperCase()).startsWith(true);

ObjectSet result = query.execute();


return result.size();
}
}


Utilizando isso:
(
frame.getPalavras() retorna palavras é um vetor Palavra[], presumam isso):



public class aplicarRegras {

public aplicarRegras(frameGeral frame){
Palavra palavraAtual;
Regra regraAtual;
Palavra[] palavras = frame.getPalavras();
String bufferGlobal="",regra="", pilha="", candidataRegra="", idioma=frame.getIdiomaDeEntrada();
DAORegra daoRegras = new DAORegra();
daoRegras.open(idioma);
int i = 0;
while(i palavraAtual = palavras[i];
if(regra.equals(""))
candidataRegra = palavraAtual.getClasseGramatical();
else
candidataRegra = regra+" "+palavraAtual.getClasseGramatical();
if((!palavraAtual.getClasseGramatical().equalsIgnoreCase("Nao Encontrada"))
&&(daoRegras.existeRegra(candidataRegra)>0)){
regra = candidataRegra;
if(pilha.equals(""))
pilha = palavraAtual.getGrafia();
else
pilha += " "+palavraAtual.getGrafia();
}else{

if(!pilha.equals("")){
regraAtual = daoRegras.existeRegraIgual(regra);
if(regraAtual != null){
bufferGlobal+="<"+regraAtual.getModulo()+">"+pilha+"";
}else{
bufferGlobal+=pilha+" ";
}
}
bufferGlobal+=palavraAtual.getGrafia()+" ";
pilha="";
regra="";
}
i++;
}
daoRegras.close();
frame.setTextoMarcado(bufferGlobal);
}


}

sexta-feira, novembro 17, 2006

Erros Comuns - Parte 1

Neste meu primeiro post venho trazer a tona erros mais comuns entre usuários iniciantes. Nesta minha primeira semana de uso detectei alguns erros cumuns de desenvolvimento que cometi e me fez perder certo tempo, e como percibi que são normais de se cometer quando se aprende a usar uma nova tecnologia pretendo passar este conhecimento a usuários iniciantes para que estes ganhem tempo !!!

Chamei de Erros mais Comuns - Parte 1 devido a minha pouca experiência neste momento e a poucas possíbilidades exploradaas ainda sobre o uso do db4o. Em breve acredito cometer novos erros que possam ser digno de um segundo post, e para no futuro condençar num artigo mais completo e bem escrito.


Construtor não Vazio x Pesquisa FullObjects:

Chamo aqui de pesquisa FullObjects aquela que retorna todos os elementos de uma classe que se encontra armazenadas no db4o. (pode-se fazer uma analogia próxima ao Select * from Tabela )

Para se buscar todos os objetos da classe usando o método Get deve-se preencher todos os campos da classe com valores nulo.

Erro Comum: O construtor de uma classe pode preencher um conjunto de atributos com informações padrões.

Resultado deste Erro: O Db4o rretornará as informações somente dos objetos que não tiveram estes atributos alterados, deixando muitos objetos de fora.

Correção Sugerida: O objeto deve possuir um Construtor (ou um método) que seta nullo em todos os atributos não constantes do objeto.

Inserir x Alterar

Quando agente quer inserir um objeto, agente cria um objeto vazio, preenche as inforções e salva. Quando agente pretende alterar devemos buscar o objeto no banco, editar suas informações e recoloca-lo no banco.

Erro Comum:

Quando agetne utilizava o SGBD relacional agente pegava o objeto que nos era passado por outra camada da aplicação, desmenbramos em um comando SQL e executamos. Quando agente recebe este objeto da camada de controle (ou outra dependedo da arquitetura) a ideia intuitiva é usar o metodo Set para salvar as alterações.


Resultado deste Erro: O objeto passado cria uma nova informação no db4o, em vez de alterar a existente como foi o desejado.


Correção Sugerida: Deve se usar o método Get para obter o objeto do banco que deseja se editar, alterar as informações que forem necessárias e usar o método Set para salvá-lonovamente no Banco.



Conclusão:
São algumas sugestões que possam facilitar a vida de quem está iniciando, porém muitas delas possuem melhores soluções, Deixo então o convite para todos os interessados em estudar este novo paradigma que partipem do grupo db4oBrasil dando dicas e sugestões e efetuando críticas construtivistas.


Abraços a Todos
Bernard C. Pereira

quinta-feira, novembro 09, 2006

Estamos no Imasters

Olá pessoal, a partir de hoje estamos representados no portal imasters. O primeiro artigo que mandei nada mais é do que as informações fornecidadas no próprio site db4o resumidas. Espero receber sugestões de vocês para os próximos artigos.

[]'s