package com.c2c.query; import mondrian.olap.Cube; import org.hsqldb.lib.Iterator; import org.olap4j.OlapConnection; import org.olap4j.OlapDatabaseMetaData; import org.olap4j.OlapException; import org.olap4j.metadata.Dimension; import org.olap4j.metadata.Hierarchy; import org.olap4j.metadata.Level; import org.olap4j.metadata.Member; import org.olap4j.metadata.Property; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; public class DimensionsQuery extends AbstractQuery<ArrayList<String[]> > { private final String cube; public DimensionsQuery(String jdbcConnection, String catalogDefFile, String cube) { super(jdbcConnection, catalogDefFile); this.cube = cube; } // private static enum DIMENSION_TYPE {TYPE_MEASURE, TYPE_SPATIAL,TYPE_THEMATIC } ; private static final int DIMENSION_NAME_COLUMN = 4; private static final int DIMENSION_UNIQUE_NAME_COLUMN = 5; private DIMENSION_TYPE getDimensionType(OlapConnection olapConnection, String dimName) { try { org.olap4j.metadata.Cube c = olapConnection.getSchema().getCubes().get(cube); List<Dimension> lDims = c.getDimensions(); for (java.util.Iterator<Dimension> i = lDims.iterator() ; i.hasNext() ; ) { Dimension cDim = i.next(); // not the good dimension // we skip this iteration if (! dimName.equals(cDim.getName())) { continue; } if (cDim.getDimensionType() == Dimension.Type.MEASURE) { return DIMENSION_TYPE.TYPE_MEASURE; } // first hierarchy List <Hierarchy> lHies = cDim.getHierarchies(); for (java.util.Iterator<Hierarchy> j = lHies.iterator() ; j.hasNext() ; ) { Hierarchy lHie = j.next(); List<Level> lLvls = lHie.getLevels(); // we just need to iterate on at most 2 levels int nbLvls = 0; for (java.util.Iterator<Level> k = lLvls.iterator() ; k.hasNext() ; ) { Level cLvl = k.next(); nbLvls++; List<Member> lMbrs; lMbrs = cLvl.getMembers(); // iterating on members for (java.util.Iterator<Member> l = lMbrs.iterator() ; l.hasNext() ; ) { Member cMbr = l.next(); List<Property> lPrps = cMbr.getProperties(); // iterating on properties for (java.util.Iterator<Property> m = lPrps.iterator() ; m.hasNext() ; ) { Property cPrp = m.next(); if (cMbr.getPropertyValue(cPrp) != null) { if ((cMbr.getPropertyValue(cPrp) instanceof com.vividsolutions.jts.geom.MultiPolygon) || (cMbr.getPropertyValue(cPrp) instanceof com.vividsolutions.jts.geom.Point)) { return DIMENSION_TYPE.TYPE_SPATIAL; } } } // end iterating on the properties // let's break after the first member break; } // end iterating on members // we need to iterate at least 2 times on levels // since the dummy level "All lvlName" could potentially // pollute our properties lookup if (nbLvls == 2) { break; } } // end iterating on levels break; } // end iterating on hierarchies break; } // end iterating on dimensions } catch (OlapException e) { // TODO Auto-generated catch block e.printStackTrace(); } return DIMENSION_TYPE.TYPE_THEMATIC; } @Override protected synchronized ArrayList<String[]> doExecute(OlapConnection olapConnection) throws OlapException { ArrayList<String[]> ret = new ArrayList<String[]>(); try { int i = 0; OlapDatabaseMetaData md = olapConnection.getMetaData(); ResultSet propMd = md.getDimensions(null, null, cube, null); while (propMd.next()) { DIMENSION_TYPE type = getDimensionType(olapConnection, propMd.getString(DIMENSION_NAME_COLUMN)); String[] curCol = new String[3]; curCol[0] = new String(propMd.getString(DIMENSION_NAME_COLUMN)); curCol[1] = new String(propMd.getString(DIMENSION_UNIQUE_NAME_COLUMN)); if (type == DIMENSION_TYPE.TYPE_SPATIAL) { curCol[2] = "spatial"; } else if (type == DIMENSION_TYPE.TYPE_THEMATIC) { curCol[2] = "thematic"; } else if (type == DIMENSION_TYPE.TYPE_MEASURE) { curCol[2] = "measure"; } ret.add(curCol); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ret; // return md.getDimensions(null, null, cube, null); } }