機械翻訳について

2 OLAP Java APIメタデータの理解

この章では、OLAPディメンション・メタデータ・オブジェクトおよびリレーショナル・メタデータ・オブジェクトを表すOracle OLAP Java APIのクラスについて説明します。 また、メタデータ・オブジェクトおよびデータ・ソースへのアクセスを提供するクラス、またはメタデータ・オブジェクトに関する情報を含むクラスについても説明します。 この章では、次の項目について説明します。

既存のメタデータ・オブジェクトの取得の詳細は、「メタデータの検出」を参照してください。 メタデータ・オブジェクトの作成の詳細は、「メタデータおよびアナリティク・ワークスペースの作成」を参照してください。

2.1 OLAP Java APIメタデータ・クラスの概要

「OLAP Java APIの概要」は、OLAPディメンション・データ・モデルを示し、そのモデルを実装するOLAP Java APIクラスの一部について簡単に説明します。 これらのクラスは、oracle.olapi.metadataパッケージにあります。 これらのクラスを使用して、次のタスクを実行できます。

  • 使用可能なメタデータ・オブジェクトへのアクセスの取得

  • 新規メタデータ・オブジェクトの作成

  • メタデータ・オブジェクトをアナリティク・ワークスペースまたはリレーショナル・オブジェクトとしてデプロイ

  • データ・ソースへのメタデータ・オブジェクトのマッピング

  • メタデータ・オブジェクトをXMLにエクスポートするか、XMLからインポート

  • データを問い合せるSourceオブジェクトを作成

「図2-1」は、oracle.olapi.metadataパッケージを示します。

図2-1 oracle.olapi.metadataパッケージ

図2-1の説明が続きます
「図2-1 oracle.olapi.metadataパッケージ」の説明

パッケージは次のとおりです:

  • oracle.olapi.metadata。メタデータ・オブジェクトおよびメタデータ・プロバイダの最も基本的な特性を指定するインタフェースおよび抽象クラスがあります。

  • oracle.olapi.metadata.mdm。MDM (多次元モデル)メタデータ・モデルを実装するクラスがあります。 このパッケージには、メタデータ・オブジェクトを表すクラス、それらのオブジェクトへのアクセスを提供するクラス、およびオブジェクトに関する説明情報を含むクラスがあります。

  • oracle.olapi.metadata.deployment。メタデータ・オブジェクトの編成をアナリティク・ワークスペース・オブジェクトまたはリレーショナル・オブジェクトとして指定するクラスがあります。

  • oracle.olapi.metadata.mapping。メタデータ・オブジェクトをリレーショナル・データ・ソースにマップするクラスがあります。

oracle.olapi.metadata.mdmパッケージの一部のクラスは、OLAPディメンション・メタデータ・オブジェクトに直接対応しています。 「表2-1」は、これらの対応の一部を示します。

表2-1 対応するディメンションおよびメーター・データ管理オブジェクト

ディメンション・メタデータ・オブジェクト MDMメタデータ・オブジェクト

キューブ

MdmCube

メジャー

MdmBaseMeasure

計算済メジャー

MdmDerivedMeasure

メジャー・フォルダ

MdmOrganizationalSchema

ディメンション

MdmTimeDimensionおよびMdmStandardDimension

階層

MdmLevelHierarchyおよびMdmValueHierarchy

レベル

MdmDimensionLevelおよびMdmHierarchyLevel

属性

MdmBaseAttributeおよびMdmDerivedAttribute

パッケージ内の他のクラスは、リレーショナル・オブジェクトに対応しています。 「表2-2」は、これらの対応を示します。

表2-2 対応するリレーショナル・オブジェクトおよびMDMオブジェクト

リレーショナル・オブジェクト MDMメタデータ・オブジェクト

スキーマ

MdmDatabaseSchema

MdmTable

表の列

MdmColumn

2.2 メタデータ・オブジェクトの識別、説明および分類

ほとんどのOLAP Java APIメタデータ・オブジェクトには、一意の識別子(ID)、名前、所有者またはそれを含むオブジェクトがあります。 摘要および分類をほとんどのメタデータ・オブジェクトに関連付けることもできます。

ほとんどのメタデータ・クラスは、抽象oracle.olapi.metadata.BaseMetadataObjectクラスを拡張します。 BaseMetadataObjectには、名前とIDを指定できます。 ほとんどのメタデータ・オブジェクトは名前で取得できます。 このIDはOracle OLAPによって内部的に使用されますが、アプリケーションではIDを使用して一部のメタデータ・オブジェクトを取得することもできます。

BaseMetadataObjectには、getOwnerメソッドによって返される所有者もあります。 ほとんどのメタデータ・オブジェクトの場合、所有者はMdmDatabaseSchemaです。 MdmRootSchemaおよびMdmMeasureDimensionオブジェクトの場合、所有者はルート・スキーマです。 BaseMetadataObjectのサブクラスではないMdmViewColumnの場合、getOwnerメソッドは、MdmPrimaryDimensionMdmBaseAttributeMdmMeasureなどのMdmViewColumnOwnerインタフェースの所有実装を返します。 MdmViewColumnは、OLAPビューの列を表します。 OLAPビューの詳細は、OLAPビューの使用を参照してください。

一部のBaseMetadataObjectオブジェクトは、それらを作成したメタデータ・オブジェクトによって格納されます。 たとえば、MdmBaseMeasureは、それを作成したMdmCubeによって含まれます。 メタデータ・オブジェクトのコンテナを取得するには、getContainedByObjectメソッドをコールします。

MdmObjectクラス(BaseMetadataObjectの抽象サブクラス)は、記述オブジェクトおよび分類との関連付けを追加します。 通常、記述オブジェクトには、メタデータ・オブジェクト自体に関連付ける名前または説明テキストが含まれます。 アプリケーションは、多くの場合、ユーザー・インタフェースでの表示目的で記述オブジェクトを使用します。 分類は、アプリケーションがメタデータ・オブジェクトに割り当てる文字列値です。 アプリケーションは、必要な目的のために分類を処理します。

2.2.1 オブジェクトの識別

BaseMetadataObjectオブジェクトは、名前およびIDで識別できます。 名前空間は、レガシー・メタデータ・オブジェクトのタイプと形式を識別します。

2.2.1.1 名前の取得および設定

ほとんどのメタデータ・オブジェクトには、オブジェクトのgetNameメソッドをコールして取得できる名前があります。 オブジェクトによっては、オブジェクトの作成時に名前を割り当てることができます。 たとえば、oracle.olapi.metadata.deployment.AWオブジェクトはアナリティク・ワークスペースを表します。 MdmDatabaseSchemafindOrCreateAWメソッドをコールしてAWを作成する場合、メソッドのpublicNameパラメータを使用して、メソッドが返すAWオブジェクトの名前を指定します。

一部のオブジェクトでは、setNameメソッドを使用して既存のオブジェクトの名前を変更できます。 たとえば、ディメンション・オブジェクトのsetNameメソッドをコールして、MdmStandardDimensionの名前を変更できます。 新しい名前は、セッションのルートTransactionをコミットするまで有効になりません。 setNameをコールした後、ルートTransactionをコミットする前に、getNewNameメソッドは新しい名前を返し、getNameメソッドは既存の名前を返します。 名前によるオブジェクトの取得の詳細は、トランザクションでのメタデータ・オブジェクトまたは問合せの作成についてを参照してください

一部のオブジェクトは、MdmDatabaseSchemaから名前で取得できます。 名前によるオブジェクトの取得の詳細は、スキーマの表現を参照してください。

ユーザー・インタフェースでの名前または説明の表示、または任意の目的で使用するために、MdmDescriptionクラスを使用して、任意の数の名前および説明をMdmObjectに関連付けることができます。 そのクラスの使用方法の詳細は、説明の使用を参照してください。

2.2.1.2 一意の識別子の説明

ほとんどのメタデータ・オブジェクトには、一意の識別子(ID)があります。 識別子には、次のいずれかの形式があります。

  • objectName

  • ownerName.objectName

  • ownerName.containerName.objectName

たとえば、ユーザーGLOBALのスキーマを表すMdmDatabaseSchemaの場合、getIDメソッドによって返される識別子はGLOBALです。 PRODUCT_AWJという名前のMdmPrimaryDimensionの場合、getIDメソッドはGLOBAL.PRODUCT_AWJを返し、PRODUCT_PRIMARYという名前のディメンションのMdmLevelHierarchyの場合、メソッドはGLOBAL.PRODUCT_AWJ.PRODUCT_PRIMARYを返します。

メタデータ・オブジェクトのIDは永続的です。 ただし、メタデータ・オブジェクトの名前または所有者が変更されると、IDも変更されます。 IDによるオブジェクトの取得の詳細は、IDによるメタデータ・オブジェクトの取得を参照してください。

従来の10gメタデータ・オブジェクトの場合、識別子の最初の部分はネームスペースです。 ネームスペースの後にネームスペース・デリミタ(2つのピリオド)が続きます。 10gディメンションの識別子の例は、AWXML_DIMENSION..GLOBAL.PRODUCT_AWです。

2.2.1.3 レガシー・メタデータ・オブジェクトのサポート

Oracle Database、リリース11g、Oracle Database、リリース11gでは、Oracle OLAPはレガシー10g OLAP Java APIアプリケーションをサポートしています。 ネームスペースは、10gメタデータ・オブジェクトを識別し、11gオブジェクトと同じセッションに存在できるようにします。

2.2.1.3.1 レガシー・アプリケーションのサポート

10gで作成されたOLAPメタデータ・オブジェクトを使用するレガシー・アプリケーションをサポートするために、oracle.olapi.data.source.DataProviderクラスにはメタデータ・リーダー・モードがあります。 デフォルトでは、メタデータ・リーダーはOracle OLAPの10gおよび11gメタデータ・オブジェクトを認識します。 メタデータ・リーダー・モードは、java.util.Propertiesオブジェクトのプロパティを使用して、または適切なXML形式の文字列を使用して指定できます。 モードおよびモードの指定方法の詳細は、「Oracle OLAP Java APIリファレンス」ドキュメントのDataProviderクラスのコンストラクタ・メソッドを参照してください。

2.2.1.3.2 ネームスペースの説明

Oracle Databaseのリリース10gでは、Oracle OLAPキューブ、ディメンションまたはメジャー・フォルダの名前がリレーショナル表またはビューと同じである可能性があります。 リリース11gでは、最上位レベルのOLAPメタデータ・オブジェクトはOracle Databaseデータ・ディクショナリに格納されるため、別のリレーショナル・オブジェクトと同じ名前を持つことはできません。 名前空間指定により、レガシーOLAP Java API 10gメタデータ・オブジェクトは、11gメタデータ・オブジェクトと同じセッションに存在できます。 このようなレガシー・メタデータ・オブジェクトは、Oracle OLAP Analytic Workspace Java APIのoracle.olapi.AWXMLパッケージのクラスを使用するか、CWM PL/SQLパッケージを使用して作成されました。 10gおよび11gオブジェクトを同じセッション内に存在させるには、DataProviderのメタデータ・リーダー・モードをALLに設定する必要があります。 ALLモードは、デフォルトのメタデータ・リーダー・モードです。 メタデータ・リーダー・モード設定の詳細は、「Oracle OLAP Java APIリファレンス」DataProviderクラスのドキュメントを参照してください。

10gキューブ、ディメンションおよびメジャー・フォルダのメタデータ・オブジェクトは、11gMdmCubeMdmPrimaryDimensionおよびMdmSchemaクラスによって表されます。 いずれかのクラスのインスタンスには、getNamespaceメソッドによって返されるネームスペースを関連付けることができます。 11gオブジェクトの場合、ネームスペースはnullです。

10gオブジェクトの11g XML定義には、Namespace属性があります。 メタデータ・オブジェクトのXML定義のエクスポートおよびインポートの詳細は、XMLテンプレートとしてのメタデータのエクスポートおよびインポートを参照してください。

レガシー・メタデータ・オブジェクトのネームスペースは、メタデータ形式とオブジェクトのタイプを識別します。 AWXML_またはCWM_のいずれかで始まり、CUBEDIMENSIONなどのオブジェクトのタイプを持ちます。 たとえば、Oracle Database 10gリリース2 (10.2)でOracle OLAP Analytic Workspace Java APIを使用して作成されたディメンションは、11gでネームスペースAWXML_DIMENSIONを持ちます。

有効なネームスペースは、MdmMetadataProviderクラスの静的定数フィールドによって表されます。 そのクラスのgetValidNamespacesメソッドは、デフォルト・ネームスペースを含む有効なネームスペースのリストを返します。 新しいネームスペースは作成できません。

定数フィールドを使用して、MdmDatabaseSchemaからレガシー・メタデータ・オブジェクトを取得できます。 たとえば、次のコードはPRODUCT_AWディメンションを取得します。 コードでは、mdmDBSchemaはGLOBALユーザーのMdmDatabaseSchemaです。

MdmStandardDimension mdmProdAWDim =
  mdmDBSchema.findOrCreateStandardDimension("PRODUCT_AW",
    MdmMetadataProvider.AWXML_DIMENSION_NAMESPACE);

ALLメタデータ・リーダー・モードでは、既存の10gメタデータ・オブジェクトを取得しますが、新しいメタデータ・オブジェクトは作成できません。 レガシー・メタデータ・オブジェクトが存在しない場合、メソッドは、指定された名前を持つ11gオブジェクトを返します。

2.2.2 説明の使用

MdmDescriptionオブジェクトを使用すると、MdmObjectオブジェクトに説明情報を関連付けることができます。

MdmDescriptionTypeオブジェクトは、MdmDescriptionの説明のタイプを表します。 MdmDescriptionオブジェクトを使用すると、ユーザー・インタフェースでメタデータ・オブジェクトの名前、説明またはその他の情報を表示できます。 MdmDescriptionオブジェクトは、アプリケーションによって作成、割当ておよび処理されます。

ノート:

MdmDescriptionを介してMdmObjectに関連付けるわかりやすい名前は、MdmObject.getNameメソッドによって返されるオブジェクト名ではありません。 オブジェクト名は、Oracle OLAPによって内部的にオブジェクトを識別するために使用されます。 わかりやすい名前は、アプリケーションによってのみ使用されます。

OLAP Java APIは、いくつかのタイプの説明を定義します。 MdmDescriptionTypeクラスには、次の説明タイプを提供する静的メソッドがあります:

  • 名前

  • 短い名前

  • 長い名前

  • 複数名

  • 短い複数名

  • 長い複数名

  • 説明

  • 短い説明

  • 長い説明

MdmDescriptionTypeのメソッドをコールして、これらの定義済の説明タイプのいずれかを取得します。 たとえば、次のコードは、詳細名と詳細説明の摘要タイプ・オブジェクトを取得します。

MdmDescriptionType mdmLongNameDescrType =
  MdmDescriptionType.getLongNameDescriptionType();
MdmDescriptionType mdmLongDescrDescrType =
  MdmDescriptionType.getLongDescriptionDescriptionType();

MdmDescriptionTypeのコンストラクタ・メソッドを使用して、新しいタイプの記述を作成できます。 getDescriptiveTypeメソッドを使用して、MdmDescriptionTypeオブジェクトの型を取得できます。 次の最初の図は、MdmDescriptionTypeのメソッドを示しています。

定義済摘要タイプの中には、関連付けられたデフォルト摘要タイプがあるものがあります。 MdmDescriptionType(java.lang.String type, MdmDescriptionType defaultType)コンストラクタ・メソッドを使用して、デフォルトの説明タイプを変更するか、新規または既存のMdmDescriptionTypeにデフォルトの説明タイプを割り当てます。 getDescriptiveTypeDefaultメソッドを使用すると、MdmDescriptionTypeオブジェクトのデフォルト・タイプを取得できます。

例2-1 説明とMdmObjectの関連付け

MdmDescriptionオブジェクトをMdmObjectに関連付けるには、MdmObjectfindOrCreateDescriptionまたはsetDescriptionメソッドを使用します。 findOrCreateDescriptionメソッドは、MdmDescriptionオブジェクトを返します。 説明の値を指定するには、MdmDescriptionsetValueメソッドを使用します。

この例では、MdmDescriptionMdmObjectに関連付ける両方の方法を示します。 この例では、mdmProdDimMdmStandardDimensionオブジェクトです。

MdmDescription mdmShortNameDescr = 
  mdmProdDim.findOrCreateDescription(
    MdmDescriptionType.getShortNameDescriptionType(), "AMERICAN");
mdmShortNameDescr.setValue("Product");

mdmProdDim.setDescription(
  MdmDescriptionType.getLongNameDescriptionType(), "Product Dimension");

この図は、MdmDescriptionおよびMdmDescriptionTypeオブジェクトを使用するMdmObjectのメソッドを示しています。 また、MdmDescriptionクラスとMdmDescriptionTypeクラスとそのメソッド、およびクラス間の関連付けも表示されます。 MdmObjectには、ゼロから多数のMdmDescriptionオブジェクトを指定できます。 MdmDescriptionは、1つのMdmObjectと1つのMdmDescriptionTypeに関連付けられます。 MdmDescriptionTypeは、1つ以上のMdmDescriptionオブジェクトに関連付けることができます。

図2-2 MdmObjectおよびMdmDescription関連付け

図2-2の説明が続きます
「図2-2 MdmObjectとMdmDescriptionの関連付け」の説明

11gより前のOLAP Java APIのバージョンには、MdmDescriptionクラスおよびMdmDescriptionTypeクラスがありませんでした。 これらのバージョンでは、MdmObjectクラスには、説明を取得および設定するための次のメソッドのみがありました。

図2-3 11gの前に説明を取得および設定する方法

図2-3の説明が続きます
「図2-3 11gの前に説明を取得および設定するためのメソッド」の説明

下位互換性のために、OLAP Java APIはこれらのメソッドを引き続きサポートしますが、MdmDescriptionおよびMdmDescriptionTypeオブジェクトを使用して内部的に実装します。

2.2.3 分類の使用

分類は、MdmObjectのプロパティです。 分類をオブジェクトに割り当ててから、必要に応じて分類を使用します。 たとえば、値がHIDDENの分類を追加して、アプリケーションがユーザー・インタフェースにオブジェクトを表示しないように指定できます。 MdmObjectに分類を割り当てるには、オブジェクトのaddObjectClassificationメソッドを使用します。 getObjectClassificationsメソッドを使用して分類を取得し、removeObjectClassificationメソッドを使用して分類を削除できます。

2.3 メタデータ・オブジェクトの指定

Oracle OLAP Java APIメタデータ・オブジェクトへのアクセスは、最初はMdmMetadataProviderオブジェクトとMdmSchemaオブジェクトによって提供されます。 MdmMetadataProviderには、メタデータ・オブジェクトのXML表現をインポートまたはエクスポートする機能もあります。 次のトピックでは、MdmMetadataProviderクラスとその使用方法について説明します。

2.3.1 メタデータ・プロバイダの説明

OLAP Java APIメタデータ・オブジェクトを取得または作成するには、まずMdmMetadataProviderを作成する必要があります。 MdmMetadataProviderの作成については、MdmMetadataProviderの作成を参照してください。

MdmMetadataProvidergetRootSchemaメソッドを使用すると、MdmRootSchemaクラスのインスタンスであるルートMdmSchemaオブジェクトを取得できます。 ルート・スキーマは、MdmDatabaseSchemaオブジェクトのコンテナです。

MdmDatabaseSchemaオブジェクトは、AWMdmCubeMdmPrimaryDimensionオブジェクトなどのトップレベル・メタデータ・オブジェクトの所有者です。 トップレベル・オブジェクトはファースト・クラスのデータ・オブジェクトであり、Oracle Databaseデータ・ディクショナリで表されます。 データ・ディクショナリ内にあるため、これらのOLAPデータ・オブジェクトはSQL問合せで使用できます。 MdmDatabaseSchemafindOrCreateメソッドを使用して、最上位レベルのメタデータ・オブジェクトを作成します。

最上位のオブジェクトは、MdmMeasureMdmHierarchyMdmAttributeオブジェクトなどのオブジェクトのコンテナです。 最上位オブジェクトのメソッドを使用して、含まれるオブジェクトを作成します。

MdmSchemaオブジェクトの詳細は、スキーマの表現を参照してください。 トップレベルのメタデータ・オブジェクトの詳細は、データ・ソースへのアクセスの提供を参照してください。

MdmMetadataProvidergetMetadataObjectまたはgetMetadataObjectsメソッドをコールし、メタデータ・オブジェクトのIDを指定して、既存のメタデータ・オブジェクトを取得することもできます。

次のトピックでは、メタデータ・オブジェクトの取得について説明します:

2.3.1.1 IDによるメタデータ・オブジェクトの取得

通常は、所有オブジェクトのfindOrCreateメソッドをコールして、メタデータ・オブジェクトを取得または作成します。 たとえば、MdmCubeを取得または作成するには、MdmDatabaseSchemaオブジェクトのfindOrCreateCubeメソッドをコールします。 ただし、オブジェクトのIDを指定して、MdmMetadataProviderから既存のメタデータ・オブジェクトを取得することもできます。 MdmMetadataProvider.getMetadataObjectメソッドは、オブジェクトのIDであるStringを取り、オブジェクトを返します。 getMetadataObjectsメソッドは、IDのListを取り、オブジェクトのListを返します。

メタデータ・オブジェクトのIDは、あるセッションから格納し、そのIDで別のセッションで取得できます。 もちろん、格納されたIDによるオブジェクトの取得は、そのオブジェクトがまだ存在し、オブジェクトのIDが変更されていないことを前提としています。 一部のメタデータ・オブジェクトでは、名前または所有者を変更できます。 オブジェクトの名前または所有者が変更されると、オブジェクトのIDが変更されます。

2.3.1.2 XMLテンプレートとしてのメタデータのエクスポートおよびインポート

MdmMetadataProviderクラスには、これらのオブジェクトのXML定義との間でメタデータ・オブジェクトをエクスポートおよびインポートするための多数のメソッドがあります。 XML定義は、Oracle OLAPが定義したメタデータ・オブジェクトを作成できるテンプレートです。

XMLテンプレートを使用して、Oracle Databaseインスタンス間でメタデータ・オブジェクトを転送できます。 Analytic Workspace ManagerとOLAP Java APIアプリケーションの間でXMLテンプレートを交換できます。つまり、Analytic Workspace Managerでは、MdmMetadataProviderエクスポートXMLメソッドで作成したテンプレートをインポートできます。また、importXMLメソッドを使用して、Analytic Workspace Managerで作成されたXMLテンプレートをインポートできます。

XMLをエクスポートする場合、オブジェクトの名前を変更したり、XML属性の値のバインド変数を指定できます。 XMLWriterCallbackインタフェースの実装を指定して、エクスポート・プロセスのいくつかの側面を管理することもできます。 XMLをインポートする場合、インポートされたオブジェクトを所有するMdmDatabaseSchema、エクスポートされたXMLのバインド変数を置換するバインド値、およびインポート・プロセスの一部を管理するためのXMLParserCallbackインタフェースの実装を指定できます。

次のトピックでは、XMLテンプレートを使用したメタデータ・オブジェクトのエクスポートおよびインポートについて説明します。

2.3.1.2.1 XMLテンプレートのエクスポート

メタデータ・オブジェクトをXMLテンプレートにエクスポートする場合、MdmMetadataProviderには、exportFullXMLメソッドとexportIncrementalXMLメソッドの多くのシグネチャがあります。 メソッドは、テンプレートをjava.lang.Stringまたはjava.io.Writerにエクスポートします。

これらのメソッドによって生成されたXMLテンプレートを使用して、MdmMetadataProviderimportXMLメソッドを介してメタデータ・オブジェクトをインポートできます。 XMLテンプレートを使用して、Analytic Workspace Managerでメタデータ・オブジェクトをインポートすることもできます。

exportFullXMLメソッドは、指定されたオブジェクトまたは指定したoracle.olapi.transaction.Transaction以降に作成または変更したオブジェクトの完全なXML定義をエクスポートします。 exportFullXMLメソッドの使用例は、「例4-10」を参照してください。

exportIncrementalXMLメソッドは、指定されたTransaction以降にメタデータ・オブジェクトに対して変更されたXML属性のみをエクスポートします。 オブジェクトのListを指定すると、エクスポートされたテンプレートには、リスト内のオブジェクトに対して変更されたXML属性が含まれます。 エクスポートされた増分XMLには、変更されたオブジェクトの所有権および包含階層内のオブジェクトのタイプと名前が含まれます。

exportFullXMLおよびexportIncrementalXMLメソッドは、次のパラメータの様々な組合せを取ります。

  • エクスポートするオブジェクトのListまたはTransaction

  • Oracle OLAPがXMLをエクスポートするWriter Writerを指定しない場合、メソッドはXMLを含むjava.lang.Stringを返します。

  • メタデータ・オブジェクト参照がキーとしてあり、キーに対するオブジェクトとして、参照オブジェクトの新しい名前を含むString値を持つjava.util.Map このMapを使用すると、エクスポートするオブジェクトの名前を変更できます。 オブジェクトの名前を変更しない場合は、パラメータにnullを指定できます。

    このrenameMapパラメータにMapを指定すると、Oracle OLAP XMLジェネレータはエクスポート中に参照オブジェクトの名前を変更します。 XMLテンプレートのエクスポート中にオブジェクトの名前を変更してからテンプレートをインポートすることで、既存のオブジェクトの定義をこの方法でコピーできます。

  • エクスポートされたXMLに所有オブジェクトの名前を含めるかどうかを指定するboolean

  • キーとしてメタデータ・オブジェクト参照を持ち、キーのオブジェクトとして、SQLバインド変数と同様に機能するString値を持つ、オプションのMap このパラメータのバインド変数の詳細は、XMLテンプレートでのバインド変数の説明を参照してください。

  • oracle.olapi.metadata.XMLWriterCallbackインタフェースのオプションの実装。 XMLWriterCallbackを使用すると、エクスポートされたXMLから属性名または所有者名を除外するかどうかを指定できます。

祖先を共有するすべてのメタデータ・オブジェクトは、エクスポートされたXMLにグループ化されます。 最上位レベルのオブジェクトではなく、最上位レベルのコンテナがエクスポートするオブジェクトのListにないオブジェクトの場合、エクスポートされたテンプレートには、オブジェクトに対する増分定義と、その下の完全な定義が含まれます。 これにより、キューブ・テンプレート全体をエクスポートせずに、キューブ内の計算済メジャーなどのオブジェクトのエクスポートがサポートされます。

MdmDatabaseSchemaがエクスポートするオブジェクトのListにある場合、エクスポートされたテンプレートには、データベース・スキーマ内のすべてのオブジェクトが含まれます。 oracle.olapi.metadata.deployment.AWオブジェクトがListにある場合、エクスポートされたテンプレートには、AWに含まれるすべてのオブジェクトが含まれます。 リスト内のMdmRootSchemaは無視されます。

2.3.1.2.2 XMLテンプレートのインポート

メタデータ・オブジェクトをXMLテンプレートとしてインポートする場合、MdmMetadataProviderにはimportXMLメソッドのいくつかのシグネチャがあります。

importXMLメソッドは、オブジェクトのXML定義をインポートし、新しいオブジェクトを作成するか、既存のオブジェクトを変更します。 importXMLメソッドは、次のパラメータの様々な組合せを取ります。

  • XMLの入力用のjava.io.Reader、またはインポートするXMLを含むString

  • 新規または変更されたメタデータ・オブジェクトを含むMdmDatabaseSchema

  • booleanmodifyIfExistsは、インポートされたXML定義の差異で同じ名前の既存のオブジェクトを変更するかどうかを示します。

  • キーとしてバインド変数を含み、キーのオブジェクトとしてバインド変数を置換するString値を含む、オプションのMapbindValues このパラメータのバインド値の詳細は、XMLテンプレートでのバインド変数の説明を参照してください。

  • oracle.olapi.metadata.XMLParserCallbackインタフェースのオプションの実装。

modifyIfExistsパラメータの値がtrueで、インポートされたXMLにすでに存在するオブジェクトの完全な定義が含まれていて、オブジェクト定義がXMLと異なる場合、メソッドはオブジェクト定義の新しい要素または変更された要素をオブジェクトの既存の定義とマージします。 modifyIfExistsの値がfalseで、すでに存在するオブジェクトの完全な定義がXMLに含まれている場合、importXMLメソッドは例外をスローします。

bindValuesパラメータを使用すると、Oracle OLAPがXMLテンプレートのインポート時にバインド変数の置換に使用するキー/オブジェクトのペアを持つMapを指定できます。 Mapのキーは置換するバインド変数で、キーとペアになるオブジェクトはバインド変数を置換する値です。 テンプレートをインポートするときに、バインド変数をキーとして含むMapを指定すると、Oracle OLAPは、インポートされたXMLのバインド変数を、bindValues Mapのバインド変数に指定された値に置き換えます。

XMLParserCallbackインタフェースの実装をparserCallbackパラメータとしてimportXMLメソッドに渡すことができます。 XMLParserCallbackを使用すると、XMLのインポート時に発生する可能性のあるエラーをOracle OLAPが処理する方法を指定できます。 XML11_2_ParserCallbackインタフェースは、インポートされたオブジェクトの名前を変更したり、インポートされたオブジェクトの属性を抑制するためのメソッドを追加します。

2.3.1.2.3 XMLテンプレートでのバインド変数の説明

exportFullXMLおよびexportIncrementalXMLメソッドには、オプションのbindVariablesパラメータがあります。 このパラメータは、メタデータ・オブジェクトをキーとして、String値をキーのオブジェクトとして持つMapです。 String値は、SQLバインド変数と同様に機能します。 XMLのエクスポート時に、Oracle OLAP XMLジェネレータによって、参照されるオブジェクトの名前がバインド変数に置き換えられます。

exportFullXMLまたはexportIncrementalXMLメソッドにbindVariablesパラメータにMapを指定した場合、メソッドによって生成されるXMLは次の宣言で始まります。

<!DOCTYPE Metadata [
<!ENTITY % BIND_VALUES PUBLIC "OLAP BIND VALUES" "OLAP METADATA">
%BIND_VALUES;
 ]>

bindVariablesマップで指定された値は、エクスポートされたXMLの書式"&BV;" (ここでBVはバインド変数)で表示されます。

importXMLメソッドのbindValuesパラメータは、XMLテンプレートのインポート時にOracle OLAPがバインド変数の置換に使用する値を指定します。 テンプレートをインポートする際に、バインド変数をキーとして含むMapを指定すると、Oracle OLAPは、インポートされたXMLのバインド変数を、Mapのバインド変数キーのオブジェクトとして指定されたStringに置き換えます。

bindValuesパラメータにMapを指定する場合、メソッドに指定するinXML文字列には!DOCTYPE Metadata宣言が含まれ、インポートするXMLのバインド変数は"&BV;"形式である必要があります。

2.3.2 スキーマの表現

スキーマは、MdmSchemaクラスとそのサブクラスで表されます。 MdmSchemaは、MdmCubeMdmDimensionおよびその他のMdmObjectオブジェクト(他のMdmSchemaオブジェクトを含む)の所有者またはコンテナです。 10g以前のバージョンのOLAP Java APIでは、MdmSchemaクラスに複数のロールがありました。 APIには、メジャー・フォルダごとに1つのルートMdmSchemaMdmSchema、およびアプリケーションが作成できるカスタムMdmSchemaオブジェクトがありました。

11g OLAP Java APIでは、異なるロールを分離および定義するためにMdmSchemaのサブクラスが導入されました。 11gでは、MdmSchemaは、以前のバージョンとの互換性、および10gメタデータ・リーダー・モードで使用するための具象クラスです。

11gでは、MdmSchemaは、MdmSchemaの次のサブクラスのインスタンスです:

  • MdmRootSchema。これは、MdmDatabaseSchemaオブジェクトのコンテナであり、システムによって提供されます。

  • MdmDatabaseSchema。データベース・ユーザーのリレーショナル・スキーマを表し、MdmCubeMdmDimensionおよびその他のMdmObjectオブジェクトを作成して所有します。 MdmDatabaseSchemaオブジェクトは、システムによって提供されます。

  • MdmOrganizationalSchema。メジャーおよびその他のMdmOrganizationalSchemaオブジェクトを編成するために使用できます。

次のトピックでは、MdmSchemaのサブクラスについて説明します。

2.3.2.1 ルート・スキーマの表現

ルート・スキーマは、データベース・スキーマ・オブジェクトのコンテナです。 この最上位スキーマは、MdmRootSchemaクラスで表されます。 MdmRootSchemaは、MdmMetadataProvidergetRootSchemaメソッドを使用して取得します。 MdmRootSchemaから、すべてのMdmDatabaseSchemaオブジェクトを取得することも、名前で個々のMdmDatabaseSchemaを取得することもできます。

MdmRootSchemaクラスには、MdmMetadataProviderによって提供されるすべてのMdmCubeMdmMeasureおよびMdmPrimaryDimensionオブジェクトも含まれており、これらのオブジェクトを取得するためのメソッドがあります。 ただし、これらのメソッドによって返されるオブジェクトのListには、ユーザーが表示する権限を持つキューブ、メジャーまたはディメンションのみが含まれます。

「図2-4」は、MdmMetadataProviderMdmSchemaのサブクラスの間の関連付けを示します。

図2-4 MdmMetadataProviderとMdmSchemaサブクラスの関連付け

図2-4の説明が続く
「図2-4 MdmMetadataProviderとMdmSchemaサブクラスの関連付け」の説明
2.3.2.2 データベース・スキーマの表現

データベース・ユーザーが所有するリレーショナル・スキーマは、MdmDatabaseSchemaオブジェクトで表されます。

MdmRootSchemaには、データベース・ユーザーごとに1つのMdmDatabaseSchemaオブジェクトがあります。 MdmDatabaseSchemaの名前はデータベース・ユーザーと同じです。 たとえば、ユーザーGLOBALのMdmDatabaseSchemaの名前はGLOBALです。

MdmRootSchemaのメソッドを使用して、1つまたはすべてのMdmDatabaseSchemaオブジェクトを取得できます。 ただし、MdmDatabaseSchemaが所有するオブジェクトへのアクセスは、セッションのユーザーに付与されるセキュリティ権限によって決まります。

MdmDatabaseSchemaは、最上位レベルのOLAPメタデータ・オブジェクトおよびそれらによって作成されたオブジェクトの所有者です。 MdmDatabaseSchemaを使用して、既存のメタデータ・オブジェクトを取得したり、新しいメタデータ・オブジェクトを作成します。 最上位オブジェクトは次のとおりです:

  • AW

  • MdmCube

  • MdmNamedBuildProcess

  • MdmOrganizationalSchema

  • MdmPrimaryDimension

  • MdmTable

MdmTableを除き、findOrCreateAWfindOrCreateStandardDimensionなどのfindOrCreateメソッドを使用して、新しい最上位オブジェクトを作成したり、既存のオブジェクトを取得したりできます。 オブジェクトの作成については、「メタデータの検出」を参照してください。

最上位レベルのOLAPメタデータ・オブジェクトを作成したTransactionをコミットすると、それらのオブジェクトがOracleデータ・ディクショナリに存在します。 これらのオブジェクトは通常のSQL問合せによって使用でき、Oracle OLAP Java APIを使用するアプリケーションでも使用できます。

メタデータ・オブジェクトはOracleデータ・ディクショナリに存在するため、Oracle Database DBAは特定のタイプのメタデータ・オブジェクトへのアクセスを制限できます。 クライアント・アプリケーションでは、JDBC APIを使用して、ユーザー・セッションのJDBC接続を介して標準のSQL GRANTおよびREVOKEコマンドを送信することで、このような制限を設定できます。

getTopLevelObjectメソッドを使用して、MdmTableまたはその他のトップレベル・オブジェクトを取得できます。 getAWsgetDimensionsgetOrganizationalSchemasなどのメソッドを使用して、特定のタイプのトップレベル・オブジェクトのすべてのインスタンスを取得することも、getSchemaObjectsを使用してMdmDatabaseSchemaが所有するすべてのオブジェクトを取得することもできます。 addAWremoveSchemaObjectなどのメソッドを使用して、最上位レベルのオブジェクトを追加または削除できます。

2.3.2.3 組織スキーマの表現

OLAPメジャー・フォルダは、メジャー、キューブおよびディメンションを編成します。 メジャー・フォルダは、MdmOrganizationalSchemaクラスで表されます。 メジャー・フォルダは、類似した名前のメジャーを区別する方法を提供します。 たとえば、ユーザーは、SALESまたはCOSTSという名前のメジャーを持つ複数のスキーマにアクセスできます。 同じ名前のメジャーを異なるMdmOrganizationalSchemaオブジェクトに分離できます。 MdmOrganizationalSchemaには、キューブ、ディメンションおよびメジャーを追加または削除するためのメソッドがあります。 組織スキーマをネストできるため、クラスには他のMdmOrganizationalSchemaオブジェクトを追加および削除するためのメソッドもあります。

2.4 データ・ソースへのアクセスの提供

mdmパッケージの一部のクラスで、データ・ストア内のデータを含むオブジェクトまたはデータへのアクセスを提供するオブジェクトを表します。 これらのクラスの中には、キューブ、メジャー、ディメンション、レベル、階層および属性を含むOLAPディメンション・データ・モデル・オブジェクトを表すものもあります。 その他のmdmクラスは、表などのリレーショナル・オブジェクト、またはビューや表の列を表します。

「図2-5」は、ディメンション・データ・モデル・オブジェクトを実装するクラス間の関連付けを示します。 MdmCubeには、ゼロから多数のMdmMeasureオブジェクトを含めることができます。 MdmMeasureは、1つのMdmCubeオブジェクトに含まれます。 MdmCubeには、ゼロから多数のMdmPrimaryDimensionオブジェクトを指定できます。これらのオブジェクトは、MdmDimensionalityオブジェクトを介して関連付けられます。 MdmPrimaryDimensionには、ゼロから多数のMdmDimensionLevelオブジェクト、MdmHierarchyオブジェクトおよびMdmAttributeオブジェクトを含めることができます。

図2-5 ディメンション・データ・モデル・クラスの関連付け

図2-5の説明が続きます
「図2-5 ディメンション・データ・モデル・クラスの関連付け」の説明

これらのディメンション・データ・オブジェクトまたはリレーショナル・データ・オブジェクトを表すクラスは、MdmSourceクラスのサブクラスです。 MdmSourceのサブクラスには、Sourceオブジェクトを戻すgetSourceメソッドがあります。 Sourceオブジェクトを使用して、データの問合せを定義します。 次に、Cursorオブジェクトを使用してデータを取得します。 SourceおよびCursorオブジェクトの操作の詳細は、「Sourceオブジェクトの理解」および「カーソル・クラスおよび概念の理解」を参照してください。

SQLを使用して、Oracle OLAPがキューブ、ディメンションおよび階層に対して自動的に生成するビューを問い合せることもできます。 これらのビューの問合せの詳細は、ディメンションおよび階層ビューおよびビュー列名の取得を参照してください。

次のトピックでは、データ・ソースへのアクセスを提供するクラスについて説明します。

2.4.1 キューブおよびメジャーの表現

キューブは、ディメンション・モデルの物理実装です。 同じディメンション・セットを持つメジャーを編成します。 キューブとメジャーはディメンション化されたオブジェクトで、キューブに関連付けられたディメンションはメジャーのデータを識別して分類します。 次のトピックでは、キューブおよびメジャーについて説明します。

2.4.1.1 キューブの表示

OLAPキューブは、MdmCubeクラスで表されます。 MdmCubeは、MdmMeasureオブジェクトのコンテナで、同じMdmPrimaryDimensionオブジェクトのセットによってディメンション化されます。 アプリケーションは、MdmCubefindOrCreateBaseMeasureおよびfindOrCreateDerivedMeasureメソッドを使用して、MdmBaseMeasureまたはMdmDerivedMeasureオブジェクトを作成します。 addDimensionメソッドを使用して、メジャーの各ディメンションをキューブに関連付けます。

MdmCubeは、通常、単一のファクト表またはビューに対応します。 表またはビューをキューブに関連付けるには、QueryおよびCubeMapオブジェクトを使用します。 表またはビューのQueryを取得し、CubeMapsetQueryメソッドを使用してQueryCubeMapに関連付けます。

CubeMapには、キューブのメジャーおよびディメンションをデータ・ソースにマップするMeasureMapおよびCubeDimensionalityMapオブジェクトが含まれます。 MeasureMapでは、メジャーのベース・データを含むファクト表またはビューの列を識別するMdmBaseMeasureおよびExpressionを指定します。

キューブのディメンションをマップするには、キューブのMdmDimensionalityオブジェクトを取得します。 MdmDimensionalityごとにCubeDimensionalityMapを作成します。 次に、ファクト表またはビュー内のディメンションの外部キー列を識別するCubeDimensionalityMapExpressionを指定します。 リーフ・レベルのディメンション・メンバーに列以外のディメンション列を指定する場合は、CubeDimensionalityMapsetJoinConditionメソッドを使用して結合Conditionを指定する必要があります。

MdmCubeには、CubeOrganizationが関連付けられています。 CubeOrganizationは、キューブをアナリティク・ワークスペースまたはリレーショナル・データベース・オブジェクトとしてデプロイします。 キューブをアナリティク・ワークスペースにデプロイするには、MdmCubefindOrCreateAWCubeOrganizationメソッドをコールします。 そのメソッドによって戻されたAWCubeOrganizationを使用して、キューブの特性(Oracle OLAPによるキューブのビルド方法、キューブのメジャー・データの格納方法、データベースによるキューブのマテリアライズド・ビューのビルドなど)を指定します。 AWCubeOrganizationクラスの詳細は、「Oracle OLAP Java APIリファレンス」を参照してください。

AWCubeOrganizationのマテリアライズド・ビュー・オプションがREWRITE_MV_OPTIONの場合、Oracle OLAPは、データベースの問合せリライト・システムで使用できるキューブ用のマテリアライズド・ビューを作成します。 マテリアライズド・ビュー・オプションがREWRITE_WITH_ATTRIBUTES_MV_OPTIONの場合、Oracle OLAPはリライト・マテリアライズド・ビューに、isPopulateLineageメソッドがtrueを戻すディメンション属性を含めます。 マテリアライズド・ビュー・オプションは、AWCubeOrganizationsetMVOptionメソッドを使用して設定します。

MdmCubeにはConsistentSolveSpecificationオブジェクトもあります。このオブジェクトには、Oracle OLAPによるキューブのメジャーの値の計算方法(または「解決」)を指定する1つ以上のConsistentSolveCommandオブジェクトが含まれます。 たとえば、ConsistentSolveCommandとして、SUMまたはMAX関数を表すAggregationCommandを指定できます。 ConsistentSolveSpecificationは、キューブのsetConsistentSolveSpecificationメソッドで指定します。

メジャーの値が仕様と一致する場合(親の値が子の値のSUMと等しい場合など)、キューブは「一貫性」です。 BuildProcessConsistentSolveCommandを実行すると、キューブの一貫性が保たれます。

MdmCubeおよびMdmMeasureオブジェクトの作成とそれらのマッピング、およびこのトピックで説明するその他の操作の例は、「例4-7」および「例4-8」を参照してください。

「図2-6」は、MdmCubeと、このトピックで説明する一部のクラスの関連付けを示します。 この図は、アナリティク・ワークスペースにデプロイされたMdmCubeを示しています。

図2-6 MdmCubeと関連オブジェクト

図2-6の説明が続きます
「図2-6 MdmCubeと関連オブジェクト」の説明
2.4.1.2 メジャーの表現

MdmMeasureは、1つ以上のMdmPrimaryDimensionオブジェクトによって編成されるデータ・セットを表す抽象クラスです。 データの構造は、多次元配列の構造に類似しています。 配列内の特定のセルを識別するための索引を提供する配列のディメンションと同様に、MdmMeasureを編成するMdmPrimaryDimensionオブジェクトは、MdmMeasureの特定の値を識別するための索引を提供します。

たとえば、ある期間および販売チャネルを介して顧客に販売された製品ユニットの数を記録するデータを含むMdmMeasureがあるとします。 メジャーのデータは、製品、時間、顧客およびチャネルのディメンション別に編成されます(カタログやインターネットなどの販売収益を表すチャネルを使用)。 この場合、製品ディメンション、時間ディメンション、顧客ディメンションおよびチャネル・ディメンションによって編成構造が提供され、データは4次元配列を持つと考えることができます。 これらの4つのディメンションの値は、配列内の特定の各セルを識別するための索引です。 各セルには、販売台数の1つのデータ値が格納されます。 配列の中の値を識別するために、各ディメンションに値を指定する必要があります。

MdmMeasureの値は通常数値ですが、メジャーには他のデータ型の値を指定できます。 MdmMeasureの具象サブクラスは、MdmBaseMeasureおよびMdmDerivedMeasureです。

アナリティク・ワークスペースのMdmBaseMeasureには、物理記憶域構造が関連付けられています。 通常、MdmCubeは、ファクト表の列からMdmBaseMeasureのベース・データを取得します。 Oracle OLAPは、メジャーの集計値を計算し、その値をキューブのOLAPビューに格納します。

MdmBaseMeasureを作成するときに、setSQLDataTypeメソッドを使用してメジャーのSQLデータ型を指定できます。 指定しない場合、MdmBaseMeasureには、マップ先のソース・データのデータ型が含まれます。

setAllowAutoDataTypeChangeメソッドでtrueを指定すると、Oracle OLAPがメジャーのSQLデータ型を自動的に設定できるようになります。 これは、メジャーのデータ型が変更された場合に役立ちます。 SQLデータ型の自動変更を許可すると、Oracle OLAPは、setSQLDataTypeメソッドでSQLデータ型を指定したかどうかに関係なく、適切なSQLデータ型を決定します。

MdmDerivedMeasureには、関連付けられた物理記憶域がありません。 Oracle OLAPは、必要に応じてMdmDerivedMeasureの値を動的に計算します。

MdmMeasureの値は、MdmMeasureMdmPrimaryDimensionオブジェクトの構造によって決まります。 つまり、MdmMeasureの各値はタプルで識別されます。タプルは、MdmPrimaryDimensionオブジェクトのメンバーの一意の組合せです。

MdmMeasureMdmPrimaryDimensionオブジェクトは、MdmStandardDimensionまたはMdmTimeDimensionオブジェクトです。 通常、これらのオブジェクトは1つ以上の階層構造を持ちます。 これらのMdmPrimaryDimensionオブジェクトには、そのコンポーネントMdmHierarchyオブジェクトのすべてのメンバーが含まれます。 この構造のため、MdmMeasureの値は、次の1つ以上です:

  • MdmMeasureのベースとなるファクト表の列、ビューまたは計算からの値。 これらの値は、ディメンションの階層のリーフ・レベルのメンバーの組合せによって識別されます。

  • Oracle OLAPが提供した集計値。 これらのメジャー値は、階層の集計レベルから少なくとも1つのメンバーによって識別されます。

  • MdmDerivedMeasureまたはカスタム・ディメンション・メンバーに対してExpressionで指定された値。

たとえば、製品のMdmTimeDimensionおよびMdmStandardDimensionによってディメンション化されるMdmBaseMeasureを想像します。 メジャーおよびディメンションのメタデータ・オブジェクトは、mdmUnitCostmdmTimeDimおよびmdmProdDimです。 mdmTimeDimおよびmdmProdDimオブジェクトには、表すディメンションのすべてのリーフ・メンバーおよび集計メンバーが含まれます。 リーフ・メンバーは、子を持たないメンバーです。 集計メンバーには1つ以上の子があります。

2つのメンバーの一意の組合せ(mdmTimeDimから1つ、mdmProdDimから1つ)は、各mdmUnitCost値を識別し、ディメンション・メンバーのすべての組合せを使用してmdmUnitCost値のセット全体を指定します。

一部のmdmUnitCost値は、リーフ・メンバー(特定の製品アイテムや特定の月など)の組合せによって識別されます。 その他のmdmUnitCost値は、集計メンバー(特定の製品ファミリや特定の四半期など)の組合せによって識別されます。 さらに、他のmdmUnitCost値は、リーフ・メンバーと集計メンバーを混在させて識別されます。

リーフ・メンバーによってのみ識別されるmdmUnitCostの値は、データベース・ファクト表の列(またはファクト表の計算)から直接取得されます。 これらの値は、最下位レベルのデータを表します。 ただし、少なくとも1つの集計メンバーによって識別される値は、Oracle OLAPによって計算されます。 これらの上位レベルの値は、集計またはロールアップされたデータを表します。 したがって、MdmBaseMeasureで表されるデータは、データ・ストアからのファクト表データと、Oracle OLAPがアナリティク操作に使用できる集計データを組み合せたものです。

2.4.2 ディメンション、レベルおよび階層の表示

ディメンションは、データ・セットを編成できるメンバーのリストの一般的な概念を表します。 たとえば、月期間中の製品アイテムの価格である数値のセットがある場合、単価データは、時間と製品値のディメンションでディメンション化されるMdmMeasureで表されます。 時間ディメンションには月の値が含まれ、製品ディメンションには項目の値が含まれます。 月および項目の値は、単位価格データセットの特定の値を識別するための索引として機能します。

ディメンションには、レベルと階層を含めることができます。 レベルでは、ディメンション・メンバーを親子関係にグループ化できます。下位レベルのメンバーは、上位レベルの親の子です。 階層は、レベル間の関係を定義します。 ディメンションには通常、関連する属性があります。

ディメンション・オブジェクト、レベル・オブジェクトおよび階層オブジェクトのベース・クラスは、MdmSourceを拡張する抽象クラスMdmDimensionです。 MdmDimensionには、オブジェクトに関連付けられた属性を取得および削除するためのメソッドがあります。 また、オブジェクトのメンバーのカーディナリティおよびカスタム順序を取得および設定するためのメソッドもあります。 MdmDimensionの直接サブクラスは、抽象MdmPrimaryDimensionクラスおよびMdmSubDimensionクラスです。

MdmPrimaryDimensionおよびMdmHierarchyLevelオブジェクトには、MdmAttributeオブジェクトを関連付けることができます。 属性の詳細は、ディメンション属性の表示を参照してください。

次のトピックでは、ディメンション、レベルおよび階層について説明します。

2.4.2.1 ディメンションの表示

ディメンションは、MdmDimensionの抽象サブクラスであるMdmPrimaryDimensionクラスのインスタンスによって表されます。 MdmPrimaryDimensionクラスの具象サブクラスは、様々なタイプのデータを表します。 MdmPrimaryDimensionの具象サブクラスは次のとおりです:

  • MdmMeasureDimension。ディメンション・メンバーの値として、データ・ストア内のすべてのMdmMeasureオブジェクトが含まれます。 データ・ストアには、MdmMeasureDimensionが1つのみあります。 MdmMeasureDimensionを取得するには、MdmRootSchemagetMeasureDimensionメソッドをコールします。 データ・ストアのメジャーを取得するには、MdmMeasureDimensiongetMeasuresメソッドをコールします。

  • MdmStandardDimension。特別な特性がなく、通常は製品、顧客、流通チャネルなどのディメンションを表します。

  • MdmTimeDimension。メンバーの値として期間があります。 各期間には、終了日と期間があります。 MdmTimeDimensionには、その情報を記録する属性を取得するためのメソッドがあります。

MdmPrimaryDimensionは、次のインタフェースを実装します。

  • Buildable。これは、BuildItemの作成で指定できるオブジェクトのマーカー・インタフェースです。

  • MdmMemberListMapOwnerMemberListMapオブジェクトを検索または作成または取得するためのメソッドを定義します。

  • MdmViewColumnOwner。これは、MdmViewColumnを関連付けることができるオブジェクトのマーカー・インタフェースです。

  • MetadataObject。一意の識別子を取得するためのメソッドを定義します。

  • MdmQuery。実装クラスに関連付けられたQueryオブジェクトを取得し、Queryに関する情報を取得するためのメソッドを定義します。

MdmPrimaryDimensionには、ディメンション・メンバーをレベルに編成するコンポーネントMdmDimensionLevelオブジェクトを含めることができます。 また、階層にレベルを編成するMdmHierarchyオブジェクトも使用できます。 MdmPrimaryDimensionにはコンポーネントMdmHierarchyオブジェクトのすべてのメンバーが含まれますが、各MdmHierarchyオブジェクトにはその階層内のメンバーのみが含まれます。

オブジェクトのgetDimensionsメソッドをコールすると、MdmDatabaseSchemaまたはMdmOrganizationalSchemaによって含まれているすべてのMdmPrimaryDimensionオブジェクトを取得できます。 MdmDatabaseSchemaには、MdmTimeDimensionまたはMdmStandardDimensionを名前で検索したり、オブジェクトが存在しない場合は作成するためのメソッドがあります。

MdmStandardDimensionおよびMdmTimeDimensionオブジェクトには、MdmAttributeオブジェクトが含まれます。 属性の中には、親属性などのOracle OLAPによって導出されるものと、リレーショナル表のデータ、またはExpressionで指定したデータにマップするものがあります。 属性の詳細は、ディメンション属性の表示を参照してください。

MdmPrimaryDimensionは、ディメンション・メンバーを1つ以上のレベルに編成できます。 各レベルは、MdmDimensionLevelオブジェクトで表されます。 MdmStandardDimensionまたはMdmTimeDimensionには、レベルを階層関係に編成するMdmHierarchyオブジェクトを含めることができます。 MdmLevelHierarchyでは、ディメンション・レベルはMdmHierarchyLevelオブジェクトで表されます。 具体的なMdmDimensionLevelクラスとMdmHierarchyLevelクラス、および抽象MdmHierarchyクラスは、抽象MdmSubDimensionクラスの直接サブクラスです。

2.4.2.2 ディメンション・レベルの表現

MdmDimensionLevelは、同じレベルのディメンション・メンバーのセットを表します。 ディメンション・メンバーは、最大1つのディメンション・レベルにすることができます。 MdmPrimaryDimensionfindOrCreateDimensionLevelを使用してMdmDimensionLevelを取得または作成します。 MemberListMapを使用して、MdmDimensionLevelをデータ・ソースにマップできます。

MdmPrimaryDimensionには、それに含まれるすべてのMdmDimensionLevelオブジェクトのリストを取得するメソッドがあります。 また、名前でMdmDimensionLevelを検索したり、オブジェクトが存在しない場合は作成するためのメソッドもあります。

2.4.2.3 階層の表示

MdmHierarchyは、MdmSubDimensionの抽象サブクラスです。 MdmHierarchyの具象サブクラスは、MdmLevelHierarchyおよびMdmValueHierarchyです。

MdmHierarchyは、ディメンションのメンバーを階層構造に編成します。 MdmLevelHierarchyの親子階層関係は、ディメンションのレベルに基づきます。 MdmValueHierarchyでは、階層関係はレベルではなくディメンション・メンバー値に基づきます。 MdmPrimaryDimensionには、いずれかの階層または両方の階層を複数持つことができます。

階層メンバーの親は親MdmAttributeに記録されます。この親は、MdmHierarchygetParentAttributeメソッドをコールして取得できます。 階層メンバーの祖先は、getAncestorsAttributeメソッドをコールして取得できる祖先MdmAttributeに記録されます。

MdmPrimaryDimensionには、それに含まれるすべてのMdmHierarchyオブジェクトのリストを取得するメソッドがあります。 また、MdmLevelHierarchyまたはMdmValueHierarchyを名前で検索したり、オブジェクトが存在しない場合は作成するためのメソッドもあります。

次のトピックでは、レベルベース階層と値ベース階層を表すオブジェクトについて説明します。

2.4.2.3.1 レベルベース階層の表現

MdmLevelHierarchyは、MdmHierarchyのサブクラスです。 MdmLevelHierarchyには、最上位、最上位、レベルおよびリーフ(最下位)レベルのツリー状の構造があります。 各メンバーは、階層内にゼロまたは1つの親を持つことができます。 メンバーAがメンバーBの親、メンバーBがメンバーCの親、メンバーCがメンバーAの親など、サイクルは許可されません。

他のメンバーの子ではないメンバーは、「独楽」メンバーです。 子を持つメンバーは、階層の「総計」または「集計メンバー」です。 子を持たないメンバーは、階層の「葉」または「リーフ・メンバー」です。

各メンバーはレベルにあります。 レベルは、最上位レベルからリーフ・レベルの順に並べられます。 順序は、MdmPrimaryDimensionMdmDimensionLevelオブジェクトを作成する順序によって決まります。 最初に作成するMdmDimensionLevelは最上位レベルであり、最後に作成するMdmDimensionLevelはリーフ・レベルです。 たとえば、TIME_AWJディメンションのCALENDAR_YEAR階層の場合、CreateAndBuildAW.javaおよびSpecifyAWValuesサンプル・プログラムでは、次の順序で4つのMdmDimensionLevelオブジェクトが作成されます: TOTAL_TIME、YEAR、QUARTERおよびMONTH。 最上位レベルはTOTAL_TIMEで、リーフ・レベルはMONTHです。

階層のメンバーに親がある場合、その親は上位レベルである必要があります。 Oracle OLAPでは、階層内のすべてのリーフ・メンバーがリーフ・レベルであることを想定しています。 Oracle OLAPが階層を「ラグ済」にすることを許可するように指定できます。 不規則階層では、1つ以上のリーフ・メンバーがリーフ・レベルにありません。 MdmLevelHierarchysetIsRagged(true)メソッドをコールして、階層の不規則化を許可するように指定できます。

Oracle OLAPでは、メンバーが最上位レベルより下のレベルにある場合、そのメンバーには親があり、その親がメンバーのレベルのすぐ上のレベルにあることも想定しています。 メンバーが最上位レベルではなく、そのメンバーに親がないか、親が次の上位レベルにない場合、階層はskip-level階層になります。 MdmLevelHierarchysetIsSkipLevel(true)メソッドをコールして、スキップ・レベルの階層を許可するように指定できます。

「図2-7」は、通常の階層内のメンバーの関係、不規則な階層および2つのタイプのスキップ・レベル階層を示します。

図2-7 通常、不規則、スキップ・レベルの階層

図2-7の説明が続きます
「図2-7 標準、不規則、スキップ・レベルの階層」の説明

MdmLevelHierarchyの様々なレベルは、MdmHierarchyLevelオブジェクトで表されます。 レベルベースの階層の作成例は、MdmLevelHierarchyの作成およびマッピングを参照してください。

MdmLevelHierarchyには階層のすべてのメンバーがあり、各コンポーネントMdmHierarchyLevelオブジェクトには、そのオブジェクトが表すレベルのメンバーのみが含まれます。 MdmLevelHierarchyは、メンバーの非階層リストも表すことができます。その場合、MdmLevelHierarchyは1つのMdmHierarchyLevelを持ち、両方のオブジェクトが同じメンバーを持ちます。 MdmLevelHierarchyのレベルを取得するには、getHierarchyLevelsメソッドをコールします。

MdmLevelHierarchyには、それに含まれるすべてのMdmHierarchyLevelオブジェクトのリストを取得するメソッドがあります。 また、名前でMdmHierarchyLevelを検索したり、オブジェクトが存在しない場合は作成するためのメソッドもあります。

MdmPrimaryDimensionには、複数のMdmLevelHierarchyを含めることができます。 たとえば、MdmTimeDimensionディメンションには、2つのMdmLevelHierarchyオブジェクトがあり、1つはカレンダ年の期間別に編成され、もう1つは会計年度の期間別に編成されます。 1つの階層のMdmHierarchyLevelオブジェクトは、カレンダ年の期間のMdmDimensionLevelオブジェクトを階層に関連付けます。 他方の階層のMdmHierarchyLevelオブジェクトは、会計年度の期間のMdmDimensionLevelオブジェクトをその階層に関連付けます。 通常、レベルベースの階層は最下位レベルを共有するため、各階層の最下位レベルのMdmHierarchyLevelは、同じMdmDimensionLevelを各階層に関連付けます。 たとえば、カレンダ年の階層と会計年度の階層では、月の期間のMdmHierarchyLevelが同じです。

2.4.2.3.2 値ベース階層の表現

値ベースの階層は、階層関係の定義においてレベルに意味がない階層です。 このタイプの階層は、MdmHierarchyのサブクラスであるMdmValueHierarchyクラスによって表されます。 値階層の例としては、会社の従業員レポート構造があり、親子関係では表すことができますが、レベルはありません。 値ベースの階層の作成例は、MdmValueHierarchyの作成およびマッピングを参照してください。

値階層のOLAPビューには、マネージャである従業員を含め、すべての従業員を含む列があります。 親メンバーを含む別の列があります。 別の列には、階層内のメンバーの深さが示されます。この階層では、マネージャを持たないメンバーが深さ0 (ゼロ)、そのマネージャの部下である従業員がレベル1などになります。

2.4.2.4 階層レベルの表現

MdmHierarchyLevelは、MdmSubDimensionのサブクラスです。 MdmHierarchyLevelは、MdmDimensionLevelMdmLevelHierarchyに関連付けます。

階層内のレベルの順序は、MdmLevelHierarchyMdmHierarchyLevelオブジェクトを作成する順序によって指定されます。 最初に作成するMdmHierarchyLevelは最上位レベルであり、最後に作成するMdmHierarchyLevelは最下位レベルです。 階層の作成例は、MdmLevelHierarchyの作成およびマッピングを参照してください。

2.4.3 ディメンション属性の表示

OLAPディメンション属性は、MdmAttributeオブジェクトで表されます。 MdmAttributeには、MdmPrimaryDimensionのメンバーに関連する値があります。 MdmAttributeクラスはMdmDimensionedObjectのサブクラスです。これは、MdmMeasureと同様に、MdmAttributeの値はディメンションのメンバーに関連して意味を持つためです。

リレーションは、1対1、多対1、または1対多のいずれかです。 たとえば、PRODUCT_AWJディメンションには、短い説明属性、パッケージ属性および祖先属性があります。 概略属性には、ディメンション・メンバーごとに個別の値があります。 パッケージ属性には値のセットがあり、それぞれが複数のディメンション・メンバーに適用されます。 祖先属性には、1つのディメンション・メンバーに適用される複数の値があります。 MdmAttributeMdmDimensionのメンバーに適用されない場合、そのメンバーのMdmAttribute値はnullです。

「表2-3」は、PRODUCT_AWJディメンションの最初の数個のメンバー、および関連する短い説明とパッケージ属性値を示します。 ディメンションのITEMレベルの一部のメンバーのみにパッケージ属性があります。 他のアイテム、および上位レベルの場合、パッケージ属性値はnullで、表にはNAとして表示されます。

表2-3 ディメンション・メンバーと関連属性値

ディメンション・メンバー 関連する簡単な説明 関連するパッケージ

TOTAL_PRODUCT::TOTAL

Total Product

NA

CLASS::HRD

Hardware

NA

FAMILY::DISK

CD/DVD

NA

ITEM::EXT CD ROM

External 48X CD-ROM

NA

ITEM::EXT DVD

External - DVD-RW - 8X

Executive

ITEM::INT 8X DVD

Internal - DVD-RW - 8X

NA

ITEM::INT CD ROM

Internal 48X CD-ROM

Laptop Value Pack

ITEM::INT CD USB

Internal 48X CD-ROM USB

NA

ITEM::INT RW DVD

Internal - DVD-RW - 6X

Multimedia

...

...

...

MdmAttributeから値を取得するには、MdmAttributeSourceと、MdmDimensionの1つ以上のメンバーを指定するSourceを結合する必要があります。 Sourceオブジェクトの結合の詳細は、「Sourceオブジェクトの理解」を参照してください。 MdmAttributeおよびMdmDimensionSourceオブジェクトを結合する例については、「例4-5」および「例5-7」「例6-10」などの「Sourceオブジェクトの理解」および「Sourceメソッドを使用した問合せの作成」の例を参照してください。

次のトピックでは、ディメンション属性を表すクラスについて説明します。

2.4.3.1 MdmAttributeクラスの説明

抽象MdmAttributeクラスには、抽象クラスMdmSingleValuedAttributeであるサブクラスがあります。 そのクラスには2つの具象サブクラスがあります: MdmBaseAttributeおよびMdmDerivedAttribute

2.4.3.1.1 属性のタイプの説明

MdmAttributeは、それを作成するMdmPrimaryDimensionによって格納されます。 親属性やレベル属性などの一部の属性は、Oracle OLAPによってディメンションの構造から導出されます。 その他は、長い説明属性や短い説明属性などのアクセッサ・メソッド、またはMdmTimeDimensionが必要とする終了日時スパン属性を持つMdmPrimaryDimensionの共通属性です。 これらの属性の1つを作成したら、MdmPrimaryDimensionsetShortValueDescriptionAttributeメソッドやMdmTimeDimensionsetTimeSpanAttributeメソッドなどのメソッドを使用してディメンションに関連付けます。 GLOBAL_AWJサンプル・アナリティク・ワークスペースのPACKAGE属性など、独自の目的で属性を作成することもできます。

2.4.3.1.2 属性とMdmSubDimensionの関連付け

属性を作成したら、それをMdmSubDimensionに関連付けます。 MdmSubDimensionaddAttributeメソッドを使用して、1つのMdmSubDimensionのみに関連付けることができます。 また、MdmAttributesetIsVisibleForAllメソッドを使用して、MdmPrimaryDimensionのすべてのMdmDimensionLevelオブジェクトに関連付けることもできます。 setIsVisibleForAllメソッドでtrueを指定すると、その属性は、MdmPrimaryDimensionによって現在含まれているすべてのMdmDimensionLevelオブジェクトと、その後にディメンションを作成または追加するすべてのMdmDimensionLevelオブジェクトに適用されます。

2.4.3.1.3 MdmAttributeオブジェクトの取得

MdmPrimaryDimensiongetAttributesメソッドは、クライアント・アプリケーションによって作成されたすべてのMdmAttributeオブジェクトを戻します。 MdmSubDimensiongetAttributesメソッドは、アプリケーションがaddAttributeメソッドを使用して追加した属性のみを返します。 MdmPrimaryDimensionのその他のメソッドは、Oracle OLAPが生成する特定の属性(getHierarchyAttributegetLevelDepthAttributegetParentAttributeメソッドなど)を返します。

2.4.3.1.4 ターゲット・ディメンションの指定

属性のターゲット・ディメンションは、表内の列間の外部キー制約の定義に似ています。 属性のすべての値も、ターゲット・ディメンションのキーである必要があります。

MdmAttributesetTargetDimensionメソッドを使用して、属性のターゲット・ディメンションを指定できます。 ターゲット・ディメンションのQueryであるリレーショナル表には、属性のマップ先となるディメンション表の列にあるすべての値を含む列が必要です。

2.4.3.2 MdmBaseAttributeクラスの説明

MdmBaseAttributeには、それを含むディメンションおよびそれが適用される階層のOLAPビューに格納されている値があります。 OLAPビューの詳細は、OLAPビューの使用を参照してください。

MdmBaseAttributeは、MdmPrimaryDimensionfindOrCreateBaseAttributeメソッドを使用して作成します。 MdmBaseAttributeをリレーショナル表またはビューの列にマップします。 属性をビルドしたMdmPrimaryDimensionをビルドすると、Oracle OLAPはMdmBaseAttributeの値をOLAPビューに格納します。 OLAPビューでMdmBaseAttributeの列を取得するには、getETAttributeColumnメソッドを使用します。 このメソッドは、MdmViewColumnオブジェクトを戻します。

MdmBaseAttributeオブジェクトの例には、「例4-5」で作成およびマップされた名前属性と、「例4-6」で作成される詳細説明属性があります。 その詳細記述属性のマッピングは、「例4-3」にあります。

通常のOLAP問合せでは、Sourceオブジェクトを使用する場合、MemberListMapオブジェクトを使用してMdmBaseAttributeMdmDimensionLevelオブジェクトにマップするだけです。 OLAPビューに対するSQL問合せの場合、HierarchyLevelMapオブジェクトを使用して属性をMdmHierarchyLevelオブジェクトにマップする必要があります。

2.4.3.2.1 データ型の指定

MdmBaseAttributeを作成するときに、setSQLDataTypeメソッドを使用してSQLデータ型を指定できます。 指定しない場合、MdmBaseAttributeには、マップ先のソース・データのデータ型が含まれます。 たとえば、短い説明属性のSQLデータ型はVARCHAR2で、終了日属性のデータ型はDATEです。

setAllowAutoDataTypeChangeメソッドでtrueを指定することで、Oracle OLAPでSQLデータ型を自動的に設定できます。 SQLデータ型の自動変更を許可すると、Oracle OLAPはsetSQLDataTypeメソッドで指定されたSQLデータ型を無視します。 これは、データ型が異なるレベルに同じ属性をマップする場合や、レベルのデータ型が変更される場合に役立ちます。

2.4.3.2.2 グループ化属性

MdmBaseAttributesetAttributeGroupNameメソッドを使用すると、属性グループの名前を指定できます。 他の属性に同じグループ名を指定できます。 たとえば、ディメンション・レベルごとに長い説明属性を作成し、各属性にLONG_DESCRIPTIONというグループ名を指定できます。 グループ名を使用して、類似する種類の属性を識別できます。 グループ名は、getAttributeGroupNameメソッドで取得します。

2.4.3.2.3 索引の作成

属性の索引を作成することで、属性ベースの問合せのパフォーマンスを向上できます。 索引をビルドすると、メンテナンス時間が長くなり、アナリティク・ワークスペースのサイズが大きくなるため、非常に大きなディメンションのビルド時間が長くなる可能性があります。 属性の索引を作成するには、MdmBaseAttributeAWAttributeOrganizationsetCreateAttributeIndexメソッドでtrueを指定します。

2.4.3.2.4 属性の言語の指定

MdmBaseAttributeAttributeMapを作成する場合、属性の言語を指定できます。 たとえば、CHANNELという名前のMdmDimensionLevelのlong description属性の言語としてフランス語を指定するには、MemberListMap.findOrCreateAttributeMapメソッドをコールして、言語を指定するStringとしてMdmBaseAttributeおよびFRENCHという長い説明を渡すことによって、AttributeMapを作成します。 次に、AttributeMapExpressionとしてGLOBAL.CHANNEL_DIM.CHANNEL_DSC_FRENCHを指定します。 AttributeMapsetLanguageメソッドを使用すると、作成後にAttributeMapの言語を指定できます。

2.4.3.2.5 多言語属性の指定

MdmBaseAttribute.setMultiLingualメソッドを使用すると、複数の言語列を同じ属性にマップできます。 これを行うには、属性のsetMultiLingualメソッドでtrueを指定します。 次に、言語ごとに個別のAttributeMapを作成しますが、同じMdmBaseAttributeを使用します。

データベースで使用されている言語によって、ディメンションのOLAPビューに表示される言語が決まります。 1つのセッションで一度に使用されている言語は1つのみですが、使用中の言語が変更されると、OLAPビューの属性列の言語も変更されます。 データベース・セッションの言語の指定の詳細は、「Oracle Databaseグローバリゼーション・サポート・ガイド」「グローバリゼーション・サポート環境の設定」を参照してください。

マテリアライズド・ビューの場合は、言語ごとに個別の属性を作成して、英語、フランス語などに長い説明属性が存在するようにしてください。 この動作は、SQLではより一般的であり、複数値列は想定されません。

2.4.3.2.6 OLAPビューへの階層属性値の移入

SQL問合せの場合は、MdmBaseAttribute.setPopulateLineageメソッドでtrueを指定して、ビューの属性の系統を移入する必要があります。 系統の移入は、OLAPビューの属性の列で、Oracle OLAPがディメンション階層の下位レベルの行に、上位レベルでマップされる属性値を移入することを意味します。 属性の系統の移入は、アナリティク・ワークスペース・キューブのマテリアライズド・ビューを作成する場合にも役立ちます。

設定のデフォルトであるsetPopulateLineage(false)を指定した場合、属性値は、属性がマップされるレベルの階層メンバーの行にのみ表示されます。 他のレベルの階層メンバーの場合、属性値はnullです。 setPopulateLineage(true)を指定すると、属性値は、マップされたレベルのメンバーの行、およびマップされたレベルの子孫であるすべてのレベルの階層メンバーに表示されます。

OLAPビューに階層系統を移入すると、ビューの内容がスター・スキーマのリレーショナル表の内容と同様になります。 たとえば、ディメンションのMdmDimensionLevelごとに、ディメンションに個別の詳細記述属性を作成できます。 各属性のsetPopulateLineage(true)メソッドをコールして、これらの属性の系統の移入を指定します。 次に、addAttributeメソッドを使用してMdmHierarchyLevelに属性を追加して、階層レベルで属性を表示できるようにします。

ディメンションの階層のOLAPビューには、詳細記述属性ごとに列があります。 これらの列には、マップされた階層レベルのメンバーと、マップされたレベルの子孫であるすべてのレベルの階層メンバーの詳細な説明属性値が含まれます。

たとえば、CreateAndBuildAWサンプル・クラスには、個々のMdmHierarchyLevelに追加するMdmBaseAttributeオブジェクトの系統の移入を指定するコード行があります。 クラスのcreateLineageAttributesメソッドには次の行が表示されます。

  mdmAttr.setPopulateLineage(true);

「例2-2」は、そのコード行がコメント・アウトされた場合の次のSQL問合せの結果を示します。 「例2-3」は、行がクラスに含まれている場合のSQL問合せの結果を示します。 どちらの例も、PRODUCT_PRIMARY階層のOLAPビューの選択された列にある値を示しています。 ビュー名はPRODUCT_AWJ_PRODUCT_PRIMA_VIEWです。 例では、SQL問合せによって返される行のいくつかのみを示しています。

SELECT TOTAL_PRODUCT_SHORT_DESC || '*' || CLASS_SHORT_DESC || '*' ||
        FAMILY_SHORT_DESC || '*' || ITEM_SHORT_DESC
  FROM PRODUCT_AWJ_PRODUCT_PRIMA_VIEW
  ORDER BY TOTAL_PRODUCT nulls first, CLASS nulls first,
           FAMILY nulls first, ITEM nulls first;

例2-2 OLAPビューのsetPopulateLineage(false)後の列の値

この例では、OLAPビューの属性行には、ディメンション・メンバーが属する階層レベルの属性値のみが含まれます。

TOTAL_PRODUCT_SHORT_DESC||'*'||CLASS_SHORT_DESC||'*'||FAMILY_SHORT_DESC||'*'||IT
--------------------------------------------------------------------------------
Total Product***
*Hardware**
**CD/DVD*
***External 48X CD-ROM
***External - DVD-RW - 8X
***Internal - DVD-RW - 8X
...
**Desktop PCs*
***Sentinel Financial
***Sentinel Multimedia
***Sentinel Standard
**Portable PCs*
***Envoy Ambassador
***Envoy Executive
***Envoy Standard
...

例2-3 OLAPビューのsetPopulateLineage(true)後の列の値

この例では、OLAPビューの属性行に、ディメンション・メンバーの祖先の属性値が移入されます。 たとえば、TOTAL_PRODUCTは階層の最上位レベルであるため、最初の行にはTotal Productという値のみが含まれます。 Envoy Standardを含む行には、TOTAL_PRODUCT、CLASSおよびFAMILYレベルの値もあります。

TOTAL_PRODUCT_SHORT_DESC||'*'||CLASS_SHORT_DESC||'*'||FAMILY_SHORT_DESC||'*'||IT
--------------------------------------------------------------------------------
Total Product***
Total Product*Hardware**
Total Product*Hardware*CD/DVD*
Total Product*Hardware*CD/DVD*External 48X CD-ROM
Total Product*Hardware*CD/DVD*External - DVD-RW - 8X
Total Product*Hardware*CD/DVD*Internal - DVD-RW - 8X
...
Total Product*Hardware*Desktop PCs*
Total Product*Hardware*Desktop PCs*Sentinel Financial
Total Product*Hardware*Desktop PCs*Sentinel Multimedia
Total Product*Hardware*Desktop PCs*Sentinel Standard
Total Product*Hardware*Portable PCs*
Total Product*Hardware*Portable PCs*Envoy Ambassador
Total Product*Hardware*Portable PCs*Envoy Executive
Total Product*Hardware*Portable PCs*Envoy Standard
...
2.4.3.2.7 マテリアライズド・ビューの属性の準備

OLAPメタデータ・オブジェクトのマテリアライズド・ビューを生成するには、MdmDimensionLevelごとにMdmBaseAttributeを作成し、MdmDimensionLevelの一意キーにマップして、MdmDimensionLevelに追加する必要があります。 MdmDimensionLevelには、一意キー属性を追加、取得および削除するためのメソッドがあります。 EnableMVs.javaサンプル・プログラムは、一意のキー属性を作成し、ディメンションのMdmDimensionLevelオブジェクトに追加します。

Oracle OLAPは、キューブのマテリアライズド・ビューを作成すると、キューブのディメンションの属性の列を作成します。 列の名前には、ディメンションのOLAPビューの属性列の名前が使用されます。 列名が一意であることを確認するために、Oracle OLAPによって名前にデフォルトのプレフィクスが追加されます。 プレフィクスを指定するには、キューブのディメンションに対してMdmDimensionalityオブジェクトのsetETAttrPrefixメソッドを使用します。

2.4.3.3 MdmDerivedAttributeクラスの説明

MdmDerivedAttributeには、Oracle OLAPが必要に応じてその場で計算される値があります。 Oracle OLAPでは、getParentAttributeによって返される属性やMdmPrimaryDimensiongetAncestorsAttributeメソッドなど、複数のMdmDerivedAttributeオブジェクトが生成されます。

2.4.4 OLAPビューの使用

アナリティク・ワークスペース内のMdmCubeMdmPrimaryDimensionおよびMdmHierarchyの各インスタンスに対して、Oracle OLAPは関連するリレーショナル・ビューを自動的に作成します。 Oracle OLAPは、これらのビューを内部的に使用して、アナリティク・ワークスペースによって生成される集計データおよび計算データへのアクセスを提供します。 OLAP Java API問合せでは、ビューが透過的に使用されます。 OLAP Java APIでは、これらのビューはETビュー(埋込み合計)と呼ばれます。 SQLアプリケーションは、スター・スキーマまたはスノーフレーク・スキーマのファクト表およびディメンション表と同様に、これらのビューを直接問い合せることができます。

クライアントOLAP Java APIアプリケーションでは、OLAPビューの名前を取得し、ビュー内の列の名前を取得できます。 アプリケーションはアプリケーションのエンド・ユーザーに名前を表示でき、エンド・ユーザーはSQL SELECT文で名前を使用してOLAPオブジェクトを問い合せることができます。

次のトピックでは、これらのビューの取得および使用について説明します。

2.4.4.1 キューブ・ビューおよびビュー列名の取得

キューブ・ビューの名前を取得するには、MdmCube.getViewName()メソッドをコールします。 たとえば、次のコードでは、UNITS_CUBE_AWJという名前のMdmCubeのビューの名前を取得します。 コードのmdmDBSchemaオブジェクトは、GLOBALユーザーのMdmDatabaseSchemaです。

MdmCube mdmUnitsCube =
 (MdmCube)mdmDBSchema.getTopLevelObject("UNITS_CUBE_AWJ");
String cubeViewName = mdmUnitsCube.getViewName();
println("The name of the view for the " +
         mdmUnitsCube.getName() + " cube is " + cubeViewName + ".");

コードの出力は次のとおりです。

The name of the view for the UNITS_CUBE_AWJ cube is UNITS_CUBE_AWJ_VIEW.

OLAPビューの名前は、MdmCube.setViewNameメソッドを使用して変更できます。 名前の変更を永続的にするには、Transactionをコミットする必要があります。

MdmCubeのOLAPビューには、キューブの各メジャー(各導出メジャーを含む)の列があります。 Oracle OLAPユーザーズ・ガイドでは、導出メジャーは計算済メジャーと呼ばれます。 キューブ・ビューには、キューブの各ディメンションの列もあります。 たとえば、UNITS_CUBE_AWJという名前のMdmCubeの場合、ビューの名前はUNITS_CUBE_AWJ_VIEWです。 次のコードは、ビュー列の名前を取得します。

MdmCube mdmUnitsCube = mdmDBSchema.findOrCreateCube("UNITS_CUBE_AWJ");
List<MdmQueryColumn> mdmQCols = mdmUnitsCube.getQueryColumns();
for (MdmQueryColumn mdmQCol : mdmQCols )
{
  MdmViewColumn mdmViewCol = (MdmViewColumn) mdmQCol;
  println(mdmViewCol.getViewColumnName());
}

コードに次の出力が表示されます。

TIME_AWJ
PRODUCT_AWJ
CUSTOMER_AWJ
CHANNEL_AWJ
UNITS
SALES
COST

UNITSSALESおよびCOST列はキューブのメジャー用で、他の4列はキューブのディメンション用です。

2.4.4.2 ディメンションおよび階層ビューおよびビュー列名の取得

ディメンションまたは階層のOLAPビューの名前を取得するには、MdmPrimaryDimensionまたはMdmHierarchygetETViewName()メソッドをコールします。 ビュー内の列の名前を取得するには、メタデータ・オブジェクトの適切なメソッドをコールします。 たとえば、次のコードでは、CHANNEL_AWJディメンションのキー列の名前と、CHANNEL_PRIMARY階層の親列を取得します。

println(mdmChanDim.getETKeyColumn().getViewColumnName());
MdmViewColumn mdmParentCol =(MdmViewColumn) mdmChanHier.getETParentColumn();
println(mdmParentCol.getViewColumnName());

コードに次の出力が表示されます。

DIM_KEY
PARENT

OLAPビューの名前は、MdmPrimaryDimensionまたはMdmHierarchysetETViewNameメソッドを使用して変更できます。

MdmPrimaryDimensionのOLAPビューには、ディメンション・キー用の列、各ディメンション・レベルの列、およびディメンションに関連付けられた各属性の列があります。 たとえば、CHANNEL_AWJという名前のMdmStandardDimensionの場合、ビューの名前はCHANNEL_AWJ_VIEWです。 SQLコマンドDESCRIBE CHANNEL_AWJ_VIEWは、次の列の名前を表示します。

DIM_KEY
LEVEL_NAME
MEMBER_TYPE
DIM_ORDER
LONG_DESCRIPTION
SHORT_DESCRIPTION
TOTAL_CHANNEL_LONG_DESC
TOTAL_CHANNEL_SHORT_DESC
CHANNEL_LONG_DESC
CHANNEL_SHORT_DESC

MdmHierarchyのOLAPビューには、ディメンション・キー用の列と階層メンバーの親用の列があります。 MdmLevelHierarchyの場合、各階層レベルの列とレベルの深さの列も表示されます。 階層に1つ以上の属性が追加されている場合、ビューには属性ごとに列があります。 たとえば、CHANNEL_PRIMARYという名前のMdmLevelHierarchyの場合、ビューの名前はCHANNEL_AWJ_CHANNEL_PRIMA_VIEWです。 SQLコマンドDESCRIBE CHANNEL_AWJ_CHANNEL_PRIMA_VIEWは、次の列の名前を表示します。

DIM_KEY
LEVEL_NAME
MEMBER_TYPE
DIM_ORDER
HIER_ORDER
LONG_DESCRIPTION
SHORT_DESCRIPTION
TOTAL_CHANNEL_LONG_DESC
TOTAL_CHANNEL_SHORT_DESC
CHANNEL_LONG_DESC
CHANNEL_SHORT_DESC
PARENT
DEPTH
TOTAL_CHANNEL
CHANNEL
2.4.4.3 OLAPビュー列の使用

OLAPビューを使用してSQL問合せを作成する方法のいくつかの例は、Oracle OLAPユーザーズ・ガイドを参照してください。 Sourceオブジェクトを使用するOLAP Java API問合せでは、これらのビューが自動的に使用されます。

OLAP Java APIアプリケーションのユーザーにOLAPビューへの直接アクセスを提供することもできます。 ユーザーは、ビューを使用するSQL SELECT文を指定してから、そのSQL問合せをデータベースに送信できます。

「例2-4」は、アナリティク・ワークスペースのキューブおよびディメンションを使用する点を除き、Oracle OLAPユーザーズ・ガイドの例4-2 を再現します。 この例では、UNITS_CUBE_AWJ_VIEWからSALESメジャーを選択し、キューブ・ビューから階層ビューにキーを結合してデータを選択します。

この例では、mdmDBSchemaはGLOBALユーザーのMdmDatabaseSchemaです。 例は、BasicCubeViewQuery.javaサンプル・プログラムからの抜粋です。

例2-4 基本キューブ・ビュー問合せ

// In a method...
// Get the cube.
  MdmCube mdmUnitsCube =
     MdmCube)mdmDBSchema.getTopLevelObject("UNITS_CUBE_AWJ");
  // Get the OLAP view for the cube.
  String cubeViewName = mdmUnitsCube.getViewName();
  // Display the name of the OLAP view for the cube.
  println("The name of the OLAP view for the " + mdmUnitsCube.getName()
          + " cube is:\n  " + cubeViewName);

  // Get the dimensions and the hierarchies of the dimensions.
  MdmPrimaryDimension mdmTimeDim =
   (MdmPrimaryDimension)mdmDBSchema.getTopLevelObject("TIME_AWJ");
  MdmLevelHierarchy mdmCalHier =
    mdmTimeDim.findOrCreateLevelHierarchy("CALENDAR_YEAR");

  // Display the name of the OLAP view name for the hierarchy and 
  // display the names of the hierarchy levels.
  displayViewAndLevelNames(mdmCalHier);

  MdmPrimaryDimension mdmProdDim =
   (MdmPrimaryDimension)mdmDBSchema.getTopLevelObject("PRODUCT_AWJ");
  MdmLevelHierarchy mdmProdHier =     mdmProdDim.findOrCreateLevelHierarchy("PRODUCT_PRIMARY");
  displayViewAndLevelNames(mdmProdHier);

  MdmPrimaryDimension mdmCustDim =
   (MdmPrimaryDimension)mdmDBSchema.getTopLevelObject("CUSTOMER_AWJ");
  MdmLevelHierarchy mdmShipHier =
    mdmCustDim.findOrCreateLevelHierarchy("SHIPMENTS");
  displayViewAndLevelNames(mdmShipHier);

  MdmPrimaryDimension mdmChanDim =
   (MdmPrimaryDimension)mdmDBSchema.getTopLevelObject("CHANNEL_AWJ");
  MdmLevelHierarchy mdmChanHier =
    mdmChanDim.findOrCreateLevelHierarchy("CHANNEL_PRIMARY");
  displayViewAndLevelNames(mdmChanHier);

  // Create a SQL SELECT statement using the names of the views and the
  // levels.
  // UNITS_CUBE_AWJ_VIEW has a column named SALES for the sales measure.
  // TIME_AWJ_CALENDAR_YEAR_VIEW has a column named LONG_DESCRIPTION
  // for the long description attribute.
  // The hierarchy views have columns that have the same names as the levels.
  String sql = "SELECT t.long_description time,\n" +
		    "     ROUND(f.sales) sales\n" +
		    "  FROM TIME_AWJ_CALENDAR_YEAR_VIEW t,\n" +
		    "     PRODUCT_AWJ_PRODUCT_PRIMA_VIEW p,\n" +
		    "     CUSTOMER_AWJ_SHIPMENTS_VIEW cu,\n" +
		    "     CHANNEL_AWJ_CHANNEL_PRIMA_VIEW ch,\n" +
		    "     UNITS_CUBE_AWJ_VIEW f\n" +
		    "  WHERE t.level_name = 'YEAR'\n" +
		    "     AND p.level_name = 'TOTAL_PRODUCT'\n" +
		    "     AND cu.level_name = 'TOTAL_CUSTOMER'\n" +
		    "     AND ch.level_name = 'TOTAL_CHANNEL'\n" +
		    "     AND t.dim_key = f.time_awj\n" +
		    "     AND p.dim_key = f.product_awj\n" +
		    "     AND cu.dim_key = f.customer_awj\n" +
		    "     AND ch.dim_key = f.channel_awj\n" +
		    "  ORDER BY t.end_date";

  // Display the SQL SELECT statement.
  println("\nThe SQL SELECT statement is:\n" + sql);

  // Display the results of the SQL query.
  String title = "\nThe results of the SQL query are:\n";
  executeSQL(sql, title);
// ...
} // End of method.

private void displayViewAndLevelNames(MdmLevelHierarchy mdmLevelHier)
{
  // Get the OLAP view name for the hierarchy.
  String levelHierViewName = mdmLevelHier.getETViewName();
  // Display the name of the OLAP view for the hierarchy.
  println("\nThe OLAP view for the " + mdmLevelHier.getName() + 
          " hierarchy is:\n  " + levelHierViewName);
  
  // Display the names of the levels of the hierarchy.
  displayLevelNames(mdmLevelHier);
}
 
private void displayLevelNames(MdmLevelHierarchy mdmLevelHier)
{
  List<MdmHierarchyLevel> mdmHierLevelList = 
    mdmLevelHier.getHierarchyLevels();
 println("The names of the levels of the "
         + mdmLevelHier.getName() + " hierarchy are:");
 for (MdmHierarchyLevel mdmHierLevel :  mdmHierLevelList)
 {
   println("  " + mdmHierLevel.getName());
 }
}

// The executeSQL method is in the BaseExample11g class.
protected void executeSQL(String sql, String heading)
{
  try
  {
    Statement statement = dp.getConnection().createStatement();
    println(heading);
    ResultSet rs = statement.executeQuery(sql);
    SQLResultSetPrinter.printResultSet(getCursorPrintWriter(), rs);
    rs.close();
    statement.close();
  }
  catch (SQLException e)
  {
    println("Could not execute SQL statement. " + e);
  }
}

この例の出力は次のようになります。

The name of the OLAP view for the UNITS_CUBE_AWJ cube is:
  UNITS_CUBE_AWJ_VIEW

The OLAP view for the CALENDAR_YEAR hierarchy is:
  TIME_AWJ_CALENDAR_YEAR_VIEW
The names of the levels of the CALENDAR_YEAR hierarchy are:
  TOTAL_TIME
  YEAR
  QUARTER
  MONTH

The OLAP view for the PRODUCT_PRIMARY hierarchy is:
  PRODUCT_AWJ_PRODUCT_PRIMA_VIEW
The names of the levels of the PRODUCT_PRIMARY hierarchy are:
  TOTAL_PRODUCT
  CLASS
  FAMILY
  ITEM

The OLAP view for the SHIPMENTS hierarchy is:
  CUSTOMER_AWJ_SHIPMENTS_VIEW
The names of the levels of the SHIPMENTS hierarchy are:
  TOTAL_CUSTOMER
  REGION
  WAREHOUSE
  SHIP_TO

The OLAP view for the CHANNEL_PRIMARY hierarchy is:
  CHANNEL_AWJ_CHANNEL_PRIMA_VIEW
The names of the levels of the CHANNEL_PRIMARY hierarchy are:
  TOTAL_CHANNEL
  CHANNEL

The SQL SELECT statement is:
SELECT t.long_description time,
     ROUND(f.sales) sales
  FROM TIME_AWJ_CALENDAR_YEAR_VIEW t,
     PRODUCT_AWJ_PRODUCT_PRIMA_VIEW p,
     CUSTOMER_AWJ_SHIPMENTS_VIEW cu,
     CHANNEL_AWJ_CHANNEL_PRIMA_VIEW ch,
     UNITS_CUBE_AWJ_VIEW f
  WHERE t.level_name = 'YEAR'
     AND p.level_name = 'TOTAL_PRODUCT'
     AND cu.level_name = 'TOTAL_CUSTOMER'
     AND ch.level_name = 'TOTAL_CHANNEL'
     AND t.dim_key = f.time_awj
     AND p.dim_key = f.product_awj
     AND cu.dim_key = f.customer_awj
     AND ch.dim_key = f.channel_awj
  ORDER BY t.end_date

The results of the SQL query are:

TIME       SALES                 
---------- ----------------------
1998       100870877             
1999       134109248             
2000       124173522             
2001       116931722             
2002       92515295              
2003       130276514             
2004       144290686             
2005       136986572             
2006       140138317             
2007       <null>      
2.4.4.4 Sourceオブジェクトの使用

「例2-4」は、OLAPビューを使用してSQL文を作成する方法を示しています。 「例2-5」に示すように、OLAP Java API Sourceオブジェクトを使用して同じ結果を生成できます。 「例2-5」のコードは、「例2-4」MdmLevelHierarchyオブジェクトを使用します。

例2-5 Sourceオブジェクトを使用した基本キューブ問合せ

// Get the SALES measure and the Source for it.
MdmBaseMeasure mdmSales = mdmUnitsCube.findOrCreateBaseMeasure("SALES");
NumberSource sales = (NumberSource)mdmSales.getSource();

// Get the Source objects for the PRODUCT_PRIMARY, CHANNEL_PRIMARY
// and the SHIPMENTS hierarchies.
StringSource prodHier = (StringSource)mdmProdHier.getSource();
    StringSource shipHier = (StringSource)mdmShipHier.getSource();  
StringSource chanHier = (StringSource)mdmChanHier.getSource();
 
// Get the YEAR hierarchy level.
List<MdmHierarchyLevel> hierLevels = mdmCalHier.getLevels();
MdmHierarchyLevel mdmYearHierLevel = null;
for(MdmHierarchyLevel mdmHierLevel : hierLevels)
{
  mdmYearHierLevel = mdmHierLevel;
  if(mdmYearHierLevel.getName().equals("YEAR"))
  {
    break;
  }
}
// Get the Source for the YEAR level of the CALENDAR_YEAR hierarchy.
Source yearLevel = mdmYearHierLevel.getSource();

// Select single values for the hierarchies except for the time hierarchy.
Source prodSel = prodHier.selectValue("PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL");
Source custSel = shipHier.selectValue("SHIPMENTS::TOTAL_CUSTOMER::TOTAL");
Source chanSel = chanHier.selectValue("CHANNEL_PRIMARY::TOTAL_CHANNEL::TOTAL");

// Get the long description attribute for the TIME_AWJ dimension.
MdmBaseAttribute mdmTimeLDAttr = (MdmBaseAttribute)
  mdmTimeDim.getValueDescriptionAttribute();
Source timeLDAttr = mdmTimeLDAttr.getSource();

Source yearsWithLDValue = timeLDAttr.join(yearLevel);

Source result = sales.joinHidden(prodSel)
                     .joinHidden(custSel)
                     .joinHidden(chanSel)
                     .join(yearsWithLDValue);

getContext().commit();
getContext().displayResult(result);

result SourceCursorの値は、次のとおりです。 値を書式設定するためのコードは表示されません。 「例2-4」および「例2-5」の完全なコードについては、BasicCubeViewQuery.javaサンプル・プログラムを参照してください。

Year  Sales
----  ------------
1998  100870876.58
1999  134109248.15
2000  124173521.55
2001  116931722.03
2002   92515295.02
2003  130276513.86
2004  144290685.55
2005  136986571.96
2006  140138317.39
2007  NA