Search code examples
javadatabasemondrian

Mondrian - Set database schema definition


I'm working with mondrian and I have some code definition that works fine. Now I want to set on my code a different database schema from where mondrian would get the queries results but I can't find where to do that.

Mondrian cube definition is as follows:

<Schema name="Cubo">
  <Cube name="PERM_PD" cache="true" enabled="true">
    <Table name="FACT_PERM_PD">
    </Table>
    <Dimension foreignKey="STE_ID" highCardinality="false" name="ESTADO">
      <Hierarchy name="ESTADO" hasAll="true" allMemberName="Todos" primaryKey="STE_ID">
        <Table name="OLAP_ESTADO">
        </Table>
        <Level name="ESTADO.STE_NAME" table="OLAP_ESTADO" column="STE_NAME" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension foreignKey="TIPO_ID" highCardinality="false" name="TIPO_DOCUMENTO">
      <Hierarchy name="TIPO_DOCUMENTO" hasAll="true" allMemberName="Todos" primaryKey="TIPO_ID">
        <Table name="OLAP_TIPO_DOCUMENTO">
        </Table>
        <Level name="TIPO_DOCUMENTO.TIPO_NAME" table="OLAP_TIPO_DOCUMENTO" column="TIPO_NAME" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension highCardinality="false" name="FECHA">
      <Hierarchy name="FECHA" hasAll="true" allMemberName="Todos">
        <Level name="DATE.YEAR" column="YEAR" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="DATE.MONTH" column="MONTH" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="DATE.DAY" column="DAY" type="Numeric" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="DATE.HOUR" column="HOUR" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension foreignKey="TEMA_ID" highCardinality="false" name="TEMA">
      <Hierarchy name="TEMA" hasAll="true" allMemberName="Todos" primaryKey="TEMA_ID">
        <Table name="OLAP_TEMA">
        </Table>
        <Level name="TEMA.TEMA_NAME" table="OLAP_TEMA" column="TEMA_NAME" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension highCardinality="false" name="DOC">
      <Hierarchy name="DOC" hasAll="true" allMemberName="Todos">
        <Level name="DOC_ID" column="DCMT_ID" type="Numeric" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>        
    <Measure name="TIEMPO TOTAL" column="UNIDAD_TIME" datatype="Integer" formatString="#.##0" aggregator="sum">
    </Measure>
    <Measure name="DIAS" column="UNIDAD_TIME" datatype="Numeric" formatString="#,###.####" aggregator="avg">
    </Measure>
  </Cube> 
</Schema>

And I have the followin mondrian query definition:

<%@ page session="true" contentType="text/html; charset=ISO-8859-1" %>
<%@ taglib uri="http://www.tonbeller.com/jpivot" prefix="jp" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<% String iUrl = request.getParameter("iUrl");
String docLink = "../" + iUrl + "/AbrirDocServlet?id={0}";%>

<jp:mondrianQuery id="query01" dataSource="jdbc/olapDB" catalogUri="/WEB-INF/queries/Cubo.mondrian.xml">
select NON EMPTY {[Measures].[DIAS]} ON COLUMNS,
  NON EMPTY {([TIPO_DOCUMENTO.TIPO_DOCUMENTO].[Todos], [TEMA.TEMA].[Todos], [DEPENDENCIA.DEPENDENCIA].[Todos], [FECHA.FECHA].[Todos], [DOC.DOC].[Todos])} ON ROWS from [PERM]
<jp:clickable urlPattern="<%=docLink%>" uniqueName="[DOC.DOC]"/>
</jp:mondrianQuery>

Solution

  • Finally I found the solution myself.

    To define the data base schema to be used I added the property schema to the tag Table like this:

    <Table name="TABLE_NAME" schema="%SCHEMA%">
    

    Then to change the schema name dynamicaly I override the filter function of FilterDynamicSchemaProcessor:

    public class DynamicSchemaProcessor extends FilterDynamicSchemaProcessor {
    
        @Override
        protected String filter(final String schemaUrl, final Util.PropertyList connectInfo, final InputStream stream) throws java.lang.Exception {
            String originalSchema = super.filter(schemaUrl, connectInfo, stream);       
            return originalSchema.replace("%SCHEMA%", schema);
        }
    }
    

    To set this custom filter to my mondrianQuery I added a dynResolver attribute referencing the new class:

    <jp:mondrianQuery id="query" dataSource="jdbc/DB" dynResolver="com.company.mondrian.filters.DynamicSchemaProcessor" catalogUri="/WEB-INF/queries/Cube.mondrian.xml">