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の説明が続く](img/mtdtpkgs.gif)
「図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メタデータ・オブジェクト |
---|---|
キューブ |
|
メジャー |
|
計算済メジャー |
|
メジャー・フォルダ |
|
ディメンション |
|
階層 |
|
レベル |
|
属性 |
|
パッケージ内の他のクラスは、リレーショナル・オブジェクトに対応しています。 「表2-2」はそれらの対応を示します。
表2-2 対応するリレーショナルおよびMDMオブジェクト
リレーショナル・オブジェクト | MDMメタデータ・オブジェクト |
---|---|
スキーマ |
|
表 |
|
表の列 |
|
2.2 メタデータ・オブジェクトの識別、記述、および分類
ほとんどのOLAP Java APIメタデータ・オブジェクトには、一意の識別子(ID)、名前、所有者または包含オブジェクトがあります。 ほとんどのメタデータ・オブジェクトに説明と分類を関連付けることもできます。
ほとんどのメタデータ・クラスは抽象的なoracle.olapi.metadata.BaseMetadataObject
クラスを拡張しています。 BaseMetadataObject
は名前とIDを持つことができます。 ほとんどのメタデータ・オブジェクトは名前で取得できます。 IDはOracle OLAPによって内部的に使用されますが、アプリケーションはIDを使用していくつかのメタデータ・オブジェクトを取得することもできます。
BaseMetadataObject
にも所有者があり、getOwner
メソッドによって返されます。 ほとんどのメタデータ・オブジェクトでは、所有者はMdmDatabaseSchema
です。 MdmRootSchema
およびMdmMeasureDimension
オブジェクトの場合、所有者はルート・スキーマです。 BaseMetadataObject
のサブクラスではないMdmViewColumn
の場合、getOwner
メソッドは、MdmPrimaryDimension
、MdmBaseAttribute
、または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
オブジェクトはアナリティク・ワークスペースを表します。 MdmDatabaseSchema
のfindOrCreateAW
メソッドを呼び出して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キューブ、ディメンション、およびメジャー・フォルダのメタデータ・オブジェクトは、MdmCube
、MdmPrimaryDimension
、および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
に関連付けるには、MdmObject
のfindOrCreateDescription
またはsetDescription
メソッドを使用します。 findOrCreateDescription
メソッドは、MdmDescription
オブジェクトを返します。 説明の値を指定するには、MdmDescription
のsetValue
メソッドを使用します。
この例は、MdmDescription
とMdmObject
を関連付ける両方の方法を示しています。 この例では、mdmProdDim
はMdmStandardDimension
オブジェクトです。
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の説明が続きます](img/mdmdsctp.gif)
「図2-2 MdmObjectおよびMdmDescriptionの関連付けの説明」
11gより前のOLAP Java APIのバージョンには、MdmDescription
クラスとMdmDescriptionType
クラスがありませんでした。 これらのバージョンでは、MdmObject
クラスには、記述を取得して設定するための次のメソッドしかありませんでした。
図2-3 11g前に説明を取得して設定するメソッド
![図2-3の説明が続きます 図2-3の説明が続きます](img/mdmobjds.gif)
「図2-3 11gより前の説明を取得および設定するメソッドの説明」
後方互換性のために、OLAP Java APIはこれらのメソッドを引き続きサポートしますが、MdmDescription
およびMdmDescriptionType
オブジェクトを使用して内部的に実装しています。
2.3 メタデータ・オブジェクトの提供
Oracle OLAP Java APIメタデータ・オブジェクトへのアクセスは、最初はMdmMetadataProvider
オブジェクトとMdmSchema
オブジェクトによって提供されます。 MdmMetadataProvider
には、メタデータ・オブジェクトのXML表現をインポートまたはエクスポートする機能もあります。 次のトピックでは、MdmMetadataProvider
クラスとその使用方法について説明します。
2.3.1 メタデータ・プロバイダの記述
OLAP Java APIメタデータ・オブジェクトを取得または作成するには、まずMdmMetadataProvider
を作成する必要があります。 MdmMetadataProvider
の作成については、「"MdmMetadataProviderの作成"」を参照してください。
MdmMetadataProvider
のgetRootSchema
メソッドを使用すると、MdmRootSchema
クラスのインスタンスであるルートMdmSchema
オブジェクトを取得できます。 ルート・スキーマは、MdmDatabaseSchema
オブジェクトのコンテナです。
MdmDatabaseSchema
オブジェクトは、AW
、MdmCube
、MdmPrimaryDimension
オブジェクトなどのトップレベル・メタデータ・オブジェクトの所有者です。 トップレベルのオブジェクトはファースト・クラスのデータ・オブジェクトで、Oracle Databaseデータ・ディクショナリに表示されます。 データ・ディクショナリ内にあるため、これらのOLAPデータ・オブジェクトはSQL問合せで使用できます。 MdmDatabaseSchema
のfindOrCreate
メソッドを使用して、トップレベルのメタデータ・オブジェクトを作成します。
トップレベルのオブジェクトは、MdmMeasure
、MdmHierarchy
、MdmAttribute
オブジェクトなどのオブジェクトのコンテナです。 含まれているオブジェクトは、最上位のオブジェクトのメソッドを使用して作成します。
MdmSchema
オブジェクトの詳細については、「"スキーマの表現"」を参照してください。 トップレベルのメタデータ・オブジェクトの詳細については、「"データソースへのアクセスの提供"」を参照してください。
また、MdmMetadataProvider
のgetMetadataObject
メソッドまたは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テンプレートを使用して、MdmMetadataProvider
のimportXML
メソッドを通じてメタデータ・オブジェクトをインポートすることができます。 また、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
。 -
boolean
、modifyIfExists
。インポートされたXML定義に相違があり、同じ名前の既存のオブジェクトを変更するかどうかを示します。 -
オプションの
Map
、bindValues
。キーとしてバインド変数を含み、キーのオブジェクトとしてバインド変数を置き換える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
パラメータのMap
をexportFullXML
または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
は、MdmCube
、MdmDimension
、およびその他のMdmSchema
オブジェクトを含む他のMdmObject
オブジェクトの所有者またはコンテナです。 10gおよび以前のバージョンのOLAP Java APIでは、MdmSchema
クラスに複数のロールがありました。 APIには、1つのルートMdmSchema
、各メジャー・フォルダのMdmSchema
、およびアプリケーションが作成できるカスタムMdmSchema
オブジェクトがありました。
11g OLAP Java APIは、さまざまなロールを分離して定義するためのMdmSchema
のサブクラスを導入しました。 11gでは、MdmSchema
は以前のバージョンとの互換性と10gメタデータ・リーダー・モードでの使用のための具体的なクラスのままです。
11gでは、MdmSchema
はMdmSchema
の次のサブクラスの1つのインスタンスです:
-
MdmRootSchema
は、MdmDatabaseSchema
オブジェクトのコンテナであり、システムによって提供されます。 -
MdmDatabaseSchema
は、データベース・ユーザーのリレーショナル・スキーマを表し、MdmCube
、MdmDimension
、およびその他のMdmObject
オブジェクトを作成および所有します。MdmDatabaseSchema
オブジェクトは、システムによって提供されます。 -
MdmOrganizationalSchema
を使用して、メジャーと他のMdmOrganizationalSchema
オブジェクトを整理することができます。
次のトピックでは、MdmSchema
のサブクラスについて説明します。
2.3.2.1 ルート・スキーマの表現
ルート・スキーマは、データベース・スキーマ・オブジェクトのコンテナです。 この最上位のスキーマは、MdmRootSchema
クラスで表されます。 MdmMetadataProvider
のgetRootSchema
メソッドを使用してMdmRootSchema
を取得します。 MdmRootSchema
からすべてのMdmDatabaseSchema
オブジェクトを取得するか、個々のMdmDatabaseSchema
を名前で取得できます。
MdmRootSchema
クラスには、MdmMetadataProvider
によって提供されるMdmCube
、MdmMeasure
、およびMdmPrimaryDimension
オブジェクトもすべて含まれています。これらのオブジェクトを取得するメソッドもあります。 ただし、これらのメソッドによって戻されるオブジェクトのList
には、ユーザーが表示権限を持つキューブ、数値データ、またはディメンションのみが含まれます。
「図2-4」は、MdmMetadataProvider
とMdmSchema
のサブクラスとの関連付けを示します。
図2-4 MdmMetadataProviderとMdmSchemaサブクラスの関連
![図2-4の説明が続きます 図2-4の説明が続きます](img/mdmschas.gif)
「図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
を除いて、findOrCreateAW
やfindOrCreateStandardDimension
などのfindOrCreate
メソッドを使用して、新しいトップレベル・オブジェクトを作成したり、既存のものを取得したりすることができます。 オブジェクトを作成する方法については、「メタデータの発見」を参照してください。
最上位のOLAPメタデータ・オブジェクトを作成したTransaction
をコミットすると、それらのオブジェクトはOracleデータ・ディクショナリに存在します。 これらのオブジェクトは通常のSQL問合せによって使用でき、Oracle OLAP Java APIを使用するアプリケーションでも使用できます。
メタデータ・オブジェクトはOracleデータ・ディクショナリに存在するため、Oracle Database DBAは特定のタイプのメタデータ・オブジェクトへのアクセスを制限できます。 クライアント・アプリケーションでは、JDBC APIを使用して標準SQL GRANT
およびREVOKE
コマンドをJDBCセッションを介して送信することによって、このような制限を設定できます。
getTopLevelObject
メソッドを使用して、MdmTable
またはその他の最上位オブジェクトを取得できます。 getAWs
、getDimensions
、またはgetOrganizationalSchemas
などのメソッドを使用して、特定のタイプのトップレベル・オブジェクトのすべてのインスタンスを取得することも、getSchemaObjects
を使用してMdmDatabaseSchema
が所有するすべてのオブジェクトを取得することもできます。 addAW
やremoveSchemaObject
のようなメソッドを使って、トップレベルのオブジェクトを追加または削除することができます。
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の説明が続きます](img/dimmodel.gif)
「図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
オブジェクトのコンテナです。 アプリケーションは、MdmCube
のfindOrCreateBaseMeasure
およびfindOrCreateDerivedMeasure
メソッドを使用して、MdmBaseMeasure
またはMdmDerivedMeasure
オブジェクトを作成します。 addDimension
メソッドを使用して、メジャーの各ディメンションをキューブに関連付けます。
MdmCube
は、通常、単一のファクト表またはビューに対応します。 表またはビューをキューブに関連付けるには、Query
およびCubeMap
オブジェクトを使用します。 表またはビューのQuery
を取得し、CubeMap
のsetQuery
メソッドを使用して、Query
をCubeMap
に関連付けます。
CubeMap
には、キューブのメジャーとディメンションをデータソースにマップするMeasureMap
オブジェクトとCubeDimensionalityMap
オブジェクトが含まれています。 MeasureMap
では、メジャーの基本データを含むファクト表またはビューの列を識別するMdmBaseMeasure
およびExpression
を指定します。
キューブのディメンションをマップするには、キューブのMdmDimensionality
オブジェクトを取得します。 各MdmDimensionality
に対してCubeDimensionalityMap
を作成します。 その後、ファクト表またはビュー内のディメンションの外部キー列を識別するCubeDimensionalityMap
のExpression
を指定します。 リーフ・レベルのディメンション・メンバーの列以外のディメンション列を指定する場合は、CubeDimensionalityMap
のsetJoinCondition
メソッドを使用して結合Condition
を指定する必要があります。
MdmCube
には、関連するCubeOrganization
があります。 CubeOrganization
は、キューブをアナリティック・ワークスペースにデプロイしたり、リレーショナル・データベース・オブジェクトとしてデプロイします。 キューブをアナリティク・ワークスペースにデプロイするには、MdmCube
のfindOrCreateAWCubeOrganization
メソッドをコールします。 このメソッドで戻されたAWCubeOrganization
を使用して、Oracle OLAPのキューブ作成メソッド、キューブのメジャー・データの格納メソッド、およびキューブのマテリアライズド・ビューの作成メソッドなどのキューブの特性を指定します。 AWCubeOrganization
クラスの詳細については、「Oracle OLAP Java APIリファレンス」を参照してください。
AWCubeOrganization
のマテリアライズド・ビュー・オプションがREWRITE_MV_OPTION
の場合、Oracle OLAPはデータベース問合せ書き換えシステムで使用できるキューブのマテリアライズド・ビューを作成します。 マテリアライズド・ビュー・オプションがREWRITE_WITH_ATTRIBUTES_MV_OPTION
の場合、Oracle OLAPは、isPopulateLineage
メソッドがtrue
を戻すディメンション属性をリライト・マテリアライズド・ビューに含めます。 マテリアライズド・ビュー・オプションは、AWCubeOrganization
のsetMVOption
メソッドを使用して設定します。
MdmCube
には、ConsistentSolveSpecification
オブジェクトもあります。このオブジェクトには、Oracle OLAPがキューブのメジャーの値を計算する方法(またはsolves)を指定する1つ以上のConsistentSolveCommand
オブジェクトが含まれています。 たとえば、ConsistentSolveCommand
として、SUM
またはMAX
関数を表すAggregationCommand
を指定できます。 キューブのsetConsistentSolveSpecification
メソッドを使用してConsistentSolveSpecification
を指定します。
たとえば、親の値が子の値のSUM
に等しい場合など、メジャーの値が仕様に一致する場合、キューブはconsistentです。 BuildProcess
がConsistentSolveCommand
を実行すると、キューブの一貫性が保たれます。
MdmCube
オブジェクトとMdmMeasure
オブジェクトを作成してマッピングする例、およびこのトピックで説明するその他の操作の例については、「例4-7」と「例4-8」を参照してください。
「図2-6」は、MdmCube
とこのトピックで言及されているいくつかのクラスとの関連付けを示しています。 図は、アナリティク・ワークスペースにデプロイされたMdmCube
を示しています。
図2-6 MdmCubeと関連付けられたオブジェクト
![図2-6の説明が続きます 図2-6の説明が続きます](img/cubeasso.gif)
「図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
の値は、MdmMeasure
のMdmPrimaryDimension
オブジェクトの構造によって決まります。 つまり、MdmMeasure
の各値は、MdmPrimaryDimension
オブジェクトのメンバーの一意の組み合わせであるタプルによって識別されます。
MdmMeasure
のMdmPrimaryDimension
オブジェクトは、MdmStandardDimension
またはMdmTimeDimension
オブジェクトです。 通常、これらのオブジェクトは1つ以上の階層構造を持ちます。 これらのMdmPrimaryDimension
オブジェクトには、そのコンポーネントMdmHierarchy
オブジェクトのすべてのメンバーが含まれます。 この構造のため、MdmMeasure
の値は、次の1つ以上の値になります:
-
MdmMeasure
の基準となる計算、ビュー、またはファクト表の列の値。 これらの値は、ディメンションの階層のリーフ・レベルでのメンバーの組み合わせによって識別されます。 -
Oracle OLAPが提供した集計値。 これらのメジャー値は、階層の集約レベルからの少なくとも1つのメンバーによって識別されます。
-
MdmDerivedMeasure
またはカスタム・ディメンション・メンバーのExpression
で指定された値。
たとえば、MdmTimeDimension
とMdmStandardDimension
の製品によってディメンション化されたMdmBaseMeasure
を想像してみてください。 メジャーとディメンションのメタデータ・オブジェクトは、mdmUnitCost
、mdmTimeDim
、および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つしかありません。MdmRootSchema
のgetMeasureDimension
メソッドを呼び出すことによって、MdmMeasureDimension
を取得することができます。MdmMeasureDimension
のgetMeasures
メソッドを呼び出すと、データストアのメジャー値を取得できます。 -
MdmStandardDimension
。特別な特性はありませんが、通常、製品、顧客、流通チャネルなどのディメンションを表します。 -
MdmTimeDimension
は、メンバーの値として期間を持ちます。 各期間には終了日と期間があります。MdmTimeDimension
には、その情報を記録する属性を取得するためのメソッドがあります。
MdmPrimaryDimension
は、以下のインタフェースを実装しています。
-
MdmMemberListMapOwner
は、MemberListMap
オブジェクトの検索、作成、または取得のためのメソッドを定義します。 -
MdmViewColumnOwner
は、関連付けられたMdmViewColumn
を持つことができるオブジェクトのマーカー・インタフェースです。 -
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つのディメンション・レベルにすることができます。 MdmPrimaryDimension
のfindOrCreateDimensionLevel
でMdmDimensionLevel
を取得または作成します。 MemberListMap
を使用して、MdmDimensionLevel
をデータソースにマップできます。
MdmPrimaryDimension
には、それに含まれるすべてのMdmDimensionLevel
オブジェクトのリストを取得するメソッドがあります。 また、名前によってMdmDimensionLevel
を検出する(存在しない場合はそのオブジェクトを作成する)ためのメソッドも持ちます。
2.4.2.3 階層の表現
MdmHierarchy
は、MdmSubDimension
の抽象サブクラスです。 MdmHierarchy
の具体的なサブクラスはMdmLevelHierarchy
とMdmValueHierarchy
です。
MdmHierarchy
は、ディメンションのメンバーを階層構造に編成します。 MdmLevelHierarchy
の親子階層関係は、ディメンションのレベルに基づいています。 MdmValueHierarchy
では、階層関係はレベルではなくディメンション・メンバー値に基づいています。 MdmPrimaryDimension
は、いずれかまたは両方の種類の階層を複数持つことができます。
階層メンバーの親は、MdmHierarchy
のgetParentAttribute
メソッドを呼び出すことで取得できる親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または「葉のメンバー」です。
各メンバーはレベルにあります。 レベルは、トップレベルからリーフ・レベルに順序付けられます。 順序は、MdmPrimaryDimension
のMdmDimensionLevel
オブジェクトを作成する順序によって決まります。 最初に作成するMdmDimensionLevel
はトップレベルで、最後に作成したものはリーフ・レベルです。 たとえば、TIME_AWJディメンションのCALENDAR_YEAR階層の場合、CreateAndBuildAW.java
およびSpecifyAWValues
サンプル・プログラムでは、次の順序で4つのMdmDimensionLevel
オブジェクトが作成されます: TOTAL_TIME、YEAR、QUARTER、およびMONTH。 トップレベルはTOTAL_TIMEで、リーフ・レベルはMONTHです。
階層のメンバーに親がある場合、その親はより高いレベルになければなりません。 Oracle OLAPでは、階層内のすべてのリーフ・メンバーがリーフ・レベルにあると予想されます。 Oracle OLAPで階層をraggedにすることを指定できます。 荒れた階層では、1つ以上のリーフ・メンバーがリーフ・レベルにありません。 MdmLevelHierarchy
のsetIsRagged(true)
メソッドを呼び出すことによって、階層が不揃いになるように指定することができます。
Oracle OLAPでは、メンバーが最上位レベルより下のレベルにある場合、そのメンバーには親があり、親はメンバーのレベルのすぐ上のレベルにあると予測されます。 メンバーがトップレベルになく、そのメンバーが親を持たない場合、または親が次の上位レベルにない場合、階層はskip-level
階層になります。 MdmLevelHierarchy
のsetIsSkipLevel(true)
メソッドを呼び出すことによって、スキップ・レベル階層を許可するように指定できます。
「図2-7」は、通常の階層、ラグ階層、および2つのタイプのスキップ・レベル階層のメンバーの関係を示しています。
図2-7 レギュラ、ラグ、およびスキップレベルの階層
![図2-7の説明が続きます 図2-7の説明が続きます](img/ragskip.gif)
「図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 階層レベルの表現
MdmHierarchyLevel
はMdmSubDimension
のサブクラスです。 MdmHierarchyLevel
によって、MdmDimensionLevel
がMdmLevelHierarchy
に関連付けられます。
階層内のレベルの順序は、MdmLevelHierarchy
のMdmHierarchyLevel
オブジェクトを作成する順序によって指定されます。 作成する最初のMdmHierarchyLevel
は最高レベルで、最後に作成したものは最低レベルです。 階層を作成する例については、「"MdmLevelHierarchyの作成とマッピング"」を参照してください。
2.4.3 ディメンション属性の表現
OLAPディメンション属性は、MdmAttribute
オブジェクトで表されます。 MdmAttribute
には、MdmPrimaryDimension
のメンバーに関連する値があります。 MdmAttribute
クラスは、MdmMeasure
と同様に、MdmAttribute
の値がディメンションのメンバーに関連して意味を持つため、MdmDimensionedObject
のサブクラスです。
リレーションは、1対1、多対1、または1対多であり得る。 たとえば、PRODUCT_AWJディメンションには、短い説明属性、パッケージ属性、および祖先属性があります。 短い説明属性には、各ディメンション・メンバーごとに別々の値があります。 パッケージ属性には一連の値があり、それぞれが複数のディメンション・メンバーに適用されます。 ancestors属性には、単一のディメンション・メンバーに適用される複数の値があります。 MdmAttribute
がMdmDimension
のメンバーに適用されない場合、そのメンバーのMdmAttribute
値はnull
です。
「表2-3」は、PRODUCT_AWJディメンションの最初の数メンバーと、その関連する短い説明およびパッケージ属性値を示しています。 ディメンションのITEMレベルのメンバーの一部のみがパッケージ属性を持ちます。 他のアイテムおよび上位レベルの場合、パッケージ属性値はnull
で、表にNA
と表示されます。
表2-3 ディメンション・メンバーと関連する属性値
ディメンション・メンバー | 関連する簡単な説明 | 関連するパッケージ |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
... |
... |
MdmAttribute
から値を取得するには、MdmAttribute
のSource
とMdmDimension
の1つ以上のメンバーを指定するSource
に参加する必要があります。 Source
オブジェクトの結合については、「ソース・オブジェクトの理解」を参照してください。 MdmAttribute
とMdmDimension
のSource
オブジェクトの結合の例については、「例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つを作成したら、MdmPrimaryDimension
のsetShortValueDescriptionAttribute
メソッドやMdmTimeDimension
のsetTimeSpanAttribute
メソッドなどのメソッドを使用して、その属性をディメンションに関連付けます。 また、GLOBAL_AWJサンプルのアナリティク・ワークスペースのPACKAGE属性など、独自の目的のために属性を作成することもできます。
2.4.3.1.2 属性とMdmSubDimensionの関連付け
属性を作成したら、それをMdmSubDimension
に関連付けます。 MdmSubDimension
のaddAttribute
メソッドを使用して、単一のMdmSubDimension
に関連付けることができます。 また、MdmAttribute
のsetIsVisibleForAll
メソッドを使用して、MdmPrimaryDimension
のすべてのMdmDimensionLevel
オブジェクトに関連付けることもできます。 setIsVisibleForAll
メソッドでtrue
を指定すると、その属性は、現在MdmPrimaryDimension
に含まれているすべてのMdmDimensionLevel
オブジェクトと、後でディメンションに作成または追加するMdmDimensionLevel
オブジェクトに適用されます。
2.4.3.1.3 MdmAttributeオブジェクトの取得
MdmPrimaryDimension
のgetAttributes
メソッドは、クライアント・アプリケーションによって作成されたすべてのMdmAttribute
オブジェクトを返します。 MdmSubDimension
のgetAttributes
メソッドは、アプリケーションがaddAttribute
メソッドで追加した属性のみを返します。 MdmPrimaryDimension
の他のメソッドは、getHierarchyAttribute
、getLevelDepthAttribute
、またはgetParentAttribute
メソッドなど、Oracle OLAPが生成する特定の属性を戻します。
2.4.3.2 MdmBaseAttributeクラスの説明
MdmBaseAttribute
には、それを含むディメンションとそれが適用される階層のOLAPビューに格納されている値があります。 OLAPビューの詳細については、「"OLAPビューの使用"」を参照してください。
MdmPrimaryDimension
のfindOrCreateBaseAttribute
メソッドを使用してMdmBaseAttribute
を作成します。 リレーショナル表またはビューの列にMdmBaseAttribute
をマップします。 属性を作成したMdmPrimaryDimension
を作成すると、Oracle OLAPはMdmBaseAttribute
の値をOLAPビューに格納します。 getETAttributeColumn
メソッドを使用すると、OLAPビューでMdmBaseAttribute
の列を取得できます。 このメソッドはMdmViewColumn
オブジェクトを返します。
MdmBaseAttribute
オブジェクトの例は、「例4-5」で作成およびマッピングされたname属性と、「例4-6」で作成された長い記述属性です。 その長い記述属性のマッピングは「例4-3」にあります。
通常のOLAP問合せでは、Source
オブジェクトを使用して、MemberListMap
オブジェクトを使用してMdmBaseAttribute
をMdmDimensionLevel
オブジェクトにマップするだけで済みます。 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.4 属性の言語の指定
MdmBaseAttribute
のAttributeMap
を作成するときに、属性の言語を指定できます。 たとえば、CHANNEL
という名前のMdmDimensionLevel
の長い記述属性の言語としてフランス語を指定するには、MemberListMap.findOrCreateAttributeMap
メソッドを呼び出し、長い記述MdmBaseAttribute
とFRENCH
を言語を指定するString
として渡します。 次に、GLOBAL.CHANNEL_DIM.CHANNEL_DSC_FRENCH
をAttributeMap
のExpression
として指定します。 AttributeMap
のsetLanguage
メソッドを使用すると、作成した後に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.4 OLAPビューの使用
アナリティク・ワークスペース内のMdmCube
、MdmPrimaryDimension
および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
UNITS
、SALES
、およびCOST
の列は、キューブのメジャー用であり、他の4つの列は、キューブのディメンション用です。
2.4.4.2 ディメンションと階層の取得列名の表示と表示
ディメンションまたは階層のOLAPビューの名前を取得するには、MdmPrimaryDimension
またはMdmHierarchy
のgetETViewName()
メソッドを呼び出します。 メタデータ・オブジェクトの適切なメソッドを呼び出すことによって、ビュー内の列の名前を取得できます。 たとえば、次のコードは、CHANNEL_AWJディメンションのキー列の名前とCHANNEL_PRIMARY階層の親列の名前を取得します。
println(mdmChanDim.getETKeyColumn().getViewColumnName()); MdmViewColumn mdmParentCol =(MdmViewColumn) mdmChanHier.getETParentColumn(); println(mdmParentCol.getViewColumnName());
コードは次の出力を表示します。
DIM_KEY PARENT
MdmPrimaryDimension
またはMdmHierarchy
のsetETViewName
メソッドを使用すると、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
Source
のCursor
の値は次のとおりです。 値の書式設定のコードは表示されません。 「例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