この章では、問合せの指定に使用するSource
オブジェクトについて説明します。Source
オブジェクトを使用して、データ・ストアから取得するデータ、およびデータに対して実行する分析またはその他の処理を指定します。Source
オブジェクトの使用例は、第6章「Sourceメソッドを使用した問合せの作成」を参照してください。Template
オブジェクトを使用した変更可能な問合せを作成する方法の詳細は、第10章「動的問合せの作成」を参照してください。
この章では、次の項目について説明します。
oracle.olapi.metadata.mdm
パッケージのクラスを使用して、OLAPメタデータのメジャーおよびディメンションを表すMdmSource
オブジェクトを取得した後、そのオブジェクトからSource
オブジェクトを取得できます。また、DataProvider
のメソッドを使用して他のSource
オブジェクトを作成することもできます。このSource
オブジェクトを使用して、データベースから取得するデータを指定する問合せを作成できます。データを取得するには、Source
のCursor
を作成します。
Source
のメソッドを使用すると、ディメンションやメジャーの値の選択や、Source
の要素に対する数学計算、比較、および問合せの要素の順序付け、追加または削除などの操作を指定できます。Source
クラスは、小数の基本メソッドと、1つ以上の基本メソッドを使用する多数のショートカット・メソッドを持ちます。最も複雑な基本メソッドは、join(Source joined, Source comparison, int comparisonRule, boolean visible)
メソッドおよびrecursiveJoin(Source joined, Source comparison, Source parent, int comparisonRule, boolean parentsFirst, boolean parentsRestrictedToBase, int maxIterations, boolean visible)
メソッドです。join
およびrecursiveJoin
メソッドのその他多くのシグネチャは、基本メソッドの特定の操作のショートカットです。
この章では、特に記述している場合を除き、join
メソッドに関する情報がrecursiveJoin
メソッドにも同様に適用されます。join
メソッドを使用すると、Source
の要素を選択でき、さらに重要なこととして、1つのSource
の要素を別のSource
の要素に関連付けることができます。たとえば、メジャー・データの取得に必要なディメンション・メンバーを指定するには、join
メソッドを使用して、そのディメンションをメジャーに関連付けます。
Source
は、タイプおよびデータ型などの特定の特性を持ち、1つ以上の入力や出力を持つ場合もあります。この章ではこれらの概念について説明します。また、様々な種類のSource
オブジェクトとそれらを取得する方法、join
メソッドと他のSource
メソッド、および、これらのメソッドを使用した問合せの指定方法についても説明します。
データの指定および分析の実行に使用するSource
オブジェクトの種類と、これらを取得する方法を次に示します。
プライマリSource
オブジェクト。これは、MdmDimension
またはMdmMeasure
などのMdmSource
オブジェクトのgetSource
メソッドによって戻されます。プライマリSource
は、MdmSource
が表すデータへのアクセスを提供します。通常、問合せを作成する際の最初の手順として、プライマリSource
オブジェクトを取得します。一般的に次の手順として、プライマリSource
オブジェクトから要素を選択します。これによって、導出Source
オブジェクトが生成されます。
導出Source
オブジェクト。これは、Source
オブジェクトの一部のメソッドをコールすることによって取得します。join
などのメソッドは、メソッドのコール対象であるSource
に基づく新しいSource
を戻します。MdmLevelHierarchy
またはMdmLevel
など、MdmSubDimension
のプライマリSource
によって指定された値の単純なリストではない、データ・ストアでのすべての問合せが、導出Source
オブジェクトです。
基本Source
オブジェクト。これは、FundamentalMetadataObject
のgetSource
メソッドによって戻されます。このSource
オブジェクトは、OLAP Java APIのデータ型を表します。
リストまたは範囲Source
オブジェクト。これは、DataProvider
のcreateConstantSource
、createListSource
またはcreateRangeSource
メソッドによって戻されます。通常、この種のSource
は、join
メソッドのjoined
またはcomparison
パラメータとして使用します。
Empty、NULL、またはVoid Source
オブジェクト。EmptyおよびVoid Source
オブジェクトはDataProvider
のgetEmptySource
またはgetVoidSource
メソッドで戻され、NULL Source
オブジェクトは、Source
のnullSource
メソッドによって戻されます。Empty Source
は要素を持ちません。VoidまたはNULL Source
は、値がNULL
の要素を1つ持ちます。この2つの違いは、Void Source
のタイプはValueデータ型のFundamentalMetadataObject
であるのに対して、NULL Source
のタイプは、自身のnullSource
メソッドによって戻されたSource
です。通常、この種のSource
オブジェクトは、join
メソッドのjoined
またはcomparison
パラメータとして使用します。
動的Source
オブジェクト。これは、DynamicDefinition
のgetSource
メソッドによって戻されます。動的Source
は通常、導出Source
です。これは、エンド・ユーザーとのやりとりの後で変更できる動的問合せの作成に使用するTemplate
によって生成されます。
パラメータ化Source
オブジェクト。これは、Parameter
のcreateSource
メソッドによって戻されます。リストまたは範囲Source
同様、パラメータ化Source
は、join
メソッドのパラメータとして使用します。ただし、リストまたは範囲Source
とは異なり、結合操作後にParameter
が表す値を変更できるので、導出Source
が表す選択を変更できます。導出Source
にCursor
を作成すると、その問合せの結果を取得できます。こうすると、Parameter
の値を変更し、導出Source
に新しいCursor
を作成することなく、同じCursor
を使用して、変更した問合せの結果を取得できます。
プレースホルダSource
オブジェクト。これは、特定のデータ型のプレースホルダを表すFundamentalMetadataObject
のgetSource
メソッドによって戻されます。プレースホルダのFundamentalMetadataObject
は、getNumberPlaceholder
またはgetStringPlaceholder
メソッドなどの、FundamentalMetadataProvider
のメソッドで取得します。Oracle OLAPでは、MdmModel
またはCustomModel
のAssignment
オブジェクトにおいてプレースホルダSource
オブジェクトが使用されます。Assignment
では、プレースホルダSource
が、値が割り当てられている現在のディメンション化されたSource
のSource
を表します。カスタム・ディメンション・メンバーの作成にプレースホルダSource
を使用すると、Oracle OLAPによって適切なModel
にAssignment
が自動的に追加されます。
Source
クラスには次のサブクラスがあります。
BooleanSource
DateSource
NumberSource
StringSource
これらのサブクラスは異なるデータ型を持ち、それらのデータ型を必要とするSource
メソッドを実装します。各サブクラスは、BooleanSource
のimplies
メソッドやStringSource
のindexOf
メソッドなど、それぞれ固有のメソッドを実装します。
Source
はデータ型とタイプ、Source
識別子(ID)およびSourceDefinition
を持ちます。ここではこれらの概念について説明します。Source
オブジェクトには、1つ以上の入力や出力を持つものもあります。これらの複雑な概念については、「Sourceの入力と出力」の項を参照してください。一部のSource
オブジェクトは、関連Model
オブジェクトを持ちます(「ModelオブジェクトとSourceオブジェクト」の項を参照)。
第2章「OLAP Java APIメタデータの理解」で説明したように、OLAP Java APIには、MdmSource
の要素のデータ型を表すクラスFundamentalMetadataObject
があります。Source
のデータ型は、基本Source
によって表されます。たとえば、BooleanSource
は、Javaのboolean
値を持つ要素を持ちます。BooleanSource
のデータ型は、OLAP Java API Boolean値を表す基本Source
です。
Source
のデータ型を表す基本Source
を取得するには、Source
のgetDataType
メソッドをコールします。基本Source
は、FundamentalMetadataObject
のgetSource
メソッドをコールしても取得できます。
例5-1では、OLAP Java API Stringデータ型の基本Source
、MdmPrimaryDimension
のデータ型のSource
、およびMdmPrimaryDimension
のSource
のデータ型のSource
を取得し、それらを比較して同じオブジェクトであることを確認します。例の中のdp
はDataProvider
で、mdmProdDim
は製品ディメンションのMdmPrimaryDimension
です。
例5-1 Sourceのデータ型の取得
FundamentalMetadataProvider fmp = dp.getFundamentalMetadataProvider(); FundamentalMetadataObject fmoStringDataType = fmp.getStringDataType(); Source stringDataTypeSource = fmoStringDataType.getSource(); FundamentalMetadataObject fmoMdmProdDimDataType = mdmProdDim.getDataType(); Source mdmProdDimDataTypeSource = fmoMdmProdDimDataType.getSource(); Source prodDim = mdmProdDim.getSource(); Source prodDimDataTypeSource = prodDim.getDataType(); if(stringDataTypeSource == prodDimDataTypeSource && mdmProdDimDataTypeSource == prodDimDataTypeSource) println("The Source objects for the data types are the same."); else println("The Source objects for the data types are not the same.");
この例によって、次のように表示されます。
The Source objects for the data types are the same.
Source
は、データ型の他にタイプを持ちます。タイプとは、Source
の要素の導出元のSource
です。Source
のタイプによって、join
メソッドがSource
を別のSource
の入力と一致させることができるかどうかが決まります。タイプを持たない唯一のSource
は、OLAP Java API Valueデータ型の基本Source
です。これはすべての値セットを表し、その他すべてのSource
オブジェクトは最終的にこれに由来します。
基本Source
のタイプはそのSource
のデータ型です。リストまたは範囲Source
のタイプは、そのリストまたは範囲Source
の要素の値のデータ型です。
プライマリSource
のタイプは、次のいずれかです。
プライマリSource
の要素の値のデータ型を表す基本Source
。たとえば、一般的なMdmMeasure
のgetSource
メソッドによって戻されたSource
は、すべてのOLAP Java API数値データ型を表す基本Source
です。
プライマリSource
のMdmSource
がコンポーネントであるMdmSource
のSource
。たとえば、MdmLevelHierarchy
のgetSource
メソッドによって戻されたSource
のタイプは、階層がコンポーネントであるMdmPrimaryDimension
のSource
です。
導出Source
のタイプは、次のいずれかです。
ベースSource
。これは、導出Source
を戻したメソッドを持つSource
です。alias
、extract
、join
、recursiveJoin
またはvalue
メソッドによって戻されたSource
、またはそれらのショートカットの1つは、タイプとしてベースSource
を持ちます。例外は、distinct
メソッドによって戻された導出Source
で、このタイプは、ベースSource
自身ではなく、そのベースSource
のタイプです。
基本Source
。position
およびcount
などのメソッドは、そのタイプとしてOLAP Java API Integerデータ型の基本Source
を持つSource
を戻します。eq
、le
などの比較を行うメソッドは、そのタイプとしてBooleanデータ型の基本Source
を持つSource
を戻します。NumberSource
、total
およびaverage
メソッドなど、集計関数を実行するメソッドは、Source
のタイプとして、その関数を表す基本Source
を戻します。
Source
のタイプを取得するには、そのgetType
メソッドをコールします。
別のSource
から導出されたSource
は、導出元のSource
のサブタイプです。isSubtypeOf
メソッドを使用すると、あるSource
が別のSource
のサブタイプかどうかを判別できます。
たとえば、例5-2のmyList
オブジェクトは、リストSource
です。この例ではmyList
を使用して、製品ディメンションのMdmPrimaryDimension
のデフォルトMdmLevelHierarchy
のSource
、prodHier
から値を選択します。例の中のdp
は、DataProvider
です。
例5-2 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
およびprodHier
のタイプは、どちらもStringデータ型の基本Source
です。prodSel
のタイプはprodHier
です。これは、prodSel
の要素がprodHier
の要素から導出されているためです。
あるSource
のタイプのタイプなど(Valueデータ型の基本Source
のタイプ)をSource
のスーパータイプといいます。たとえば、Valueデータ型の基本Source
は、prodHier
のタイプであるStringデータ型の基本Source
のタイプで、さらにこのprodHier
は、prodSel
のタイプです。この場合、Valueデータ型の基本Source
およびStringデータ型の基本Source
はともに、prodSel
のスーパータイプです。また、prodSel
Source
は、prodHier
のサブタイプであると同時に、Stringデータ型の基本Source
およびValueデータ型の基本Source
のサブタイプでもあります。
Source
はそれぞれ識別子(ID)を持ちます。これは、データベースへの現行の接続期間においてそのSource
を一意に識別できるString
です。Source
の識別子を取得するには、getID
メソッドをコールします。たとえば、次のコードでは、製品ディメンションのMdmPrimaryDimension
のSource
の識別子を取得して、その値を表示します。
println("The Source ID of prodDim is " + prodDim.getID());
このコードによって、次のように表示されます。
The Source ID of prodDim is Hidden..GLOBAL.PRODUCT_AWJ
例5-9の出力に、Source
識別子の例がいくつか示されています。
各Source
は、そのSource
に関する情報を記録する1つのSourceDefinition
オブジェクトを持ちます。Source
オブジェクトの種類が異なれば、SourceDefinition
オブジェクトの種類も異なります。たとえば、MdmPrimaryDimension
の基本Source
は、SourceDefinition
のサブクラスであるHiddenDefinition
のサブクラスであるMdmSourceDefinition
を持ちます。
join
メソッドをコールすることによって生成されたSource
のSourceDefinition
は、JoinDefinition
クラスのインスタンスです。JoinDefinition
から、ベースSource
、結合Source
、比較Source
、比較規則およびvisible
パラメータの値など、そのSource
を生成した結合操作のパラメータに関する情報を取得できます。
Source
の入力および出力は、クラスの複雑かつ高度な側面です。この項では、入力および出力の概念を説明し、それらがどのように関連するのかを例示します。
入力を持つSource
は、ディメンション化されたSource
です。Source
の入力もまたSource
です。入力によって、ディメンション化されたSource
の値が、指定されていない入力の値セットに基づくことが示されます。入力と一致するSource
が、その入力が必要とする値を提供します。入力をディメンション化されたSource
と一致させるには、join
メソッドを使用します。Source
と入力を一致させる方法については、「Sourceと入力の一致」を参照してください。
特定のSource
オブジェクトは、常に1つ以上の入力を持ちます。それらは、MdmDimensionedObject
サブクラスMdmMeasure
およびMdmAttribute
のSource
オブジェクトです。こうしたオブジェクトが入力を持つのは、メジャーまたは属性の値が、これらのディメンションの値によって指定されているためです。メジャーまたは属性のSource
の入力は、そのメジャーまたは属性のディメンションのSource
オブジェクトです。メジャーまたは属性のデータを取得するには、必要な値を提供するSource
とそれぞれの入力を一致させておく必要があります。
入力を持つSource
を生成するSource
メソッドがいくつかあります。入力を持つSource
は、extract
、position
またはvalue
メソッドを使用して生成できます。これらのメソッドによって、別のSource
の要素のサブセットである要素を持つSource
を生成する手段が提供されます。これらのメソッドのいずれかで生成したSource
は、ベースSource
を入力として持ちます。
たとえば、次のコードでは、prodHier
がベースSource
です。value
メソッドによって、入力としてprodHier
を持つprodHierValues
が生成されます。
Source prodHierValues = prodHier.value();
入力によって、prodHier
から値を選択する手段が提供されます(例5-2を参照)。例5-2のselectValues
メソッドは、次のjoin
メソッドのショートカットです。
Source prodSel = prodHier.join(prodHier.value(), myList, Source.COMPARISON_RULE_SELECT, false);
join
メソッドのパラメータは、結果のSource
に現れるベースSource
の要素を指定します。例では、joined
パラメータがprodHier.value()
メソッドによって生成されるSource
です。結果のSource
(名前なし)は、入力としてprodHier
を持ちます。この入力は、prodHier
でもあるjoin
メソッドのベースと一致します。結合操作の結果prodSel
は、比較Source
(myList
)にあるprodHier
の値と一致するprodHier
の値を持ちます。
結合Source
がprodHier
で、prodHier.value()
によって生成されたSource
でない場合、Source
の値と比較Source
の値間の比較ではなく、Source
オブジェクト自身と比較Source
の値間での比較になります。結合Source
オブジェクトは、比較Source
のいずれの値とも一致しないので、join
メソッドの結果はprodHier
のすべての要素を持ちます。比較規則で指定された比較Source
の値と一致する結合Source
の値によって指定されたprodHier
の値のみを持つことはありません。
position
またはvalue
メソッドによって生成されたSource
の入力、およびMdmDimensionedObject
固有の入力を通常の入力といいます。通常の入力は、join
メソッドに、Source
とその入力を一致させる際に、比較Source
の値と、入力Source
自身とではなく、その入力を持つSource
の値との比較を強制します。
extract
メソッドで生成されたSource
の入力を抽出入力といいます。抽出入力は、次の点で通常の入力と異なります。抽出入力を持つSource
の値がSource
である場合、join
メソッドは、その入力を持つSource
の値であるSource
の値を抽出します。次に、join
メソッドは、比較Source
の値と、Source
自身とではなく、抽出した値との比較を行います。
Source
は多くの入力を持つ場合もあれば、入力を持たない場合もあります。Source
のすべての入力を取得するには、getInputs
メソッドをコールします。通常の入力についてはgetRegularInputs
メソッドを、抽出入力についてはgetExtractionInputs
メソッドをコールします。各メソッドは、Source
オブジェクトのセットを戻します。
join
メソッドは、メソッドのパラメータによって指定されるベースSource
の要素を持つSource
を戻します。visible
パラメータの値がtrue
の場合、結合Source
は、戻されたSource
の出力となります。join
メソッドによって戻されたSource
の出力は、戻されたSource
の要素を指定する結合Source
の要素を持ちます。出力は、出力を持つSource
の要素を指定する結合Source
の要素を識別する手段です。
Source
は多くの出力を持つ場合もあれば、出力を持たない場合もあります。Source
の出力を取得するには、Source
オブジェクトのList
を戻すgetOutputs
メソッドをコールします。
複数の出力を持つSource
は、出力の要素の各セットについて、1つ以上の要素を持ちます。たとえば、すべての入力が一致しており、入力と一致するSource
オブジェクトが出力となったメジャーを表すSource
は、出力の要素の各セットについて単一のタイプの要素を持ちます。これは、そのメジャーの各データ値が、ディメンションの一意の値セットによって識別されるためです。ただし、メジャーのデータに対して実行されたある操作によって選択されるディメンション値を表すSource
は、出力の要素の各セットについて、複数の要素を持つ場合があります。この例として、一定額より大きな単位原価を持つ製品の値を表すSource
があります。このようなSource
は、指定した額より大きな単位原価を持つ、各期間の製品を複数持つ場合があります。
例5-3では、顧客値のディメンションの階層のSource
である、shipHier
の要素の選択が生成されます。顧客は、配送元と宛先の階層によってグループ化されます。
例5-3 joinメソッドを使用した出力を持たないSourceの生成
Source custValuesToSelect = dp.createListSource(new String[] {"SHIPMENTS::REGION::AMER", "SHIPMENTS::REGION::EMEA"}); Source shipHierValues = shipHier.value(); Source custSel = shipHier.join(shipHierValues, custValuesToSelect, Source.COMPARISON_RULE_SELECT, false);
shipHierValues
Source
は、shipHier
の入力を持ちます。この例のjoin
メソッドでは、ベースSource
(shipHier
)は結合Source
(shipHierValues
)の入力と一致します。これは、ベースと入力が同じオブジェクトであるためです。join
メソッドは、比較Source
(custValuesToSelect
)によって指定される結合shipHier
の値と一致する値を持つベースshipHier
の要素を選択します。このメソッドによって、shipHier
の選択された要素のみを持つSource
(custSel
)が生成されます。visible
パラメータがfalse
なので、結合Source
はcustSel
の出力とはなりません。したがって、custSel
Source
は2つの要素しか持ちません。それぞれの値はSHIPMENTS::REGION::AMER
とSHIPMENTS::REGION::EMEA
です。
出力を持つSource
は、join
メソッドのvisible
パラメータとしてtrue
を指定することによって生成します。例5-4では、例5-2および例5-3のディメンションの選択のSource
オブジェクトを結合し、1つの出力を持つSource
(custSelByProdSel
)を生成します。このcustSelByProdSel
Source
は、prodSel
の要素によって指定されるcustSel
の要素を持ちます。
比較Source
は、要素を持たない空のSource
です。これは、DataProvider
(dp
)のgetEmptySource
メソッドの結果です。比較規則値COMPARISON_RULE_REMOVE
は、比較Source
にないprodSel
の要素のみを選択します。比較Source
は要素を持たないため、結合Source
のすべての要素が選択されます。結合Source
の各要素が、ベースSource
のすべての要素を指定します。したがって、結果のSource
(custSelByProdSel
)は、custSel
のすべての要素を持ちます。
例5-4では、visible
パラメータがtrue
なので、prodSel
はcustSelByProdSel
の出力となります。したがって、出力の各要素について、custSelByProdSel
は、出力の各要素によって指定されるcustSel
の要素を持ちます。custSel
およびprodSel
はどちらもディメンション値の単純なリストなので、結果は、両方のSource
オブジェクトの要素のクロス積となります。
例5-4 joinメソッドを使用した出力を持つSourceの生成
Source custSelByProdSel = custSel.join(prodSel, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true);
custSelByProdSel
によって指定されるデータを実際に取得するには、そのCursor
を作成する必要があります。このようなCursor
の値は、左の列に出力prodSel
の値があり、右の列にcustSelByProdSel
Source
の要素の値(そのタイプであるcustSel
から導出)があることを示すヘッダー付きの次の表に表示されます。
Output Values Type Values ----------------------------- ------------------------ PRODUCT_PRIMARY::FAMILY::DTPC SHIPMENTS::REGION::AMER PRODUCT_PRIMARY::FAMILY::DTPC SHIPMENTS::REGION::EMEA PRODUCT_PRIMARY::FAMILY::LTPC SHIPMENTS::REGION::AMER PRODUCT_PRIMARY::FAMILY::LTPC SHIPMENTS::REGION::EMEA PRODUCT_PRIMARY::FAMILY::MON SHIPMENTS::REGION::AMER PRODUCT_PRIMARY::FAMILY::MON SHIPMENTS::REGION::EMEA PRODUCT_PRIMARY::FAMILY::ACC SHIPMENTS::REGION::AMER PRODUCT_PRIMARY::FAMILY::ACC SHIPMENTS::REGION::EMEA
custSelByProdSel
Source
は2つのタイプの要素を持ち、custSelByProdSel
の出力は4つの要素を持ちます。このcustSelByProdSel
の要素の数は8つです。これは、このSource
では、各出力要素が2つのタイプの要素の同じセットを指定するためです。
true
のvisible
パラメータを指定する各結合操作によって、結果のSource
の出力のリストに1つの出力が追加されます。たとえば、あるSource
が2つの出力を持ち、1つの出力を生成するjoin
メソッドの1つをコールすると、結合操作の結果のSource
は3つの出力を持ちます。Source
の出力を取得するには、Source
オブジェクトのList
を戻すgetOutputs
メソッドをコールします。
例5-5では、あるメジャーをメジャーのディメンションからの選択に結合することによって、必要な要素を提供するメジャーSource
オブジェクトの入力と一致させる例を示します。最後の2つのjoin
メソッドがディメンションの選択とメジャーの入力を一致させるので、結果のSource
は入力を持ちません。これらのjoinにおけるvisible
パラメータはtrue
なので、最後のjoin
メソッドは2つの出力を持つSource
を生成します。
例5-5では、単位原価のメジャーのSource
を取得します。このSource
(unitCost
)は2つの入力を持ちます。それぞれ、単位原価のディメンションである、時間ディメンションおよび製品ディメンションのプライマリSource
オブジェクトです。例では、ディメンションのSource
オブジェクトのサブタイプである、ディメンションの階層のSource
オブジェクトが取得されます。次に、階層の選択が生成され、これらの選択とメジャーが結合されます。結果のunitCostSel
は、選択された時間における選択された製品の単位原価を指定します。
例5-5 joinメソッドを使用したSourceオブジェクトと入力の一致
Source unitCost = mdmUnitCost.getSource(); Source calendar = mdmCalendar.getSource(); Source prodHier = mdmProdHier.getSource(); Source timeSel = calendar.join(calendar.value(), dp.createListSource(new String[] {"CALENDAR_YEAR::MONTH::2000.05", "CALENDAR_YEAR::MONTH::2001.05"}), Source.COMPARISON_RULE_SELECT, false); Source prodSel = prodHier.join(prodHier.value(), dp.createListSource(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY STD", "PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY ABM"}), Source.COMPARISON_RULE_SELECT, false); Source unitCostSel = unitCost.join(timeSel, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true) .join(prodSel, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true);
timeSel
とunitCost
の結合によって生成されるSource
(名前なし)は、1つの出力を持ちます。これがtimeSel
です。このSource
(名前なし)にprodSel
を結合すると、2つの出力(timeSel
およびprodSel
)を持つunitCostSel
が生成されます。このunitCostSel
Source
は、これらの出力によって指定されるタイプunitCost
からの要素を持ちます。
unitCostSel
のCursor
の値は、Cursor
の構造を示すヘッダー付きの表として表示されます。Cursor
の構造は、関連するSource
の構造と同じです。単位原価値は、ドル値として書式化されています。
Output 1 Output 2 Type Values Values Values ------------------------------- ---------------------------- -------- PRODUCT_PRIMARY::ITEM::ENVY ABM CALENDAR_YEAR::MONTH::2000.05 2847.47 PRODUCT_PRIMARY::ITEM::ENVY ABM CALENDAR_YEAR::MONTH::2001.05 2819.85 PRODUCT_PRIMARY::ITEM::ENVY STD CALENDAR_YEAR::MONTH::2000.05 2897.40 PRODUCT_PRIMARY::ITEM::ENVY STD CALENDAR_YEAR::MONTH::2001.05 2376.73 PRODUCT_PRIMARY::ITEM::ENVY EXE CALENDAR_YEAR::MONTH::2000.05 3238.36 PRODUCT_PRIMARY::ITEM::ENVY EXE CALENDAR_YEAR::MONTH::2001.05 3015.90
Output 1はprodSel
の値、Output 2はtimeSel
の値、Type Valuesは出力値によって指定されるunitCost
の値を示します。
これらの結合操作は、ほとんどのOLAP Java APIアプリケーションで実行されるので、APIでは、これらやその他多くの結合操作のショートカットが提供されています。例5-6では、例5-5の結合操作のショートカットを使用し、同じ結果が生成されます。
例5-6 ショートカットの使用
Source unitCost = mdmUnitCost.getSource(); StringSource calendar = (StringSource) mdmCalendar.getSource(); StringSource prodHier =(StringSource) mdmProdHier.getSource(); Source timeSel = calendar.selectValues(new String[] {"CALENDAR_YEAR::MONTH::2000.05", "CALENDAR_YEAR::MONTH::2001.05"}), Source prodSel = prodHier.selectValues(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY STD", "PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY ABM"}), Source unitCostSel = unitCost.join(timeSel).join(prodSel);
結合操作では、Source
と入力の一致は、ベースSource
と結合Source
との間でのみ発生します。次の条件のいずれかがtrueの場合、Source
は入力と一致します。
Source
が入力と同じオブジェクトか、入力のサブタイプである。
Source
が入力と同じオブジェクトである出力を持つか、入力のサブタイプである出力を持つ。
出力が入力と同じオブジェクトである出力を持つか、入力のサブタイプである。
結合操作では、前述の順序で条件が検索されます。Source
の出力のリストが再帰的に検索され、入力との一致が検索されます。この検索は、最初の一致するSource
が見つかると終了します。1つの入力は1つのSource
とのみ一致し、2つの入力が同じSource
と一致することはありません。
Source
が入力と一致すると、join
メソッドの結果には、メソッドのパラメータによって指定された要素と一致するベースの要素が含まれます。あるSource
が別のSource
や、他のSource
の出力と一致するかどうかを判別するには、他のSource
のfindMatchFor
メソッドにそのSource
を渡します。
Source
が入力と一致する際、結果のSource
はその入力を持ちません。Source
と入力の一致によって、結合Source
またはベースSource
の出力が影響を受けることはありません。ベースSource
が結合Source
の入力と一致する出力を持つ場合、結果のSource
はその入力を持ちませんが、その出力は持ちます。
結合操作の結合Source
またはベースSource
が、その操作で一致しない入力を持つ場合、その一致しない入力が結果のSource
の入力となります。
join
メソッドの比較Source
は、入力一致には関係しません。比較Source
が入力を持つ場合、その入力は一致せず、join
メソッドによって戻されたSource
は同じ入力を持ちます。
例5-7では、結合操作の結合Source
の入力とベースSource
との一致を例示します。この例では、入力を持つSource
の生成にposition
メソッドを、結合操作のベースと結合Source
の入力との一致にjoin
メソッドを使用します。
例5-7 ベースSourceと結合Sourceの入力の一致
Source myList = dp.createListSource(new String[] {"PRODUCT_PRIMARY::FAMILY::LTPC", "PRODUCT_PRIMARY::FAMILY::DTPC", "PRODUCT_PRIMARY::FAMILY::ACC", "PRODUCT_PRIMARY::FAMILY::MON"}); Source pos = dp.createListSource(new int[] {2, 4}); Source myListPos = myList.position(); Source myListSel = myList.join(myListPos, pos, Source.COMPARISON_RULE_SELECT, false);
例5-7では、position
メソッドによって、myList
の要素を持ち、入力としてmyList
を持つmyListPos
が戻されます。join
メソッドは、ベースmyList
と結合Source
(myListPos
)の入力を一致させます。
比較Source
(pos
)は、myListPos
の要素の位置を、myList
の要素の位置と一致するように指定します。結果のSource
(myListSel
)の要素は、位置がjoin
メソッドのパラメータによって指定されたものと一致するmyList
の要素です。
myListSel
のCursor
は次の値を持ちます。
PRODUCT_PRIMARY::FAMILY::DTPC PRODUCT_PRIMARY::FAMILY::MON
例5-7のvisible
パラメータがfalse
ではなくtrue
である場合、結果にはmyList
の要素およびmyListPos
の出力が含まれます。この場合、myListSel
のCursor
の値は、出力およびタイプ値を示すヘッダー付きの表として表示されます。
Output Type Values Values ------ ------------------------- 2 PRODUCT_PRIMARY::FAMILY::DTPC 4 PRODUCT_PRIMARY::FAMILY::MON
例5-8では、結合Source
の出力とベースSource
の2つの入力との一致を例示します。この例では、units
がMdmMeasure
のSource
です。これは、時間、製品、顧客、およびチャネル・ディメンションのプライマリSource
オブジェクトを入力として持ちます。
DataProvider
はdp
で、prodHier
、shipHier
、calendar
およびchanHier
はそれぞれ、製品ディメンション、顧客ディメンション、時間ディメンションおよびチャネル・ディメンションのデフォルト階層のSource
オブジェクトです。これらのSource
オブジェクトは、units
の入力であるディメンションのSource
オブジェクトのサブタイプです。
例5-8の最初の行のprodHier
のjoin
メソッドは、選択した製品の値を指定するprodSel
を生成します。このメソッドにおいて、結合Source
は、prodHier
のvalue
メソッドの結果です。結合Source
はprodHier
と同じ要素を持ち、入力としてprodHier
を持ちます。比較Source
は、DataProvider
のcreateListSource
メソッドの結果であるリストSource
です。
join
メソッドのベースSource
(prodHier
)は、結合Source
の入力と一致します。prodHier
は、結合Source
の入力であるため、join
メソッドによって戻されるSource
が持つのは、比較Source
に現れる結合Source
の要素と一致するベースprodHier
の要素のみです。visible
パラメータの値はfalse
なので、結果のSource
は出力として結合Source
を持ちません。例5-8における次の3つの同様な結合操作では、その他の3つのディメンションの選択が生成されます。
timeSel
のjoin
メソッドの結合Source
はcustSel
です。この比較Source
はgetEmptySource
メソッドの結果なので、要素は持ちません。比較規則では、比較Source
に存在する結合Source
の要素が、結果のSource
に出現しないことを指定します。比較Source
は要素を持たないため、結合Source
のすべての要素が選択されます。visible
パラメータの値がtrue
であるため、結合Source
は、join
メソッドによって戻されるSource
の出力となります。戻されたSource
(custSelByTime
)は、顧客ディメンションの選択された要素を持ち、出力としてtimeSel
を持ちます。
prodSel
のjoin
メソッドの結合Source
はcustSelByTime
です。これによって、製品ディメンションの選択された要素を持ち、出力としてcustSelByTime
を持つprodByCustByTime
が生成されます。例5-8では次に、ディメンションの選択をunits
Source
に結合します。
ディメンションの選択は、units
の入力であるSource
オブジェクトのサブタイプなので、units
の入力と一致します。製品ディメンションの入力はprodByCustByTime
と一致します。これは、prodByCustByTime
がprodHier
のサブタイプであるprodSel
のサブタイプであるためです。顧客ディメンションの入力は、prodByCustByTime
の出力であるcustSelByTime
と一致します。
custSelByTime
Source
は、shipHier
のサブタイプであるcustSel
のサブタイプです。時間ディメンションの入力は、custSelByTime
の出力であるtimeSel
と一致します。timeSel
Source
はcalendar
のサブタイプです。
例5-8 ベースSourceの入力と結合Sourceの出力の一致
Source prodSel = prodHier.join(prodHier.value(), dp.createListSource(new String[] {"PRODUCT_PRIMARY::FAMILY::DTPC", "PRODUCT_PRIMARY::FAMILY::LTPC"}), Source.COMPARISON_RULE_SELECT, false); Source custSel = shipHier.join(shipHier.value(), dp.createListSource(new String[] {"SHIPMENTS::REGION::EMEA", "SHIPMENTS::REGION::AMER"}), Source.COMPARISON_RULE_SELECT, false); Source timeSel = calendar.join(calendar.value(), dp.createConstantSource( "CALENDAR_YEAR::YEAR::CY2001"), Source.COMPARISON_RULE_SELECT, false); Source chanSel = chanHier.join(chanHier.value(), dp.createConstantSource( "CHANNEL_PRIMARY::CHANNEL::INT"), Source.COMPARISON_RULE_SELECT, false); Source custSelByTime = custSel.join(timeSel, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true); Source prodByCustByTime = prodSel.join(custSelByTime, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true); Source selectedUnits = units.join(prodByCustByTime, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true) .join(promoSel, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true ), .join(chanSel, dp.getEmptySource(), Source.COMPARISON_RULE_REMOVE, true);
selectedUnits
のCursor
の値は、列ヘッダーおよび書式が追加されたクロス集計形式で表示されます。この表には、ディメンション要素のローカル値のみが含まれます。最初の2行はクロス集計のページ・エッジ値です。これらは、selectedUnits
のchanSel
出力の値および、selectedUnits
のprodByCustByTime
出力の出力であるtimeSel
の値です。クロス集計の行エッジ値は左の列の顧客値で、列エッジ値は中央および右の列の製品値です。
クロス集計には、ディメンション要素の一意値のローカル値部分のみが含まれます。メジャー値は、選択されたディメンション値によって指定される販売台数の値です。
INT CY2001 Products ----------- Customers DTPC LTPC --------- ---- ---- AMER 1748 846 EMEA 439 215
次の表では結果は同じですが、ディメンション要素値が、それぞれの値の簡単な説明で置き換えられています。
Internet 2001 Products ------------------------- Customers Desktop PCs Portable PCs ------------- ----------- ------------ North America 1748 846 Europe 439 215
例5-9では、入力を出力に切り換える例を示すために、units
(UNITSメジャーのSource
)およびdefaultHiers
(メジャーのディメンションのデフォルト階層のSource
オブジェクトのArrayList
)を使用します。例では、メジャーのSource
の入力および出力が取得されます。また、メジャーおよびSource
の入力のSource
のSource
識別子が表示されます。メジャーのSource
の入力は、そのメジャーのディメンションであるMdmPrimaryDimension
オブジェクトのSource
オブジェクトです。
例5-9では次に、メジャーのSource
の入力および出力の数が表示されます。例では、要素として結合操作のベースの要素を持ち、出力としてjoined
パラメータSource
を持つSource
を生成するjoin(Source joined)
メソッドを使用して、階層Source
オブジェクトの1つをメジャーのSource
に結合し、結果のSource
の入力および出力の数を表示します。次に、残りの各階層Source
を前の結合操作の結果に結合し、結果のSource
の入力および出力の数を表示します。
最後に、最後の結合操作で生成されたSource
の出力が取得され、その出力のSource
識別子が表示されます。最後のSource
の出力は、この例でメジャーのSource
に結合したデフォルト階層のSource
オブジェクトです。階層のSource
オブジェクトは、メジャーの入力であるMdmPrimaryDimension
オブジェクトのSource
オブジェクトのサブタイプであるため、これらの入力は一致します。
例5-9 メジャーの入力の一致および出力の生成
Set inputs = units.getInputs(); Iterator inputsItr = inputs.iterator(); List outputs = units.getOutputs(); Source input = null; int i = 1; println("The inputs of " + units.getID() + " are:"); while(inputsItr.hasNext()) { input = (Source) inputsItr.next(); println(i + ": " + input.getID()); i++; } println(" "); int setSize = inputs.size(); for(i = 0; i < (setSize + 1); i++) { println(units.getID() + " has " + inputs.size() + " inputs and " + outputs.size() + " outputs."); if (i < setSize) { input = defaultHiers.get(i); println("Joining " + input.getID() + " to " + units.getID()); units = units.join(input); inputs = units.getInputs(); outputs = units.getOutputs(); } } println("The outputs of " + units.getID() + " are:"); Iterator outputsItr = outputs.iterator(); i = 1; while(outputsItr.hasNext()) { Source output = (Source) outputsItr.next(); println(i + ": " + output.getID()); i++; }
この例の出力は次のようになります。
The inputs of Hidden..GLOBAL.UNITS_CUBE_AWJ.UNITS are: 1: Hidden..GLOBAL.CHANNEL_AWJ 2: Hidden..GLOBAL.CUSTOMER_AWJ 3: Hidden..GLOBAL.PRODUCT_AWJ 4: Hidden..GLOBAL.TIME_AWJ Hidden..GLOBAL.UNITS_CUBE_AWJ.UNITS has 4 inputs and 0 outputs. Joining Hidden..GLOBAL.CHANNEL_AWJ.CHANNEL_PRIMARY to Hidden..GLOBAL.UNITS_CUBE_AWJ.UNITS Join.30 has 3 inputs and 1 outputs. Joining Hidden..GLOBAL.CUSTOMER_AWJ.SHIPMENTS to Join.30 Join.31 has 2 inputs and 2 outputs. Joining Hidden..GLOBAL.PRODUCT_AWJ.PRODUCT_PRIMARY to Join.31 Join.32 has 1 inputs and 3 outputs. Joining Hidden..GLOBAL.TIME_AWJ.CALENDAR_YEAR to Join.32 Join.33 has 0 inputs and 4 outputs. The outputs of Join.33 are: 1: Hidden..GLOBAL.TIME_AWJ.CALENDAR_YEAR 2: Hidden..GLOBAL.PRODUCT_AWJ.PRODUCT_PRIMARY 3: Hidden..GLOBAL.CUSTOMER_AWJ.SHIPMENTS 4: Hidden..GLOBAL.CHANNEL_AWJ.CHANNEL_PRIMARY
1つの階層の連続するSource
は、前の結合操作の結果にそれぞれ結合されるので、結果のSource
の出力List
の最初の出力になることに注目してください。したがって、Join.33
の最初の出力はHidden..GLOBAL.TIME_AWJ.CALENDAR_YEAR
、最後の出力はHidden..GLOBAL.CHANNEL_AWJ.CHANNEL_PRIMARY
です。
パラメータ化Source
オブジェクトは、ある問合せを指定し、問合せの異なる結果セットを取得する方法を提供します。これは、パラメータ化Source
によって指定される要素セットを変更することによって行います。パラメータ化Source
は、Parameter
のcreateSource
メソッドを使用して作成します。このParameter
が、パラメータ化Source
によって指定される値を供給します。
Parameter
オブジェクトは、一般的にはキューブのページ・エッジの指定に使用します。例6-9に、ページ・エッジの指定にParameter
オブジェクトを使用する例を示しています。その他に、Parameter
オブジェクトは現在必要とする要素セットのみをサーバーからフェッチするためにも使用します。例6-15に、異なる要素セットのフェッチにParameter
オブジェクトを使用する例を示しています。
Parameter
オブジェクトを作成する際は、Parameter
の初期値を指定します。次に、そのParameter
を使用して、パラメータ化Source
を作成します。問合せを指定する際に、このパラメータ化Source
を含めます。問合せにはCursor
を作成します。Parameter
の値を変更するには、setValue
メソッドを使用します。これは問合せが指定する要素セットを変更します。同じCursor
を使用して、新しい値セットを表示できます。
例5-10は、メジャー・ディメンションの要素を指定するためのパラメータ化Source
およびParameter
の使用方法の例です。例では、単位原価および単位価格メジャーのSource
オブジェクトを要素値として持つリストSource
を作成します。また、単位原価メジャーのSource
について一意に識別するString
を初期値として持つStringParameter
オブジェクトを作成します。このStringParameter
が、パラメータ化Source
の作成に使用されます。
この例では、メジャーから値を抽出し、パラメータ化Source
で指定されたメジャーにディメンションの選択を結合することによって指定されたデータ値を選択します。また、結果の問合せに対してCursor
を作成し、結果を表示します。Cursor
の位置を再設定し、measParam
StringParameter
の値を変更した後で、再びCursor
の値を表示します。
dp
オブジェクトは、DataProvider
です。getContext
メソッドは、ディメンション要素のローカル値のみでCursor
の値を表示するメソッドを持つContext11g
オブジェクトを取得します。
例5-10 メジャー・ディメンションに関するパラメータ化Sourceの使用
Source measDim = dp.createListSource(new Source[] {unitCost, unitPrice}); // Get the unique identifiers of the Source objects for the measures. String unitCostID = unitCost.getID(); String unitPriceID = unitPrice.getID(); // Create a StringParameter using one of the IDs as the initial value. StringParameter measParam = new StringParameter(dp, unitCostID); // Create a parameterized Source. Source measParamSrc = measParam.createSource(); // Extract the values from the measure dimension elements, and join // them to the specified measure and the dimension selections. Source result = measDim.extract().join(measDim, measParamSrc) .join(prodSelShortDescr) .join(timeSelShortDescr); // Get the TransactionProvider and commit the current transaction. // These operations are not shown. // Create a Cursor. CursorManager cursorMngr = getDataProvider().createCursorManager(result); Cursor resultsCursor = cursorMngr.createCursor(); // Display the results. getContext().displayCursor(resultsCursor, true); // Reset the Cursor position to 1. resultsCursor.setPosition(1); // Change the value of the parameterized Source. measParam.setValue(unitPriceID); // Display the results again. getContext().displayCursor(resultsCursor, true);
次の表は、列ヘッダーおよび書式を追加して、resultCursor
の最初の値セットを表示したものです。表の左の列は、時間ディメンション階層のローカル値を示します。左から2番目の列は、時間値の簡単な説明を示します。3番目の列は、製品ディメンション階層のローカル値を示します。4番目の列は、製品値の簡単な説明を示します。5番目の列は、時間および製品の単位原価メジャー値を示します。
Time Description Product Description Unit Cost ------- ----------- -------- --------------- --------- 2001.04 Apr-01 ENVY EXE Envoy Executive 2952.85 2001.04 Apr-01 ENVY STD Envoy Standard 2360.78 2001.05 May-01 ENVY EXE Envoy Executive 3015.90 2001.05 May-01 ENVY STD Envoy Standard 2376.73
次の表は、同じ形式で、resultCursor
の2つ目の値セットを表示したものです。この表では、5番目の列は単位価格メジャーの値です。
Time Description Product Description Unit Price ------- ----------- -------- --------------- ---------- 2001.04 Apr-01 ENVY EXE Envoy Executive 3107.65 2001.04 Apr-01 ENVY STD Envoy Standard 2412.42 2001.05 May-01 ENVY EXE Envoy Executive 3147.85 2001.05 May-01 ENVY STD Envoy Standard 2395.63
この項では、Model
インタフェースとその実装、およびModel
オブジェクトとSource
オブジェクトの関係について説明します。また、カスタムModel
オブジェクトの作成例、およびSource
オブジェクトとModel
オブジェクトに関するその他のタスクの実行例も示します。
Model
は、Oracle SQLのMODEL
句と同様のものです。Model
を使用すると、オブジェクトのディメンション・メンバーの1つ以上のセットのディメンション化されたオブジェクトのSource
に値を割り当てることができます。Model
によって、単純な定数から、ネストされたModel
オブジェクトを持つその他の複数のSource
オブジェクトが関与する複雑な計算の結果まで、あらゆる値を割り当てることができます。
Model
がディメンション・メンバーのセットに割り当てる値は、Assignment
オブジェクトによって表されます。Model
は、1つ以上のAssignment
オブジェクトを持つことができます。このセットの各ディメンション・メンバーは、Qualification
オブジェクトによって表されます。Assignment
は、1つ以上のQualification
オブジェクトを持つことができます。
Assignment
が割り当てる値は、Source
によって指定されます。Assignment
は、Oracle OLAPが値を計算して割り当てる際の順序に影響する優先順位を指定する整数値も持ちます。優先順位を指定せずにModel
に複数のAssignment
を作成すると、値の計算および割当てが行われる順序は保証されません。
Model
は、既存のディメンション・メンバーに値を割り当てます。Model
を使用して、1つのディメンション・メンバーに異なる値を割り当てたり、複数のディメンション・メンバーのセットに1つの値を割り当てたり、ディメンション・メンバーのセットの特定のメジャーに異なる値を割り当てたり、属性のディメンション・メンバーに1つの値を割り当てることができます。
カスタム・ディメンション・メンバーを作成する際は割当て値を指定します。Oracle OLAPは、ディメンションの適切なModel
に、カスタム・メンバーの値を指定するAssignment
オブジェクトを自動的に追加します。Oracle OLAPは、ディメンションによってディメンション化される任意のメジャーに、その値をメジャー値として割り当てます。
図5-1に、Model
インタフェースのクラス階層およびこのインタフェースを実装するクラスを示します。oracle.olapi.metadata.mdm.MdmModel
クラスは、MdmObject
オブジェクトのModel
インタフェースを実装します。Model
インタフェースのもう1つの実装は、oracle.olapi.data.source
パッケージ内のCustomModel
クラスです。
Model
は、値を割り当てる対象のSource
オブジェクトである、1つ以上の入力を持ちます。この入力は、OLAP DMLまたはSQL Model
のディメンション・リストに相当します。たとえば、MdmStandardDimension
のgetNumberCalcModel
メソッドによって戻されたMdmDimensionCalculationModel
は、入力として同じMdmStandardDimension
のSource
を持ちます。MdmAttribute
のgetModel
メソッドによって戻されたMdmDimensionedObjectModel
は、属性をディメンション化するMdmPrimaryDimension
のSource
を入力として持ちます。MdmMeasure
のgetModel
メソッドによって戻されたMdmDimensionedObjectModel
は、メジャーをディメンション化するMdmPrimaryDimension
オブジェクトのSource
オブジェクトを入力として持ちます。
Model
は1つ以上の親を持つことができます。親は、そのModel
のAssignment
オブジェクトの継承元である他のModel
オブジェクトです。MdmMeasureModel
は、自身に関連付けられたディメンションのMdmDimensionCalculationModel
オブジェクトを親として持ちます。MdmAttributeModel
およびMdmDimensionCalculationModel
オブジェクトは、親Model
オブジェクトを持ちません。
CustomModel
は入力および親Model
オブジェクトを持つことができます。CustomModel
オブジェクトを作成する場合、入力および親Model
オブジェクトを指定できます。CustomModel
は出力も持つことができます。MdmModel
オブジェクトは出力を持ちません。
一連のCustomModel
オブジェクトを作成し、お互いにAssignment
オブジェクトを継承させることができます。次の制約は、CustomModel
同士によるAssignment
の継承に適用されます。
継承は循環できません。たとえば、customModelB
がcustomModelA
から継承する場合、customModelA
はcustomModelB
からは継承できません。
CustomModel
オブジェクトのタイプおよび出力は同一である必要があります。
親CustomModel
が入力を持つ場合、子CustomModel
もその入力を指定する必要があります。子CustomModel
は追加の入力を持つことができますが、その親CustomModel
オブジェクトの入力を指定する必要があります。
CustomModel
を作成し、任意の割当てを追加したら、そのcreateSolvedSource
メソッドをコールして、CustomModel
のSource
を作成できます。createSolvedSource
メソッドのdefaultValues
パラメータを使用すると、このメソッドによって戻されるSource
のデフォルト値を提供するSource
を指定できます。デフォルト値のSource
を指定しない場合、結果のSource
のデフォルト値はNULL
となります。
Source.extract
メソッドはCustomModel
として実装されます。extract
メソッドに対して独自のCustomModel
を使用すると、Source
IDではなく、String
にメジャー値を割り当てることができるというメリットがあります。例5-11に、extract
メソッドを使用する例と、同じ結果を生成するCustomModel
を使用する例を示します。また、別のCustomModel
を使用して、String
値の異なるセットにメジャー値を割り当てる結果を生成する例も示します。
この例では、unitPrice
およびunitCost
が単位価格メジャーおよび単位原価メジャーのNumberSource
オブジェクトで、dp
はDataProvider
です。prodSel
オブジェクトは、製品ディメンションの3つのメンバーの選択を表すSource
です。
例5-11 CustomModelとしてのextractメソッドの実装
// Create a Source that represents a calculation involving two measures. Source calculation = unitPrice.minus(unitCost); // Create a list Source that has Source objects as element values. Source sourceListSrc = dp.createListSource(new Source[] {unitPrice, unitCost, calculation}); // Use the extract method to get the values of the Source components of the // list and join Source objects that match the inputs. Source resultUsingExtract = sourceListSrc.extract() .join(sourceListSrc) .join(prodSel) .join(calendar, "CALENDAR_YEAR::MONTH::2000.05"); // Produce the same result using a CustomModel directly. CustomModel customModel = dp.createModel(sourceListSrc); customModel.assign(unitPrice.getID(), unitPrice); customModel.assign(unitCost.getID(), unitCost); customModel.assign(calculation.getID(), calculation); Source measValForSrc = customModel.createSolvedSource(); Source resultUsingCustomModel = measValForSrc.join(sourceListSrc) .join(prodSel) .join(calendar, "CALENDAR_YEAR::MONTH::2000.05"); // Create a list Source that has String objects as element values. Source stringListSrc = dp.createListSource(new String[] {"price", "cost", "markup"}); // Create a CustomModel for the list Source. CustomModel customModel2 = dp.createModel(stringListSrc); customModel2.assign("price", unitPrice); customModel2.assign("cost", unitCost); customModel2.assign("markup", calculation); Source measValForSrc2 = customModel2.createSolvedSource(); Source resultUsingCustomModel2 = measValForSrc2.join(stringListSrc) .join(prodSel) .join(calendar, "CALENDAR_YEAR::MONTH::2000.05");
resultUsingCustomModel
およびresultUsingExtract
のCursor
オブジェクトは同じ値を持ちます。これらは、次のように書式が追加されて表示されます。
PRODUCT_PRIMARY::ITEM::ENVY ABM Hidden..GLOBAL.PRICE_CUBE_AWJ.UNIT_PRICE 2962.14 PRODUCT_PRIMARY::ITEM::ENVY ABM Hidden..GLOBAL.PRICE_CUBE_AWJ.UNIT_COST 2847.47 PRODUCT_PRIMARY::ITEM::ENVY ABM Join.2 114.67 PRODUCT_PRIMARY::ITEM::ENVY EXE Hidden..GLOBAL.PRICE_CUBE_AWJ.UNIT_PRICE 3442.86 PRODUCT_PRIMARY::ITEM::ENVY EXE Hidden..GLOBAL.PRICE_CUBE_AWJ.UNIT_COST 3238.36 PRODUCT_PRIMARY::ITEM::ENVY EXE Join.2 204.50 ITEM::ENVY STD Hidden..GLOBAL.PRICE_CUBE_AWJ.UNIT_PRICE 3118.61 PRODUCT_PRIMARY::ITEM::ENVY STD Hidden..GLOBAL.PRICE_CUBE_AWJ.UNIT_COST 2897.40 PRODUCT_PRIMARY::ITEM::ENVY STD Join.2 221.21
resultUsingCustomModel2
のCursor
の値は、次のように書式が追加されて表示されます。
PRODUCT_PRIMARY::ITEM::ENVY ABM price 2962.14 PRODUCT_PRIMARY::ITEM::ENVY ABM cost 2847.47 PRODUCT_PRIMARY::ITEM::ENVY ABM markup 114.67 PRODUCT_PRIMARY::ITEM::ENVY EXE price 3442.86 PRODUCT_PRIMARY::ITEM::ENVY EXE cost 3238.36 PRODUCT_PRIMARY::ITEM::ENVY EXE markup 204.50 PRODUCT_PRIMARY::ITEM::ENVY STD price 3118.61 PRODUCT_PRIMARY::ITEM::ENVY STD cost 2897.40 PRODUCT_PRIMARY::ITEM::ENVY STD markup 221.21