2016-12-07 2 views
0

Ich arbeite mit Mondrian und ich habe einige Code-Definition, die gut funktioniert. Jetzt möchte ich auf meinem Code ein anderes Datenbankschema festlegen, von dem aus mondrian die Abfrageergebnisse erhalten würde, aber ich kann nicht finden, wo das zu tun ist.Mondrian - Set-Datenbank-Schema-Definition

Mondrian Cube-Definition ist wie folgt:

<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> 

Und ich habe die 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> 

Antwort

1

Schließlich ich die Lösung fand mich.

Um das Datenbank-Schema zu definieren ich die Eigenschaft Schema den Tag Tabelle wie folgt verwendet werden hinzugefügt:

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

Dann die Schemanamen zu ändern, überschreibe ich dynamicaly die Filterfunktion von 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); 
    } 
} 

um diese benutzerdefinierten Filter zu meinem mondrianQuery gesetzt habe ich ein dynResolver Attribut die neue Klasse verweisen:

Verwandte Themen