6 Sourceメソッドを使用した問合せの作成
問合せを作成するには、取得するデータとそのデータに対して実行する操作を指定するSourceを作成します。 問合せを生成するには、問合せ対象のメジャーおよびディメンションとその属性を表すプライマリSourceオブジェクトから開始します。 通常、プライマリSourceオブジェクトのメソッドを使用して、他の多数のSourceオブジェクトを導出します。各オブジェクトは、ディメンション・メンバーの選択やデータに対して実行する操作など、問合せの一部を指定します。 次に、必要なデータおよび操作を指定するSourceオブジェクトを結合します。 結果は、問合せを表す1つのSourceです。 その後、SourceのCursorを作成してデータを取得できます。
この章では、様々な種類のSourceメソッドについて簡単に説明し、その一部について詳細に説明します。 また、これらのメソッドを使用した一般的なOLAP問合せの作成方法を説明し、一部については例も示します。
この章では、次の項目について説明します。
6.1 基本Sourceメソッド
Sourceクラスには、導出されたSourceを戻す多数のメソッドがあります。 導出されたSourceの要素は、導出されたSourceを戻すSourceである「塩基」 Sourceに対する操作の結果です。 Sourceクラスの最も基本的な操作を実行するのは、いくつかのメソッドのみです。
Sourceクラスの他の多くのメソッドでは、1つ以上の基本メソッドを使用して、値または位置による基本Sourceの要素の選択や要素のソートなどの操作を実行します。 この章および「Sourceオブジェクトの理解」の例の多くでは、これらのメソッドの一部を使用します。 その他のSourceメソッドは、getID、getInputs、getTypeメソッドなどのSourceに関する情報を持つオブジェクトを取得したり、geメソッドやgtメソッドなどの比較を実行したり、Sourceの値をあるデータ型から別のデータ型(toDoubleSourceメソッドなど)に変換したりします。
表6-1 基本Sourceメソッド
| メソッド | 説明 |
|---|---|
|
ベース |
|
|
ベース |
|
|
メソッド・コールの |
|
|
ベース |
|
|
|
|
|
ベース |
次のトピックでは、基本的なSourceメソッドについて説明し、その使用例をいくつか示します。
親トピック: Sourceメソッドを使用した問合せの作成
6.2 基本メソッドの使用方法
- aliasメソッドの使用方法
- distinctメソッドの使用方法
- joinメソッドの使用方法
- positionメソッドの使用方法
- 「recursiveJoinメソッドの使用」
- valueメソッドの使用方法
親トピック: Sourceメソッドを使用した問合せの作成
6.2.1 aliasメソッドの使用方法
aliasメソッドを使用して、入力に対するSourceの一致を制御します。 たとえば、メジャーのディメンションのメンバーによって指定されたメジャー値が、同じディメンションの他のメンバーによって指定されたメジャー値よりも大きいかどうかを調べる場合は、同じ結合操作でメジャーの入力を2回照合する必要があります。 そのためには、同じディメンションの別名である2つのSourceオブジェクトを導出し、メジャーから導出された2つのSourceオブジェクトの入力を作成し、各導出メジャーSourceを関連する別名ディメンションSourceオブジェクトに結合してから、結果を比較します。
例6-1では、このような操作を実行します。 CHANNEL_AWJディメンションの各値の販売単位数が、CHANNEL_AWJディメンションの他の値の販売単位数より多いかどうかを指定するSourceが生成されます。
この例では、メジャーのSourceであるunitsを、メジャーの3つのディメンションの単一値の選択肢であるSourceオブジェクトに結合して、unitsSelを生成します。 unitsSel Sourceは、unitsSelの出力であるtimeSel、custSelおよびprodSelオブジェクトによって指定されるディメンション値のunits要素を指定します。 unitsSel Sourceには、入力としてCHANNEL_AWJディメンションのSourceがあります。
timeSel、custSelおよびprodSel Sourceオブジェクトは、それぞれTIME_AWJ、CUSTOMER_AWJおよびPRODUCT_AWJディメンションの階層から1つの値を指定します。 timeSel値はCALENDAR_YEAR::MONTH::2001.01で、2001年1月を識別し、custSel値はSHIPMENTS::SHIP_TO::BUSN WRLD SJで、Business World San Joseの顧客を識別し、prodSel値はPRODUCT_PRIMARY::ITEM::ENVY ABMで、Envoy AmbassadorポータブルPCを識別します。
次の例では、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSourceであるchanHierに対して、2つの別名chanAlias1およびchanAlias2を作成します。 次に、chanAlias1.value()によって戻されるSourceとunitsSelを結合して、unitsSel1を生成します。 unitsSel1 Sourceは、unitsSelの要素と出力を持ち、入力としてchanAlias1を持ちます。 同様に、この例では、入力としてchanAlias2を持つunitsSel2が生成されます。
この例では、unitsSel1のgtメソッドを使用して、unitsSel1の値がunitsSel2の値より大きいかどうかを判断します。 最終結合操作は、chanAlias1とunitsSel1の入力を一致させ、chanAlias2とunitsSel2の入力を一致させます。
例6-1 aliasメソッドを使用したソース付き入力照合の制御
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は、unitsSel1.gt(unitsSel2).join(chanAlias1)によって戻されるSourceへのchanAlias2の結合によって生成されるため、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メソッドの使用方法
「例6-2」に示すように、distinctメソッドを使用して、重複した値がないSourceを生成します。 この例では、ディメンション・メンバーの2つの選択を結合します。 ディメンション・メンバーの中には、両方の選択肢に存在するものがあります。 この例では、distinctメソッドを使用して、重複値のない一意のディメンション・メンバーのみを含むSourceを生成します。
この例では、CUSTOMER_AWJディメンションのMdmStandardDimensionオブジェクトを取得し、そのディメンションのMARKETS階層のMdmLevelHierarchyオブジェクトを取得します。 MdmLevelHierarchyのStringSourceオブジェクトmktHierを取得します。 次に、mktHierのselectValuesメソッドを使用して、階層のメンバーcustomersToSelectとmoreCustomersToSelectの2つの選択を生成します。 customersToSelectのメンバーの2つもmoreCustomersToSelectに存在します。
この例では、appendValuesメソッドを使用して、combinedCustomers SourceのcustomersToSelectとmoreCustomersToSelectの要素を結合します。 最後に、この例では、combinedCustomersのdistinctメソッドを使用して、階層の個別のメンバーのみを持つSource、distinctCombinedCustomersを返します。
例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メソッドの使用方法
「Sourceオブジェクトの理解」で説明されているように、joinメソッドを使用して、メソッドのjoined、comparisonおよびcomparisonRuleパラメータによって決定される、ベースSourceの要素を含むSourceを生成します。 visibleパラメータは、joinedパラメータSourceが、結合操作によって生成されるSourceの出力であるかどうかを決定します。 また、joinメソッドを使用して、SourceをベースまたはjoinedパラメータSourceの入力と照合します。
この章の例のほとんどは、「Sourceオブジェクトの理解」の例の多くと同様に、joinメソッドの1つ以上のシグネチャを使用します。 「例6-3」は、完全なjoinシグネチャと最も単純なjoinシグネチャを使用します。 この例では、完全なjoinシグネチャは、comparisonRuleパラメータとしてCOMPARISON_RULE_DESCENDINGを使用することを示しています。
「例6-3」は、次のSourceオブジェクトを使用します。
-
prodSelWithShortDescr。これは、PRODUCT_AWJディメンションの簡単な説明属性を、ディメンションのPRODUCT_PRIMARY階層のFAMILY階層レベルのSourceと結合することによって生成されるSourceです。 -
salesMeasure。これは、UNITS_CUBE_AWJキューブのSALESメジャーのSourceです。 -
timeSelWithShortDescr。これは、ディメンションのCALENDAR_YEAR階層の選択したメンバーについて、TIME_AWJディメンションの簡単な説明属性をSourceと結合することによって生成されるSourceです。 -
custSelWithShortDescr。これは、ディメンションのSHIPMENTS階層の選択したメンバーのCUSTOMER_AWJディメンションの簡単な説明属性をSourceと結合することによって生成されるSourceです。 -
chanSelWithShortDescr。これは、ディメンションのCHANNEL_PRIMARY階層の選択したメンバーについて、CHANNEL_AWJディメンションの簡単な説明属性をSourceと結合することによって生成されるSourceです。
最初の結合操作では、prodSelWithShortDescrをベースSource、salesMeasureを結合Source、Numberデータ型のSourceを比較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 Documentation親トピック: 基本メソッドの使用
6.2.4 positionメソッドの使用方法
positionメソッドを使用して、ベース要素の位置を持ち、入力としてベースを持つSourceを生成します。 「例6-4」は、positionメソッドを使用して、TIME_AWJディメンションの階層のレベルの最初と最後のメンバーの選択を指定するSourceを生成します。
この例では、mdmTimeDimはTIME_AWJディメンションのMdmPrimaryDimensionです。 この例では、ディメンションのレベル属性とCALENDAR_YEAR階層を取得します。 次に、属性および階層のSourceオブジェクトを取得します。
次に、この例ではSourceオブジェクトの配列を作成し、階層のMdmHierarchyLevelコンポーネントのListを取得します。 各レベルのSourceオブジェクトを取得して配列に追加し、そのレベルのSourceオブジェクトを要素値として持つリストSourceを作成します。
この例では、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メソッドの使用
recursiveJoinメソッドを使用して、階層的に順序付けされた要素を含むSourceを生成します。 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の結果をパッケージ属性に結合して、パッケージ属性値を要素値として、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メソッドは、custSelを生成します。これは、shipHierの一部の要素の選択です。 custSelのselectValuesメソッドは、その選択のサブセットであるcustSel2を生成します。
最初のjoinメソッドのベースはcustSelで、結合されたSourceです。 比較SourceとしてcustSel2があります。 結果のSource、result1の要素は、ベースのデカルト積であり、比較Sourceで指定された結合Sourceオブジェクトです。 result1 Sourceには、比較SourceにあるcustSelの各要素について、custSelの要素の1セットがあります。 visibleパラメータのtrue値により、結合されたSourceがresult1の出力になります。
2番目のjoinメソッドには、ベースとしてcustSel、比較SourceとしてcustSel2もありますが、結合SourceとしてcustSel.value()メソッドによって戻されるSourceがあります。 custSelは結合されたSourceの入力であるため、ベースSourceはその入力と一致します。 この入力関係により、結果のSource、result2は、比較Sourceにも含まれるcustSelの要素のみを持ちます。
例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
親トピック: valueメソッドの使用
6.2.6.2 リレーションの戻し処理
valueメソッドのもう1つの使用方法は、「例6-7」に示すように、リレーションを逆にすることです。 この例では、CUSTOMER_AWJディメンションの祖先属性リレーションを逆にして、子孫リレーションを表すSource、marketsDescendantsを生成します。 marketsDescendants Sourceは、ディメンションのMARKETS階層のSourceを入力として持ちます。 marketsDescendantsを、その入力と一致するSourceと結合すると、階層の参加メンバーの子孫を指定するSourceが取得されます。
リレーションを戻すもう1つの例は、「例6-10」です。 親属性を戻して親の子を取得する際に、valueメソッドを使用します。
「例6-7」は、最初にCUSTOMER_AWJディメンションのMdmStandardDimensionオブジェクトと、そのディメンションのMARKETS階層のMdmLevelHierarchyオブジェクトを取得します。 階層のSourceを取得します。
次の例では、ディメンションの祖先属性とディメンションのSourceを取得します。 祖先属性は、各ディメンション・メンバーをそのメンバーの祖先に関連付けます。
ディメンションの各メンバーの子孫を表すSourceを生成するために、この例では、階層mktHierのSourceを祖先属性ancestorsAttrと結合して、祖先のリレーションを逆にします。 結合操作では、mktHier.value()が比較Sourceとして使用されるため、結合操作marketsDescendantsによって返されるSourceが入力としてmktHierを持ちます。 marketsDescendants Sourceは、ancestorsAttrの各要素に対して、ancestorsAttr要素を祖先とするmktHierの要素を指定します。 入力としてmktHierがあるため、marketsDescendants Sourceは、階層の子孫関係を表す属性と同じように機能します。
この例では、次の行でmktHierをmarketsDescendantsに結合する場合を示しています。
Source selValDescendants = marketsDescendants.join(mktHier, selVal);
結合操作では、結合されたSource、mktHierがmarketsDescendantsの入力と一致します。 比較Sourceは、階層の1つのメンバーを指定するselValです。 結合操作では、selValメンバーの子孫であるmarketsDescendantsの要素を指定するselValDescendantsが返されます。 結果には、祖先メンバー自体も含まれます。 mktHier Sourceは、selValDescendantsの出力ではありません。使用されるjoinメソッドのシグネチャは、結合されたSourceを出力として持たないSourceを導出するためです。
次の例では、joinメソッドの完全なシグネチャを使用して、祖先の値ではなく子孫のみを含むselValDescendantsOnlyを生成します。 祖先の値を削除するには、この例ではvalueメソッドを再度使用し、今度はselValDescendantsOnlyを戻す結合操作のjoinedパラメータであるSourceを戻します。 比較SourceはselValで、比較ルールはCOMPARISON_RULE_REMOVEです。
最後に、この例では、removeValueメソッドを使用して、selValDescendantsOnlyと同じselValDescendantsOnly2を生成します。 これは、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
親トピック: valueメソッドの使用
6.3 その他のSourceメソッドの使用方法
Sourceクラスには、基本メソッドの様々なシグネチャであるメソッドとともに、基本メソッドの組合せを使用する他の多くのメソッドがあります。 一部のメソッドは、atメソッドやoffsetメソッドなど、単一の位置に基づいて選択を実行します。 その他は、intervalメソッドなど、様々な位置で動作します。 eqやgtなどの比較を実行したり、selectValueやremoveValueなどの要素を1つ以上選択したり、sortAscendingやsortDescendingHierarchicallyなどの要素をソートします。
Sourceのサブクラスには、他の特殊なメソッドもあります。 たとえば、NumberSourceクラスには、abs、div、cosなどの数学的関数を実行する多数のメソッドと、averageやtotalなどの集計を実行するメソッドがあります。
次のトピックでは、Sourceメソッドの一部の使用例を示します。 例の中には、OLAPアプリケーションで一般的に実行するタスクもあります。
- extractメソッドの使用方法
- キューブの作成およびエッジのピボット
- 階層内でのドリルアップおよびドリルダウン
- メジャー値による階層的ソート
- NumberSourceメソッドを使用した販売台数のシェアの計算
- 時系列操作に基づいた選択
- パラメータ化Sourceオブジェクトを使用した要素のセットの選択
親トピック: Sourceメソッドを使用した問合せの作成
6.3.1 extractメソッドの使用方法
extractメソッドを使用して、別のSourceの要素の値であるSourceの値を抽出します。 Sourceの要素にSourceオブジェクトではない要素値がある場合、extractメソッドはvalueメソッドと同様に動作します。
「例6-8」は、extractメソッドを使用して、リストSource measDimの要素の値であるNumberSourceオブジェクトの値を取得します。 各NumberSourceオブジェクトは1つのメジャーを表します。
この例では、UNITS_CUBE_AWJキューブのディメンションの階層のStringSourceオブジェクトから要素を選択します。 cost、unitsおよびsalesオブジェクトは、キューブのCOST、UNITSおよびSALESメジャーに対するNumberSourceオブジェクトです。
次に、この例ではmeasDimを作成します。これは、3つのNumberSourceオブジェクトを要素値として持つリストSourceです。 次に、extractメソッドを使用して、NumberSourceオブジェクトの値を取得します。 結果の名前のないSourceは、抽出入力としてmeasDimを持ちます。 最初の結合操作には、ベースSourceとしてmeasDim.extract()があります。 ベース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
親トピック: その他のSourceメソッドの使用
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 1748親トピック: その他のSourceメソッドの使用
6.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
親トピック: その他のSourceメソッドの使用
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。Sourceで、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層の単一メンバーを指定します。 メンバー値は、直接販売チャネルであるCHANNEL_PRIMARY::CHANNEL::DIRです。 -
timeSel。Sourceで、TIME_AWJディメンションのCALENDAR_YEAR階層の単一メンバーを指定します。 メンバーはCALENDAR_YEAR::YEAR::CY2001で、2001年です。
例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クラス値のみが含まれます。 製品値は、販売ユニット別に階層的かつ昇順でリストされます。 Software/Otherクラスの販売台数が多いため、Software/Otherクラスの前にHardwareクラスが表示されます。 Hardwareクラスでは、Portable PCsファミリが最も少ないユニットを販売しているため、最初に表示されます。 Software/Otherクラスでは、Accessoriesファミリの販売台数が最も多いため、最後に表示されます。
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
親トピック: その他のSourceメソッドの使用
6.3.5 NumberSourceメソッドを使用した販売台数のシェアの計算
「例6-12」は、NumberSourceメソッドdivおよびtimesを使用して、デスクトップPCおよびポータブルPCファミリが、選択した時間、顧客およびチャネル値に対して販売された製品ユニットの合計数量を保持するシェアを指定するSourceを生成します。 この例では、最初にPRODUCT_AWJディメンションの階層のSourceであるprodHierのselectValueメソッドを使用して、階層の最上位の集計レベルであるPRODUCT_PRIMARY::TOTAL_PRODUCT::TOTALという値を持つ単一の要素を指定するtotalProdsを生成します。
NumberSource unitsのjoinHiddenメソッドは、totalUnitsを生成します。このメソッドは、totalProdsがtotalUnitsの出力として表示されることなく、合計製品レベルでUNITSメジャー値を指定します。 次に、unitsのdivメソッドにより、各販売ユニットの値を合計販売ユニット数で割った値を表すSourceが生成されます。 timesメソッドは、そのdiv操作の結果に100を乗算して、製品メンバーが販売ユニットの合計数量を持つ割合(シェア)を表すproductShareを生成します。 productShare Sourceは、unitsメジャーの入力を入力として持ちます。
prodFamiliesオブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSourceです。 productShareのjoinメソッド(結合SourceとしてprodFamiliesを指定)は、各製品ファミリが販売した製品の合計数量を持つシェアを指定するSourceを生成します。
custSel、chanSelおよびtimeSel Sourceオブジェクトは、CUSTOMER_AWJ、CHANNEL_AWJおよびTIME_AWJディメンションの階層の単一メンバーの選択です。 残りのjoinメソッドは、resultを生成するために、これらのSourceオブジェクトをproductShareの他の入力と一致させます。 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%
親トピック: その他のSourceメソッドの使用
6.3.6 時系列操作に基づいた選択
このトピックでは、TIME_AWJディメンションのCALENDAR_YEAR階層に対してMdmLevelHierarchyの一連の要素を操作するメソッドの使用例を2つ示します。 「例6-13」は、UNIT_PRICEメジャーのSourceであるunitPriceのlagメソッドを使用して、階層のメンバーと一致するunitPriceの各要素について、階層内の同じレベルで4つの期間前の階層メンバーと一致するunitPriceの要素を指定するunitPriceLag4を生成します。
この例では、dpはDataProviderです。 createListSourceメソッドは、unitPriceおよびunitPriceLag4 Sourceオブジェクトを要素値として持つmeasuresDimを作成します。 measuresDimのextractメソッドは、measuresDimの要素の値を取得します。 extractメソッドによって生成されるSourceは、抽出入力としてmeasuresDimを持ちます。 最初のjoinメソッドは、Source、measuresDim、extractメソッドによって返されるSourceの入力に一致します。
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は、各四半期および4四半期前の四半期のデスクトップ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には、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列には四半期があり、中央の列にはその四半期のデスクトップPCファミリのメンバーの単価の合計があり、右の列には4四半期前の四半期の単価の合計があります。 右側の列の最初の4つの値はNAです。これは、四半期5のQ1-98がCALENDAR_YEAR階層の最初の四半期であるためです。 表には、最初の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メソッドの使用方法
この例では、「例6-13」と同じunitPrice, mdmCalHier, quarterLevelおよびprodSelオブジェクトを使用しますが、measuresDimの2番目の要素としてunitPriceMovingTotalメジャーを使用します。 unitPriceMovingTotal Sourceは、unitPriceのmovingTotalメソッドによって生成されます。 このメソッドは、dimensionパラメータとしてTIME_AWJディメンションのCALENDAR_YEAR階層のMdmLevelHierarchyであるmdmCalHierを提供し、開始オフセット値と終了オフセット値として整数0および3を提供します。
movingTotalResult Sourceは、四半期ごとに、その四半期のデスクトップ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には、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列には四半期があり、中央の列にはその四半期のデスクトップ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 ...
親トピック: その他のSourceメソッドの使用
6.3.7 パラメータ化Sourceオブジェクトを使用した要素のセットの選択
「例6-15」は、NumberParameterオブジェクトを使用して、パラメータ化されたSourceオブジェクトを作成します。 これらのオブジェクトは、prodHierのintervalメソッドのbottomおよびtopパラメータです。 このメソッドは、paramProdSelIntervalを返します。これは、bottomから階層のtop位置までのprodHier要素のセットを指定する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親トピック: その他のSourceメソッドの使用