2016-12-07 5 views
0

私はmondrianと一緒に作業していますが、うまく動作するコード定義がいくつかあります。 今、mondrianがクエリ結果を取得する場所とは異なるデータベーススキーマをコードに設定したいが、その場所を見つけることができない。Mondrian - データベーススキーマ定義を設定する

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

そして私はfollowinモンドリアンクエリ定義を持っている:次のように

モンドリアンキューブ定義がある

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

答えて

1

は最後に、私は解決策を自分自身を発見しました。使用されるデータベーススキーマを定義し

私はこのようなタグにプロパティスキーマを追加:

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

そしてスキーマ名dynamicalyを変更するIは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); 
    } 
} 

私mondrianQueryにこのカスタムフィルタを設定するには、私は新しいクラスを参照dynResolver属性を追加しました:

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