機械翻訳について

4 メタデータとアナリティック・ワークスペースの作成

この章では、新しいメタデータ・オブジェクトを作成し、それをリレーショナル構造または式にマップする方法について説明します。 メタデータ・オブジェクトの定義をXMLテンプレートにエクスポートおよびインポートする方法について説明します。 また、オブジェクトをアナリティク・ワークスペースに関連付ける方法と、アナリティク・ワークスペースを構築する方法についても説明します。

この章の例は、CreateMetadataAndAW.javaサンプル・プログラムの例です。 このプログラムは、CreateAndBuildAW.javaSpecifyAWValues.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オブジェクトとして実装する基本手順を示します。

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

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

  3. MdmPrimaryDimensionMdmDimensionLevelMdmHierarchy、およびMdmAttributeオブジェクトを作成し、MdmDimensionLevelオブジェクトをMdmHierarchyに関連付けるMdmHierarchyLevelオブジェクトを作成し、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が所有します。 ディメンションを作成するには、MdmDatabaseSchemafindOrCreateTimeDimensionまたは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-3ArrayListオブジェクトが使用されます。 これによって、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ユーザーの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オブジェクト: ディメンションによって識別されるデータを格納します。

  • 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オブジェクト、およびディメンションおよびキューブが所有するMdmAttributeMdmMeasureおよびその他のオブジェクトの定義が含まれます。

メタデータ・オブジェクトの定義は、XMLテンプレートとしてインポートできます。 インポート後は、オブジェクトを構築する必要があります。

例4-10 XMLテンプレートへのエクスポート

この例では、メタデータ・オブジェクトをXMLテンプレートにエクスポートし、ファイルに保存します。 この例の冒頭にある抜粋コードは、エクスポートするオブジェクトのListを作成します。 Listawオブジェクトが追加されます。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を作成し、そのセッションのDataProviderexecuteBuildメソッドに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);
}