機械翻訳について

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オブジェクトとして実装する基本ステップを示します。

  1. AWオブジェクト、MdmPrimaryDimensionおよびMdmCubeオブジェクトを作成します。

  2. MdmPrimaryDimensionおよびMdmCubeオブジェクトを AWにデプロイします。

  3. MdmPrimaryDimensionごとにMdmDimensionLevelMdmHierarchyおよびMdmAttributeオブジェクトを作成し、MdmHierarchyLevelオブジェクトを作成してMdmDimensionLevelオブジェクトをMdmHierarchyに関連付け、MdmCubeオブジェクトのMdmMeasureおよび関連オブジェクトを作成します。

  4. メタデータ・オブジェクトを基本データのリレーショナル・ソースにマップします。

  5. Transactionをコミットすると、データベースに永続オブジェクトが作成されます。

  6. アナリティック・ワークスペースを構築して、リレーショナル・ソースからオブジェクトにデータをロードします。

これらのステップを説明するトピックのリストは、「メタデータおよびアナリティク・ワークスペースの作成」を参照してください。

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またはMdmDatabaseSchemafindOrCreateStandardDimensionメソッドを使用してディメンションを作成します。 レベルを持たないディメンションをリレーショナル・データ・ソースにマップするには、ディメンションの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ユーザーのMdmDatabaseSchemadpDataProvidermpMdmMetadataProviderです。 この例では、データベースへの接続、DataProviderの取得およびUserSessionの作成、MdmMetadataProviderMdmRootSchemaまたは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がディメンション・メンバーの特性または関係から導出する値を表します。 たとえば、MdmPrimaryDimensiongetParentAttributeメソッドは、各ディメンション・メンバーの親を記録するMdmDerivedAttributeを返します。

findOrCreateBaseAttributeメソッドを使用して、ディメンションのベース属性を作成します。 属性のデータ型を指定できますが、多くの属性に対して、Oracle OLAPは属性マッピングからデータ型を決定できます。 setAllowAutoDataTypeChangeメソッドを使用すると、Oracle OLAPがデータ型を決定するように指定できます。 ディメンション・メンバーの説明や、計算で使用できる日付情報の提供など、特定の方法でディメンションで使用される属性もあります。 たとえば、ディメンションのsetValueDescriptionAttributeメソッドを使用して説明の属性を指定し、MdmTimeDimensionsetEndDateAttributeメソッドを使用して終了日時の値を含む属性を指定できます。

「例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」は、各ディメンション・レベルのMemberListMapfindOrCreateAttributeMapメソッドをコールして、各ディメンション・レベルの詳細記述属性の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オブジェクト、およびディメンションおよびキューブが所有するMdmAttributeMdmMeasureおよびその他のオブジェクトの定義が含まれます。

メタデータ・オブジェクトの定義は、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をセッションのDataProviderexecuteBuildメソッドに渡します。

例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);
}