機械翻訳について

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

取得するデータとそのデータに対して実行する操作を指定するSourceを生成して、問合せを作成します。 問合せを作成する場合、問合せ対象のメジャー、ディメンションおよび属性のメタデータを表す、プライマリSourceオブジェクトを最初に作成します。 通常、プライマリSourceオブジェクトのメソッドを使用して、ディメンション・メンバーの選択やデータに対して実行する操作など、問合せの一部を指定するその他のSourceオブジェクトを派生させます。 次に、必要なデータと操作を指定するSourceオブジェクトを結合します。 これにより、問合せを表す1つのSourceが生成されます。 次に、SourceCursorを作成してデータを取得できます。

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

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

6.1 基本Sourceメソッド

Sourceクラスには、派生したSourceを返す多くのメソッドがあります。 導出されたSourceの要素は、base Source (Sourceが導出されたSourceを返すメソッド)の操作の結果になります。 Sourceクラスの最も基本的な操作は、ほんのわずかのメソッドでしか実行できません。

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

表6-1 基本Sourceメソッド

メソッド 説明

alias

ベースSourceと同じ要素を持つが、タイプとしてベースSourceを持つSourceを返します。

distinct

基底に複製された要素が派生したSourceに1回しか出現しないことを除いて、基底のSourceと同じ要素を持つSourceを返します。

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メソッドの使用方法

Sourceと入力の一致を制御するには、aliasメソッドを使用します。 たとえば、メジャーのディメンションのメンバーによって指定されたメジャー値が、同じディメンションの他のメンバーによって指定されたメジャー値よりも大きいかどうかを調べるには、メジャーの入力を2回一致させる必要があります同じ結合操作で実行されます。 これを行うには、同じディメンションの別名である2つのSourceオブジェクトを派生させ、それらの2つのSourceオブジェクトをメジャーから派生させ、それぞれの派生メジャーSourceを関連する別名化されたディメンションSourceオブジェクトに結合させ、。

例6-1では、このような操作を実行します。 CHANNEL_AWJディメンションの各値に対して販売されたユニットの数が、CHANNEL_AWJディメンションの他の値に対して販売されたユニットの数よりも大きいかどうかを指定するSourceを生成します。

この例では、メジャーのSourceであるunitsを、unitsSelを生成するメジャーの3つの単一値の選択であるSourceオブジェクトに結合します。 unitsSel Sourceは、unitsSelの出力であるtimeSelcustSel、およびprodSelオブジェクトで指定されるディメンション値のunits要素を指定します。 unitsSel Sourceには、入力としてCHANNEL_AWJディメンションのSourceがあります。

timeSelcustSel、および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を識別します。

次に、chanHierchanAlias1chanAlias2の2つの別名を作成します。chanHierは、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSourceです。 次に、unitsSelchanAlias1.value()によって返されたSourceを結合して、unitsSel1を生成します。 このunitsSel1 Sourceは、unitsSelの要素および出力を持ち、入力としてchanAlias1を持ちます。 同様に、入力としてchanAlias2を持つunitsSel2を生成します。

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

例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の販売単位の値よりも大きいかという問合せを指定 resultchanAlias2unitsSel1.gt(unitsSel2).join(chanAlias1)によって返されるSourceとの結合によって生成されるため、chanAlias2resultの最初の出力であり、chanAlias1resultの2番目の出力です。

result SourceCursorは、問合せに応答するboolean値を値として持ちます。 Cursorの最初の出力の値はchanAlias2で指定されたチャネル値であり、2番目の出力の値はchanAlias1で指定されたチャネル値です。

次に示すのは、ヘッダー付きのクロス集計形式で表示されたCursorの値です。 列エッジの値はchanAlias1の値で、行エッジの値はchanAlias2の値です。 クロス集計のセルの値は、列のチャネル値の販売台数の値が、行のチャネル値の販売台数の値より大きいかどうかを示すboolean値です。 たとえば、最初の列のクロス集計値は、列チャネル値Total Channelの販売単位の値が、行Total Channelの値の単価を超えていませんが、Direct SalesCatalogInternet行の値。

               ----------------- 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を取得します。 次に、mktHierselectValuesメソッドを使用して、階層のメンバーであるcustomersToSelectmoreCustomersToSelectの2つの選択肢を生成します。 customersToSelectのメンバーのうちの2つは、moreCustomersToSelectにも存在します。

この例では、appendValuesメソッドを使用して、combinedCustomers SourcecustomersToSelectmoreCustomersToSelectの要素を結合します。 最後に、この例では、combinedCustomersdistinctメソッドを使用します。SourcedistinctCombinedCustomersが返されます。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 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メソッドの使用方法

「ソース・オブジェクトの理解」で説明されているように、joinメソッドを使用して、メソッドのjoinedcomparison、およびcomparisonRuleパラメータによって決定される基本Sourceの要素を持つSourceを生成します。 visibleパラメータは、joinedパラメータSourceが結合操作によって生成されたSourceの出力であるかどうかを決定します。 また、joinメソッドを使用して、SourceをbaseまたはjoinedパラメータSourceの入力と照合します。

この章のほとんどの例では、joinメソッドの1つ以上のシグネチャを使用しています。「ソース・オブジェクトの理解」の例の多くはそうです。 「例6-3」は完全なjoinシグネチャと最も単純なjoinシグネチャを使用します。 この例では、完全なjoinシグネチャは、COMPARISON_RULE_DESCENDINGcomparisonRuleパラメータとして使用する方法を示しています。

「例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です。

最初の結合操作では、prodSelWithShortDescrSourcesalesMeasureを結合SourceSourceをNumberデータ型のSourceCOMPARISON_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メソッドの使用方法

ベースの要素の位置を持ち、そのベースを入力として持つ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 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メソッドの使用

階層的に順序付けられた要素を持つSourceを生成するには、recursiveJoinメソッドを使用します。 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の結果を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 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メソッドは、shipHierのいくつかの要素の選択であるcustSelを生成します。 custSelselectValuesメソッドは、その選択のサブセットであるcustSel2を生成します。

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

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

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メソッドの別の使い方は、「例6-7」に示すように、リレーションを逆転させることです。 この例では、CUSTOMER_AWJディメンションの祖先属性の関係を逆にして子孫の関係を表すSourcemarketsDescendantsを生成しています。 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として使用するため、結合操作によって戻されたSourcemarketsDescendantsに入力としてmktHierを持ちます。 marketsDescendants Sourceは、ancestorsAttr要素を祖先とするmktHierの要素を、ancestorsAttrの各要素に対して指定します。 marketsDescendants Sourceは、mktHierを入力として持つため、階層の子孫関係を表す属性と同じように機能します。

この例は、次の行でmktHiermarketsDescendantsを結合するときにこれを示します。

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

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

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

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クラスには、基本メソッドと組み合せて使用するその他のメソッドが多数あります。 このようなメソッドの中には、atoffsetメソッドのように、単一の位置に基づいて選択を実行するメソッドがあります。 また、intervalメソッドのように、位置の範囲に基づいて処理を行うメソッドもあります。 さらに、eqgtのように比較を行うメソッド、selectValueremoveValueのように1つ以上の要素を選択するメソッド、sortAscendingsortDescendingHierarchicallyのように要素をソートするメソッドもあります。

Sourceの各サブクラスにも、その他の特殊なメソッドがあります。 たとえば、NumberSourceクラスには、算術関数を実行するメソッド(absdivおよび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オブジェクトから要素を選択します。 costunits、および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 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です。

  • 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 SourceCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 一番左の列は、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ディメンションの階層のprodHierselectValueメソッドを使用して、階層の最高集約レベルであるPRODUCT_PRIMARY::TOTAL_PRODUCT::TOTALという値を持つ単一要素を指定するtotalProdsを生成します。

NumberSource unitsjoinHiddenメソッドは、totalProdstotalUnitsの出力として表示させずに、合計製品レベルでUNITSメジャー値を指定するtotalUnitsを生成します。 unitsdivメソッドは、販売されたユニットの総量で割った各ユニットの販売額を表すSourceを生成します。 timesメソッドは、div操作の結果に100を掛けてproductShareを生成します。productShareは、製品メンバーが販売した総量のパーセンテージまたはシェアを表します。 productShare Sourceには、入力としてunitsメジャーの入力があります。

prodFamiliesオブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSourceオブジェクトです。 結合されたSourceとしてproductSharejoinメソッド(prodFamiliesが結合されたもの)は、各製品ファミリが販売する製品の総量のうちのどれかを共有することを指定するSourceを生成します。

custSelchanSel、および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 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であるlagメソッドを使用して、unitPriceLag4を生成します。unitPriceは、階層メンバーと一致するunitPriceの各要素に対して、階層メンバーと一致するunitPriceの要素を指定します。階層内の同じレベルで4つの時間期間が早くなる。

例の中のdpは、DataProviderです。 createListSourceメソッドは、要素値としてunitPriceおよびunitPriceLag4 Sourceオブジェクトを持つmeasuresDimを生成します。 measuresDimextractメソッドは、measuresDimの要素の値を取得します。 extractメソッドによって生成されるSourceは、抽出入力としてmeasuresDimを持ちます。 最初のjoinメソッドは、extractメソッドによって返されたSourceの入力にSourcemeasuresDimをマッチさせます。

unitPriceunitPriceLag4の両方のメジャー値には、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 SourceCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列には四半期が、中央の列には四半期の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メソッドの使用方法

この例では、同じunitPricemdmCalHierquarterLevel、およびprodSelオブジェクトを「例6-13」として使用しますが、unitPriceMovingTotalmeasuresDimの第2要素として使用します。 unitPriceMovingTotal Sourceは、unitPricemovingTotalメソッドによって生成されます。 このメソッドは、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 SourceCursorの値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列には四半期があり、中央の列にはその四半期の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オブジェクトを作成します。 これらのオブジェクトは、prodHierintervalメソッドの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の値を表示します。

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