5 Sourceオブジェクトの理解
この章では、問合せを指定するために使用するSource
オブジェクトについて説明します。 Source
オブジェクトを使用して、データ・ストアから取得するデータ、およびデータに対して実行する分析またはその他の処理を指定します。 「ソース・メソッドを使用した問合せの作成」は、Source
オブジェクトの使用例を提供します。 「動的問合せの作成」は、Template
オブジェクトを使用して変更可能な問合せを作成する方法について説明しています。
この章では、次の項目について説明します。
5.1 Sourceオブジェクトの概要
Source
オブジェクトを使用して、データベースから取得するデータを指定する問合せを作成します。 問合せとして、Source
はSQL SELECT
文に似ています。
問合せを作成するには、通常、oracle.olapi.metadata.mdm
パッケージのクラスを使用して、OLAPメタデータ・オブジェクトを表すMdmSource
オブジェクトを取得します。 MdmSource
オブジェクトから、Source
オブジェクトを取得できます。 DataProvider
のメソッドを使用して、他の種類のSource
オブジェクトを作成することもできます。 これらのSource
オブジェクトを使用して問合せを作成することができます。 問合せで指定されたデータを取得するには、Source
のCursor
を作成します。
Source
のメソッドを使用すると、ディメンション・メンバー、属性値、またはメジャー値の選択を指定できます。 数学的計算、比較、問合せの要素の順序付け、追加、削除など、Source
の要素に対する操作を指定することもできます。
Source
クラスは、小数の基本メソッドと、1つ以上の基本メソッドを使用する多数のショートカット・メソッドを持ちます。 最も複雑な基本的なメソッドは、join(Source joined, Source comparison, int comparisonRule, boolean visible)
メソッドとrecursiveJoin(Source joined, Source compariso4n, Source parent, int comparisonRule, boolean parentsFirst, boolean parentsRestrictedToBase, int maxIterations, boolean visible)
メソッドです。 join
およびrecursiveJoin
メソッドのその他多くのシグネチャは、基本メソッドの特定の操作のショートカットです。
この章では、特に記述している場合を除き、join
メソッドに関する情報がrecursiveJoin
メソッドにも同様に適用されます。 join
メソッドを使用すると、Source
の要素を、その入力と一致するSource
への入力とSource
を結合することによって、1つのSource
の要素を別のSource
の要素に関連付けることができます。 たとえば、ディメンションを入力として持つメジャーのデータを取得するために必要なディメンション・メンバーを指定するには、join
メソッドを使用してディメンション・メンバーをメジャーに関連付けます。 join
メソッドとSource
の入力については、「"ソースの入力と出力"」で説明しています。
Source
は、タイプとデータ型などの特定の特性を持ち、1つまたは複数の入力または出力を持つことができます。 この章ではこれらの概念について説明します。 また、さまざまな種類のSource
オブジェクトとその取得方法、join
メソッド、その他のSource
メソッド、およびこれらのメソッドを使用して問合せを指定する方法についても説明します。
5.2 Sourceオブジェクトの種類
データの指定および分析の実行に使用するSource
オブジェクトの種類と、これらを取得する方法を次に示します。
-
MdmDimension
またはMdmDimensionedObject
のようなMdmSource
オブジェクトのgetSource
メソッドによって返されるプライマリSource
オブジェクト。 プライマリSource
は、MdmSource
が表すデータへのアクセスを提供します。 通常、プライマリSource
オブジェクトを取得することは、問合せを作成する最初のステップです。 その後、通常、主要なSource
オブジェクトから要素を選択し、それによって派生したSource
オブジェクトを生成します。 -
Source
オブジェクトのいくつかのメソッドを呼び出すことによって得られるSource
オブジェクトを派生させました。join
などのメソッドは、メソッドを呼び出すSource
から派生した新しいSource
を返します。MdmDimension
のプライマリSource
で指定された値の単純なリスト以外の、データストアのすべての問合せは、Source
オブジェクトから派生します。 -
基本
Source
オブジェクト。FundamentalMetadataObject
のgetSource
メソッドによって返されます。 これらのSource
オブジェクトは、OLAP Java APIデータ型を表します。 -
createConstantSource
、createListSource
、またはDataProvider
のcreateRangeSource
メソッドによって返されるSource
オブジェクトを一覧表示または範囲指定します。 通常、この種のSource
をjoin
メソッドのjoined
またはcomparison
パラメータとして使用します。 -
Empty、NULL、またはVoid
Source
オブジェクト。 空と空のSource
オブジェクトはDataProvider
のgetEmptySource
またはgetVoidSource
メソッドによって返され、nullSource
オブジェクトはSource
のnullSource
メソッドによって返されます。 空のSource
には要素がありません。 voidSource
およびnullSource
にはそれぞれ、null
の値を持つ1つの要素があります。 voidSource
とnullSource
の違いは、voidSource
のタイプがValueデータ型のFundamentalMetadataObject
であり、nullSource
のタイプがnullSource
メソッドがそれを戻したSource
であることです。 通常、この種のSource
オブジェクトは、join
メソッドのjoined
またはcomparison
パラメータとして使用します。 -
動的
Source
オブジェクト。DynamicDefinition
のgetSource
メソッドによって返されます。 動的なSource
は通常、派生したSource
です。Template
によって生成されます。Template
は、エンド・ユーザーとの対話後に変更できる動的問合せを作成するために使用します。 -
パラメータ化された
Source
オブジェクト。Parameter
のcreateSource
メソッドによって返されます。 リストまたは範囲Source
のように、パラメータ化されたSource
をjoin
メソッドのパラメータとして使用します。 ただし、リストまたは範囲Source
とは異なり、結合操作後にParameter
が表す値を変更して、派生Source
が表す選択を変更することができます。 その派生したSource
のCursor
を作成し、その結果を取得することができます。 その後、Parameter
の値を変更することができます。派生したSource
の新しいCursor
を作成することなく、同じCursor
を使用して、変更された問合せの結果を取得できます。
-
BooleanSource
-
DateSource
-
NumberSource
-
StringSource
これらのサブクラスは異なるデータ型を持ち、それらのデータ型を必要とするSource
メソッドを実装します。 各サブクラスは、BooleanSource
のimplies
メソッドやStringSource
のindexOf
メソッドなど、それぞれ固有のメソッドを実装します。
5.3 Sourceオブジェクトの特性
Source
にはデータ型、型、識別子(ID)があり、空のSource
を除くすべてのSource
オブジェクトには1つ以上の要素があります。 次のトピックでは、これらの概念について説明します。
Source
オブジェクトには、1つ以上の入力や出力を持つものもあります。 これらの複雑な概念については、「"ソースの入力と出力"」で説明しています。
5.3.1 ソースの要素と値
空のSource
を除くすべてのSource
オブジェクトには、1つ以上の要素があります。 Source
の要素には値があり、nullでもかまいません。 たとえば、CHANNEL_AWJディメンションのMdmPrimaryDimension
オブジェクトのSource
には4つの要素があります。 これらの要素の値は、ディメンションのメンバーの一意の値です。次のとおりです。
CHANNEL_PRIMARY::CHANNEL::TOTAL CHANNEL_PRIMARY::CHANNEL::CAT CHANNEL_PRIMARY::CHANNEL::DIR CHANNEL_PRIMARY::CHANNEL::INT
5.3.2 Sourceのデータ型
FundamentalMetadataObject
クラスは、MdmSource
の要素の値のデータ型を表します。 Source
のデータ型は、基本的なSource
で表されます。 たとえば、BooleanSource
は、Javaのboolean
値を持つ要素を持ちます。 BooleanSource
のデータ型は、OLAP Java API Boolean値を表す基本Source
です。
Source
のデータ型を表す基本的なSource
を取得するには、Source
のgetDataType
メソッドを呼び出します。 基本Source
は、FundamentalMetadataObject
のgetSource
メソッドをコールしても取得できます。
プライマリSource
のデータ型は、関連するメタデータ・オブジェクトのSQLデータ型に関連しています。 たとえば、VARCHAR2(30)
のSQLデータ型を持つMdmBaseAttribute
は、データ型がOLAP Java API String値を表す基本Source
であるSource
を生成します。 次のコードはその基本的なSource
を取得します。
fmp.getStringDataType().getSource(); // fmp is the FundamentalMetadataProvider.
データ型にSource
を使用する典型的な方法は、結合または再帰結合操作の比較Source
です。 したがって、そのデータ型のすべての値のセットを表します。 getDataType
メソッドの使用例については、「例6-3」、「例6-5」、および「例6-11」を参照してください。
5.3.3 Sourceのタイプ
データ型とともに、Source
には型があります。これは、Source
の要素を引き出すSource
です。 Source
のタイプは、join
メソッドがSource
と別のSource
の入力を一致させることができるかどうかを決定します。 タイプを持たない唯一のSource
は、すべての値のセットを表し、他のすべてのSource
オブジェクトが最終的に降下するOLAP Java API Valueデータ型の基本的なSource
です。 Source
のタイプを取得するには、そのgetType
メソッドをコールします。
基本的なSource
のタイプは、Source
のデータ型です。 リストまたは範囲Source
のタイプは、リストまたは範囲Source
の要素の値のデータ型です。
プライマリSource
のタイプは、次のいずれかです。
-
プライマリ
Source
の要素の値のデータ型を表す基本的なSource
。 たとえば、getSource
メソッドによって返されるSource
のタイプは、すべてのOLAP Java API番号値のセットを表す基本的なSource
です。 -
プライマリ
Source
を含むオブジェクトのSource
。 たとえば、MdmLevelHierarchy
のgetSource
メソッドによって返されるSource
のタイプは、階層を含むMdmPrimaryDimension
のSource
です。
導出Source
のタイプは、次のいずれかです。
-
base
Source
は、Source
であり、そのメソッドは派生Source
を返しました。alias
、distinct
、extract
、join
、recursiveJoin
、またはvalue
メソッドまたはそのショートカットの1つによって返されるSource
は、タイプとしてベースSource
を持ちます。 -
基本
Source
。position
やcount
などのメソッドで返されるSource
のタイプは、OLAP Java API Integerデータ型の基本的なSource
です。eq
、le
などの比較を行うメソッドによって返されるSource
の型は、ブール型データ型の基本的なSource
です。NumberSource
のメソッドtotal
やaverage
など、集約関数を実行するメソッドによって返されるSource
の型は、関数を表す基本的なSource
です。
タイプとしてベースSource
を有する派生Source
は、それが導出されるSource
のサブタイプです。 タイプとして基本的なSource
を持つ派生Sourceは、基本的なSource
のサブタイプです。 isSubtypeOf
メソッドを使用して、Source
が別のSource
のサブタイプであるかどうかを判断できます。
たとえば、「例5-1」では、myList
オブジェクトはリストSource
です。 この例では、myList
を使用して、PRODUCT_AWJディメンションのMdmPrimaryDimension
のMdmLevelHierarchy
のprodHier
、Source
から値を選択します。 例の中のdp
は、DataProvider
です。
例5-1 isSubtypeOfメソッドの使用
Source myList = dp.createListSource(new String[] { "PRODUCT_PRIMARY::FAMILY::LTPC", "PRODUCT_PRIMARY::FAMILY::DTPC", "PRODUCT_PRIMARY::FAMILY::ACC", "PRODUCT_PRIMARY::FAMILY::MON"}); Source prodSel = prodHier.selectValues(myList); if (prodSel.isSubtypeOf(prodHier)) println("prodSel is a subtype of prodHier."); else println("prodSel is not a subtype of prodHier.");
prodSel
はprodHier
のサブタイプなので、if
文の条件はtrueです。次のように表示されます。
prodSel is a subtype of prodHier.
myList
のタイプは、基本的なString Source
です。 prodHier
のタイプは、PRODUCT_AWJディメンションのSource
です。 prodSel
の要素はprodHier
の要素から派生しているため、prodSel
のタイプはprodHier
です。
Source
のスーパータイプは、Source
のタイプのタイプであり、基本タイプのデータ型のSource
のタイプまでです。 たとえば、基本的なValue Source
は、prodSel
のタイプであるprodHier
のタイプである基本String Source
のタイプです。 基本的なValue Source
と基本的なString Source
は、両方ともprodSel
のスーパータイプです。 prodSel
Source
は、prodHier
のサブタイプであり、基本的なString Source
と基本的なValue Source
のサブタイプです。
5.3.4 SourceのSource識別子およびSourceDefinition
Source
には、データベースへの現在の接続中にそれを一意に識別するString
である識別IDがあります。 Source
の識別子を取得するには、getID
メソッドをコールします。 たとえば、次のコードでは、PRODUCT_AWJディメンションのMdmPrimaryDimension
のSource
のIDが取得され、値が表示されます。
println("The Source ID of prodDim is " + prodDim.getID());
このコードによって、次のように表示されます。
The Source ID of prodDim is Hidden..GLOBAL.PRODUCT_AWJ
各Source
にはSourceDefinition
オブジェクトもあり、Source
に関する情報が記録されます。 Oracle OLAPはこの情報を内部的に使用します。 たとえば、派生Source
のSourceDefinition
は、ベースSource
、結合Source
、比較Source
、比較ルール、およびvisible
パラメータの値など、Source
を生成した結合操作のパラメータを記録します。
DynamicDefinition
クラスは、SourceDefinition
のサブクラスです。 OLAP Java APIクライアント・アプリケーションは、Template
のDynamicDefinition
を使用して、Template
の動的Source
を取得します。
5.4 Sourceの入力と出力
Source
の入力は、Source
の要素が別のSource
の要素と関連していることを示します。 Source
の出力には、出力を伴うSource
の値が導出される要素が含まれています。 1つ以上の出力を持つSource
は、配列の配列にいくらか似ています。
Source
は入力を持つことができ、出力を持つことができます。 Source
の入力と出力は、他のSource
オブジェクトです。
ベースSource
の入力と出力は、そのベースSource
から派生したSource
の要素に影響します。 Source
を導出するには、ベースSource
のメソッドを使用します。 導出されたSource
は、メソッドおよびメソッドのパラメータに応じて、出力または入力を有することができ、またはその両方またはどちらも出力することができない。
value
やposition
メソッドなど、一部のSource
メソッドは、入力を持つSource
を返します。 join
とrecursiveJoin
メソッドは、出力を持つSource
を返すことができます。 結合操作が入力とその入力と一致するSource
を含むSource
を含む場合、入力は派生Source
の要素を生成する際のフィルタとして機能します。
次のトピックでは、join
メソッド、出力と入力の概念、および入力のマッチングについて説明します。 これらは、出力を持つSource
オブジェクト、入力を持つSource
オブジェクト、およびSource
と入力に一致する結合操作を生成する例を提供します。
5.4.1 joinメソッドの説明
join
メソッドを使用すると、あるSource
の要素を別のSource
の要素と結合して、派生Source
を生成します。 導出されたSource
は入力または出力を持つことができます。 派生したSource
の要素と、入力または出力を持つかどうかは、join
メソッドに渡すパラメータの値によって決まります。
join
メソッドの完全なシグネチャは次のとおりです。
Source join(Source joined, Source comparison, int comparisonRule, boolean visible)
5.4.1.1 結合されたパラメータの説明
joined
パラメータはSource
オブジェクトです。 join
メソッドは、基底の要素Source
と結合されたSource
の要素を結合し、その結果は他のjoin
パラメータの値によって決定されます。 ジョインされたSource
の値がベースSource
の値に関連していない場合、つまり、ジョイントされたSource
もベースSource
も、他方の入力と一致しない場合、ジョインは、ベースとSource
オブジェクトが結合されています。 「"ソースの出力"」トピックの例は、この種の結合操作を示しています。
結合されたSource
の値が基底のSource
の値に関連する場合、すなわち結合されたSource
または基底のSource
のいずれかが他方の入力である場合、導出されたSource
の要素は、入力。 「"ソースと入力のマッチング"」の例は、この種の結合操作を示しています。
5.4.1.3 comparisonRuleパラメータの説明
comparisonRule
パラメータの値は、結合されたSource
のどの値が結合操作に関与するかを指定します。 comparisonRule
値は、参加する値のソート順も決定します。 比較ルールは、Source
クラスの静的定数フィールドの1つです。 基本的な比較ルールは次のとおりです。
-
COMPARISON_RULE_SELECT
は、結合Source
の要素だけが比較Source
にも含まれ、結合操作に参加することを指定します。 -
COMPARISON_RULE_REMOVE
:比較Source
にない結合されたSource
の要素のみが結合操作に参加することを指定します。
他の比較ルールは、様々な方法で結果の値をソートするすべての選択操作です。 これらのルールは次のとおりです。
5.4.2 Sourceの出力
join
メソッドは、メソッドのパラメータで指定された基底Source
の要素の値を持つ派生Source
を返します。 これらの値は、導出されたSource
の基本値です。
join
メソッドのvisible
パラメータの値がtrue
である場合、結合されたSource
は、派生Source
の出力になります。 導出されたSource
の要素は、結合操作の他のパラメータで指定された出力値と基本値の値を持ちます。
導出されたSource
は0から多くの出力を持つことができます。 出力であるSource
自体が出力を持つことができます。 Source
の出力を得るには、getOutputs
メソッドを呼び出します。getOutputs
メソッドは、Source
オブジェクトのList
を返します。
以下のトピックの例はすべて、1つ以上の出力を持つSource
オブジェクトを生成する簡単な結合操作を持っています。 結合操作のSource
オブジェクトのいずれも入力を持たないので、結合操作によって生成された派生Source
オブジェクトの値は、基底のデカルト積と結合されたSource
オブジェクトです。
非常に異なる結果は、入力を持つSource
と、その入力と一致するSource
を含む結合操作から発生します。 入力と入力の一致を伴うSource
オブジェクトの例については、以下のトピックを参照してください。
5.4.2.1 出力付きソースの作成
例5-2 出力付きソースを生成する簡単な結合
この例では、join
メソッドの最も単純なシグネチャを使用して、1つの出力を持つSource
を生成します。 この例では、3つの要素を持つリストSource
、letters
を作成します。その値はA、B、およびCです。 また、Stephen、Leo、Mollyの3つの要素を持つSource
、names
というリストを作成します。
Source letters = dp.createListSource(new String[] {"A", "B", "C"}); Source names = dp.createListSource(new String[] {"Stephen", "Leo", "Molly"}); Source lettersWithNames = letters.join(names); // Oracle OLAP translates this shortcut signature of the join method into the // following full signature, where dp is the DataProvider for the session. // Source letters.join(names, // dp.getEmptySource(), // Source.COMPARISON_RULE_REMOVE, // true);
letters.join(names)
操作は、ベースSource
、letters
、および結合されたSource
、names
の要素を結合します。 比較Source
には要素がないため、結合されたSource
を生成する際に結合されたSource
に含まれる要素は削除されません。 (比較Source
は、この例に示す完全なjoin
シグネチャのdp.getEmptySource()
パラメータによって返される空のSource
です)。 結果として得られる派生Source
、lettersWithNames
は、ベースletters
と結合されたnames
の要素のデカルト積です。 letters
とnames
の両方に3つの要素があるため、lettersWithNames
の要素数は9です。
letters.join(names)
のvisible
パラメータはtrue
なので、派生したSource
には出力があります。 結合されたSource
からelements
が除去されなかったので、導出されたSource
は、結合されたSource
のすべての要素の値を有します。
Source
のCursor
は、Source
と同じ構造を持っています。 lettersWithNames
Source
のCursor
は、出力値のための導出されたSource
およびValueCursor
の基本値のためのValueCursor
を有します。 次の表は、ValueCursor
オブジェクトの値を示しています。 表には、ValueCursor
オブジェクトにない見出しが含まれています。
Output Values Base Values Stephen A Stephen B Stephen C Leo A Leo B Leo C Molly A Molly B Molly C
5.4.2.2 COMPARISON_RULE_SELECTを使用
例5-3 結合されたソースの要素を選択する簡単な結合
この例では、値を持つ比較Source
と比較ルールCOMPARISON_RULE_SELECT
を使用しています。 この例では、letter
とnames
Source
オブジェクトを「例5-2」から使用し、someNames
Source
を追加します。 比較Source
としてsomeNames
を使用します。 結合操作から派生したSource
の出力には、結合されたSource
と比較Source
の両方にある名前のみがあります。
Source someNames = dp.createListSource(new String[] {"Stephen", "Molly"}); Source lettersAndSelectedNames = letters.join(names, someNames, Source.COMPARISON_RULE_SELECT, true);
lettersAndSelectedNames
Source
のCursor
には、Source
で指定された値があります。 次の表は、Cursor
の値を示し、見出しが追加されています。
Output Values Base Values Stephen A Stephen B Stephen C Molly A Molly B Molly C
5.4.2.3 COMPARISON_RULE_REMOVEの使用
例5-4 結合されたソースの要素を削除する簡単な結合
この例では、値を持つ比較Source
と比較ルールCOMPARISON_RULE_REMOVE
を使用しています。 その比較ルールは、結合操作の参加を、結合されたSource
オブジェクトと同じ値の結合操作から除外します。 従って、導出されたSource
の出力は、結合されたSource
のうち、比較Source
にない名前のみを有します。
この例では、「例5-3」と同じbase、joined、および比較Source
オブジェクトがあります。
Source lettersAndNamesWithoutRemovedNames = letters.join(names, someNames, Source.COMPARISON_RULE_REMOVE, true);
lettersAndNamesWithoutRemovedNames
Source
のCursor
には、Source
で指定された値があります。 次の表は値を示し、見出しが追加されています。
Output Values Base Values Leo A Leo B Leo C
5.4.2.4 2つの出力を持つソースの生成
例5-5 2つの出力を持つソースを生成する簡単な結合
Source
を出力を持つSource
に結合し、visible
parameter
がtrue
であれば、結合操作は結合されたSource
を追加出力として持つSource
を生成します。 この例に示すように、追加の出力が最初の出力になります。
この例では、「例5-3」のSource
オブジェクトを使用し、2つの色の名前を含む別のリストSource
、colors
を作成します。 この例では、colors
Source
をlettersWithSelectedNames
Source
に結合して、lettersWithSelectedNamesAndColors
Source
を生成します。
lettersWithSelectedNames
Source
は、出力としてnames
を持っています。 lettersWithSelectedNamesAndColors
Source
は、出力としてcolors
とnames
の両方を持っています。 最初の出力はcolors
で、2番目の出力はnames
です。
Source colors = dp.createListSource(new String[] {"Green", "Maroon"}); Source lettersWithSelectedNames = letters.join(names, someNames, Source.COMPARISON_RULE_SELECT, true); Source lettersWithSelectedNamesAndColors = lettersWithSelectedNames.join(colors);
lettersWithSelectedNamesAndColors
Source
のCursor
には、次の表に示す値があります。 表に見出しが追加されました。
Output 1 Values Output 2 Values Base Values Green Stephen A Green Stephen B Green Stephen C Green Molly A Green Molly B Green Molly C Maroon Stephen A Maroon Stephen B Maroon Stephen C Maroon Molly A Maroon Molly B Maroon Molly C
5.4.2.5 出力を隠す
例5-6 出力を非表示にする簡単な結合
join
メソッドのvisible
パラメータがfalse
の場合、結合されたSource
は結合操作に参加しますが、結合によって導出されたSource
の出力としては表示されません。 この例では、joinHidden
ショートカット・メソッドを使用して、lettersWithSelectedNames
オブジェクトとcolors
Source
オブジェクトを「例5-5」から結合します。 この例では、joinHidden
ショートカットの完全なjoin
シグネチャがコメントに含まれています。
Source lettersWithSelectedNamesAndHiddenColors = lettersWithSelectedNames.joinHidden(colors); // The full signature of the joinHidden shortcut method is // Source result = base.join(joined, // dp.getEmptySource(), // Source.COMPARISON_RULE_REMOVE, // false); // So if Source base = lettersWithSelectedNames and // Source joined = colors, then the result Source is the same as the // lettersWithSelectedNamesAndHiddenColors Source.
lettersWithSelectedNamesAndHiddenColors
Source
のCursor
には、次の表に示す値があります。 表に見出しが追加されました。
colors
Source
の値が出力値として表示されない場合でも、派生lettersWithSelectedNamesAndHiddenColors
Source
にはまだ12要素があることに注意してください。 導出されたSource
は、隠されたcolors
Source
の各値に対するlettersWithSelectedNames
Source
の6つの値の1つのセットを有します。
この例では、次の出力が表示されます。
Output Values Base Values Stephen A Stephen B Stephen C Molly A Molly B Molly C Stephen A Stephen B Stephen C Molly A Molly B Molly C
5.4.3 Sourceの入力
「"ソースの出力"」トピックの例はすべて、無関係な基底と結合されたSource
オブジェクトのデカルト積である要素を持つ派生Source
オブジェクトを生成します。 このような操作は便利ですが、Source
オブジェクトのより強力な側面は、1つのSource
の要素を別のSource
に関連付ける機能です。 このような関係が存在する場合、関連する要素間の操作の結果である他のSource
オブジェクトを派生させることができます。 たとえば、別のSource
の選択された要素のみを含むSource
を派生させることができます。 要素間のこの関係は、Source
の入力によって表されます。
入力があるSource
は、データの不完全な指定です。 入力は、結合操作がデータ仕様を完了するために必要な要素を持つことができるSource
のタイプを表します。 Cursor
を使用してデータを取得するには、その入力を、仕様を満たす要素を持つSource
と一致させる必要があります。
join
またはrecursiveJoin
メソッドを使用して、入力をSource
に一致させます。 この一致は、ベースSource
と結合されたSource
との間で起こる。
入力のマッチングは、結合操作によって導出されたSource
が、結合されたSource
の要素の値に関連する基本Source
の要素のみを有するように、フィルタとして機能します。 Source
と入力のマッチングに関するルールは、「"ソースと入力のマッチング"」で説明しています。 そのトピックには、入力の一致の結果である派生Source
オブジェクトが生成される例があります。
Source
は0から多くの入力を持つことができます。 getInputs
メソッドを呼び出すと、Source
のすべての入力を取得できます。
一部の主要なSource
オブジェクトには入力があります。 Source
クラスのいくつかのメソッドを使用して、入力を持つSource
を派生させることができます。
5.4.3.1 入力を持つプライマリ・ソース・オブジェクト
MdmDimensionedObject
サブクラスMdmAttribute
とMdmMeasure
の主要なSource
オブジェクトには入力があります。 MdmAttribute
の主要なSource
には1つの入力があります。 MdmMeasure
の主要なSource
には、1つまたは複数の入力があります。
MdmAttribute
またはMdmMeasure
の入力は、属性またはメジャーをディメンション化するMdmPrimaryDimension
オブジェクトのSource
オブジェクトです。 属性またはメジャーの値を取得するには、関連するディメンション・メンバーを含むSource
を使用して属性またはメジャーを結合する必要があります。 結合操作は、ディメンション・メンバーを含むSource
で属性またはメジャーの入力を照合します。 「例5-7」は、属性の入力とその属性のディメンションを一致させます。 「例5-8」は、メジャーの入力をそのメジャーのディメンションと照合します。
5.4.3.2 入力によるソースの導出
いくつかのSource
メソッドは、常に入力を持つSource
を返します。 extract
、position
、またはvalue
メソッドによって返されるSource
は、入力としてベースSource
を持ちます。 これらのメソッドを使用して、別のSource
の要素から要素が派生(フィルタリング)されたSource
を生成することができます。
value
メソッドは、ベースSource
の要素を持ち、ベースSource
を入力として持つSource
を返します。 通常は、value
メソッドによって返されたSource
をベースとして使用するか、join
メソッドのSource
に参加させるか、またはSource
と比較することがあります。 この章と「ソース・メソッドを使用した問合せの作成」のいくつかの例では、value
メソッドを使用しています。
position
メソッドは、ベースSource
の各要素の位置を持ち、ベースSource
を入力として持つSource
を返します。 position
メソッドの使用例については、「例6-4」を参照してください。
結合するSource
オブジェクトの要素に値としてSource
オブジェクトがある場合は、extract
メソッドを使用します。 extract
メソッドの使用例については、「例5-12」、「例6-8」、「例6-13」、および「例6-14」を参照してください。
5.4.4 ソースと入力のマッチング
結合操作では、Source
と入力の一致は、ベースSource
と結合されたSource
の間でのみ発生します。 Source
は、次のいずれかの条件に該当する場合、入力と一致します。
-
Source
が入力と同じオブジェクトか、入力のサブタイプである。 -
Source
が入力と同じオブジェクトである出力を持つか、入力のサブタイプである出力を持つ。
結合操作は、前のリストに示されている順序で条件を検索します。 Source
の出力のリストを再帰的に検索します。出力の出力を含め、入力との一致を探します。 この検索は、最初の一致するSource
が見つかると終了します。 入力は1つのSource
と一致することができます。
入力があるSource
が入力と一致するSource
に結合されると、join
メソッドによって戻された派生Source
は、メソッドのパラメータで指定された要素に関連する基本要素を持ちます。 派生したSource
には入力がありません。
Source
を入力と照合しても、ベースSource
または結合Source
の出力には影響しません。 ベースSource
に、結合されたSource
の入力と一致する出力がある場合、結果のSource
には入力がありませんが、出力はあります。 結合操作の基底のSource
または結合されたSource
が、操作で一致しない入力を持つ場合、一致しない入力は結果のSource
の入力です。
join
メソッドの比較Source
は、入力一致には関係しません。 比較Source
に入力がある場合、その入力は一致せず、join
メソッドによって返されたSource
は同じ入力を持ちます。
以下のトピックの例では、Source
と入力の一致を示しています。
5.4.4.1 MdmAttributeのソースの入力のマッチング
「例5-7」は、MdmBaseAttribute
のSource
とMdmPrimaryDimension
のSource
の結合を示します。 この例では、CHANNEL_AWJディメンションのMdmPrimaryDimension
からローカル値属性を取得します。 属性locValAttr
のSource
には、入力としてMdmPrimaryDimension
のSource
があります。
この例では、locValAttr
は結合操作のベースSource
であり、chanDim
は結合されたSource
です。 chanDim
はCHANNEL_AWJディメンションのMdmPrimaryDimension
のSource
のインスタンスであるため、chanDim
はlocValAttr
の入力と一致します。 結合の結果はdimMembersWithLocalValue
です。dimMembersWithLocalValue
は出力としてchanDim
を持ち、入力がありません。
locValAttr
Source
には、CHANNEL_AWJディメンションの4つのメンバーのそれぞれが異なるローカル値を持つため、4つの要素があります。 結合操作によって得られたSource
、dimMembersWithLocalValue
には、4つの要素があります。 各要素の値は、ディメンション・メンバーおよび関連する属性値です。 ディメンション・メンバーは出力からの値であり、属性値は基底からの値です。
「例5-7」は、ベースSource
の入力と結合されたSource
の一致を示します。 この例では、mdmDBSchema
はGLOBALスキーマのMdmDatabaseSchema
です。
dimMembersWithLocalValue
Source
のCursor
には、次の表に示す値があります。 出力値は、結合されたSource
、chanDim
から派生した一意のディメンション・メンバー値です。 ベース値は、ベースSource
、locValAttr
から得られます。 表に見出しが追加されました。
Output Values Base Values CHANNEL_PRIMARY::TOTAL_CHANNEL::TOTAL TOTAL CHANNEL_PRIMARY::CHANNEL::CAT CAT CHANNEL_PRIMARY::CHANNEL::DIR DIR CHANNEL_PRIMARY::CHANNEL::INT INT
例5-7 ディメンション・メンバーの属性の取得
MdmStandardDimension mdmChanDim = mdmDBSchema.findOrCreateStandardDimension("CHANNEL_AWJ"); Source chanDim = mdmChanDim.getSource(); Source locValAttr = mdmChanDim.getLocalValueAttribute().getSource(); Source dimMembersWithLocalValue = locValAttr.join(chanDim);
5.4.4.2 メジャーの入力のマッチング
「例5-8」はメジャーから値を取得する方法を示します。 この例では、UNIT_PRICEメジャーを含むMdmCube
を取得し、そのキューブからメジャーのMdmBaseMeasure
を取得します。 キューブとキューブのメジャーは、PRODUCT_AWJおよびTIME_AWJディメンションによってディメンション化されます。 この例では、これらのディメンションのMdmPrimaryDimension
オブジェクトを取得し、それらのメタデータ・オブジェクトのSource
オブジェクトを取得します。
メジャー用のSource
、unitPrice
は、2つのMdmPrimaryDimension
オブジェクトのSource
オブジェクトを入力として持っています。 この例では、ディメンションのSource
オブジェクトを使用して、メジャーのSource
を結合します。 結合操作は、メジャーの入力とディメンションのSource
オブジェクトを一致させます。
この例では、まず、PRODUCT_AWJディメンションのSource
をメジャーのSource
にジョインします。 そのunitPrice.join(prodDim)
操作は、unitPrice
からの基本値を持ち、prodDim
を出力として持つSource
を導出します。 また、入力としてTIME_AWJディメンションのSource
もあります。 次の結合操作では、unitPrice.join(prodDim)
によって生成されたSource
と、timeDim
(TIME_AWJディメンション用のSource
)が結合されます。 その結合操作は、unitPrice.join(prodDim)
によって派生したSource
の入力とtimeDim
との入力に一致します。
2番目の結合操作によって派生したSource
はpricesByProductAndTime
です。 Source
には入力がなく、出力としてPRODUCT_AWJおよびTIME_AWJディメンションのSource
オブジェクトがあります。 pricesByProductAndTime
用のCursor
には、各時間価値に対する各製品価値の価格が含まれています。
この例では、最終的にpricesByProductAndTime
のcount
メソッドが呼び出されます。 このメソッドは、NumberSource
numPricesByProductAndTime
を返します。これには、pricesByProductAndTime
Source
の要素数が含まれています。 numPricesByProductAndTime
Source
のCursor
には、製品と時間タプルのメジャー値の数である値4998が含まれています。
特定の製品と時間のメジャー値のみを含むSource
を生成するには、必要なディメンション値を指定するSource
オブジェクトを使用してメジャーのSource
を結合する必要があります。 ディメンションのSource
の1次メソッドを使用して、そのような選択を生成できます。 Source
の値の選択を表すSource
を生成する1つの手段は、value
メソッドを使用することです。
例5-8 メジャー値の取得
この例では、ベースSource
の入力と結合されたSource
との一致を示します。 この例では、mdmDBSchema
はGLOBALスキーマのMdmDatabaseSchema
です。
MdmCube mdmPriceCube = mdmDBSchema.findOrCreateCube("PRICE_CUBE_AWJ"); MdmBaseMeasure mdmUnitPrice = mdmPriceCube.findOrCreateBaseMeasure("UNIT_PRICE"); MdmStandardDimension mdmProdDim = mdmDBSchema.findOrCreateStandardDimension("PRODUCT_AWJ"); MdmTimeDimension mdmTimeDim = mdmDBSchema.findOrCreateTimeDimension("TIME_AWJ"); Source prodDim = mdmProdDim.getSource(); Source timeDim = mdmTimeDim.getSource(); Source unitPrice = mdmUnitPrice.getSource(); Source pricesByProductAndTime = unitPrice.join(prodDim).join(timeDim); NumberSource numPricesByProductAndTime = pricesByProductAndTime.count();
5.4.4.3 メソッドを使用して入力付きソースを派生させる
例5-9 valueメソッドを使用してソースを自分自身に関連付ける
この例では、lettersValue
Source
がletters.value()
メソッドによって返されます。 lettersValue
Source
は入力としてletters
を持っています。 入力は、入力と一致するSource
の値と、入力と一致するSource
の値との間の関係を表します。
ジョイン操作では、ベースSource
としてletters
が、ジョインされたSource
としてlettersValue
が設定されます。 ベースSource
、letters
は、同じであるため、lettersValue
の入力と一致します。letters
もletters
です。 結合操作によって生成されたSource
、lettersByLettersValue
は出力としてlettersValue
を持ちます。 入力がありません。 lettersByLettersValue
の各要素は、letters
の基底値と、lettersValue
の関連値を持ちます。
Source letters = dp.createListSource(new String[] {"A", "B", "C"}); Source lettersValue = letters.value(); Source lettersByLettersValue = letters.join(lettersValue);
lettersByLettersValue
Source
のCursor
には、次の表に示す値があります。 表に見出しが追加されました。
Output Values Base Values A A B B C C
lettersByLettersValue
には、関連するベースおよび結合Source
オブジェクトの値のみが含まれているため、lettersByLettersValue
Source
のCursor
の基本値は出力値と同じです。 letters.join(letters)
のように、ベースおよび結合されたSource
オブジェクトが無関係だった場合、結合操作によって生成されたSource
には、ベースのデカルト積が含まれ、結合されたSource
オブジェクトが含まれます。
5.4.4.4 メソッドの値を使用したソース値の選択
例5-10 メソッドの値を使用してソースの要素を選択
value
メソッドを使用すると、別のSource
の要素の選択であるSource
を派生させることができます。 この例では、「例5-7」のPRODUCT_AWJディメンションのSource
から2つの要素を選択します。 この例では、結合されたSource
の入力と一致するベースSource
を示します。
Source productsToSelect = dp.createListSource(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY STD"}); Source selectedProducts = prodDim.join(prodDim.value(), productsToSelect, Source.COMPARISON_RULE_SELECT, false); // Hide the output.
productsToSelect
Source
のCursor
には、次の値があります。
PRODUCT_PRIMARY::ITEM::ENVY EXE PRODUCT_PRIMARY::ITEM::ENVY STD
selectedProducts
Source
のCursor
には、次の値があります。
PRODUCT_PRIMARY::ITEM::ENVY EXE PRODUCT_PRIMARY::ITEM::ENVY STD
2つのSource
オブジェクトには同じ値が含まれています。 ただし、オブジェクトのタイプは異なります。 productsToSelect
Source
のタイプは、Stringデータ型のFundamentalMetadataObject
のSource
です。 selectedProducts
はprodDim
から派生しているため、selectedProducts
Source
のタイプはprodDim
です。 したがって、selectedProducts
はprodDim
のサブタイプであるため、次の例に示すように、入力としてPRODUCT_AWJディメンションのSource
を持つSource
と一致させることができます。
例5-11 派生ソース・オブジェクトを使用したメジャー値の選択
この例では、2つのディメンションのSource
オブジェクトから要素を選択し、選択したディメンション・メンバーのメジャー値を取得します。 この例では、「例5-8」と同じディメンションとメジャーを使用しています。 ただし、この例では、メジャーのSource
の入力と一致するSource
オブジェクトは、ディメンションのSource
オブジェクトではありません。 代わりに、それらのディメンションのSource
オブジェクトのサブタイプです。 サブタイプは、ディメンションの選択されたメンバーを指定します。 メジャーをpricesForSelectedProductsAndTimes
ディメンションと結合することによって導出されるSource
には、6つの要素があり、「例5-8」のpricesByProductAndTime
Source
の4998要素の代わりに、3つの時間値の2つの製品のメジャー値のみを指定します。 この例では、mdmDBSchema
はGLOBALスキーマのMdmDatabaseSchema
です。
// Create lists of product and time dimension members. Source productsToSelect = dp.createListSource(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY STD"}); Source timesToSelect = dp.createListSource(new String[] {"CALENDAR_YEAR::MONTH::2000.01", "CALENDAR_YEAR::MONTH::2001.01", "CALENDAR_YEAR::MONTH::2002.01"}); // Get the PRICE_CUBE_AWJ cube. MdmCube mdmPriceCube = mdmDBSchema.findOrCreateCube("PRICE_CUBE_AWJ"); // Get the UNIT_PRICE measure from the cube. MdmBaseMeasure mdmUnitPrice = mdmPriceCube.findOrCreateBaseMeasure("UNIT_PRICE"); // Get the PRODUCT_AWJ and TIME_AWJ dimensions. MdmStandardDimension mdmProdDim = mdmDBSchema.findOrCreateStandardDimension("PRODUCT_AWJ"); MdmTimeDimension mdmTimeDim = mdmDBSchema.findOrCreateTimeDimension("TIME_AWJ"); // Get the Source objects for the dimensions and the measure. Source prodDim = mdmProdDim.getSource(); Source timeDim = mdmTimeDim.getSource(); Source unitPrice = mdmUnitPrice.getSource(); // Using the value method, derive Source objects that specify the selected // dimension members. Source selectedProducts = prodDim.join(prodDim.value(), productsToSelect, Source.COMPARISON_RULE_SELECT, false); Source selectedTimes = timeDim.join(timeDim.value(), timesToSelect, Source.COMPARISON_RULE_SELECT, false); // Derive a Source that specifies the unitPrice values for the selected products // and times. Source pricesForSelectedProductsAndTimes = unitPrice.join(selectedProducts) .join(selectedTimes);
pricesForSelectedProductsAndTimes
Source
のCursor
には、次の表に示す値があります。 表に見出しが追加されました。
Month Product Price ----------------------------- ------------------------------- ------- CALENDAR_YEAR::MONTH::2000.01 PRODUCT_PRIMARY::ITEM::ENVY EXE 3358.02 CALENDAR_YEAR::MONTH::2000.01 PRODUCT_PRIMARY::ITEM::ENVY STD 3000.11 CALENDAR_YEAR::MONTH::2001.01 PRODUCT_PRIMARY::ITEM::ENVY EXE 3223.28 CALENDAR_YEAR::MONTH::2001.01 PRODUCT_PRIMARY::ITEM::ENVY STD 2426.07 CALENDAR_YEAR::MONTH::2002.01 PRODUCT_PRIMARY::ITEM::ENVY EXE 3008.95 CALENDAR_YEAR::MONTH::2002.01 PRODUCT_PRIMARY::ITEM::ENVY STD 2140.71
5.4.4.5 抽出メソッドを使用したソース・オブジェクトの要素の結合
extract
メソッドは、ベースSource
を入力として持つSource
を導出します。 extract
メソッドは、Source
の要素の値がSource
オブジェクトそのものである場合に使用します。
例5-12 ソースの要素の抽出
この例では、selectValues
メソッドを使用して、PRODUCT_AWJディメンションのStringSource
から2つの要素の選択を派生します。 selectValues
メソッドは、selectedProducts
とselectedTimes
Source
オブジェクトを生成する「例5-10」と「例5-11」のメソッドの完全なjoin
シグネチャのショートカットです。
この例では、2つの派生Source
オブジェクトを要素値として持つリストSource
、sourcesToCombine
を作成します。 sourcesToCombine.extract()
メソッドはsourcesToCombineWithAnInput
を生成します。これはsourcesToCombine
を入力として持つSource
です。 結合操作sourcesToCombineWithAnInput.joinHidden(sourcesToCombine)
は、結合されたsourcesToCombine
とsourcesToCombineWithAnInput
の入力を照合し、入力または出力を持たないcombinedSources
を生成します。 このSource
要素の結合のためのショートカットは、appendValues
メソッドです。
MdmStandardDimension mdmProdDim = mdmDBSchema.findOrCreateStandardDimension("PRODUCT_AWJ"); StringSource prodDim = (StringSource) mdmProdDim.getSource(); Source productsToSelect = prodDim.selectValues(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY ABM", "PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY STD"}); Source moreProductsToSelect = prodDim.selectValues(new String[] {"PRODUCT_PRIMARY::ITEM::SENT FIN", "PRODUCT_PRIMARY::ITEM::SENT MM", "PRODUCT_PRIMARY::ITEM::SENT STD"}); Source sourcesToCombine = dp.createListSource(new Source[] {productsToSelect, moreProductsToSelect}); Source sourcesToCombineWithAnInput = sourcesToCombine.extract(); Source combinedProducts = sourcesToCombineWithAnInput.joinHidden(sourcesToCombine);
combinedProducts
Source
のCursor
には、次の値があります。
PRODUCT_PRIMARY::ITEM::ENVY ABM PRODUCT_PRIMARY::ITEM::ENVY EXE PRODUCT_PRIMARY::ITEM::ENVY STD PRODUCT_PRIMARY::ITEM::SENT FIN PRODUCT_PRIMARY::ITEM::SENT MM PRODUCT_PRIMARY::ITEM::SENT STD
5.5 パラメータ化Sourceオブジェクト
パラメータ化されたSource
オブジェクトは、パラメータ化されたSource
で指定された要素のセットを変更することによって、問合せを指定し、問合せの異なる結果セットを取得する方法を提供します。 Parameter
のcreateSource
メソッドを使用して、パラメータ化されたSource
を作成します。 Parameter
は、パラメータ化されたSource
が指定する値を提供します。
このトピックの例は、Parameter
オブジェクトを使用する非常に簡単なデモです。 Parameter
の一般的な使い方は、「例6-9」に示すように、キューブのページの端を指定することです。 その他に、Parameter
オブジェクトは現在必要とする要素セットのみをサーバーからフェッチするためにも使用します。 例6-15に、異なる要素セットのフェッチにParameter
オブジェクトを使用する例を示しています。
Parameter
オブジェクトを作成するときは、Parameter
の初期値を指定します。 Parameter
を使用して、パラメータ化されたSource
を作成します。 問合せを指定するには、パラメータ化されたSource
を含めます。 問合せのCursor
を作成します。 Parameter
の値を変更するには、setValue
メソッドを使用します。これは、問合せが指定する要素のセットを変更します。 同じCursor
を使用すると、新しい値のセットを取得できます。
この例では、Parameter
とパラメータ化されたSource
を使用してディメンション内のメンバーを指定する方法を示します。 この例では、PRODUCT_AWJディメンションのMdmStandardDimension
を取得し、MdmStandardDimension
のSource
をStringSource
として取得します。
この例では、ディメンション・メンバーを初期値として持つStringParameter
オブジェクトを作成します。 その後、StringParameter
のcreateSource
メソッドを使用して、パラメータ化されたSource
、paramProdSel
を作成します。 次に、ディメンション・メンバーを選択するジョイン操作で、paramProdSel
を比較Source
として使用します。
この例では、ディメンションのローカル値属性のSource
を取得します。 これは、Source
、locValAttr
、paramProdSel
と結合します。 ジョイン操作では、dimMemberWithLocalValue
Source
が生成されます。
この例では、dimMemberWithLocalValue
用のCursor
を作成し、Cursor
の値を表示します。 Cursor
の位置をリセットし、prodParam
StringParameter
の値を変更すると、この例ではCursor
の値が再び表示されます。
dp
オブジェクトは、DataProvider
です。 getContext
メソッドは、現在のTransaction
をコミットするメソッドとCursor
の値を表示するメソッドを持つContext11g
オブジェクトを取得します。
例5-13 パラメータ化されたソースを使用してディメンションの選択を変更
MdmStandardDimension mdmProdDim = mdmDBSchema.findOrCreateStandardDimension("PRODUCT_AWJ"); StringSource prodDim = (StringSource) mdmProdDim.getSource(); StringParameter prodParam = new StringParameter(dp, "PRODUCT_PRIMARY::FAMILY::LTPC"); Source prodParamSrc = prodParam.createSource(); Source paramProdSel = prodDim.join(prodDim.value(), prodParamSrc); Source locValAttr = mdmProdDim.getLocalValueAttribute().getSource(); Source dimMemberWithLocalValue = locValAttr.join(paramProdSel); // Commit the Transaction. getContext().commit(); // Create a Cursor for the Source. CursorManager cursorMngr = dp.createCursorManager(dimMemberWithLocalValue); Cursor cursor = cursorMngr.createCursor(); // Display the value of the Cursor. getContext().displayCursor(cursor); // Change the product parameter value. prodParam.setValue("PRODUCT_PRIMARY::FAMILY::DTPC"); // Reset the Cursor position to 1 cursor.setPosition(1); // Display the value of the Cursor again. getContext().displayCursor(cursor);
dimMemberWithLocalValue
のCursor
には、次の情報が表示されます。
PRODUCT_PRIMARY::FAMILY::LTPC,LTPC
StringParameter
の値を変更してCursor
の位置をリセットした後、dimMemberWithLocalValue
のCursor
は次のように表示します。
PRODUCT_PRIMARY::FAMILY::DTPC,DTPC