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
パッケージのクラスを使用して、メタデータ・オブジェクトをリレーショナル・ソース・オブジェクトにマップし、アナリティク・ワークスペースをビルドします。 oracle.olapi.syntax
パッケージのクラスを使用して、メタデータのマッピングに使用するExpression
オブジェクトを指定します。 oracle.olapi.metadata.deployment
パッケージのクラスを使用して、メタデータ・オブジェクトをアナリティク・ワークスペースまたはリレーショナル・データベース(ROLAP)組織にデプロイします。
次に、アナリティック・ワークスペースに次元モデルをOLAP Java APIオブジェクトとして実装する基本ステップを示します。
-
AW
オブジェクト、MdmPrimaryDimension
およびMdmCube
オブジェクトを作成します。 -
MdmPrimaryDimension
およびMdmCube
オブジェクトをAW
にデプロイします。 -
MdmPrimaryDimension
ごとにMdmDimensionLevel
、MdmHierarchy
およびMdmAttribute
オブジェクトを作成し、MdmHierarchyLevel
オブジェクトを作成してMdmDimensionLevel
オブジェクトをMdmHierarchy
に関連付け、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
によって所有されます。 findOrCreateTimeDimension
またはMdmDatabaseSchema
の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
は、同じレベルのディメンションのメンバーを表します。 通常、レベルのメンバーは、リレーショナル・ソースのディメンション表の列内に格納されます。 MemberListMap
は、MdmDimensionLevel
をリレーショナル・ソースに関連付けます。
「例4-3」は、CHANNEL_AWJディメンションに対して2つのMdmDimensionLevel
オブジェクトを作成し、ディメンション・レベルを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
オブジェクトを使用します。 MdmHierarchyLevel
オブジェクトは、MdmDimensionLevel
オブジェクトがマップされるのと同じリレーショナル・ソース・オブジェクトにマップされます。
例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という名前の表があります。 この表には、従業員およびマネージャ用の列があります。 従業員のディメンションを作成できます。 次に、「例4-5」に示すように、従業員列を階層のベース値としてマップし、マネージャ列を親リレーションとしてマップするMdmValueHierarchy
を作成できます。 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
オブジェクト。 -
キューブがメジャー・データを格納および管理する方法を指定する
CubeOrganization
。 -
キューブをリレーショナル・ソースに関連付ける
CubeMap
オブジェクト。 -
集計レベル・データの計算または解決方法を指定する
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 トランザクションのコミット
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
を作成します。 「例4-1」によって作成されたアナリティク・ワークスペースであるaw
オブジェクトをList
に追加します。 次に、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
を作成し、BuildProcess
をセッションのDataProvider
のexecuteBuild
メソッドに渡します。
例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); }
親トピック: メタデータおよびアナリティク・ワークスペースの作成