Queries em arquivos de texto com o MetaModel
O MetaModel é um engine para execução de queries para diferentes tipos de fontes de dados. Normalmente realizamos queries em um banco de dados relacional, isso também pode ser feito com o MetaModel.
O MetaModel vai além disso e possibilita que efetuemos queries em outros tipos de fontes de dados como por exemplo:
Através do schema podemos obter as tabelas, colunas e tipos de dados da fonte dos dados, mesmo ela sendo um simples arquivo CSV. Apenas pela facilidade e simplicidade que o MetaModel faz isso já uma coisa fantástica!
Como eu disse antes, o framework é feito com o padrão SQL 99, isto significa que você pode fazer queries SQL, isso através da DSL em java que ele possui. Esta DSL é como se fosse a DetachedCriteria do Hibernate.
Ainda é possível implementar o dk.eobjects.metamodel.DataContext e acessar outra fonte de dados como um serviço de diretório padrão como o LDAP.
Um exemplo Simples
Vou demonstrar como é simples utilizar o MetaModel. Você irá precisar dos seguintes jars:
Arquivo linguagens.CSV
A primeira linha do arquivo é muito importante, é dela que ele tira os nomes das colunas.
Agora veja a classe Java que eu fiz para testes chamda MetaModelCsv.Java
Aqui é criado um contexto de dados através da classe DataContextFactory, nesse caso utilizado uma fonte de dados em CVS.
Com a conexão estabelecida a fonte de dados obtive o eschema e naveguei por seus dados, perceba que primeor obtive o schema depois as tabelas e por fim as colunas.
Para finalizar realizei uma query com a DSL-Criteria-SQL-Like do MetaModel e por fim naveguei nos resultados lendo todos e mostrado na tela.
Infelismente o framework trabalha apenas com leituras de dados, somente schemas e queries, não podemos inserir dados. Mesmo assim é um framework muito util para ler dados de fontes mais mundanas como Excel e CSV de maneira fácil e padronizada.
Caso queriam o ver, estou disponibilizado o projeto do eclipse com os fontes. Os fontes estão disponíveis aqui.
O MetaModel vai além disso e possibilita que efetuemos queries em outros tipos de fontes de dados como por exemplo:
- Arquivo Texto (CSV)
- Arquivo MS Excel
- Arquivo OpenOffice
- Arquivo XML
- Banco de dados
Através do schema podemos obter as tabelas, colunas e tipos de dados da fonte dos dados, mesmo ela sendo um simples arquivo CSV. Apenas pela facilidade e simplicidade que o MetaModel faz isso já uma coisa fantástica!
Como eu disse antes, o framework é feito com o padrão SQL 99, isto significa que você pode fazer queries SQL, isso através da DSL em java que ele possui. Esta DSL é como se fosse a DetachedCriteria do Hibernate.
Ainda é possível implementar o dk.eobjects.metamodel.DataContext e acessar outra fonte de dados como um serviço de diretório padrão como o LDAP.
Um exemplo Simples
Vou demonstrar como é simples utilizar o MetaModel. Você irá precisar dos seguintes jars:
- commons-discovery-0.2.jar
- commons-lang-2.4.jar
- commons-logging-1.0.3.jar
- commons-math-1.1.jar
- joda-time-1.5.2.jar
- MetaModel-core-1.1.3.jar
- MetaModel-csv-1.1.3.jar
- MetaModel-full-1.1.3.jar
- MetaModel-querypostprocessor-1.1.3.jar
- opencsv-1.8.jar
Arquivo linguagens.CSV
id,nome,mercado 1,Java,Otimo 2,.NET,Bom 3,PHP,Bom 4,Rails,Medio 5,Python,Regular 6,C,Ruim
A primeira linha do arquivo é muito importante, é dela que ele tira os nomes das colunas.
Agora veja a classe Java que eu fiz para testes chamda MetaModelCsv.Java
package com.blogspot.diegopacheco.metamodel.exemplo; import java.io.File; import dk.eobjects.metamodel.DataContext; import dk.eobjects.metamodel.DataContextFactory; import dk.eobjects.metamodel.data.DataSet; import dk.eobjects.metamodel.data.Row; import dk.eobjects.metamodel.query.Query; import dk.eobjects.metamodel.schema.Column; import dk.eobjects.metamodel.schema.Schema; import dk.eobjects.metamodel.schema.Table; /** * Teste do MetaModel com arquivo CSV. * * @author Diego Pacheco * @since 22/12/2008 * @version 1.0 */ public class MetaModelCsv { public static void main(String[] args) { // Cria um DataContext: Aqui poderia ser acessando Excel, OpenOffice ou Banco de Dados // Ou você poderia cirar o seu strategy e acessar outras fontes como um LDAP por exemplo DataContext dataContext = DataContextFactory.createCsvDataContext(new File("files/linguagens.csv")); // Obtem os schemas: Como se fosse de banco, mas nesse caso eh um CSV. Schema[] schemas = dataContext.getSchemas(); // Varre todo o schema e mostra todas as tabelas e os campos for(Schema s: schemas){ for(Table t: s.getTables()){ System.out.println("Tablea: " + t.getName()); for(Column c: t.getColumns()){ System.out.println("Coluna: " + c.getName() + " - tipo: " + c.getType()); } } } // Efetuo uma query em cima do arquivo CSV. Query q = new Query(); Table tabela = schemas[1].getTableByName("linguagens"); Column nomeColuna = tabela.getColumnByName("nome"); Column orderBy = tabela.getColumnByName("id"); q.select(nomeColuna,orderBy); q.from(tabela); q.orderBy(orderBy); // Executo a query e mostro o resulado. DataSet dataSet = dataContext.executeQuery(q); System.out.println("Resultado da Query"); while (dataSet.next()) { Row row = dataSet.getRow(); System.out.println(row.getValue(0)); } } }
Aqui é criado um contexto de dados através da classe DataContextFactory, nesse caso utilizado uma fonte de dados em CVS.
Com a conexão estabelecida a fonte de dados obtive o eschema e naveguei por seus dados, perceba que primeor obtive o schema depois as tabelas e por fim as colunas.
Para finalizar realizei uma query com a DSL-Criteria-SQL-Like do MetaModel e por fim naveguei nos resultados lendo todos e mostrado na tela.
Infelismente o framework trabalha apenas com leituras de dados, somente schemas e queries, não podemos inserir dados. Mesmo assim é um framework muito util para ler dados de fontes mais mundanas como Excel e CSV de maneira fácil e padronizada.
Caso queriam o ver, estou disponibilizado o projeto do eclipse com os fontes. Os fontes estão disponíveis aqui.