5 Sourceオブジェクトの理解
この章では、問合せを指定するために使用するSourceオブジェクトについて説明します。 Sourceオブジェクトを使用して、データ・ストアから取得するデータ、およびデータに対して実行する分析またはその他の処理を指定します。 「ソース・メソッドを使用した問合せの作成」は、Sourceオブジェクトの使用例を提供します。 「動的問合せの作成」は、Templateオブジェクトを使用して変更可能な問合せを作成する方法について説明しています。
この章の内容は次のとおりです。
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メソッド、およびこれらのメソッドを使用して問合せを指定する方法についても説明します。
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メソッドなど、それぞれ固有のメソッドを実装します。
Sourceオブジェクトの特性
Sourceにはデータ型、型、識別子(ID)があり、空のSourceを除くすべてのSourceオブジェクトには1つ以上の要素があります。 次のトピックでは、これらの概念について説明します。
Sourceオブジェクトには、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
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」を参照してください。
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のサブタイプです。
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を取得します。
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と入力に一致する結合操作を生成する例を提供します。
joinメソッドの説明
joinメソッドを使用すると、あるSourceの要素を別のSourceの要素と結合して、派生Sourceを生成します。 導出されたSourceは入力または出力を持つことができます。 派生したSourceの要素と、入力または出力を持つかどうかは、joinメソッドに渡すパラメータの値によって決まります。
joinメソッドの完全なシグネチャは次のとおりです。
Source join(Source joined,
Source comparison,
int comparisonRule,
boolean visible)
結合されたパラメータの説明
joinedパラメータはSourceオブジェクトです。 joinメソッドは、基底の要素Sourceと結合されたSourceの要素を結合し、その結果は他のjoinパラメータの値によって決定されます。 ジョインされたSourceの値がベースSourceの値に関連していない場合、つまり、ジョイントされたSourceもベースSourceも、他方の入力と一致しない場合、ジョインは、ベースとSourceオブジェクトが結合されています。 「"ソースの出力"」トピックの例は、この種の結合操作を示しています。
結合されたSourceの値が基底のSourceの値に関連する場合、すなわち結合されたSourceまたは基底のSourceのいずれかが他方の入力である場合、導出されたSourceの要素は、入力。 「"ソースと入力のマッチング"」の例は、この種の結合操作を示しています。
comparisonRuleパラメータの説明
comparisonRuleパラメータの値は、結合されたSourceのどの値が結合操作に関与するかを指定します。 comparisonRule値は、参加する値のソート順も決定します。 比較ルールは、Sourceクラスの静的定数フィールドの1つです。 基本的な比較ルールは次のとおりです。
-
COMPARISON_RULE_SELECTは、結合Sourceの要素だけが比較Sourceにも含まれ、結合操作に参加することを指定します。 -
COMPARISON_RULE_REMOVE:比較Sourceにない結合されたSourceの要素のみが結合操作に参加することを指定します。
他の比較ルールは、様々な方法で結果の値をソートするすべての選択操作です。 これらのルールは次のとおりです。
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-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
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
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
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-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
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を派生させることができます。
入力を持つプライマリ・ソース・オブジェクト
MdmDimensionedObjectサブクラスMdmAttributeとMdmMeasureの主要なSourceオブジェクトには入力があります。 MdmAttributeの主要なSourceには1つの入力があります。 MdmMeasureの主要なSourceには、1つまたは複数の入力があります。
MdmAttributeまたはMdmMeasureの入力は、属性またはメジャーをディメンション化するMdmPrimaryDimensionオブジェクトのSourceオブジェクトです。 属性またはメジャーの値を取得するには、関連するディメンション・メンバーを含むSourceを使用して属性またはメジャーを結合する必要があります。 結合操作は、ディメンション・メンバーを含むSourceで属性またはメジャーの入力を照合します。 「例5-7」は、属性の入力とその属性のディメンションを一致させます。 「例5-8」は、メジャーの入力をそのメジャーのディメンションと照合します。
入力によるソースの導出
いくつかの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」を参照してください。
ソースと入力のマッチング
結合操作では、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と入力の一致を示しています。
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-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-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-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
抽出メソッドを使用したソース・オブジェクトの要素の結合
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
パラメータ化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