6 Sourceメソッドを使用した問合せの作成
取得するデータとそのデータに対して実行する操作を指定するSourceを生成して、問合せを作成します。 問合せを作成する場合、問合せ対象のメジャー、ディメンションおよび属性のメタデータを表す、プライマリSourceオブジェクトを最初に作成します。 通常、プライマリSourceオブジェクトのメソッドを使用して、ディメンション・メンバーの選択やデータに対して実行する操作など、問合せの一部を指定するその他のSourceオブジェクトを派生させます。 次に、必要なデータと操作を指定するSourceオブジェクトを結合します。 これにより、問合せを表す1つのSourceが生成されます。 次に、SourceのCursorを作成してデータを取得できます。
この章では、様々な種類のSourceメソッドの概要を説明し、一部については詳細に説明します。 また、これらのメソッドを使用した一般的なOLAP問合せの作成方法を説明し、一部については例も示します。
この章の内容は次のとおりです。
6.1 基本Sourceメソッド
Sourceクラスには、派生したSourceを返す多くのメソッドがあります。 導出されたSourceの要素は、base Source (Sourceが導出されたSourceを返すメソッド)の操作の結果になります。 Sourceクラスの最も基本的な操作は、ほんのわずかのメソッドでしか実行できません。
Sourceクラスの他の多くのメソッドは、値または位置によるベースSourceの要素の選択、または要素のソートなどの操作を実行するための基本メソッドの1つ以上を使用します。 この章および「ソース・オブジェクトの理解」の例の多くは、これらのメソッドのいくつかを使用しています。 他のSourceメソッドは、getID、getInputs、getTypeメソッドなどのSourceに関する情報を持つオブジェクトを取得し、geメソッドやgtメソッドなどの比較を実行するか、Sourceの値をあるデータ型から別のデータ型に変換します。toDoubleSourceメソッド。
表6-1 基本Sourceメソッド
| メソッド | 説明 |
|---|---|
|
ベース |
|
|
基底に複製された要素が派生した |
|
|
メソッド呼び出しの |
|
|
ベース |
|
|
|
|
|
ベース |
次のトピックでは、基本的なSourceメソッドについて説明し、その使用例を示します。
6.2 基本メソッドの使用方法
6.2.1 aliasメソッドの使用方法
Sourceと入力の一致を制御するには、aliasメソッドを使用します。 たとえば、メジャーのディメンションのメンバーによって指定されたメジャー値が、同じディメンションの他のメンバーによって指定されたメジャー値よりも大きいかどうかを調べるには、メジャーの入力を2回一致させる必要があります同じ結合操作で実行されます。 これを行うには、同じディメンションの別名である2つのSourceオブジェクトを派生させ、それらの2つのSourceオブジェクトをメジャーから派生させ、それぞれの派生メジャーSourceを関連する別名化されたディメンションSourceオブジェクトに結合させ、。
例6-1では、このような操作を実行します。 CHANNEL_AWJディメンションの各値に対して販売されたユニットの数が、CHANNEL_AWJディメンションの他の値に対して販売されたユニットの数よりも大きいかどうかを指定するSourceを生成します。
この例では、メジャーのSourceであるunitsを、unitsSelを生成するメジャーの3つの単一値の選択であるSourceオブジェクトに結合します。 unitsSel Sourceは、unitsSelの出力であるtimeSel、custSel、およびprodSelオブジェクトで指定されるディメンション値のunits要素を指定します。 unitsSel Sourceには、入力としてCHANNEL_AWJディメンションのSourceがあります。
timeSel、custSel、およびprodSel Sourceオブジェクトは、それぞれTIME_AWJ、CUSTOMER_AWJ、およびPRODUCT_AWJディメンションの階層から単一の値を指定します。 timeSelの値はCALENDAR_YEAR::MONTH::2001.01で、2001年1月の月を示し、custSelの値はBusiness World San Joseの顧客を識別するSHIPMENTS::SHIP_TO::BUSN WRLD SJで、prodSelの値はPRODUCT_PRIMARY::ITEM::ENVY ABMで、EnvoyポータブルPCを識別します。
次に、chanHierのchanAlias1とchanAlias2の2つの別名を作成します。chanHierは、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSourceです。 次に、unitsSelとchanAlias1.value()によって返されたSourceを結合して、unitsSel1を生成します。 このunitsSel1 Sourceは、unitsSelの要素および出力を持ち、入力としてchanAlias1を持ちます。 同様に、入力としてchanAlias2を持つunitsSel2を生成します。
この例では、unitsSel1のgtメソッドを使用して、unitsSel1の値がunitsSel2の値より大きいかどうかを判断します。 最後の結合操作では、chanAlias1とunitsSel1の入力が一致し、chanAlias2とunitsSel2の入力が一致します。
例6-1別名メソッドによる入力とソースのマッチングの制御
Source unitsSel = units.join(timeSel).join(custSel).join(prodSel);
Source chanAlias1 = chanHier.alias();
Source chanAlias2 = chanHier.alias();
NumberSource unitsSel1 = (NumberSource)
unitsSel.join(chanAlias1.value());
NumberSource unitsSel2 = (NumberSource)
unitsSel.join(chanAlias2.value());
Source result = unitsSel1.gt(unitsSel2)
.join(chanAlias1) // Output 2, column
.join(chanAlias2); // Output 1, row;
result Sourceは、chanAlias1のチャネル値に対するunitsSel1の販売単位の値が、chanAlias2のチャネル値に対するunitsSel2の販売単位の値よりも大きいかという問合せを指定 resultはchanAlias2とunitsSel1.gt(unitsSel2).join(chanAlias1)によって返されるSourceとの結合によって生成されるため、chanAlias2はresultの最初の出力であり、chanAlias1はresultの2番目の出力です。
result SourceのCursorは、問合せに応答するboolean値を値として持ちます。 Cursorの最初の出力の値はchanAlias2で指定されたチャネル値であり、2番目の出力の値はchanAlias1で指定されたチャネル値です。
次に示すのは、ヘッダー付きのクロス集計形式で表示されたCursorの値です。 列エッジの値はchanAlias1の値で、行エッジの値はchanAlias2の値です。 クロス集計のセルの値は、列のチャネル値の販売台数の値が、行のチャネル値の販売台数の値より大きいかどうかを示すboolean値です。 たとえば、最初の列のクロス集計値は、列チャネル値Total Channelの販売単位の値が、行Total Channelの値の単価を超えていませんが、Direct Sales、Catalog、Internet行の値。
----------------- chanAlias1 ---------------- chanAlias2 TotalChannel Catalog Direct Sales Internet ------------ ------------ ------- ------------ -------- TotalChannel false false false false Catalog true false false false Direct Sales true true false false Internet true true true false
6.2.2 distinctメソッドの使用方法
distinctメソッドを使用して、重複した値を持たないSourceを生成します(「例6-2」に示されています)。 この例では、ディメンション・メンバーの2つの選択肢を結合します。 両方の選択肢にはディメンション・メンバーがあります。 この例では、distinctメソッドを使用して、値が重複しない一意のディメンション・メンバーのみを含むSourceを生成します。
この例では、CUSTOMER_AWJディメンションのMdmStandardDimensionオブジェクトを取得し、そのディメンションのMARKETS階層のMdmLevelHierarchyオブジェクトを取得します。 StringSourceオブジェクトmktHierを取得します。 次に、mktHierのselectValuesメソッドを使用して、階層のメンバーであるcustomersToSelectとmoreCustomersToSelectの2つの選択肢を生成します。 customersToSelectのメンバーのうちの2つは、moreCustomersToSelectにも存在します。
この例では、appendValuesメソッドを使用して、combinedCustomers SourceのcustomersToSelectとmoreCustomersToSelectの要素を結合します。 最後に、この例では、combinedCustomersのdistinctメソッドを使用します。Source、distinctCombinedCustomersが返されます。Sourceには、階層の別個のメンバーのみが含まれています。
例6-2 distinctメソッドの使用方法
MdmStandardDimension mdmCustDim =
mdmDBSchema.findOrCreateStandardDimension("CUSTOMER_AWJ");
MdmLevelHierarchy mdmMktHier =
mdmCustDim.findOrCreateLevelHierarchy("MARKETS");
StringSource mktHier = (StringSource)mdmMktHier.getSource();
Source customersToSelect =
mktHier.selectValues(new String[] {"MARKETS::SHIP_TO::KOSH ENT BOS",
"MARKETS::SHIP_TO::KOSH ENT TOK",
"MARKETS::SHIP_TO::KOSH ENT WAN"});
Source moreCustomersToSelect =
mktHier.selectValues(new String[] {"MARKETS::SHIP_TO::KOSH ENT BOS",
"MARKETS::SHIP_TO::KOSH ENT TOK",
"MARKETS::SHIP_TO::BUSN WRLD NY",
"MARKETS::SHIP_TO::BUSN WRLD SJ"});
Source combinedCustomers =
customersToSelect.appendValues(moreCustomersToSelect);
Source distinctCombinedCustomers = combinedCustomers.distinct();
combinedCustomers SourceのCursorには、次の値があります:
MARKETS::SHIP_TO::KOSH ENT BOS MARKETS::SHIP_TO::KOSH ENT TOK MARKETS::SHIP_TO::KOSH ENT WAN MARKETS::SHIP_TO::KOSH ENT BOS MARKETS::SHIP_TO::KOSH ENT TOK MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
distinctCombinedCustomers SourceのCursorには、次の値があります:
MARKETS::SHIP_TO::KOSH ENT BOS MARKETS::SHIP_TO::KOSH ENT TOK MARKETS::SHIP_TO::KOSH ENT WAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
6.2.3 joinメソッドの使用方法
「ソース・オブジェクトの理解」で説明されているように、joinメソッドを使用して、メソッドのjoined、comparison、およびcomparisonRuleパラメータによって決定される基本Sourceの要素を持つSourceを生成します。 visibleパラメータは、joinedパラメータSourceが結合操作によって生成されたSourceの出力であるかどうかを決定します。 また、joinメソッドを使用して、SourceをbaseまたはjoinedパラメータSourceの入力と照合します。
この章のほとんどの例では、joinメソッドの1つ以上のシグネチャを使用しています。「ソース・オブジェクトの理解」の例の多くはそうです。 「例6-3」は完全なjoinシグネチャと最も単純なjoinシグネチャを使用します。 この例では、完全なjoinシグネチャは、COMPARISON_RULE_DESCENDINGをcomparisonRuleパラメータとして使用する方法を示しています。
「例6-3」は、次のSourceオブジェクトを使用します。
-
prodSelWithShortDescrは、PRODUCT_AWJディメンションの短い説明属性とディメンションのPRODUCT_PRIMARY階層のFAMILY階層レベルのSourceを結合して生成されたSourceです。 -
salesMeasureは、UNITS_CUBE_AWJキューブのSALESメジャーのSourceです。 -
timeSelWithShortDescrは、TIME_AWJディメンションの短い説明属性とディメンションのCALENDAR_YEAR階層の選択されたメンバーのSourceを結合して生成されたSourceです。 -
custSelWithShortDescr。これは、CUSTOMER_AWJディメンションの短い説明属性とディメンションのSHIPMENTS階層の選択メンバーのSourceを結合して生成されたSourceです。 -
chanSelWithShortDescrは、CHANNEL_AWJディメンションの短い説明属性とディメンションのCHANNEL_PRIMARY階層の選択されたメンバーのSourceを結合して生成されたSourceです。
最初の結合操作では、prodSelWithShortDescrをSource、salesMeasureを結合Source、SourceをNumberデータ型のSource、COMPARISON_RULE_DESCENDINGを比較ルールとして使用するjoinメソッドの完全なシグネチャが使用されます。 その結合操作によって戻されたSourceには、製品ファミリ・レベルのメンバーと、関連する製品の短い記述値が基本値として格納され、出力が降順で出力されます。
次の3つの結合操作は、メジャーの他の3つのディメンションの1つのメンバー選択を結合します。 result Sourceは、すべての顧客とすべてのチャネルについて、2001年5月分の売上金額の降順で製品ファミリのレベル・メンバーを指定します。
例6-3 COMPARISON_RULE_DESCENDINGの使用
Source result = prodSelWithShortDescr.join(salesMeasure, salesMeasure.getDataType(), Source.COMPARISON_RULE_DESCENDING, true) .join(timeSelWithShortDescr) .join(custSelWithShortDescr) .join(chanSelWithShortDescr);
result SourceのCursorの値は、次のように表形式で表示されます。 表には、階層メンバーの短い値の説明と売上金額の値のみが含まれ、見出しと書式が追加されています。
Total Channel
Total Customer
MAY-01
Total Sales Amounts Product Family
------------------- -----------------
3,580,239.72 Desktop PCs
2,508,560.92 Portable PCs
891,807.30 CD/DVD
632,376.84 Modems/Fax
444,444.38 Memory
312,389.39 Accessories
291,510.88 Monitors
222,995.92 Operating Systems
44,479.32 Documentation6.2.4 positionメソッドの使用方法
ベースの要素の位置を持ち、そのベースを入力として持つSourceを生成するには、positionメソッドを使用します。 「例6-4」は、positionメソッドを使用して、TIME_AWJディメンションの階層レベルの最初と最後のメンバーの選択を指定するSourceを生成します。
この例では、mdmTimeDimはTIME_AWJディメンションのMdmPrimaryDimensionです。 この例では、ディメンションの階層属性とCALENDAR_YEAR階層を取得します。 また、属性および階層のSourceオブジェクトを取得します。
次に、この例では、Sourceオブジェクトの配列を作成し、階層のMdmHierarchyLevelコンポーネントのListを取得します。 各レベルのSourceオブジェクトを取得して配列に追加し、そのレベルのSourceオブジェクトを要素値として持つリストSourceを作成します。
この例では、levelMembersが生成されます。levelMembersは、階層レベルのメンバーを指定するSourceです。 結合操作のcomparisonパラメータはlevelList.value()によって生成されるSourceであるため、levelMembersは入力としてlevelListを持ちます。 したがって、levelMembersは、入力が結合操作で照合されたときに、各レベルのメンバーをレベル別に返すSourceです。
range Sourceは、Sourceの2番目の要素から最後の要素までの範囲を指定します。
次の結合操作では、firstAndLast Sourceが生成されます。 操作の基底はlevelMembersです。 joinedパラメータは、levelMembers.position()メソッドの結果であるSourceです。 comparisonパラメータはrange Sourceであり、比較ルールはCOMPARISON_RULE_REMOVEです。 visibleパラメータの値はtrueです。 したがって、firstAndLast Sourceは、レベルの他のメンバーのすべてを選択から削除するため、レベルの最初と最後のメンバーのみを指定します。 firstAndLast Sourceは入力としてまだlevelListを持っています。
最後の結合操作では、firstAndLastの入力とlevelListの入力が一致します。
例6-4 最初と最後の時間要素の選択
MdmAttribute mdmTimeLevelAttr = mdmTimeDim.getLevelAttribute();
MdmLevelHierarchy mdmCalHier =
mdmTimeDim.findOrCreateLevelHierarchy("CALENDAR_YEAR");
Source levelRel = mdmTimeLevelAttr.getSource();
StringSource calHier = (StringSource) mdmCalHier.getSource();
Source[] levelSources = new Source[3];
List levels = mdmCalHier.getHierarchyLevels();
for (int i = 0; i < levelSources.length; i++)
{
levelSources[i] = ((MdmHierarchyLevel) levels.get(i)).getSource();
}
Source levelList = dp.createListSource(levelSources);
Source levelMembers = calHier.join(levelRel, levelList.value());
Source range = dp.createRangeSource(2, levelMembers.count().minus(1));
Source firstAndLast = levelMembers.join(levelMembers.position(),
range,
Source.COMPARISON_RULE_REMOVE,
true);
Source result = firstAndLast.join(levelList);
result SourceのCursorの値は、次のように、列ヘッダーおよび書式が追加された表として表示されます。 左の列はレベル名、中央の列はレベル内のメンバーの位置、右の列はメンバーのローカル値です。 TOTAL_TIMEレベルにはメンバーが1つしかありません。
Level Member Position in Level Member Value ---------- ------------------------ ------------ TOTAL_TIME 1 TOTAL YEAR 1 CY1998 YEAR 10 CY2007 QUARTER 1 CY1998.Q1 QUARTER 40 CY2007.Q4 MONTH 1 1998.01 MONTH 120 2007.12
6.2.5 recursiveJoinメソッドの使用
階層的に順序付けられた要素を持つSourceを生成するには、recursiveJoinメソッドを使用します。 recursiveJoinメソッドは、MdmHierarchyのSourceまたはそのようなSourceのサブタイプとともにのみ使用します。 このメソッドは、階層における親とその子で階層的に順序付けられた要素を持つSourceを生成します。
joinメソッドと同様に、recursiveJoinメソッドを使用して、メソッドのjoined、comparison、およびcomparisonRuleパラメータによって決定されるベースSourceの要素を持つSourceを生成します。 visibleパラメータは、結合されたSourceが再帰結合操作によって生成されたSourceの出力であるかどうかを決定します。
完全なrecursiveJoinメソッドには、階層の親属性を指定するその他のパラメータ、結果が子の前後に親を持つかどうか、結果に子が含まれているが親は含まれていない場合は結果の要素を順序付ける方法があります。 recursiveJoinメソッドには、完全なシグネチャのショートカットであるいくつかのシグネチャがあります。
「例6-5」は、親を最初にリストし、親をベースに限定し、結合されたSourceを出力として追加しないrecursiveJoinメソッドを使用します。 この例では、まずPRODUCT_AWJディメンションのPRODUCT_PRIMARY階層のメンバーを階層レベルでソートし、次に各メンバーのパッケージ属性の値でソートします。
最初のrecursiveJoinメソッドでは、COMPARISON_RULE_ASCENDINGパラメータは、prodHier階層のメンバーが各レベル内でアルファベット昇順になるように指定します。 prodParentAttrオブジェクトは、階層の親属性のSourceです。
2番目のrecursiveJoinメソッドのprodPkgAttrオブジェクトは、ディメンションのパッケージ属性のSourceです。 ITEMレベルのメンバーだけが、関連するパッケージ属性値を持っています。 集計レベルTOTAL_PRODUCT、CLASS、およびFAMILYのメンバーは関連パッケージを持たないため、これらのレベルのメンバーのパッケージ属性値はnullであり、結果にはNAと表示されます。 ITEMレベル・メンバーの中には、関連パッケージ値がないものもあります。そのため、値はNAです。
2番目のrecursiveJoinメソッドは、パッケージの属性値を関連する階層メンバーに結合し、レベルごとに階層的にメンバーをソートし、レベルの昇順アルファベット順にソートします。 COMPARISON_RULE_ASCENDING_NULLS_FIRSTパラメータは、null値を持つメンバーが同じレベルの他のメンバーの前に表示されるように指定します。 この例では、メソッドsortedHierAscendingの結果をpackage属性に結合して、パッケージ属性値を要素値として、sortedHierAscendingを出力として持つSourceを生成します。
3番目のrecursiveJoinメソッドは、2番目のメソッドと同じですが、COMPARISON_RULE_DESCENDING_NULLS_FIRSTパラメータが、階層内のメンバーをパッケージ属性値ごとにレベルの降順アルファベット順に並べ替える点が異なります。
例6-5属性による階層的なソート
Source result1 = prodHier.recursiveJoin(prodDim.value(),
prodHier.getDataType(),
prodParentAttr,
Source.COMPARISON_RULE_ASCENDING);
Source sortedHierAscending =
prodHier.recursiveJoin(prodPkgAttr,
prodPkgAttr.getDataType(),
prodParentAttr,
Source.COMPARISON_RULE_ASCENDING_NULLS_FIRST);
Source result2 = prodPkgAttr.join(sortedHierAscending);
Source sortedHierDescending =
prodHier.recursiveJoin(prodPkgAttr,
prodPkgAttr.getDataType(),
prodParentAttr,
Source.COMPARISON_RULE_DESCENDING_NULLS_FIRST);
Source result3 = prodPkgAttr.join(sortedHierDescending);
result1 SourceのCursorの値は、ヘッダー付きで次のように表示されます。 ここでは、Cursorの最初の17個の値のみが表示されています。
Product Primary Hierarchy Value ------------------------------------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL PRODUCT_PRIMARY::CLASS::HRD PRODUCT_PRIMARY::FAMILY::DISK PRODUCT_PRIMARY::ITEM::EXT CD ROM PRODUCT_PRIMARY::ITEM::EXT DVD PRODUCT_PRIMARY::ITEM::INT 8X DVD PRODUCT_PRIMARY::ITEM::INT CD ROM PRODUCT_PRIMARY::ITEM::INT CD USB PRODUCT_PRIMARY::ITEM::INT RW DVD PRODUCT_PRIMARY::FAMILY::DTPC PRODUCT_PRIMARY::ITEM::SENT FIN PRODUCT_PRIMARY::ITEM::SENT MM PRODUCT_PRIMARY::ITEM::SENT STD PRODUCT_PRIMARY::FAMILY::LTPC PRODUCT_PRIMARY::ITEM::ENVY ABM PRODUCT_PRIMARY::ITEM::ENVY EXE PRODUCT_PRIMARY::ITEM::ENVY STD ...
result2 SourceのCursorの値は、次のようにヘッダー付きの表形式で表示されます。 表では、Cursorの最初の17個の値のみが表示されています。 左の列は階層のメンバー値、右の列はメンバーのパッケージ属性値です。
null値を持つITEMレベル・メンバーが最初に表示され、次に他のレベル・メンバーがパッケージ値の昇順に表示されます。 パッケージ属性のデータ型はStringであるため、パッケージの値は昇順のアルファベット順になります。
Product Primary Hierarchy Value Package Attribute Value ------------------------------------- ----------------------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL NA PRODUCT_PRIMARY::CLASS::HRD NA PRODUCT_PRIMARY::FAMILY::DISK NA PRODUCT_PRIMARY::ITEM::EXT CD ROM NA PRODUCT_PRIMARY::ITEM::INT 8X DVD NA PRODUCT_PRIMARY::ITEM::INT CD USB NA PRODUCT_PRIMARY::ITEM::EXT DVD Executive PRODUCT_PRIMARY::ITEM::INT CD ROM Laptop Value Pack PRODUCT_PRIMARY::ITEM::INT RW DVD Multimedia PRODUCT_PRIMARY::FAMILY::DTPC NA PRODUCT_PRIMARY::ITEM::SENT FIN NA PRODUCT_PRIMARY::ITEM::SENT STD NA PRODUCT_PRIMARY::ITEM::SENT MM Multimedia PRODUCT_PRIMARY::FAMILY::LTPC NA RODUCT_PRIMARY::ITEM::ENVY ABM NA PRODUCT_PRIMARY::ITEM::ENVY EXE Executive PRODUCT_PRIMARY::ITEM::ENVY STD Laptop Value Pack ...
result3 SourceのCursorの値は、次のようにヘッダー付きの表形式で表示されます。 ここでは、メンバーはパッケージ属性値を基準に、降順のアルファベット順でソートされています。
Product Primary Hierarchy Value Package Attribute Value ------------------------------------- ----------------------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL NA PRODUCT_PRIMARY::CLASS::HRD NA PRODUCT_PRIMARY::FAMILY::DISK NA PRODUCT_PRIMARY::ITEM::EXT CD ROM NA PRODUCT_PRIMARY::ITEM::INT 8X DVD NA PRODUCT_PRIMARY::ITEM::INT CD USB NA PRODUCT_PRIMARY::ITEM::INT RW DVD Multimedia PRODUCT_PRIMARY::ITEM::INT CD ROM Laptop Value Pack PRODUCT_PRIMARY::ITEM::EXT DVD Executive PRODUCT_PRIMARY::FAMILY::DTPC NA PRODUCT_PRIMARY::ITEM::SENT FIN NA PRODUCT_PRIMARY::ITEM::SENT STD NA PRODUCT_PRIMARY::ITEM::SENT MM Multimedia PRODUCT_PRIMARY::FAMILY::LTPC NA PRODUCT_PRIMARY::ITEM::ENVY ABM NA PRODUCT_PRIMARY::ITEM::ENVY STD Laptop Value Pack PRODUCT_PRIMARY::ITEM::ENVY EXE Executive ...
6.2.6 valueメソッドの使用方法
「"入力によるソースの導出"」で説明したように、valueメソッドを使用して、それ自体を入力として持つSourceを作成します。 この関係により、Sourceの要素のサブセットを選択できます。 また、valueメソッドを使用して関係を逆転させることもできます。
以下のトピックには、これらの操作の例があります。
6.2.6.1 ソースの要素の選択
「例5-11」と「例6-6」は、Sourceの要素のサブセットの選択を示します。 「例6-6」では、shipHierはCUSTOMER_AWJディメンションのSHIPMENTS階層のSourceです。 shipHierのselectValuesメソッドは、shipHierのいくつかの要素の選択であるcustSelを生成します。 custSelのselectValuesメソッドは、その選択のサブセットであるcustSel2を生成します。
最初のjoinメソッドのベースおよび結合SourceはcustSelです。 この比較SourceはcustSel2です。 結果として生じるSource、result1の要素は、比較Sourceで指定されたベースと結合されたSourceオブジェクトのデカルト積です。 result1 Sourceは、比較SourceにあるcustSelの各要素に対してcustSelの要素の1つのセットを持っています。 visibleパラメータの値がtrueであるため、結合Sourceはresult1の出力になります。
2番目のjoinメソッドも、ベースとしてcustSelを持ち、比較SourceとしてcustSel2を持ちますが、custSel.value()メソッドによって結合されたSourceとして返されたSourceを持っています。 custSelは結合されたSourceの入力であるため、ベースSourceはその入力と一致します。 その入力関係により、結果として得られるSource、result2は、custSelの要素だけを持ち、それらもSourceの比較に含まれます。
例6-6ソースの要素のサブセットの選択
StringSource custSel = shipHier.selectValues(new String[]
{"SHIPMENTS::SHIP_TO::COMP WHSE SIN",
"SHIPMENTS::SHIP_TO::COMP WHSE LON",
"SHIPMENTS::SHIP_TO::COMP WHSE SJ",
"SHIPMENTS::SHIP_TO::COMP WHSE ATL"});
Source custSel2 = custSel.selectValues(new String[]
{"SHIPMENTS::SHIP_TO::COMP WHSE SIN",
"SHIPMENTS::SHIP_TO::COMP WHSE SJ"});
Source result1 = custSel.join(custSel, custSel2, true);
Source result2 = custSel.join(custSel.value(), custSel2, true);
result1のCursorには、次の表に示す値があります。 表には、Cursorにない書式と見出しがあります。 左の列は、Cursorの出力の要素値を示します。 右側の列には、Cursorの基本値があります。
Output Value result1 Value --------------------------------- --------------------------------- SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE ATL SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE LON SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE ATL SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE LON
result2のCursorの値は、次のようにヘッダー付きの表形式で表示されます。 左の列は、Cursorの出力の要素値を示します。 右側の列には、Cursorの基本値があります。
Output Value result2 Value --------------------------------- --------------------------------- SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN
6.2.6.2 関係を逆転
valueメソッドの別の使い方は、「例6-7」に示すように、リレーションを逆転させることです。 この例では、CUSTOMER_AWJディメンションの祖先属性の関係を逆にして子孫の関係を表すSource、marketsDescendantsを生成しています。 marketsDescendants Sourceは、ディメンションのMARKETS階層のSourceを入力として持っています。 marketsDescendantsをその入力と一致するSourceに結合すると、参加している階層メンバーの子孫を指定するSourceが取得されます。
リレーションを逆転させる別の例は、「例6-10」です。 valueメソッドを使用して、親属性を逆にして親の子を取得します。
「例6-7」はまず、CUSTOMER_AWJディメンションのMdmStandardDimensionオブジェクトとそのディメンションのMARKETS階層のMdmLevelHierarchyオブジェクトを取得します。 階層のSourceを取得します。
次の例では、ディメンションのancestors属性とそのディメンションのSourceが取得されます。 ancestors属性は、各ディメンション・メンバーをそのメンバーの祖先に関連付けます。
ディメンションの各メンバーの子孫を表すSourceを生成するために、この例では、mktHierという階層のSourceをancestors属性ancestorsAttrに結合することによって、祖先関係を逆転させます。 結合操作では、mktHier.value()を比較Sourceとして使用するため、結合操作によって戻されたSourceはmarketsDescendantsに入力としてmktHierを持ちます。 marketsDescendants Sourceは、ancestorsAttr要素を祖先とするmktHierの要素を、ancestorsAttrの各要素に対して指定します。 marketsDescendants Sourceは、mktHierを入力として持つため、階層の子孫関係を表す属性と同じように機能します。
この例は、次の行でmktHierとmarketsDescendantsを結合するときにこれを示します。
Source selValDescendants = marketsDescendants.join(mktHier, selVal);
結合操作では、結合されたSource、mktHierは、marketsDescendantsの入力と一致します。 比較Sourceは、階層の単一メンバーを指定するselValです。 結合操作は、selValの子孫であるmarketsDescendantsの要素を指定するselValDescendantsを返します。 結果には祖先メンバー自体も含まれます。 mktHier Sourceは、使用されたjoinメソッドのシグネチャが、結合されたSourceを出力として持たないSourceを導出するため、selValDescendantsの出力ではありません。
次の例では、joinメソッドの完全シグネチャを使用してselValDescendantsOnlyを生成します。selValDescendantsOnlyには、祖先値ではなく子孫のみが含まれています。 祖先の値を削除するには、この例ではvalueメソッドを再度使用します。このとき、selValDescendantsOnlyを戻す結合操作のjoinedパラメータであるSourceを戻します。 比較SourceはselValであり、比較ルールはCOMPARISON_RULE_REMOVEです。
最後に、この例ではremoveValueメソッドを使用してselValDescendantsOnly2を生成します。これはselValDescendantsOnlyと同じです。 これは、単にremoveValueメソッドがselValDescendantsOnlyを返した結合操作のショートカットであることを示しています。
例6-7値のメソッドを使用したリレーションの逆転
MdmStandardDimension mdmCustDim =
mdmDBSchema.findOrCreateStandardDimension("CUSTOMER_AWJ");
MdmLevelHierarchy mdmMktHier =
mdmCustDim.findOrCreateLevelHierarchy("MARKETS");
StringSource mktHier = (StringSource)mdmMktHier.getSource();
MdmAttribute mdmAncestorsAttr = mdmCustDim.getAncestorsAttribute();
Source ancestorsAttr = mdmAncestorsAttr.getSource();
// Reverse the ancestors relation to get the descendants relation.
Source marketsDescendants = mktHier.join(ancestorsAttr, mktHier.value());
Source selVal = mktHier.selectValue("MARKETS::ACCOUNT::BUSN WRLD");
// Select the descendants of the specified hierarchy member.
StringSource selValDescendants =
(StringSource)marketsDescendants.join(mktHier, selVal);
// Remove the ancestor value so that only the descendants remain.
Source selValDescendantsOnly =
selValDescendants.join(selValDescendants.value(),
selVal,
Source.COMPARISON_RULE_REMOVE),
false;
// Produce the same result using the removeValue method.
Source selValDescendantsOnly2 =
selValDescendants.removeValue("MARKETS::ACCOUNT::BUSN WRLD");
selValDescendantsのCursorの値は次のとおりです。
MARKETS::ACCOUNT::BUSN WRLD MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
selValDescendantsOnlyのCursorの値は次のとおりです。
MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
selValDescendantsOnly2のCursorには、次の値があります。
MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
6.3 その他のSourceメソッドの使用方法
基本メソッドの様々なシグネチャであるメソッドに加え、Sourceクラスには、基本メソッドと組み合せて使用するその他のメソッドが多数あります。 このようなメソッドの中には、atやoffsetメソッドのように、単一の位置に基づいて選択を実行するメソッドがあります。 また、intervalメソッドのように、位置の範囲に基づいて処理を行うメソッドもあります。 さらに、eqやgtのように比較を行うメソッド、selectValueやremoveValueのように1つ以上の要素を選択するメソッド、sortAscendingやsortDescendingHierarchicallyのように要素をソートするメソッドもあります。
Sourceの各サブクラスにも、その他の特殊なメソッドがあります。 たとえば、NumberSourceクラスには、算術関数を実行するメソッド(abs、divおよびcosなど)や、集計を実行するメソッド(averageおよびtotalなど)が数多くあります。
以下のトピックには、Sourceメソッドのいくつかの使用を示す例があります。 例の中には、OLAPアプリケーションで一般的に実行するタスクもあります。
6.3.1 extractメソッドの使用方法
extractメソッドを使用して、別のSourceの要素の値であるSourceの値を抽出します。 Sourceの要素がSourceオブジェクトではない要素値を持つ場合、extractメソッドはvalueメソッドのように動作します。
「例6-8」はextractメソッドを使用して、NumberSourceオブジェクトの値を取得します。NumberSourceオブジェクト自体は、リストSource measDimの要素の値です。 各NumberSourceオブジェクトは、メジャーを表します。
この例では、UNITS_CUBE_AWJキューブのディメンションの階層のStringSourceオブジェクトから要素を選択します。 cost、units、およびsalesオブジェクトは、キューブのCOST、UNITS、およびSALESメジャーのNumberSourceオブジェクトです。
次に、この例では、measDimを作成します。これは、要素値として3つのNumberSourceオブジェクトを持つリストSourceです。 その後、extractメソッドを使用して、NumberSourceオブジェクトの値を取得します。 結果の名前のないSourceは抽出入力としてmeasDimを持っています。 最初の結合操作では、measDim.extract()が基底Sourceとなります。 ベースSourceの入力は、joinedパラメータであるmeasDimと一致します。 この例では、ディメンション選択を結合してresult Sourceを生成することによって、メジャーの他の入力と一致します。
例6-8 extractメソッドの使用方法
Source prodSel = prodHier.selectValues(new String[]
{"PRODUCT_PRIMARY::ITEM::ENVY STD",
"PRODUCT_PRIMARY::ITEM::ENVY EXE",
"PRODUCT_PRIMARY::ITEM::ENVY ABM"});
Source chanSel = chanHier.selectValue("CHANNEL_PRIMARY::CHANNEL::DIR");
Source timeSel = timeHier.selectValue("CALENDAR_YEAR::MONTH::2001.05");
Source custSel = custHier.selectValue("SHIPMENTS::TOTAL_CUSTOMER::TOTAL");
Source measDim = dp.createListSource(new Source[] {cost, units, sales});
Source result = measDim.extract().join(measDim) // column
.join(prodSel) // row
.join(timeSel) // page
.join(chanSel) // page
.join(custSel); // page
次のクロス集計では、ヘッダーおよび書式が追加されて、result SourceのCursorの値が表示されます。
SHIPMENTS::TOTAL_CUSTOMER::TOTAL CHANNEL_PRIMARY::CHANNEL::DIR CALENDAR_YEAR::MONTH::2001.05 ITEM COST UNITS SOLD SALES AMOUNT -------- ---------- ---------- ------------- ENVY ABM 73,316.10 26 77,825.54 ENVY EXE 111,588.30 37 116,470.45 ENVY STD 92,692.47 39 93,429.57
6.3.2 キューブの作成およびエッジのピボット
典型的なOLAP操作の1つは、多ディメンションのデータ・アレイであるキューブの作成です。 キューブのデータは、キューブの列、行、およびページの辺の要素によって指定されます。 キューブのデータは、メジャーのディメンションのメンバーによって指定されたメジャーからのデータにすることができます。 キューブ・データは、指定された金額を超える単価の販売数量を持つ製品など、メジャー・データの計算によって指定されるディメンション・メンバーでもあります。
このトピックの例の多くは、キューブを作成します。 例6-9では、販売台数をデータとして持つキューブを作成します。 列のエッジ値は、最初はチャネルのディメンション階層から、行のエッジ値は時間ディメンションの階層から、ページのエッジ値は製品および顧客のディメンションの階層からのものです。 ページのエッジ上の製品および顧客メンバーの値は、パラメータ化されたSourceオブジェクトによって表されます。
この例では、階層メンバーの選択肢をディメンションの短い値の説明属性に結合して、結果に属性値が含まれるようにします。 この例では、階層から派生したSourceオブジェクトをメジャーのSourceに結合してcube問合せを生成します。 この例では、現行のTransactionをコミットし、次に問合せのCursorを作成して、その値を表示します。
この例では、Cursorの値を表示した後、顧客選択のパラメータ化されたSourceのParameterの値を変更し、同じTransaction内の同じCursorを使用して異なる結果セットを取得します。 この例では、Cursorの位置がリセットされ、Cursorの値が再び表示されます。
この例では、列の値が時間メンバーであり、行の値がチャネルのメンバーになるように列と行の端をピボットします。 それから、Transactionをコミットし、問合せに別のCursorを作成して、その値を表示します。 そして、各Parameterオブジェクトの値を変更して、Cursorの値を再表示します。
dpオブジェクトは、DataProviderです。 getContextメソッドは、クロス集計形式でCursorの値を表示するメソッドを持つContext11gオブジェクトを取得します。
例6-9 キューブの作成およびエッジのピボット
// Create Parameter objects with values from the hierarchies
// of the CUSTOMER_AWJ and PRODUCT_AWJ dimensions.
StringParameter custParam =
new StringParameter(dp, "SHIPMENTS::REGION::EMEA");
StringParameter prodParam =
new StringParameter(dp, "PRODUCT_PRIMARY::FAMILY::LTPC");
// Create parameterized Source objects using the Parameter objects.
Source custParamSrc = custParam.createSource();
Source prodParamSrc = prodParam.createSource();
// Select single values from the hierarchies, using the Parameter
// objects as the comparisons in the join operations.
Source paramCustSel = custHier.join(custHier.value(), custParamSrc);
Source paramProdSel = prodHier.join(prodHier.value(), prodParamSrc);
// Select members from the other dimensions of the measure.
Source timeSel =
timeHier.selectValues(new String[] {"CALENDAR_YEAR::YEAR::CY1999"
"CALENDAR_YEAR::YEAR::CY2000",
"CALENDAR_YEAR::YEAR::CY2001"});
Source chanSel =
chanHier.selectValues(new String[] {"CHANNEL_PRIMARY::CHANNEL::DIR",
"CHANNEL_PRIMARY::CHANNEL::CAT ",
"CHANNEL_PRIMARY::CHANNEL::INT"});
// Join the hierarchy selections to the short description attributes
// for the dimensions.
Source columnEdge = chanSel.join(chanShortDescr);
Source rowEdge = timeSel.join(timeShortDescr);
Source page1 = paramProdSel.join(prodShortDescr);
Source page2 = paramCustSel.join(custShortDescr);
// Join the dimension selections to the measure.
Source cube = units.join(columnEdge)
.join(rowEdge)
.join(page2)
.join(page1);
// The following method commits the current Transaction.
getContext().commit();
// Create a Cursor for the query.
CursorManager cursorMngr = dp.createCursorManager(cube);
CompoundCursor cubeCursor = (CompoundCursor) cursorMngr.createCursor();
// Display the values of the Cursor as a crosstab.
getContext().displayCursorAsCrosstab(cubeCursor);
// Change the customer parameter value.
custParam.setValue("SHIPMENTS::REGION::AMER");
// Reset the Cursor position to 1 and display the values again.
cubeCursor.setPosition(1);
println();
getContext().displayCursorAsCrosstab(cubeCursor);
// Pivot the column and row edges.
columnEdge = timeSel.join(timeShortDescr);
rowEdge = chanSel.join(chanShortDescr);
// Join the dimension selections to the measure.
cube = units.join(columnEdge)
.join(rowEdge))
.join(page2)
.join(page1);
// Commit the current Transaction.
getContext().commit();
// Create another Cursor.
cursorMngr = dp.createCursorManager(cube);
cubeCursor = (CompoundCursor) cursorMngr.createCursor();
getContext().displayCursorAsCrosstab(cubeCursor);
// Change the product parameter value.
prodParam.setValue("PRODUCT_PRIMARY::FAMILY::DTPC");
// Reset the Cursor position to 1
cubeCursor.setPosition(1);
println();
getContext().displayCursorAsCrosstab(cubeCursor);
次のクロス集計の値は、最初のdisplayCursorAsCrosstabメソッドによって表示されるcubeCursorの値です。
Portable PCs
Europe
Catalog Direct Sales Internet
1999 1986 86 0
2000 1777 193 10
2001 1449 196 215
次のクロス集計の値は、custParam Parameterオブジェクトの値を変更した後のcubeCursorの値です。
Portable PCs
North America
Catalog Direct Sales Internet
1999 6841 385 0
2000 6457 622 35
2001 5472 696 846
次のクロス集計の値は、列エッジおよび行エッジをピボットした後のcubeCursorの値です。
Portable PCs
North America
1999 2000 2001
Catalog 6841 6457 5472
Direct Sales 385 622 696
Internet 0 35 846
最後のクロス集計の値は、prodParam Parameterオブジェクトの値を変更した後のcubeCursorの値です。
Desktop PCs
North America
1999 2000 2001
Catalog 14057 13210 11337
Direct Sales 793 1224 1319
Internet 0 69 17486.3.3 階層内でのドリルアップおよびドリルダウン
もう1つの一般的なOLAP操作として、ディメンション階層内でのドリルアップおよびドリルダウンがあります。 「例6-10」は、ディメンション階層の1つのレベルのメンバーを取得し、メンバーを選択し、メンバーの親、子、および祖先を取得することを示します。 この例では、親リレーションを逆にして親の子を取得し、prodHierChildren Sourceを生成します。
この例では、次のオブジェクトが使用されています。
-
levelSrcは、PRODUCT_AWJディメンションのPRODUCT_PRIMARY階層のFAMILYレベルのSourceです。 -
prodHierは、PRODUCT_PRIMARY階層のSourceです。 -
prodHierParentAttr。階層の親属性のSourceです。 -
prodHierAncsAttr。階層の祖先属性のSourceです。 -
prodShortLabelは、PRODUCT_AWJディメンションの短い値の説明属性のSourceです。
例6-10 階層内のドリル操作
int pos = 5;
// Get the element at the specified position of the level Source.
Source levelElement = levelSrc.at(pos);
// Get ancestors of the level member.
Source levelElementAncs = prodHierAncsAttr.join(prodHier, levelElement);
// Get the parent of the level member.
Source levelElementParent = prodHierParentAttr.join(prodHier, levelElement);
// Get the children of a parent.
Source prodHierChildren = prodHier.join(prodHierParentAttr, prodHier.value());
// Select the children of the level member.
Source levelElementChildren = prodHierChildren.join(prodHier, levelElement);
// Get the short value descriptions for the members of the level.
Source levelSrcWithShortDescr = prodShortLabel.join(levelSrc);
// Get the short value descriptions for the children.
Source levelElementChildrenWithShortDescr =
prodShortLabel.join(levelElementChildren);
// Get the short value descriptions for the parents.
Source levelElementParentWithShortDescr =
prodShortLabel.join(prodHier, levelElementParent, true);
// Get the short value descriptions for the ancestors.
Source levelElementAncsWithShortDescr =
prodShortLabel.join(prodHier, levelElementAncs, true);
// Commit the current Transaction.
getContext().commit();
// Create Cursor objects and display their values.
println("Level Source element values:");
getContext().displayResult(levelSrcWithShortDescr);
println("\nLevel Source element at position " + pos + ":");
getContext().displayResult(levelElement);
println("\nParent of the level member:");
getContext().displayResult(levelElementParentWithShortDescr);
println("\nChildren of the level member:");
getContext().displayResult(levelElementChildrenWithShortDescr);
println("\nAncestors of the level member:");
getContext().displayResult(levelElementAncsWithShortDescr);
次のリストは、displayResultsメソッドによって作成されたCursorオブジェクトの値を示しています。
Level Source element values: PRODUCT_PRIMARY::FAMILY::ACC,Accessories PRODUCT_PRIMARY::FAMILY::DISK,CD/DVD PRODUCT_PRIMARY::FAMILY::DOC,Documentation PRODUCT_PRIMARY::FAMILY::DTPC,Portable PCs PRODUCT_PRIMARY::FAMILY::LTPC,Desktop PCs PRODUCT_PRIMARY::FAMILY::MEM,Memory PRODUCT_PRIMARY::FAMILY::MOD,Modems/Fax PRODUCT_PRIMARY::FAMILY::MON,Monitors PRODUCT_PRIMARY::FAMILY::OS,Operating Systems Level Source element at position 5: PRODUCT_PRIMARY::FAMILY:LTPC Parent of the level member: PRODUCT_PRIMARY::CLASS::HRD,Hardware Children of the level member: PRODUCT_PRIMARY::ITEM::ENVY ABM,Envoy Ambassador PRODUCT_PRIMARY::ITEM::ENVY EXE,Envoy Executive PRODUCT_PRIMARY::ITEM::ENVY STD,Envoy Standard Ancestors of the level member: PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL,Total Product PRODUCT_PRIMARY::CLASS::HRD,Hardware PRODUCT_PRIMARY::FAMILY::LTPC,Portable PCs
6.3.4 メジャー値による階層的ソート
「例6-11」は、recursiveJoinメソッドを使用して、PRODUCT_AWJディメンションのPRODUCT_PRIMARYディメンションのメンバーを、UNITSメジャーの値の昇順で階層的にソートします。 この例では、ソートされた製品をディメンションの値の簡単な説明属性に結合してから、その操作の結果sortedProductsShortDescrをunitsに結合します。
連続しているjoinHiddenメソッドは、unitsの他のディメンションの選択を結合して、要素値としてメジャーのデータを持ち、出力としてsortedProductsShortDescrを持つresult Sourceを生成します。 この例でjoinHiddenメソッドを使用するのは、他のディメンションの選択が結果の出力にならないようにするためです。
この例では、次のオブジェクトが使用されています。
-
prodHierは、PRODUCT_PRIMARY階層のSourceです。 -
unitsは、販売された製品単位のUNITS指標のSourceです。 -
prodParentAttrは、PRODUCT_PRIMARY階層の親属性のSourceです。 -
prodShortDescrは、PRODUCT_AWJディメンションの短い値の説明属性のSourceです。 -
custSelは、CUSTOMER_AWJディメンションのSHIPMENTS階層の単一メンバーを指定するSourceです。 メンバーはすべての顧客の合計であるSHIPMENTS::TOTAL_CUSTOMER::TOTALです。 -
chanSelは、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層の単一メンバーを指定するSourceです。 メンバーの値は、直接販売チャネルであるCHANNEL_PRIMARY::CHANNEL::DIRです。 -
timeSelは、TIME_AWJディメンションのCALENDAR_YEAR階層の単一メンバーを指定するSourceです。 メンバーは2001年のCALENDAR_YEAR::YEAR::CY2001です。
例6-11 メジャー値による階層的ソート
Source sortedProduct = prodHier.recursiveJoin(units, units.getDataType(), prodParentAttr, Source.COMPARISON_RULE_ASCENDING, true, // Parents first true); // Restrict parents to base Source sortedProductShortDescr = prodShortDescr.join(sortedProduct); Source result = units.join(sortedProductShortDescr) .joinHidden(custSel) .joinHidden(chanSel) .joinHidden(timeSel);
result SourceのCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 一番左の列は、PRODUCT_PRIMARY階層のレベルの名前です。 左から2番目の列は製品識別子の値を示し、左から3番目の列は製品の値の簡単な説明を示します。 一番右の列は、2001年に直販チャネルを介して全顧客に販売された製品の単位数を示します。
この表には、Cursorの最初の9個の値と最後の11個の値と、Software/Otherクラスの値だけが含まれています。 製品の値は、販売された単位によって階層的かつ昇順に並べられています。 Hardwareクラスは、Software/Otherクラスの前に表示されます。これは、Software/Otherクラスの販売台数が多いためです。 ハードウェア・クラスでは、ポータブルPCファミリが最小単位で販売されているため、最初に表示されます。 ソフトウェア/その他のクラスでは、アクセサリ・ファミリの販売台数が最大になるため、最後に表示されます。
Product Level ID Description Units Sold ------------- ------------ ----------------------------- ---------- TOTAL_PRODUCT TOTAL Total Product 43,785 CLASS HRD Hardware 16,543 FAMILY LTPC Portable PCs 1,192 ITEM ENVY ABM Envoy Ambassador 330 ITEM ENVY EXE Envoy Executive 385 ITEM ENVY STD Envoy Standard 477 FAMILY MON Monitors 1,193 ITEM 19 SVGA Monitor- 19" Super VGA 207 ITEM 17 SVGA Monitor- 17"Super VGA 986 ... CLASS SFT Software/Other) 27,242 ... FAMILY ACC Accessories 18,949 ITEM ENVY EXT KBD Envoy External Keyboard 146 ITEM EXT KBD External 101-key keyboard 678 ITEM MM SPKR 5 Multimedia speakers- 5" cones 717 ITEM STD MOUSE Standard Mouse 868 ITEM MM SPKR 3 Multimedia speakers- 3" cones 1,120 ITEM 144MB DISK 1.44MB External 3.5" Diskette 1,145 TEM KBRD REST Keyboard Wrist Rest 2,231 ITEM LT CASE Laptop carrying case 3,704 ITEM DLX MOUSE Deluxe Mouse 3,884 ITEM MOUSE PAD Mouse Pad 4,456
6.3.5 NumberSourceメソッドを使用した販売台数のシェアの計算
例6-12では、NumberSourceメソッドのdivおよびtimesを使用して、選択した時間、顧客およびチャネルの値について、製品の販売台数の総数に対するDesktop PCおよびPortable PCファミリのシェアを指定するSourceを生成します。 この例では、最初に、PRODUCT_AWJディメンションの階層のprodHierのselectValueメソッドを使用して、階層の最高集約レベルであるPRODUCT_PRIMARY::TOTAL_PRODUCT::TOTALという値を持つ単一要素を指定するtotalProdsを生成します。
NumberSource unitsのjoinHiddenメソッドは、totalProdsをtotalUnitsの出力として表示させずに、合計製品レベルでUNITSメジャー値を指定するtotalUnitsを生成します。 unitsのdivメソッドは、販売されたユニットの総量で割った各ユニットの販売額を表すSourceを生成します。 timesメソッドは、div操作の結果に100を掛けてproductShareを生成します。productShareは、製品メンバーが販売した総量のパーセンテージまたはシェアを表します。 productShare Sourceには、入力としてunitsメジャーの入力があります。
prodFamiliesオブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSourceオブジェクトです。 結合されたSourceとしてproductShareのjoinメソッド(prodFamiliesが結合されたもの)は、各製品ファミリが販売する製品の総量のうちのどれかを共有することを指定するSourceを生成します。
custSel、chanSel、およびtimeSel Sourceオブジェクトは、CUSTOMER_AWJ、CHANNEL_AWJ、およびTIME_AWJディメンションの階層の単一メンバーの選択です。 残りのjoinメソッドは、これらのSourceオブジェクトと他のproductShareの入力との一致を行い、resultを作成します。 joinメソッドのjoin(Source joined, String comparison)シグネチャは、結合されたSourceを出力として持たないSourceを生成します。
result Sourceは、2001年の直販チャネルを介した全顧客を対象とした製品の販売総数に対する製品ファミリごとのシェアを指定します。
例6-12 販売台数のシェアの取得
Source totalProds =
prodHier.selectValue("PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL");
NumberSource totalUnits = (NumberSource) units.joinHidden(totalProds);
Source productShare = units.div(totalUnits).times(100);
Source result =
productShare.join(prodFamilies)
.join(timeHier, "CALENDAR_YEAR::YEAR::CY2001")
.join(chanHier, "CHANNEL_PRIMARY::CHANNEL::DIR")
.join(custHier, "SHIPMENTS::TOTAL_CUSTOMER::TOTAL");
Source sortedResult = result.sortAscending();
sortedResult SourceのCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列は製品ファミリの値を、右の列は、2001年の直販チャネルを介した全顧客を対象とした販売台数の総数に対する製品ファミリのシェアを表しています。
Product Family Member Share of Total Units Sold ----------------------------- ------------------------- PRODUCT_PRIMARY::FAMILY::LTPC 2.72% PRODUCT_PRIMARY::FAMILY::MON 2.73% PRODUCT_PRIMARY::FAMILY::MEM 3.57% PRODUCT_PRIMARY::FAMILY::DTPC 5.13% PRODUCT_PRIMARY::FAMILY::DOC 6.4% PRODUCT_PRIMARY::FAMILY::DISK 11.71% PRODUCT_PRIMARY::FAMILY::MOD 11.92% PRODUCT_PRIMARY::FAMILY::OS 12.54% PRODUCT_PRIMARY::FAMILY::ACC 43.28%
6.3.6 時系列操作に基づいた選択
このトピックには、TIME_AWJディメンションのCALENDAR_YEAR階層のMdmLevelHierarchyの一連の要素を操作するメソッドを使用する2つの例があります。 「例6-13」は、UNIT_PRICEメジャーのSourceであるlagメソッドを使用して、unitPriceLag4を生成します。unitPriceは、階層メンバーと一致するunitPriceの各要素に対して、階層メンバーと一致するunitPriceの要素を指定します。階層内の同じレベルで4つの時間期間が早くなる。
例の中のdpは、DataProviderです。 createListSourceメソッドは、要素値としてunitPriceおよびunitPriceLag4 Sourceオブジェクトを持つmeasuresDimを生成します。 measuresDimのextractメソッドは、measuresDimの要素の値を取得します。 extractメソッドによって生成されるSourceは、抽出入力としてmeasuresDimを持ちます。 最初のjoinメソッドは、extractメソッドによって返されたSourceの入力にSource、measuresDimをマッチさせます。
unitPriceとunitPriceLag4の両方の測定値には、PRODUCT_AWJおよびTIME_AWJディメンションのSourceオブジェクトが入力として格納されています。 2番目のjoinメソッドは、TIME_AWJディメンションのCALENDAR_YEAR階層のQUARTERレベルのSourceであるquarterLevelと、メジャーのTIME_AWJディメンション入力を照合し、結果のSourceの出力にします。
joinHiddenメソッドは、prodSelとメジャーのPRODUCT_AWJディメンション入力を一致させ、prodSelを結果のSourceの出力にしません。 prodSel Sourceは、デスクトップPCである単一の階層メンバーPRODUCT_PRIMARY::FAMILY::DTPCを指定します。
lagResult Sourceは、四半期ごとおよび四半期前の四半期ごとのデスクトップPC製品ファミリの総単価を指定します。
例6-13 lagメソッドの使用方法
NumberSource unitPriceLag4 = unitPrice.lag(mdmCalHier, 4);
Source measuresDim = dp.createListSource(new Source[] {unitPrice,
unitPriceLag4});
Source lagResult = measuresDim.extract()
.join(measuresDim)
.join(quarterLevel)
.joinHidden(prodSel);
lagResult SourceのCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列には四半期が、中央の列には四半期のDesktop PCファミリの単価の合計が表示され、右の列には四半期前の四半期の単価の合計が表示されます。 右側の列の最初の4つの値は、第5四半期(Q1-98)がCALENDAR_YEAR階層の第1四半期であるため、NAです。 表には、最初の8つの四半期のみが含まれます。
Unit Price Quarter Unit Price Four Quarters Before --------------------------------- ---------- -------------------- CALENDAR_YEAR::QUARTER::CY1998.Q1 2687.54 NA CALENDAR_YEAR::QUARTER::CY1998.Q2 2704.48 NA CALENDAR_YEAR::QUARTER::CY1998.Q3 2673.27 NA CALENDAR_YEAR::QUARTER::CY1998.Q4 2587.76 NA CALENDAR_YEAR::QUARTER::CY1999.Q1 2394.79 2687.54 CALENDAR_YEAR::QUARTER::CY1999.Q2 2337.18 2704.48 CALENDAR_YEAR::QUARTER::CY1999.Q3 2348.39 2673.27 CALENDAR_YEAR::QUARTER::CY1999.Q4 2177.89 2587.76 ...
例6-14 movingTotalメソッドの使用方法
この例では、同じunitPrice、mdmCalHier、quarterLevel、およびprodSelオブジェクトを「例6-13」として使用しますが、unitPriceMovingTotalをmeasuresDimの第2要素として使用します。 unitPriceMovingTotal Sourceは、unitPriceのmovingTotalメソッドによって生成されます。 このメソッドは、mdmCalHierを提供します。mdmCalHierは、TIME_AWJディメンションのCALENDAR_YEAR階層のMdmLevelHierarchyで、dimensionパラメータ、整数0および3は開始オフセット値および終了オフセット値です。
movingTotalResult Sourceは、各四半期について、その四半期のDesktop PCファミリのメンバーの単位価格の集計を指定し、その単位価格と次の3つの四半期の単位価格を加えた合計を指定します。
NumberSource unitPriceMovingTotal =
unitPrice.movingTotal(mdmCalHier, 0, 3);
Source measuresDim =
dp.createListSource(new Source[]{unitPrice, unitPriceMovingTotal});
Source movingTotalResult = measuresDim.extract()
.join(measuresDim)
.join(quarterLevel)
.joinHidden(prodSel);
movingTotalResult SourceのCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列には四半期があり、中央の列にはその四半期のDesktop PCファミリのメンバー単価の合計があり、左の列にはその四半期と次の3四半期の単価の合計があります。 表には、最初の8つの四半期のみが含まれます。
Unit Price Moving Total Quarter Unit Price Current Plus Next Three Periods --------------------------------- ---------- ------------------------------- CALENDAR_YEAR::QUARTER::CY1998.Q1 2687.54 10653.05 CALENDAR_YEAR::QUARTER::CY1998.Q2 2704.48 10360.30 CALENDAR_YEAR::QUARTER::CY1998.Q3 2673.27 9993.00 CALENDAR_YEAR::QUARTER::CY1998.Q4 2587.76 9668.12 CALENDAR_YEAR::QUARTER::CY1999.Q1 2394.79 9258.25 CALENDAR_YEAR::QUARTER::CY1999.Q2 2337.18 8911.87 CALENDAR_YEAR::QUARTER::CY1999.Q3 2348.39 8626.48 CALENDAR_YEAR::QUARTER::CY1999.Q4 2177.89 8291.37 ...
6.3.7 パラメータ化Sourceオブジェクトを使用した要素のセットの選択
「例6-15」は、NumberParameterオブジェクトを使用して、パラメータ化されたSourceオブジェクトを作成します。 これらのオブジェクトは、prodHierのintervalメソッドのbottomおよびtopパラメータです。 そのメソッドは、paramProdSelIntervalを返します。paramProdSelIntervalは、prodHierの要素のセットをbottomからtopの階層の位置に指定するSourceです。
製品Sourceの要素は、result Sourceに表示されるunitsメジャーの要素を指定します。 Parameterオブジェクトの値を変更することにより、同じCursorを使用し、新しいSourceオブジェクトとCursorオブジェクトを生成することなく、販売された単位の異なるセットを選択できます。
この例では、次のオブジェクトが使用されています。
-
dp。セッションのDataProviderです。 -
prodHierは、PRODUCT_AWJディメンションのPRODUCT_PRIMARY階層のSourceです。 -
prodShortDescrは、PRODUCT_AWJディメンションの短い値の説明属性のSourceです。 -
unitsは、販売された製品単位のUNITS指標のSourceです。 -
chanHier、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSourceです。 -
calHierは、TIME_AWJディメンションのCALENDAR_YEAR階層のSourceです。 -
shipHierは、CUSTOMER_AWJディメンションのSHIPMENTS階層のSourceです。 -
getContextメソッドによって戻されるContext11gオブジェクト。Context11gには、現在のTransactionをコミットするメソッドがあり、Source用のCursorを作成し、そのテキストを表示し、Cursorの値を表示します。
prodShortDescrのjoinメソッドは、paramProdSelIntervalの要素値の簡単な説明を取得します。 次の4つのjoinメソッドは、Sourceオブジェクトをunitsメジャーの入力と一致させます。 この例では、Cursorを作成して、問合せの結果セットを表示します。 次に、resultCursorのsetPositionメソッドは、Cursorの位置を最初の要素に設定します。
NumberParameterオブジェクトのsetValueメソッドは、これらのオブジェクトの値を変更し、問合せによって指定された製品Sourceの要素の選択を変更します。 この例では、Cursorの値が再び表示されます。
例6-15 NumberParameterオブジェクトを使用した範囲の選択
NumberParameter startParam = new NumberParameter(dp, 1);
NumberParameter endParam = new NumberParameter(dp, 6);
NumberSource startParamSrc = (NumberSource)startParam.createSource();
NumberSource endParamSrc = (NumberSource)endParam.createSource();
Source paramProdSelInterval =
prodHier.interval(startParamSrc, endParamSrc);
Source paramProdSelIntervalShortDescr =
prodShortDescr.join(paramProdSelInterval);
NumberSource result =
(NumberSource)units.join(chanHier, "CHANNEL_PRIMARY::CHANNEL::INT")
.join(calHier, "CALENDAR_YEAR::YEAR::CY2001")
.join(shipHier, "SHIPMENTS::TOTAL_CUSTOMER::TOTAL")
.join(paramProdSelIntervalShortDescr);
// Commit the current transaction.
getContext().commit();
CursorManager cursorMngr = dp.createCursorManager(result);
Cursor resultCursor = cursorMngr.createCursor();
getContext().displayCursor(resultCursor);
//Reset the Cursor position to 1.
resultCursor.setPosition(1);
// Change the value of the parameterized Source.
startParam.setValue(7);
endParam.setValue(12);
// Display the results again.
getContext().displayCursor(resultsCursor);
次の表は、列ヘッダーおよび書式を追加して、resultCursorの値を表示したものです。 左の列には製品階層メンバーがあり、中央の列には短い値の説明があり、右の列には販売台数があります。
Product Description Units Sold
------------------------------------- ---------------------- ----------
PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL Total Product 55,872
PRODUCT_PRIMARY::CLASS::HRD Hardware 21,301
PRODUCT_PRIMARY::FAMILY::DISK Memory 6,634
PRODUCT_PRIMARY::ITEM::EXT CD ROM External 48X CD-ROM 136
PRODUCT_PRIMARY::ITEM::EXT DVD External - DVD-RW - 8X 1,526
PRODUCT_PRIMARY::ITEM::INT 8X DVD Internal - DVD-RW - 8X 1,543
Product Description Units Sold
------------------------------------- ---------------------- ----------
PRODUCT_PRIMARY::ITEM::INT CD ROM Internal 48X CD-ROM 380
PRODUCT_PRIMARY::ITEM::INT CD USB Internal 48X CD-ROM USB 162
PRODUCT_PRIMARY::ITEM::INT RW DVD Internal - DVD-RW - 6X 2,887
PRODUCT_PRIMARY::FAMILY::DTPC Desktop PCs 2,982
PRODUCT_PRIMARY::ITEM::SENT FIN Sentinel Financial 1,015
PRODUCT_PRIMARY::ITEM::SENT MM Sentinel Multimedia 875