機械翻訳について

6 Sourceメソッドを使用した問合せの作成

問合せを作成するには、取得するデータとそのデータに対して実行する操作を指定するSourceを作成します。 問合せを生成するには、問合せ対象のメジャーおよびディメンションとその属性を表すプライマリSourceオブジェクトから開始します。 通常、プライマリSourceオブジェクトのメソッドを使用して、他の多数のSourceオブジェクトを導出します。各オブジェクトは、ディメンション・メンバーの選択やデータに対して実行する操作など、問合せの一部を指定します。 次に、必要なデータおよび操作を指定するSourceオブジェクトを結合します。 結果は、問合せを表す1つのSourceです。 その後、SourceCursorを作成してデータを取得できます。

この章では、様々な種類のSourceメソッドについて簡単に説明し、その一部について詳細に説明します。 また、これらのメソッドを使用した一般的なOLAP問合せの作成方法を説明し、一部については例も示します。

この章では、次の項目について説明します。

6.1 基本Sourceメソッド

Sourceクラスには、導出されたSourceを戻す多数のメソッドがあります。 導出されたSourceの要素は、導出されたSourceを戻すSourceである「塩基」 Sourceに対する操作の結果です。 Sourceクラスの最も基本的な操作を実行するのは、いくつかのメソッドのみです。

Sourceクラスの他の多くのメソッドでは、1つ以上の基本メソッドを使用して、値または位置による基本Sourceの要素の選択や要素のソートなどの操作を実行します。 この章および「Sourceオブジェクトの理解」の例の多くでは、これらのメソッドの一部を使用します。 その他のSourceメソッドは、getIDgetInputsgetTypeメソッドなどのSourceに関する情報を持つオブジェクトを取得したり、geメソッドやgtメソッドなどの比較を実行したり、Sourceの値をあるデータ型から別のデータ型(toDoubleSourceメソッドなど)に変換したりします。

表6-1 基本Sourceメソッド

メソッド 説明

alias

ベースSourceと同じ要素を持つが、ベースSourceが型であるSourceを返します。

distinct

ベースSourceと同じ要素を持つSourceを返します。ただし、ベースで複製される要素は、導出されたSourceで1回のみ表示されます。

join

メソッド・コールのjoinedcomparisonおよびcomparisonRuleパラメータで指定された、ベースSourceの要素を持つSourceを返します。 visibleパラメータがtrueの場合、結合されたSourceは結果のSourceの出力になります。

position

ベースSourceの要素の位置を持ち、ベースSourceを入力として持つSourceを返します。

recursiveJoin

joinメソッドと同様ですが、このメソッドが返すSourceでは、Sourceの要素を親子関係によって階層的に順序付けします。

value

ベースSourceと同じ要素を持つが、ベースSourceを入力とするSourceを返します。

次のトピックでは、基本的なSourceメソッドについて説明し、その使用例をいくつか示します。

6.2 基本メソッドの使用方法

次のトピックでは、いくつかの基本的なメソッドの使用例を示します。

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の出力であるtimeSelcustSelおよびprodSelオブジェクトによって指定されるディメンション値のunits要素を指定します。 unitsSel Sourceには、入力としてCHANNEL_AWJディメンションのSourceがあります。

timeSelcustSelおよび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()によって戻されるSourceunitsSelを結合して、unitsSel1を生成します。 unitsSel1 Sourceは、unitsSelの要素と出力を持ち、入力としてchanAlias1を持ちます。 同様に、この例では、入力としてchanAlias2を持つunitsSel2が生成されます。

この例では、unitsSel1gtメソッドを使用して、unitsSel1の値がunitsSel2の値より大きいかどうかを判断します。 最終結合操作は、chanAlias1unitsSel1の入力を一致させ、chanAlias2unitsSel2の入力を一致させます。

例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の結合によって生成されるため、chanAlias2resultの最初の出力で、chanAlias1resultの2番目の出力です。

result SourceCursorの値は、問合せに回答するboolean値です。 Cursorの最初の出力の値は、chanAlias2で指定されたチャネル値で、2番目の出力の値は、chanAlias1で指定されたチャネル値です。

次に、ヘッダーが追加されたクロス集計として書式設定されたCursorの値を示します。 列のエッジ値はchanAlias1の値で、行のエッジ値はchanAlias2の値です。 クロス集計セルの値は、列チャネル値の販売ユニット値が行チャネル値の販売ユニット値より大きいかどうかを示すboolean値です。 たとえば、最初の列のクロス集計値は、列チャネル値Total Channelの販売ユニット値が、行Total Channelの値の販売ユニット値より大きくないが、Direct SalesCatalogおよび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オブジェクトを取得します。 MdmLevelHierarchyStringSourceオブジェクトmktHierを取得します。 次に、mktHierselectValuesメソッドを使用して、階層のメンバーcustomersToSelectmoreCustomersToSelectの2つの選択を生成します。 customersToSelectのメンバーの2つもmoreCustomersToSelectに存在します。

この例では、appendValuesメソッドを使用して、combinedCustomers SourcecustomersToSelectmoreCustomersToSelectの要素を結合します。 最後に、この例では、combinedCustomersdistinctメソッドを使用して、階層の個別のメンバーのみを持つSourcedistinctCombinedCustomersを返します。

例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 SourceCursorには、次の値があります:

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 SourceCursorには、次の値があります:

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メソッドを使用して、メソッドのjoinedcomparisonおよび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をベースSourcesalesMeasureを結合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 SourceCursorには、表として表示される次の値があります。 表には、階層メンバーと売上額の値の短い値の説明のみが含まれ、見出しと書式設定が追加されています。

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であるため、levelMemberslevelListを入力として持ちます。 したがって、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 SourceCursorには、列見出しおよび書式設定が追加された表として表示される次の値があります。 左の列はレベル名、中央の列はレベル内のメンバーの位置、右の列はメンバーのローカル値です。 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メソッドは、MdmHierarchySourceまたはSourceのサブタイプでのみ使用します。 メソッドによってSourceが生成され、その要素は階層内の親とその子によって階層的に順序付けされます。

joinメソッドと同様に、recursiveJoinメソッドを使用して、メソッドのjoinedcomparisonおよび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 SourceCursorには、次の値があり、見出しが追加されて表示されます。 リストには、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 SourceCursorには、見出しが追加された表として表示される次の値があります。 表には、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 SourceCursorには、見出しが追加された表として表示される次の値があります。 ここでは、メンバーはパッケージ属性値を基準に、降順のアルファベット順でソートされています。

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です。 shipHierselectValuesメソッドは、custSelを生成します。これは、shipHierの一部の要素の選択です。 custSelselectValuesメソッドは、その選択のサブセットであるcustSel2を生成します。

最初のjoinメソッドのベースはcustSelで、結合されたSourceです。 比較SourceとしてcustSel2があります。 結果のSourceresult1の要素は、ベースのデカルト積であり、比較Sourceで指定された結合Sourceオブジェクトです。 result1 Sourceには、比較SourceにあるcustSelの各要素について、custSelの要素の1セットがあります。 visibleパラメータのtrue値により、結合されたSourceresult1の出力になります。

2番目のjoinメソッドには、ベースとしてcustSel、比較SourceとしてcustSel2もありますが、結合SourceとしてcustSel.value()メソッドによって戻されるSourceがあります。 custSelは結合されたSourceの入力であるため、ベースSourceはその入力と一致します。 この入力関係により、結果のSourceresult2は、比較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);

result1Cursorには、次の表に示す値があります。 表には、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

result2Cursorには、見出しが追加された表として表示される次の値があります。 左側の列には、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メソッドのもう1つの使用方法は、「例6-7」に示すように、リレーションを逆にすることです。 この例では、CUSTOMER_AWJディメンションの祖先属性リレーションを逆にして、子孫リレーションを表すSourcemarketsDescendantsを生成します。 marketsDescendants Sourceは、ディメンションのMARKETS階層のSourceを入力として持ちます。 marketsDescendantsを、その入力と一致するSourceと結合すると、階層の参加メンバーの子孫を指定するSourceが取得されます。

リレーションを戻すもう1つの例は、「例6-10」です。 親属性を戻して親の子を取得する際に、valueメソッドを使用します。

「例6-7」は、最初にCUSTOMER_AWJディメンションのMdmStandardDimensionオブジェクトと、そのディメンションのMARKETS階層のMdmLevelHierarchyオブジェクトを取得します。 階層のSourceを取得します。

次の例では、ディメンションの祖先属性とディメンションのSourceを取得します。 祖先属性は、各ディメンション・メンバーをそのメンバーの祖先に関連付けます。

ディメンションの各メンバーの子孫を表すSourceを生成するために、この例では、階層mktHierSourceを祖先属性ancestorsAttrと結合して、祖先のリレーションを逆にします。 結合操作では、mktHier.value()が比較Sourceとして使用されるため、結合操作marketsDescendantsによって返されるSourceが入力としてmktHierを持ちます。 marketsDescendants Sourceは、ancestorsAttrの各要素に対して、ancestorsAttr要素を祖先とするmktHierの要素を指定します。 入力としてmktHierがあるため、marketsDescendants Sourceは、階層の子孫関係を表す属性と同じように機能します。

この例では、次の行でmktHiermarketsDescendantsに結合する場合を示しています。

Source selValDescendants = marketsDescendants.join(mktHier, selVal);

結合操作では、結合されたSourcemktHiermarketsDescendantsの入力と一致します。 比較Sourceは、階層の1つのメンバーを指定するselValです。 結合操作では、selValメンバーの子孫であるmarketsDescendantsの要素を指定するselValDescendantsが返されます。 結果には、祖先メンバー自体も含まれます。 mktHier Sourceは、selValDescendantsの出力ではありません。使用されるjoinメソッドのシグネチャは、結合されたSourceを出力として持たないSourceを導出するためです。

次の例では、joinメソッドの完全なシグネチャを使用して、祖先の値ではなく子孫のみを含むselValDescendantsOnlyを生成します。 祖先の値を削除するには、この例ではvalueメソッドを再度使用し、今度はselValDescendantsOnlyを戻す結合操作のjoinedパラメータであるSourceを戻します。 比較SourceselValで、比較ルールは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");

selValDescendantsCursorには、次の値があります。

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

selValDescendantsOnlyCursorには、次の値があります。

MARKETS::SHIP_TO::BUSN WRLD HAM
MARKETS::SHIP_TO::BUSN WRLD NAN
MARKETS::SHIP_TO::BUSN WRLD NY
MARKETS::SHIP_TO::BUSN WRLD SJ

selValDescendantsOnly2Cursorには、次の値があります。

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メソッドなど、様々な位置で動作します。 eqgtなどの比較を実行したり、selectValueremoveValueなどの要素を1つ以上選択したり、sortAscendingsortDescendingHierarchicallyなどの要素をソートします。

Sourceのサブクラスには、他の特殊なメソッドもあります。 たとえば、NumberSourceクラスには、absdivcosなどの数学的関数を実行する多数のメソッドと、averagetotalなどの集計を実行するメソッドがあります。

次のトピックでは、Sourceメソッドの一部の使用例を示します。 例の中には、OLAPアプリケーションで一般的に実行するタスクもあります。

6.3.1 extractメソッドの使用方法

extractメソッドを使用して、別のSourceの要素の値であるSourceの値を抽出します。 Sourceの要素にSourceオブジェクトではない要素値がある場合、extractメソッドはvalueメソッドと同様に動作します。

「例6-8」は、extractメソッドを使用して、リストSource measDimの要素の値であるNumberSourceオブジェクトの値を取得します。 NumberSourceオブジェクトは1つのメジャーを表します。

この例では、UNITS_CUBE_AWJキューブのディメンションの階層のStringSourceオブジェクトから要素を選択します。 costunitsおよび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 SourceCursorの値が表示され、見出しと書式設定が追加されます。

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の値を表示した後、顧客選択のパラメータ化されたSourceParameterの値を変更し、同じ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

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

6.3.4 メジャー値による階層的ソート

「例6-11」は、recursiveJoinメソッドを使用して、PRODUCT_AWJディメンションのPRODUCT_PRIMARY階層のメンバーをUNITSメジャーの値の昇順で階層的にソートします。 この例では、ソートされた製品をディメンションの短縮値摘要属性に結合し、その操作の結果sortedProductsShortDescrunitsに結合します。

連続する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で、これはすべての顧客の合計です。

  • chanSelSourceで、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層の単一メンバーを指定します。 メンバー値は、直接販売チャネルであるCHANNEL_PRIMARY::CHANNEL::DIRです。

  • timeSelSourceで、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 SourceCursorには、列見出しおよび書式設定が追加された表に表示される次の値があります。 左側の列には、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

6.3.5 NumberSourceメソッドを使用した販売台数のシェアの計算

「例6-12」は、NumberSourceメソッドdivおよびtimesを使用して、デスクトップPCおよびポータブルPCファミリが、選択した時間、顧客およびチャネル値に対して販売された製品ユニットの合計数量を保持するシェアを指定するSourceを生成します。 この例では、最初にPRODUCT_AWJディメンションの階層のSourceであるprodHierselectValueメソッドを使用して、階層の最上位の集計レベルであるPRODUCT_PRIMARY::TOTAL_PRODUCT::TOTALという値を持つ単一の要素を指定するtotalProdsを生成します。

NumberSource unitsjoinHiddenメソッドは、totalUnitsを生成します。このメソッドは、totalProdstotalUnitsの出力として表示されることなく、合計製品レベルでUNITSメジャー値を指定します。 次に、unitsdivメソッドにより、各販売ユニットの値を合計販売ユニット数で割った値を表すSourceが生成されます。 timesメソッドは、そのdiv操作の結果に100を乗算して、製品メンバーが販売ユニットの合計数量を持つ割合(シェア)を表すproductShareを生成します。 productShare Sourceは、unitsメジャーの入力を入力として持ちます。

prodFamiliesオブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSourceです。 productSharejoinメソッド(結合SourceとしてprodFamiliesを指定)は、各製品ファミリが販売した製品の合計数量を持つシェアを指定するSourceを生成します。

custSelchanSelおよび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 SourceCursorには、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列は製品ファミリの値を、右の列は、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であるunitPricelagメソッドを使用して、階層のメンバーと一致するunitPriceの各要素について、階層内の同じレベルで4つの期間前の階層メンバーと一致するunitPriceの要素を指定するunitPriceLag4を生成します。

この例では、dpDataProviderです。 createListSourceメソッドは、unitPriceおよびunitPriceLag4 Sourceオブジェクトを要素値として持つmeasuresDimを作成します。 measuresDimextractメソッドは、measuresDimの要素の値を取得します。 extractメソッドによって生成されるSourceは、抽出入力としてmeasuresDimを持ちます。 最初のjoinメソッドは、SourcemeasuresDimextractメソッドによって返される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 SourceCursorには、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列には四半期があり、中央の列にはその四半期のデスクトップ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は、unitPricemovingTotalメソッドによって生成されます。 このメソッドは、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 SourceCursorには、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列には四半期があり、中央の列にはその四半期のデスクトップ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オブジェクトを作成します。 これらのオブジェクトは、prodHierintervalメソッドの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をコミットするメソッドがあり、テキストを表示するSourceCursorを作成し、Cursorの値を表示するメソッドがあります。

prodShortDescrjoinメソッドは、paramProdSelIntervalの要素の短い値の説明を取得します。 次の4つのjoinメソッドは、Sourceオブジェクトをunitsメジャーの入力と照合します。 この例では、Cursorを作成し、問合せの結果セットを表示します。 次に、resultCursorsetPositionメソッドは、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