機械翻訳について

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オブジェクト

ディメンション・メタデータ・オブジェクト 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メソッドは、MdmPrimaryDimensionMdmBaseAttribute、またはMdmMeasureなどのMdmViewColumnOwnerインタフェースの所有実装を返します。 MdmViewColumnは、OLAPビューの列を表します。 OLAPビューの詳細については、「"OLAPビューの使用"」を参照してください。

一部のBaseMetadataObjectオブジェクトは、それらを作成したメタデータ・オブジェクトに含まれています。 例えば、MdmBaseMeasureはそれを作成したMdmCubeに含まれています。 getContainedByObjectメソッドを呼び出すと、メタデータ・オブジェクトのコンテナを取得できます。

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

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から名前でオブジェクトを取得できます。 名前でオブジェクトを取得する方法の詳細については、「"スキーマの表現"」を参照してください。

ユーザー・インタフェースに名前や説明を表示する場合や、目的に応じて任意の数の名前と説明をMdmObjectクラスに関連付けるには、MdmDescriptionクラスを使用します。 そのクラスの使用方法については、「"説明の使用"」を参照してください。

2.2.1.2 一意の識別子の記述

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

  • objectName

  • ownerName.objectName

  • ownerName.containerName.objectName

たとえば、ユーザーGLOBALのスキーマを表すMdmDatabaseSchemaの場合、getIDメソッドによって戻されるIDは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キューブ、ディメンション、またはメジャー・フォルダの名前は、リレーショナル表またはビューと同じ名前になります。 Release 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キューブ、ディメンション、およびメジャー・フォルダのメタデータ・オブジェクトは、MdmCubeMdmPrimaryDimension、およびMdmSchemaクラスによって11gで表されます。 これらのクラスの1つのインスタンスには、getNamespaceメソッドによって返される名前空間を関連付けることができます。 11gオブジェクトの場合、名前空間はnullです。

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

レガシー・メタデータ・オブジェクトの名前空間は、メタデータ・フォーマットとオブジェクトのタイプを識別します。 AWXML_またはCWM_で始まり、CUBEまたはDIMENSIONなどのオブジェクトのタイプを持ちます。 たとえば、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のメソッドを呼び出すことによって、これらの定義された記述型の1つを取得します。 たとえば、次のコードは、長い名前と長い説明の記述型オブジェクトを取得します。

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は、0から多くの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の値を持つ分類を追加して、アプリケーションがオブジェクトをユーザー・インタフェースに表示すべきでないことを示すことができます。 オブジェクトのaddObjectClassificationメソッドを使用して、MdmObjectに分類を割り当てることができます。 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メソッドを呼び出すことによって、メタデータ・オブジェクトを取得または作成します。 たとえば、MdmDatabaseSchemaオブジェクトのfindOrCreateCubeメソッドを呼び出して、MdmCubeを取得または作成できます。 ただし、オブジェクトのIDを指定することによって、既存のメタデータ・オブジェクトをMdmMetadataProviderから取得することもできます。 MdmMetadataProvider.getMetadataObjectメソッドは、オブジェクトのIDであるStringを取得し、そのオブジェクトを返します。 getMetadataObjectsメソッドは、IDのListを受け取り、オブジェクトのListを返します。

1つのセッションからメタデータ・オブジェクトの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

  • オプションのMapは、メタ・オブジェクトの参照をキーとして持ち、キーのオブジェクトとしてSQLバインド変数のように機能するString値を持ちます。 このパラメータのバインド変数の詳細については、「"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を含むXMLまたはStringの入力用のjava.io.Reader

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

  • booleanmodifyIfExists。インポートされたXML定義に相違があり、同じ名前の既存のオブジェクトを変更するかどうかを示します。

  • オプションのMapbindValues。キーとしてバインド変数を含み、キーのオブジェクトとしてバインド変数を置き換えるString値。 このパラメータのバインド値の詳細については、「"XMLテンプレートのバインド変数の記述"」を参照してください。

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

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

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

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

2.3.1.2.3 XMLテンプレートのバインド変数の記述

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

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

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

bindVariablesマップで指定された値は、"&BV;"の形式でエクスポートされたXMLに表示されます。ここで、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、およびその他のMdmSchemaオブジェクトを含む他のMdmObjectオブジェクトの所有者またはコンテナです。 10gおよび以前のバージョンのOLAP Java APIでは、MdmSchemaクラスに複数のロールがありました。 APIには、1つのルートMdmSchema、各メジャー・フォルダのMdmSchema、およびアプリケーションが作成できるカスタムMdmSchemaオブジェクトがありました。

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

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

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

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

  • MdmOrganizationalSchemaを使用して、メジャーと他のMdmOrganizationalSchemaオブジェクトを整理することができます。

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

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

ルート・スキーマは、データベース・スキーマ・オブジェクトのコンテナです。 この最上位のスキーマは、MdmRootSchemaクラスで表されます。 MdmMetadataProvidergetRootSchemaメソッドを使用してMdmRootSchemaを取得します。 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のメソッドを使用して、MdmDatabaseSchemaオブジェクトの1つまたはすべてを取得できます。 ただし、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を使用して標準SQL GRANTおよびREVOKEコマンドをJDBCセッションを介して送信することによって、このような制限を設定できます。

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

2.3.2.3 組織スキーマの表現

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

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

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

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

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

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

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

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

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

2.4.1 キューブとメジャーを表す

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

2.4.1.1 キューブを表す

OLAPキューブは、MdmCubeクラスで表されます。 MdmCubeは、同じMdmPrimaryDimensionオブジェクトのセットによってディメンション化されたMdmMeasureオブジェクトのコンテナです。 アプリケーションは、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がキューブのメジャーの値を計算する方法(またはsolves)を指定する1つ以上のConsistentSolveCommandオブジェクトが含まれています。 たとえば、ConsistentSolveCommandとして、SUMまたはMAX関数を表すAggregationCommandを指定できます。 キューブのsetConsistentSolveSpecificationメソッドを使用してConsistentSolveSpecificationを指定します。

たとえば、親の値が子の値のSUMに等しい場合など、メジャーの値が仕様に一致する場合、キューブはconsistentです。 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データ型を判別します。

MdmDerivedMeasureには、物理ストレージが関連付けられていません。 Oracle OLAPは、必要に応じてMdmDerivedMeasureの値を動的に計算します。

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

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

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

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

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

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

mdmTimeDimからのものとmdmProdDimからのものの2つのメンバーのユニークな組み合わせは、各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 ディメンションを表す

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

  • MdmMeasureDimensionは、データ・ストア内のすべてのMdmMeasureオブジェクトをディメンション・メンバーの値として持ちます。 データストアにはMdmMeasureDimensionが1つしかありません。 MdmRootSchemagetMeasureDimensionメソッドを呼び出すことによって、MdmMeasureDimensionを取得することができます。 MdmMeasureDimensiongetMeasuresメソッドを呼び出すと、データストアのメジャー値を取得できます。

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

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

MdmPrimaryDimensionは、以下のインタフェースを実装しています。

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

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

  • 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つのディメンション・レベルにすることができます。 MdmPrimaryDimensionfindOrCreateDimensionLevelMdmDimensionLevelを取得または作成します。 MemberListMapを使用して、MdmDimensionLevelをデータソースにマップできます。

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

2.4.2.3 階層の表現

MdmHierarchyは、MdmSubDimensionの抽象サブクラスです。 MdmHierarchyの具体的なサブクラスはMdmLevelHierarchyMdmValueHierarchyです。

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

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

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

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

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

MdmLevelHierarchyは、MdmHierarchyのサブクラスです。 MdmLevelHierarchyは、最上位、最上位、葉、または最下位のレベルを持つツリー状の構造を持っています。 各メンバーは、階層内にゼロまたは1つの親を持つことができます。 サイクルは許可されません。たとえば、メンバーAがメンバーBの親であり、メンバーBがメンバーCの親であり、メンバーCがメンバーAの親である場合です。

他のメンバーの子ではないメンバーは、topメンバーです。 子を持つメンバーは、階層のaggregatesまたは「集約メンバー」です。 子がないメンバーは、階層のleavesまたは「葉のメンバー」です。

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

階層のメンバーに親がある場合、その親はより高いレベルになければなりません。 Oracle OLAPでは、階層内のすべてのリーフ・メンバーがリーフ・レベルにあると予想されます。 Oracle OLAPで階層をraggedにすることを指定できます。 荒れた階層では、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があり、両方のオブジェクトには同じメンバーがあります。 getHierarchyLevelsメソッドを呼び出して、MdmLevelHierarchyのレベルを取得します。

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

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

2.4.2.3.2 値ベースの階層の表現

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

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

2.4.2.4 階層レベルの表現

MdmHierarchyLevelMdmSubDimensionのサブクラスです。 MdmHierarchyLevelによって、MdmDimensionLevelMdmLevelHierarchyに関連付けられます。

階層内のレベルの順序は、MdmLevelHierarchyMdmHierarchyLevelオブジェクトを作成する順序によって指定されます。 作成する最初のMdmHierarchyLevelは最高レベルで、最後に作成したものは最低レベルです。 階層を作成する例については、「"MdmLevelHierarchyの作成とマッピング"」を参照してください。

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

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

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

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

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

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

TOTAL_PRODUCT::TOTAL

全製品

該当なし

CLASS::HRD

ハードウェア

該当なし

FAMILY::DISK

CD/DVD

該当なし

ITEM::EXT CD ROM

External 48X CD-ROM

該当なし

ITEM::EXT DVD

External - DVD-RW - 8X

Executive

ITEM::INT 8X DVD

Internal - DVD-RW - 8X

該当なし

ITEM::INT CD ROM

Internal 48X CD-ROM

Laptop Value Pack

ITEM::INT CD USB

Internal 48X CD-ROM USB

該当なし

ITEM::INT RW DVD

Internal - DVD-RW - 6X

Multimedia

...

...

...

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

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

2.4.3.1 MdmAttributeクラスの説明

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

2.4.3.1.1 属性のタイプの説明

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

2.4.3.1.2 属性とMdmSubDimensionの関連付け

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

2.4.3.1.3 MdmAttributeオブジェクトの取得

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

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

属性のターゲット・ディメンションは、表内の列間に外部キー制約を定義するのと同様です。 属性のすべての値は、ターゲット・ディメンションのキーでもなければなりません。

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

2.4.3.2 MdmBaseAttributeクラスの説明

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

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

MdmBaseAttributeオブジェクトの例は、「例4-5」で作成およびマッピングされたname属性と、「例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の長い記述属性の言語としてフランス語を指定するには、MemberListMap.findOrCreateAttributeMapメソッドを呼び出し、長い記述MdmBaseAttributeFRENCHを言語を指定するStringとして渡します。 次に、GLOBAL.CHANNEL_DIM.CHANNEL_DSC_FRENCHAttributeMapExpressionとして指定します。 AttributeMapsetLanguageメソッドを使用すると、作成した後にAttributeMapの言語を指定できます。

2.4.3.2.5 多言語属性の指定

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

データベースで使用されている言語によって、ディメンションのOLAPビューに表示される言語が決まります。 セッション中に一度に使用できる言語は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のサンプル・クラスには、MdmBaseAttributeオブジェクトのリネージを各MdmHierarchyLevelに追加することを指定するコード行があります。 クラスの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 setPopulateLineage(false)の後のOLAPビュー列の値

この例では、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 setPopulateLineage(true)の後のOLAPビュー列の値

この例では、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は、MdmPrimaryDimensiongetParentAttributeメソッドおよびgetAncestorsAttributeメソッドによって戻される属性など、いくつかの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.

MdmCube.setViewNameメソッドを使用すると、OLAPビューの名前を変更できます。 名前を永続的に変更するには、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

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

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 ソース・オブジェクトの使用

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

例2-5 ソース・オブジェクトを使用する基本キューブ問合せ

// 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