4 メタデータとアナリティック・ワークスペースの作成
この章では、新しいメタデータ・オブジェクトを作成し、それをリレーショナル構造または式にマップする方法について説明します。 メタデータ・オブジェクトの定義をXMLテンプレートにエクスポートおよびインポートする方法について説明します。 また、オブジェクトをアナリティク・ワークスペースに関連付ける方法と、アナリティク・ワークスペースを構築する方法についても説明します。
この章の例は、CreateMetadataAndAW.java
サンプル・プログラムの例です。 このプログラムは、CreateAndBuildAW.java
とSpecifyAWValues.java
サンプル・プログラムと同じメタデータ・オブジェクトのいくつかを作成します。 また、CreateMetadataAndAW
プログラムは、アナリティク・ワークスペースをXMLテンプレートにエクスポートします。
この章では、次の項目について説明します。
4.1 メタデータの作成とマッピングの概要
OLAP Java APIでは、永続メタデータ・オブジェクトを作成できます。 最上位のメタデータ・オブジェクトは、Oracle Databaseインスタンスのデータ・ディクショナリに格納されます。 このAPIでは、セッション期間中のみ存在する一時的なメタデータ・オブジェクトを作成することもできます。 アプリケーションでは両方のタイプのメタデータ・オブジェクトを使用して、データ・ストア内のデータを取得または使用する問合せを作成できます。
OLAP Java APIアプリケーションでメタデータ・オブジェクトを作成するには、データベース管理者がOracle Databaseインスタンスを準備しておく必要があります。 DBAは、Oracle OLAPメタデータ・オブジェクトを作成できるようにデータベース内に永続および一時表領域を設定しておき、セッション・ユーザーがオブジェクトを作成および管理できる権限を付与しておく必要があります。 ディメンション・メタデータ・モデルには、通常、「OLAP Java APIメタデータについて」で説明されているオブジェクトが含まれます。
次元モデルは、OLAP Java APIメタデータ・オブジェクトを作成することによって実装します。 メタデータ・オブジェクトをリレーショナル・ソース・オブジェクトにマップし、アナリティック・ワークスペースを構築するには、oracle.olapi.metadata.mapping
パッケージ内のクラスを使用します。 メタデータのマッピングに使用するExpression
オブジェクトを指定するには、oracle.olapi.syntax
パッケージ内のクラスを使用します。 アナリティック・ワークスペースまたはリレーショナル・データベース(ROLAP)編成にメタデータ・オブジェクトをデプロイするには、oracle.olapi.metadata.deployment
パッケージ内のクラスを使用します。
次に、アナリティック・ワークスペースに次元モデルをOLAP Java APIオブジェクトとして実装する基本手順を示します。
-
AW
オブジェクト、MdmPrimaryDimension
オブジェクトおよびMdmCube
オブジェクトを作成します。 -
MdmPrimaryDimension
およびMdmCube
オブジェクトをAW
にデプロイします。 -
各
MdmPrimaryDimension
のMdmDimensionLevel
、MdmHierarchy
、およびMdmAttribute
オブジェクトを作成し、MdmDimensionLevel
オブジェクトをMdmHierarchy
に関連付けるMdmHierarchyLevel
オブジェクトを作成し、MdmCube
オブジェクト用のMdmMeasure
および関連オブジェクトを作成します。 -
メタデータ・オブジェクトを基本データのリレーショナル・ソースにマップします。
-
Transaction
をコミットし、データベースに永続オブジェクトを作成します。 -
アナリティック・ワークスペースを構築して、リレーショナル・ソースからオブジェクトにデータをロードします。
これらのステップを説明するトピックのリストについては、「メタデータとアナリティク・ワークスペースの作成」を参照してください。
4.2 アナリティック・ワークスペースの作成
アナリティク・ワークスペースは、ディメンション・オブジェクトのコンテナです。 これは、oracle.olapi.metadata.deployment
パッケージ内のAW
クラスによって表されます。 アナリティック・ワークスペースは、MdmDatabaseSchema
によって所有されます。
例4-1では、GLOBALユーザーのMdmDatabaseSchema
を取得し、AW
を作成する例を示します。 MdmRootSchema
を取得する例については、「メタデータの発見」を参照してください。
例4-1 AWの作成
private void createAW(MdmRootSchema mdmRootSchema) { MdmDatabaseSchema mdmDBSchema = mdmRootSchema.getDatabaseSchema("GLOBAL"); aw = mdmDBSchema.findOrCreateAW("GLOBAL_AWJ"); }
4.3 ディメンション、レベルおよび階層の作成
ディメンションは、データを識別および分類する一意値のリストです。 ディメンションはキューブのエッジを形成し、キューブのメジャーの値を識別します。 ディメンションは、ディメンション・メンバーを分類する1つ以上のレベルを持つことができます。 そのメンバーをさらに分類する階層を1つ以上持つことができます。 ディメンションにレベルまたは階層を持たないこともできます。 ただし、Oracle OLAPでマテリアライズド・ビューを作成するには、ディメンションに1つ以上のレベルが必要です。
ディメンションは、ディメンション・メンバーに関する情報を格納する属性も持ちます。 属性の作成についての説明は、「"属性の作成"」を参照してください。
次のトピックでは、ディメンション、およびディメンションのレベルと階層を表すオブジェクトを作成する方法について説明します。
4.3.1 ディメンションの作成とマッピング
OLAPのディメンションは、MdmPrimaryDimension
クラスによって表されます。 ディメンションはMdmDatabaseSchema
が所有します。 ディメンションを作成するには、MdmDatabaseSchema
のfindOrCreateTimeDimension
またはfindOrCreateStandardDimension
メソッドを使用します。 ディメンションのMemberListMap
を作成することによって、レベルのないディメンションをリレーショナル・データソースにマップできます。
「例4-2」は、CHANNEL_AWJという名前の標準ディメンションを作成します。 この例では、AWPrimaryDimensionOrganization
オブジェクトを作成し、ディメンションをアナリティック・ワークスペースにデプロイします。 mdmDBSchema
およびaw
オブジェクトは、例4-1で作成したものです。 最後の3行は、それぞれ「例4-3」、「例4-4」、および「例4-9」のメソッドを呼び出します。
例4-2 MdmStandardDimensionの作成とデプロイ
MdmStandardDimension mdmChanDim = mdmDBSchema.findOrCreateStandardDimension("CHANNEL_AWJ"); AWPrimaryDimensionOrganization awChanDimOrg = mdmChanDim.findOrCreateAWPrimaryDimensionOrganization(aw); createAndMapDimensionLevels(mdmChanDim); createAndMapHierarchies(); commit(mdmChanDim);
4.3.2 ディメンション・レベルの作成とマッピング
MdmDimensionLevel
は、同じレベルにあるディメンションのメンバーを表します。 通常、レベルのメンバーは、リレーショナル・ソースのディメンション表の列内に格納されます。 MdmDimensionLevel
は、MemberListMap
によって、リレーショナル・ソースに関連付けられます。
例4-3では、CHANNEL_AWJディメンションのMdmDimensionLevel
オブジェクトを2つ作成し、このディメンション・レベルをGLOBAL.CHANNEL_DIM表のキー列にマップします。 この例ではまた、ディメンション・レベルの詳細な説明属性を、この表の列にマップします。 詳細な説明属性chanLongDescAttr
は、例4-6で作成します。
例4-3 MdmDimensionLevelの作成とマッピング
private ArrayList<MdmDimensionLevel> dimLevelList = new ArrayList(); private ArrayList<String> dimLevelNames = new ArrayList(); private ArrayList<String> keyColumns = new ArrayList(); private ArrayList<String> lDescColNames = new ArrayList(); private void createAndMapDimensionLevels(MdmPrimaryDimension mdmChanDim) { dimLevelNames.add("TOTAL_CHANNEL"); dimLevelNames.add("CHANNEL"); keyColumns.add("GLOBAL.CHANNEL_DIM.TOTAL_ID"); keyColumns.add("GLOBAL.CHANNEL_DIM.CHANNEL_ID"); lDescColNames.add("GLOBAL.CHANNEL_DIM.TOTAL_DSC"); lDescColNames.add("GLOBAL.CHANNEL_DIM.CHANNEL_DSC"); // Create the MdmDimensionLevel and MemberListMap objects. int i = 0; for(String dimLevelName : dimLevelNames) { MdmDimensionLevel mdmDimLevel = mdmChanDim.findOrCreateDimensionLevel(dimLevelNames.get(i)); dimLevelList.add(mdmDimLevel); // Create a MemberListMap for the dimension level. MemberListMap mdmDimLevelMemListMap = mdmDimLevel.findOrCreateMemberListMap(); ColumnExpression keyColExp = (ColumnExpression)SyntaxObject.fromSyntax(keyColumns.get(i), metadataProvider); mdmDimLevelMemListMap.setKeyExpression(keyColExp); mdmDimLevelMemListMap.setQuery(keyColExp.getQuery()); // Create an attribute map for the Long Description attribute. AttributeMap attrMapLong = mdmDimLevelMemListMap.findOrCreateAttributeMap(chanLongDescAttr); // Create an expression for the attribute map. Expression lDescColExp = (Expression)SyntaxObject.fromSyntax(lDescColNames.get(i), metadataProvider); attrMapLong.setExpression(lDescColExp); i++; } }
4.3.3 階層の作成とマッピング
MdmHierarchy
は、次元オブジェクト・モデルの階層を表します。 MdmHierarchy
は、MdmLevelHierarchy
またはMdmValueHierarchy
クラスのインスタンスになる場合があります。 MdmLevelHierarchy
は、MdmDimensionLevel
オブジェクトを階層に関連付けるMdmHierarchyLevel
オブジェクトの順序付けリストを持ちます。
4.3.3.1 MdmLevelHierarchyの作成とマッピング
例4-4では、CHANNEL_AWJディメンションの階層を作成します。 この例では階層の階層レベルを作成し、その階層レベルに属性を関連付けます。 また、階層レベルおよび属性をリレーショナル・ソースにマップします。 この例では、例4-3のArrayList
オブジェクトが使用されます。 これによって、MdmDimensionLevel
オブジェクトがマップされた同じリレーショナル・ソース・オブジェクトにMdmHierarchyLevel
オブジェクトがマップされます。
例4-4 MdmLevelHierarchyおよびMdmHierarchyLevelオブジェクトの作成とマッピング
private void createAndMapHierarchies() { MdmLevelHierarchy mdmLevelHier = mdmChanDim.findOrCreateLevelHierarchy("CHANNEL_PRIMARY"); // Create the MdmHierarchyLevel and HierarchyLevelMap objects. int i = 0; for(String dimLevelName : dimLevelNames) { MdmDimensionLevel mdmDimLevel = mdmChanDim.findOrCreateDimensionLevel(dimLevelName); MdmHierarchyLevel mdmHierLevel = mdmLevelHier.findOrCreateHierarchyLevel(mdmDimLevel); HierarchyLevelMap hierLevelMap = mdmHierLevel.findOrCreateHierarchyLevelMap(); ColumnExpression keyColExp = (ColumnExpression)SyntaxObject.fromSyntax(keyColumns.get(i), metadataProvider); hierLevelMap.setKeyExpression(keyColExp); hierLevelMap.setQuery(keyColExp.getQuery()); i++; } }
4.3.3.2 MdmValueHierarchyの作成とマッピング
このドキュメントの例で使用されているGLOBAL_AWJアナリティク・ワークスペースには、MdmValueHierarchy
が有効なMdmPrimaryDimension
はありません。 ユーザーSCOTT
のサンプル・スキーマには、例として役立つ表があります。
SCOTTサンプル・スキーマには、EMPという名前の表があります。 この表には、従業員と管理者用の列があります。 従業員のディメンションを作成することができます。 次に、MdmValueHierarchy
を作成して、従業員列を階層の基本値としてマップし、manager列を親関係としてマップします(「例4-5」に示されています)。 OLAPディメンションを作成するには、SCOTTユーザーにOLAP_USER
ロールとCREATE SESSION
権限を付与する必要があります。
この例では、mdmDBSchema
はSCOTTユーザーのMdmDatabaseSchema
、dp
はDataProvider
、mp
はMdmMetadataProvider
です。 この例では、データベースに接続するコードや、DataProvider
を取得してUserSession
を作成するコード、またはMdmMetadataProvider
、MdmRootSchema
、またはMdmDatabaseSchema
を取得するコードは表示されません。 このコードは、BaseExample11g
サンプル・クラスを拡張したクラスからの抜粋です。 このクラスは、現在のTransaction
をコミットし、出力を表示するメソッドを持つ他のサンプル・クラスを使用します。 完全なコードについては、CreateValueHierarchy.java
サンプル・プログラムを参照してください。
例4-5 MdmValueHierarchyの作成
// Create an analytic workspace object. AW aw = mdmDBSchema.findOrCreateAW(awName); // Create a dimension and deploy it to the analytic workspace. MdmPrimaryDimension mdmEmpDim = mdmDBSchema.findOrCreateStandardDimension("EMP_DIM"); AWPrimaryDimensionOrganization awEmpDimOrg = mdmEmpDim.findOrCreateAWPrimaryDimensionOrganization(aw); // Get the EMP table and the Query for the table. MdmTable empTable = (MdmTable)mdmDBSchema.getTopLevelObject("EMP"); Query empQuery = empTable.getQuery(); // Create a value hierarchy. MdmValueHierarchy mdmValHier = mdmEmpDim.findOrCreateValueHierarchy("EMPVALHIER"); // Create a map for the hierarchy. SolvedValueHierarchyMap solvedValHierMap = mdmValHier.findOrCreateSolvedValueHierarchyMap(); // Specify the Query, the key expression and the parent key expression for // the hierarchy. solvedValHierMap.setQuery(empQuery); Expression keyExp = (Expression)SyntaxObject.fromSyntax("SCOTT.EMP.EMPNO", mp); solvedValHierMap.setKeyExpression(keyExp); Expression parentExp = (Expression)SyntaxObject.fromSyntax("SCOTT.EMP.MGR", mp); solvedValHierMap.setParentKeyExpression(parentExp); // Create an attribute that relates a name to each dimension member. MdmBaseAttribute mdmNameAttr = mdmEmpDim.findOrCreateBaseAttribute("EMP_NAME"); SQLDataType sdtVC2 = new SQLDataType("VARCHAR2"); mdmNameAttr.setSQLDataType(sdtVC2) // Create an attribute map for the attribute. AttributeMap attrMap = solvedValHierMap.findOrCreateAttributeMap(mdmNameAttr); // Create and set an expression for the attribute map. Expression exp = (Expression) SyntaxObject.fromSyntax("SCOTT.EMP.ENAME", mp); attrMap.setExpression(exp); mdmValHier.addAttribute(mdmNameAttr); // Commit the Transaction before building the analytic workspace. // The getContext method of BaseExample11g returns a Context11g object, // which has a method that commits the Transaction. getContext().commit(); BuildItem bldEmpDim = new BuildItem(mdmEmpDim); ArrayList<BuildItem> items = new ArrayList(); items.add(bldEmpDim); BuildProcess bldProc = new BuildProcess(items); // Execute the build. try { dp.executeBuild(bldProc, 0); } catch (Exception ex) { println("Could not execute the BuildProcess."); println("Caught: " + ex); } //Get the Source objects for the dimension, the hierarchy, and the attribute. Source empDim = mdmEmpDim.getSource(); Source valHier = mdmValHier.getSource(); Source empNameAttr = mdmNameAttr.getSource(); // Get the parent attribute and get the Source for it. MdmAttribute mdmParentAttr = mdmEmpDim.getParentAttribute(); Source parentAttr = mdmParentAttr.getSource(); Source parentByEmpByName = parentAttr.join(valHier.join(empNameAttr)); // Sort the values in ascending order by employee number of the managers. Source sortedParentByEmpByName = parentByEmpByName.sortAscending(); // Commit the Transaction before creating a Cursor. getContext().commit(); // The displayResult method of the Context11g object creates a Cursor and // displays the results. println("The managers of the employees are:"); getContext().displayResult(sortedParentByEmpByName);
この例の出力は次のとおりです。 従業員名、従業員ID、および従業員IDが表示されます。 結果はマネージャによってソートされます。 従業員のKingには親がなく、階層の最上位のメンバーであるため、Kingのマネージャ値はnullで、出力にはNA
と表示されます。
The managers of the employees are: 1: ((SCOTT,EMPVALHIER::7788),EMPVALHIER::7566) 2: ((FORD,EMPVALHIER::7902),EMPVALHIER::7566) 3: ((ALLEN,EMPVALHIER::7499),EMPVALHIER::7698) 4: ((WARD,EMPVALHIER::7521),EMPVALHIER::7698) 5: ((MARTIN,EMPVALHIER::7654),EMPVALHIER::7698) 6: ((TURNER,EMPVALHIER::7844),EMPVALHIER::7698) 7: ((JAMES,EMPVALHIER::7900),EMPVALHIER::7698) 8: ((MILLER,EMPVALHIER::7934),EMPVALHIER::7782) 9: ((ADAMS,EMPVALHIER::7876),EMPVALHIER::7788) 10: ((JONES,EMPVALHIER::7566),EMPVALHIER::7839) 11: ((BLAKE,EMPVALHIER::7698),EMPVALHIER::7839) 12: ((CLARK,EMPVALHIER::7782),EMPVALHIER::7839) 13: ((SMITH,EMPVALHIER::7369),EMPVALHIER::7902) 14: ((KING,EMPVALHIER::7839),NA)
4.4 属性の作成
属性には、ディメンション・メンバーに関する情報が格納されます。 MdmBaseAttribute
は、リレーショナル・ソース表に基づく値を表します。 MdmDerivedAttribute
は、ディメンション・メンバーの特性または関係からOracle OLAPが導出する値を表します。 たとえば、MdmPrimaryDimension
のgetParentAttribute
メソッドは、各ディメンション・メンバーの親を記録するMdmDerivedAttribute
を返します。
ディメンションの基本属性は、findOrCreateBaseAttribute
メソッドを使用して作成します。 属性のデータ型を指定できますが、多くの属性でOracle OLAPは属性マッピングからデータ型を判別できます。 setAllowAutoDataTypeChange
メソッドを使用すると、Oracle OLAPでデータ型を指定できます。 一部の属性は、ディメンション・メンバーの説明を提供したり、計算で使用できる日付情報を提供するなど、特定の方法でディメンションで使用されます。 たとえば、ディメンションのsetValueDescriptionAttribute
メソッドを使用して説明の属性を指定し、MdmTimeDimension
のsetEndDateAttribute
メソッドを使用して、終了日の期間値を含む属性を指定できます。
「例4-6」は、CHANNEL_AWJディメンションの長い説明属性を作成し、ディメンションのメンバーの説明を含む属性として指定します。 この例では、Oracle OLAPが属性のSQLデータ型を自動的に決定するように指定しています。
例4-6 MdmBaseAttributeの作成
private MdmBaseAttribute chanLongDescAttr = null; private void createLongDesciptionAttribute(MdmPrimaryDimension mdmChanDim) { // Create the long description attribute and allow the automatic changing of // the SQL data type. chanLongDescAttr = mdmChanDim.findOrCreateBaseAttribute("LONG_DESCRIPTION"); chanLongDescAttr.setAllowAutoDataTypeChange(true)); // Specifies that the attribute contains descriptions of the dimension members. mdmChanDim.setValueDescriptionAttribute(chanLongDescAttr); }
属性は、ディメンションの異なるレベルのメンバーごとに、異なる値を格納できます。 この場合、属性は各レベルの属性マッピングを持ちます。 例4-3では、各ディメンション・レベルのMemberListMap
のfindOrCreateAttributeMap
メソッドをコールして、各ディメンション・レベルについて詳細な説明属性のAttributeMap
を作成します。 ここでは、各属性マップに対して異なる列を指定します。
4.5 キューブとメジャーの作成
ディメンション・オブジェクト・モデルのキューブは、MdmCube
クラスで表されます。 MdmCube
は、1つまたは複数のMdmMeasure
オブジェクトを所有しています。 これには、メジャーのディメンションを決めるMdmPrimaryDimension
オブジェクトのリストがあります。
MdmCube
には、次のオブジェクトが関連付けられます。
-
MdmPrimaryDimension
オブジェクト: キューブの次元性を指定します。 -
MdmMeasure
オブジェクト: ディメンションによって識別されるデータを格納します。 -
1つの
CubeOrganization
オブジェクト: メジャー・データをキューブが格納および管理する方法を指定します。 -
CubeMap
オブジェクト: キューブをリレーショナル・ソースに関連付けます。 -
1つの
ConsistentSolveSpecification
オブジェクト: 集計レベル・データを計算または解決する方法を指定します。
次の例は、キューブとそのメジャーの作成とマッピングを示しています。
4.5.1 キューブの作成
例4-7 MdmCubeの作成とマッピング
この例では、キューブとそれに関連付けられたオブジェクトの一部を作成します。 これは、名前がPRICE_CUBE_AWJのMdmCube
を作成します。 また、キューブをアナリティク・ワークスペースにデプロイするためのAWCubeOrganization
オブジェクトを作成します。 mdmDBSchema
およびaw
オブジェクトは例4-1で作成したもの、leafLevel
ArrayList
は例4-4で作成したものです。 mdmTimeDim
およびmdmProdDim
オブジェクトは、期間および製品カテゴリのディメンションです。 CreateAndBuildAW
プログラムは、これらのディメンションを作成します。 この例の最後の行は、それぞれ「例4-8」と「例4-9」のメソッドを呼び出します。
private MdmCube createAndMapCube(MdmPrimaryDimension mdmTimeDim, MdmPrimaryDimension mdmProdDim) { MdmCube mdmPriceCube = mdmDBSchema.findOrCreateCube("PRICE_CUBE_AWJ"); // Add dimensions to the cube. mdmPriceCube.addDimension(mdmTimeDim); mdmPriceCube.addDimension(mdmProdDim); AWCubeOrganization awCubeOrg = mdmPriceCube.findOrCreateAWCubeOrganization(aw); awCubeOrg.setMVOption(AWCubeOrganization.NONE_MV_OPTION); awCubeOrg.setMeasureStorage(AWCubeOrganization.SHARED_MEASURE_STORAGE); awCubeOrg.setCubeStorageType("NUMBER"); AggregationCommand aggCommand = new AggregationCommand("AVG"); ArrayList<ConsistentSolveCommand> solveCommands = new ArrayList(); solveCommands.add(aggCommand); ConsistentSolveSpecification conSolveSpec = new ConsistentSolveSpecification(solveCommands); mdmPriceCube.setConsistentSolveSpecification(conSolveSpec); // Create and map the measures of the cube. createAndMapMeasures(mdmPriceCube); // Commit the Transaction. commit(mdmPriceCube); }
4.5.2 メジャーの作成とマッピング
例4-8 メジャーの作成とマッピング
この例では、キューブのメジャーを作成し、メジャーをリレーショナル・データベースのファクト表にマップします。 この例では、「例4-7」によって作成されたキューブを使用します。
private void createAndMapMeasures(MdmCube mdmPriceCube) { ArrayList<MdmBaseMeasure> measures = new ArrayList(); MdmBaseMeasure mdmCostMeasure = mdmPriceCube.findOrCreateBaseMeasure("UNIT_COST"); MdmBaseMeasure mdmPriceMeasure = mdmPriceCube.findOrCreateBaseMeasure("UNIT_PRICE"); mdmCostMeasure.setAllowAutoDataTypeChange(true); mdmPriceMeasure.setAllowAutoDataTypeChange(true); measures.add(mdmCostMeasure); measures.add(mdmPriceMeasure); MdmTable priceCostTable = (MdmTable)mdmDBSchema.getTopLevelObject("PRICE_FACT"); Query cubeQuery = priceCostTable.getQuery(); ArrayList<String> measureColumns = new ArrayList(); measureColumns.add("GLOBAL.PRICE_FACT.UNIT_COST"); measureColumns.add("GLOBAL.PRICE_FACT.UNIT_PRICE"); CubeMap cubeMap = mdmPriceCube.findOrCreateCubeMap(); cubeMap.setQuery(cubeQuery); // Create MeasureMap objects for the measures of the cube and // set the expressions for the measures. The expressions specify the // columns of the fact table for the measures. int i = 0; for(MdmBaseMeasure mdmBaseMeasure : measures) { MeasureMap measureMap = cubeMap.findOrCreateMeasureMap(mdmBaseMeasure); Expression expr = (Expression)SyntaxObject.fromSyntax(measureColumns.get(i), metadataProvider); measureMap.setExpression(expr); i++; } // Create CubeDimensionalityMap objects for the dimensions of the cube and // set the expressions for the dimensions. The expressions specify the // columns of the fact table for the dimensions. ArrayList<String> factColNames = new ArrayList(); factColNames.add("GLOBAL.PRICE_FACT.MONTH_ID"); factColNames.add("GLOBAL.PRICE_FACT.ITEM_ID"); List<MdmDimensionality> mdmDimltys = mdmPriceCube.getDimensionality(); for (MdmDimensionality mdmDimlty: mdmDimltys) { CubeDimensionalityMap cubeDimMap = cubeMap.findOrCreateCubeDimensionalityMap(mdmDimlty); MdmPrimaryDimension mdmPrimDim = (MdmPrimaryDimension)mdmDimlty.getDimension(); String columnMap = null; if (mdmPrimDim.getName().startsWith("TIME")) { columnMap = factColNames.get(0); i = 0; } else// (mdmPrimDim.getName().startsWith("PRODUCT")) { columnMap = factColNames.get(1); i = 1; } Expression expr = (Expression)SyntaxObject.fromSyntax(columnMap,metadataProvider); cubeDimMap.setExpression(expr); // Associate the leaf level of the hierarchy with the cube. MdmHierarchy mdmDefHier = mdmPrimDim.getDefaultHierarchy(); MdmLevelHierarchy mdmLevHier = (MdmLevelHierarchy)mdmDefHier; List<MdmHierarchyLevel> levHierList = mdmLevHier.getHierarchyLevels(); // The last element in the list must be the leaf level of the hierarchy. MdmHierarchyLevel leafLevel = levHierList.get(levHierList.size() - 1); cubeDimMap.setMappedDimension(leafLevel); } }
4.6 Transactionのコミット
メタデータ・オブジェクトを、データベースに永続エンティティとして保存するには、そのメタデータ・オブジェクトを作成したTransaction
をコミットする必要があります。 Transaction
はいつでもコミットできます。 Transaction
をコミットするタイミングとしては、最上位レベルのオブジェクト、および最上位レベルのオブジェクトが所有するオブジェクトを作成した後をお薦めします。
例4-9では、セッションのDataProvider
からTransactionProvider
を取得し、現在のTransaction
をコミットします。
例4-9 Transactionのコミット
private void commit(MdmSource mdmSource) { try { System.out.println("Committing the transaction for " + mdmSource.getName() + "."); (dp.getTransactionProvider()).commitCurrentTransaction(); } catch (Exception ex) { System.out.println("Could not commit the Transaction. " + ex); } }
4.7 XMLテンプレートのエクスポートとインポート
メタデータ・オブジェクトの定義を保存するには、該当オブジェクトをXMLテンプレートにエクスポートします。 オブジェクトをエクスポートすると、そのオブジェクトの定義、およびそのオブジェクトが所有するすべてのオブジェクトの定義が保存されます。 たとえば、AW
オブジェクトをXMLにエクスポートすると、XMLには、AW
が所有するMdmPrimaryDimension
およびMdmCube
オブジェクト、およびディメンションおよびキューブが所有するMdmAttribute
、MdmMeasure
およびその他のオブジェクトの定義が含まれます。
メタデータ・オブジェクトの定義は、XMLテンプレートとしてインポートできます。 インポート後は、オブジェクトを構築する必要があります。
例4-10 XMLテンプレートへのエクスポート
この例では、メタデータ・オブジェクトをXMLテンプレートにエクスポートし、ファイルに保存します。 この例の冒頭にある抜粋コードは、エクスポートするオブジェクトのList
を作成します。 List
にaw
オブジェクトが追加されます。aw
オブジェクトは、「例4-1」によって作成されたアナリティク・ワークスペースです。 次に、exportToXML
メソッドを呼び出します。
... // In some method. List objectsToExport = new ArrayList(); objectsToExport.add(aw); exportToXML(objectsToExport, "globalawj.xml"); ... public void exportToXML(List objectsToExport, String fileName) { try { PrintWriter writer = new PrintWriter(new FileWriter(filename)); mp.exportFullXML(writer, // mp is the MdmMetadataProvider objectsToExport, null, // No Map for renaming objects false); // Do not include the owner name writer.close(); } catch (IOException ie) { ie.printStackTrace(); } }
4.8 アナリティック・ワークスペースの構築
メタデータ・オブジェクトを作成およびマップした後、またはオブジェクトのXML定義をインポートした後には、オブジェクトが指定する計算を実行し、結果のデータを物理記憶域構造にロードする必要があります。
例4-11では、アナリティック・ワークスペースのディメンションおよびキューブのBuildItem
オブジェクトを作成します。 BuildItem
オブジェクトを指定するBuildProcess
を作成し、そのセッションのDataProvider
のexecuteBuild
メソッドにBuildProcess
を渡します。
例4-11 アナリティック・ワークスペースの構築
BuildItem bldChanDim = new BuildItem(mdmChanDim); BuildItem bldProdDim = new BuildItem(mdmProdDim); BuildItem bldCustDim = new BuildItem(mdmCustDim); BuildItem bldTimeDim = new BuildItem(mdmTimeDim); BuildItem bldUnitsCube = new BuildItem(mdmUnitsCube); BuildItem bldPriceCube = new BuildItem(mdmPriceCube); ArrayList<BuildItem> items = new ArrayList(); items.add(bldChanDim); items.add(bldProdDim); items.add(bldCustDim); items.add(bldTimeDim); items.add(bldUnitsCube); items.add(bldPriceCube); BuildProcess bldProc = new BuildProcess(items); try { dp.executeBuild(bldProc, 0); } catch (Exception ex) { System.out.println("Could not execute the BuildProcess." + ex); }