sábado, 18 de julio de 2009

Hello world, hello mondrian

Mondrian es un motor olap open source escrito en java.
http://mondrian.pentaho.org/

Tiene algunas caracteristicas interesantes, como por ejemplo permitir mendiante un archivo xml configurar las facts y dimensiones de un cubo, tomar como origen de datos una base de datos relaciones, distintos niveles de agregacion y cache, etc. Es compatible con varias bases de datos, entre ellas hsqldb

Este es un breve paso a paso para realizar un hello world, o mejor dicho, un hello mondrian.

1ro bajar el ultimo release.

2do descomprimir y copiar en usr/local/mondrian.
Todas las librerias y dependencias requeridas por mondrian se encuentran dentro de mondrian-embedded.war. Por lo tanto descomprimir mondrian-embedded.war y copiar el contenido de la carpeta WEB-INF/lib en usr/local/mondrian/lib.

3ro crear proyecto java en eclipse. Agrear los siguientes external jars:


4to crear xml de definicion del cubo. Este ejemplo contiene una dimension de producto y otra de tiempo.

<?xml version="1.0" encoding="UTF-8"?>
<Schema name="SaleStore">
<Cube name="Sales">
<Table name="FT_SALES"/>
<Dimension name="Product" foreignKey="PRODUCT_ID">
<Hierarchy hasAll="true" allMemberName="All Products" primaryKey="PRODUCT_ID">
<Table name="LK_PRODUCT"/>
<Level name="Product" column="PRODUCT_ID" nameColumn="PRODUCT_NAME" uniqueMembers="true"/>
</Hierarchy>
</Dimension>
<Dimension name="Time" type="TimeDimension" foreignKey="DATE_ID">
<Hierarchy hasAll="true" allMemberName="All Periods" primaryKey="DATE_ID">
<Table name="LK_TIME"/>
<Level name="Year" column="YEAR" uniqueMembers="true" levelType="TimeYears" type="Numeric"/>
<Level name="Quarter" column="QUARTER" uniqueMembers="false" levelType="TimeQuarters" />
<Level name="Month" column="MONTH" uniqueMembers="false" ordinalColumn="MONTH" nameColumn="MONTH_NAME" levelType="TimeMonths" type="Numeric"/>
<Level name="WEEK" column="WEEK_IN_MONTH" uniqueMembers="false" levelType="TimeWeeks" />
<Level name="DAY" column="DAY_IN_MONTH" uniqueMembers="false" ordinalColumn="DAY_IN_MONTH" nameColumn="DAY_IN_MONTH" levelType="TimeDays" type="Numeric"/>
</Hierarchy>
</Dimension>
<Measure name="Quantity" column="QUANTITY" aggregator="sum" formatString="#,###"/>
<Measure name="SalePrice" column="SALE_PESO" aggregator="sum" formatString="#,###.##"/>
</Cube>
</Schema>

5to crear clase java de prueba

import mondrian.olap.*;
import java.io.PrintWriter;
import java.io.StringWriter;

public class TestMondrian {

/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException
{
// Load the HSQL Database Engine JDBC driver
// hsqldb.jar should be in the class path or made part of the current jar
Class.forName("org.hsqldb.jdbcDriver");

// First, set up a valid connection string
String connStr = "Provider=mondrian;" +
"Catalog=data/cube_sales.xml;" +
"JdbcDrivers=org.hsqldb.jdbcDriver;" +
"Jdbc=Jdbc:hsqldb:file:/home/fer/workspace/helloworld/HelloHsqldb/data/testdb;" +
"jdbcUser=sa;" +
"jdbcPassword=;";

// Second, set up a valid query string
String queryStr =
"SELECT {[Measures].[Quantity], [Measures].[SalePrice]} on columns," +
" {[Product].children} on rows " +
"FROM [Sales] ";
//"WHERE ([Time].[2009].[Q1]";

// Third, retrieve a connection from the DriveManager
Connection connection = DriverManager.getConnection(connStr, null);

// Fourth, generate a MDX Query object
Query query = connection.parseQuery(queryStr);

// Fifth, execute the query
Result result = connection.execute(query);

// Finally, print out the result
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
result.print(pw);
pw.flush();
System.out.println(sw.toString());

}

}

No hay comentarios.: