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:
  • Arquivo Texto (CSV)
  • Arquivo MS Excel
  • Arquivo OpenOffice
  • Arquivo XML
  • Banco de dados
Tudo isso funcionando através de uma DSL-like escrita em java, onde a syntax é compatível com SQL 99. O framework permite trabalhar com a estrutura do "Banco" seja ele um arquivo Excel, CSV ou banco mesmo.

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
Todas as dependências binárias você encontra da distribuição do MetaModel em seu site para download. Caso você utilize como fonte de dados o Excel ou XML ou outra fonte de dados será necessário mais alguns jars, essa informação você pode conferir com detahles do site do MetaModel.

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.

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java