ヘッダーをスキップ
Oracle OLAP Java API開発者ガイド
11g リリース1(11.1)
E05733-01
  目次へ
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

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

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

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

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

基本Sourceメソッド

Sourceクラスには、導出Sourceを戻す多くのメソッドがあります。導出Sourceの要素は、ベースSourceでの操作によって生成されます。これは、自身のメソッドがコールされて導出Sourceを生成するSourceです。小数のメソッドで、Sourceクラスのほとんどの基本操作を実行できます。

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

この項では、基本Sourceメソッドについて説明し、その使用例をいくつか示します。表6-1に、基本Sourceメソッドを示します。

表6-1 基本Sourceメソッド

メソッド 説明

alias

ベースSourceと同じ要素を持つが、そのベースSourceをタイプとして持つSourceを生成する。

distinct

ベースでコピーされた要素は導出Sourceで一度しか出現しない点を除き、ベースSourceと同じ要素を持つSourceを生成する。

join

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

position

ベースSourceの要素の位置を持ち、そのベースSourceを通常の入力として持つSourceを生成する。

recursiveJoin

このメソッドは、生成するSourceにおいて、Sourceの要素を親子関係で階層的に順序付ける点を除き、joinメソッドと同じである。

value

ベースSourceと同じ要素を持つが、そのベースSourceを通常の入力として持つSourceを生成する。


基本メソッドの使用方法

この項では、一部の基本メソッドの使用例を示します。

aliasメソッドの使用方法

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

例6-1では、このような操作を実行します。この例では、チャネル・ディメンションの各値の販売台数が、チャネル・ディメンションの他の値の販売台数より大きいかどうかを指定するSourceを作成します。

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

timeSelcustSelおよびprodSelの各Sourceオブジェクトは、ぞれぞれ時間、顧客、および製品ディメンションのデフォルトの階層から単一の値を指定します。timeSelの値は、2001年1月を表すCALENDAR_YEAR::MONTH::2001.01です。custSelの値は、Business WorldのSan Joseの顧客を表すSHIPMENTS::SHIP_TO::BUSN WRLD SJです。prodSelの値は、Envoy AmbassadorのPortable PCを表すPRODUCT_PRIMARY::ITEM::ENVY ABMです。

例では次に、チャネル・ディメンションのデフォルトの階層chanHierに対して別名を2つ(chanAlias1およびchanAlias2)を作成します。そして、chanAlias1valueメソッドをコールして生成されたSourceに、unitsSelを結合してunitsSel1を作成します。このunitsSel1 Sourceは、unitsSelの要素および出力を持ち、入力としてchanAlias1を持ちます。同様に、入力としてchanAlias2を持つunitsSel2を生成します。

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

例6-1 aliasメソッドを使用した入力とSourceの一致の制御

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)によって作成されたSourcechanAlias2を結合して作成されるため、chanAlias2resultの最初の出力になり、chanAlias1resultの2番目の出力になります。

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

次に示すのは、ヘッダー付きのクロス集計形式で表示されたCursorの値です。列エッジの値はchanAlias1の値で、行エッジの値はchanAlias2の値です。クロス集計のセルの値は、列のチャネル値の販売台数の値が、行のチャネル値の販売台数の値より大きいかどうかを示すboolean値です。たとえば、1列目のクロス集計値の場合、列のチャネル値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

distinctメソッドの使用方法

コピーされた値を持たないSourceを生成するには、distinctメソッドを使用します。例6-2では、顧客ディメンションの階層から要素を選択し、その要素の子孫を取得します。そして、階層の要素の選択に子孫を追加します。子孫のSourceには祖先の値が含まれているため、例ではdistinctメソッドを使用して、コピーされた祖先の値を削除し、結果にその値が2回出現するのを回避します。

例6-2では、marketsが、顧客ディメンションのMARKETS階層を表すStringSourceです。marketsAncestorsオブジェクトは、その階層の祖先属性のSourceです。例では、祖先の子孫を表すSourceを取得するために、joinメソッドを使用して、marketsAncestorsの各要素について、祖先としてmarketsAncestors要素を持つmarketsの要素を選択します。結合操作では、ベースSourcemarkets)と祖先属性の入力を一致させます。

ただし、結果のSourcemarketsDescendants)は、入力として引き続きmarketsを持ちます。これは、markets.value()メソッドによって生成されたSourceが、結合操作の比較Sourceであるためです。結合操作のcomparisonパラメータSourceは、入力とSourceの一致には関与しません。

marketsselectValueメソッドは、Business Worldのアカウントを示すMARKETS::ACCOUNT::BUSN WRLDを値に持つmarketsの要素を選択して、selValを生成します。marketsDescendantsjoinメソッドは、selValを比較Sourceとして使用します。このメソッドは、marketsselValの両方に存在するmarketsDescendantsの要素を持つselValDescendantsを生成します。marketsDescendantsの入力は、結合Source marketsと一致します。markets Sourceは、結合操作のvisibleパラメータの値がfalseであるため、selValDescendantsの出力とはなりません。

selValappendValuesメソッドは、selValPlusDescendantsを生成します。これは、selValDescendantsの要素をselValの要素に追加し、distinctメソッドを使用して重複要素をすべて削除した結果です。

例6-2 distinctメソッドの使用方法

Source marketsDescendants =
                     markets.join(marketsAncestors, markets.value());
Source selVal = markets.selectValue("MARKETS::ACCOUNT::BUSN WRLD");
Source selValDescendants = marketsDescendants.join(markets,
                                                   selVal,
                                                   false);
Source selValPlusDescendants = selVal.appendValues(selValDescendants)
                                     .distinct();

selValPlusDescendants SourceCursorの値は次のとおりです。

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

この例にdistinctメソッドのコールを含めなかった場合、selValPlusDescendantsCursorの値は次のようになります。

MARKETS::ACCOUNT::BUSN WRLD
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

joinメソッドの使用方法

joinメソッドを使用すると、メソッドのjoinedcomparisonおよびcomparisonRuleパラメータで指定されたベースSourceの要素を持つSourceを生成できます。visibleパラメータは、joined Sourceを、結合操作で生成されたSourceの出力とするかどうかを指定します。joinメソッドは、ベースまたはjoinedパラメータSourceの入力に、Sourceを一致させる場合にも使用します。

joinメソッドには、メソッドの完全な記述join(Source joined, Source comparison, int comparisonRule, boolean visible)のショートカットとして役立つ多くのシグネチャがあります。この章の例では、様々なjoinメソッドのシグネチャを使用しています。

Sourceクラスには、comparisonRuleパラメータの値として指定できる定数がいくつかあります。例6-3例6-4では、これらの定数のうちCOMPARISON_RULE_REMOVEおよびCOMPARISON_RULE_DESCENDINGの2つを使用しています。COMPARISON_RULE_REMOVE例6-5でも使用されています。

例6-3は、例6-2と類似する結果を生成します。この例では、markets(顧客ディメンションの階層のSource)およびmarketsAncestors(階層の祖先属性のSource)を使用しています。また、marketsDescendants(階層の要素の子孫のSource)も使用しています。

この例では、最初に階層の要素を選択します。次に、marketsDescendantsjoinメソッドでmarketsDescendantsOnlyを生成します。これは、marketsの子孫を指定します。また、結合操作のcomparisonパラメータがmarkets.value()メソッドによって生成されたSourceであるため、入力としてmarketsを持ちます。

COMPARISON_RULE_REMOVEは、marketsDescendantsOnlyを生成した結合操作の比較規則であるため、SourcemarketsDescendantsOnlyの入力との一致を行う結合操作によって、結合操作の比較Sourceに存在しないmarketsDescendantsOnlyの要素のみを持つSourceが生成されます。

次の結合操作では、この一致が実行されます。この操作では、結合Sourcemarkets)とmarketsDescendantsOnlyの入力の一致が行われ、selValDescendantsOnlyが生成されます。これは、選択された階層の値の子孫を指定しますが、選択された値は含みません。これは、marketsDescendantsOnlyが、比較SourceselVal)の値と一致する値の削除を指定しているためです。

これに対して、最後の結合操作では、選択された階層値の子孫を指定し、選択された値も含むselValDescendantsが生成されます。

例6-3 COMPARISON_RULE_REMOVEの使用方法

Source selVal = markets.selectValue("MARKETS::ACCOUNT::BUSN WRLD");
Source marketsDescendantsOnly =
      marketsDescendants.join(marketsDescendants.getDataType().value(),
                              markets.value(),
                              Source.COMPARISON_RULE_REMOVE);

// Select the descendants of the specified element.
Source selValDescendants = marketsDescendants.join(markets, selVal);

// Select only the descendants of the specified element.
Source selValDescendantsOnly = marketsDescendantsOnly.join(markets,
                                                           selVal);

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

例6-4は、比較規則COMPARISON_RULE_DESCENDINGを使用するもう1つの結合操作の例です。ここでは、次のSourceオブジェクトを使用しています。

  • prodSelWithShortDescr。これは、製品ディメンションの値の簡単な説明属性のSourceを、そのディメンションのPRODUCT_PRIMARY階層のFAMILYレベルのSourceに結合して生成されたSourceです。

  • unitPrice。これは、単位価格メジャーのSourceです。

  • timeSelWithShortDescr。これは、時間ディメンションの値の簡単な説明属性のSourceを、そのディメンションのCALENDAR_YEAR階層の選択された要素のSourceに結合して生成されたSourceです。

この結果生成されるSourceは、2001年5月の合計単位価格の降順で、製品ファミリのレベル要素を指定します。

例6-4 COMPARISON_RULE_DESCENDINGの使用方法

Source result =
       prodSelWithShortDescr.join(unitPrice,
                                  unitPrice.getDataType(),
                                  Source.COMPARISON_RULE_DESCENDING,
                                  true)
                            .join(timeSelWithShortDescr);

result SourceCursorの値は、次のように表形式で表示されます。表には、ディメンション要素の値の簡単な説明および単位価格値のみが含まれ、書式が追加されています。

May, 2001

Total Unit Prices   Product Family
-----------------   --------------
     2,845.59       Portable PCs
     1,871.03       Desktop PCs
       415.37       Memory
       397.62       Monitors
       196.05       CD/DVD
       318.61       Modems/Fax
        74.68       Documentation
        65.92       Operating Systems
        36.50       Accessories

positionメソッドの使用方法

ベースの要素の位置を持ち、そのベースを入力として持つSourceを生成するには、positionメソッドを使用します。例6-5では、positionメソッドを使用して、時間ディメンションの階層のレベルの最初と最後の要素の選択を指定するSourceを生成します。

この例では、mdmTimeDimは、時間ディメンションのMdmPrimaryDimensionです。この例では、ディメンションのデフォルト階層およびレベル属性を取得します。また、属性および階層のSourceオブジェクトを取得します。

次に、この例では、Sourceオブジェクトの配列を作成し、階層のMdmHierarchyLevelコンポーネントのListを取得します。また、各レベルのSourceオブジェクトを取得し、それを配列に追加して、要素値としてレベルのSourceオブジェクトを持つリストSourceを作成します。

次に、この例では、levelMembersを生成します。これは、階層のレベル・メンバーを指定するSourceです。結合操作のcomparisonパラメータは、levelList.value()によって生成されたSourceであるため、levelMembersは、入力としてlevelListを持ちます。したがって、levelMembersは、結合操作で入力が一致した際に、レベルを基準に各レベルのメンバーを戻すSourceです。

range Sourceは、Sourceの2番目の要素から最後の要素の直前の要素までの要素の範囲を指定します。

次の結合操作では、firstAndLast Sourceを生成します。操作のベースは、levelMembersです。joinedパラメータは、levelMembers.position()メソッドによって生成されるSourceです。comparisonパラメータはrange Source、比較規則はCOMPARISON_RULE_REMOVEです。visibleパラメータの値は、trueです。したがって、firstAndLast Sourceは、レベルの最初と最後のメンバーのみを指定します。これは、選択からレベルの最初と最後以外のその他すべてのメンバーを削除するためです。ただし、firstAndLast Sourceは、引き続き入力としてlevelListを持ちます。

最後の結合操作では、firstAndLastの入力とlevelListの一致が行われます。

例6-5 最初と最後の時間要素の選択

MdmAttribute mdmTimeLevelAttr = mdmTimeDim.getLevelAttribute();
MdmLevelHierarchy mdmTimeHier = (MdmLevelHierarchy)
                                 mdmTimeDim.getDefaultHierarchy();

Source levelRel = mdmTimeLevelAttr.getSource();
StringSource calendar = (StringSource) mdmTimeHier.getSource();

Source[] levelSources = new Source[3];
List levels = mdmTimeHier.getHierarchyLevels();
for (int i = 0; i < levelSources.length; i++)
{
  levelSources[i] = ((MdmHierarchyLevel) levels.get(i)).getSource();
}
Source levelList = dp.createListSource(levelSources);
Source levelMembers =  calendar.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の値は、次のように、列ヘッダーおよび書式が追加された表として表示されます。左の列はレベル名、中央の列はレベル内のメンバーの位置、右の列はメンバーのローカル値です。

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

recursiveJoinメソッドの使用方法

階層的に順序付けられた要素を持つSourceを生成するには、recursiveJoinメソッドを使用します。recursiveJoinメソッドは、MdmHierarchySourceまたはこのようなSourceのサブタイプでのみ使用します。このメソッドは、階層における親とその子で階層的に順序付けられた要素を持つSourceを生成します。

joinメソッドと同様に、メソッドのjoinedcomparisonおよびcomparisonRuleパラメータで指定されたベースSourceの要素を持つSourceを生成するには、recursiveJoinメソッドを使用します。visibleパラメータは、joined Sourceを再帰的結合操作で生成されたSourceの出力とするかどうかを指定します。

recursiveJoinメソッドには、複数のシグネチャがあります。完全なrecursiveJoinメソッドには、階層の親属性、結果に子の前後の親を含めるかどうか、結果に子のみを含める場合に結果の要素を順序付けする方法、および結合Sourceを結果のSourceの出力とするかどうかを指定するパラメータがあります。

例6-6では、recursiveJoinメソッドを使用し、最初に親をリストして、ベースにその親を限定します。joined Sourceは出力として追加しません。この例では、製品ディメンションの階層の要素を最初に階層レベルでソートし、次に各要素のパッケージ属性の値でソートします。

最初のrecursiveJoinメソッドは、昇順の階層でprodHier階層の要素を順序付けます。prodParentオブジェクトは、階層の親属性のSourceです。

2番目のrecursiveJoinメソッドのprodPkgAttrオブジェクトは、ディメンションのパッケージ属性のSourceです。関連するパッケージ値を持つのは、ITEMレベルの要素のみです。集計レベルTOTAL_PRODUCT、CLASSおよびFAMILYの要素は関連するパッケージを持たないため、これらのレベルの要素のパッケージ属性値はNULLになり、出力結果ではNAと表示されます。一部のITEMレベルの要素は、関連するパッケージを持たないため、これらの値もNAになります。

2番目のrecursiveJoinメソッドは、関連する階層の要素にパッケージ属性値を結合し、レベルを基準に要素を階層的にソートしてから、パッケージの値を基準にレベル内で要素を昇順でソートします。COMPARISON_RULE_ASCENDING_NULLS_FIRSTパラメータは、値がNULLの要素を同じレベル内の他の要素より前に表示するよう指定します。また、この例では、メソッドの結果sortedHierNullsFirstをパッケージ属性に結合して、要素値としてパッケージの値を持ち、出力としてsortedHierNullsFirstを持つSourceを生成します。

3番目のrecursiveJoinメソッドも2番目と同様です。ただし、COMPARISON_RULE_ASCENDING_NULLS_LASTパラメータが使用されているので、値がnullの要素は同じレベルの他の要素より後に表示されます。

例6-6 属性による製品の階層的ソート

Source result1 = prodHier.recursiveJoin(prodDim.value(),
                                        prodHier.getDataType(),
                                        prodParent,
                                        Source.COMPARISON_RULE_ASCENDING);

Source sortedHierNullsFirst =
      prodHier.recursiveJoin(prodPkgAttr,
                             prodPkgAttr.getDataType(),
                             prodParent,
                             Source.COMPARISON_RULE_ASCENDING_NULLS_FIRST);
Source result2 = prodPkgAttr.join(sortedHierNullsFirst);

Source sortedHierNullsLast =
      prodHier.recursiveJoin(prodPkgAttr,
                             prodPkgAttr.getDataType(),
                             prodParent,
                             Source.COMPARISON_RULE_DESCENDING_NULLS_LAST);
Source result3 = prodPkgAttr.join(sortedHierNullsLast);

result1 SourceCursorの値は、ヘッダー付きで次のように表示されます。ここでは、Cursorの最初の17個の値のみが表示されています。

Product Dimension Element 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 Dimension Element 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 Dimension Element 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
...

valueメソッドの使用方法

自身を入力として持つSourceを作成するには、valueメソッドを使用します。この関係により、Sourceの要素のサブセットを選択できます。

例6-7では、このようなサブセットの選択を示します。この例では、shipHierが顧客ディメンションのSHIPMENTS階層のSourceです。shipHierselectValuesメソッドは、custSelを生成します。これは、shipHierの一部の要素の選択です。custSelselectValuesメソッドは、custSel2を生成します。これは、その選択のサブセットです。

最初のjoinメソッドのベースおよび結合SourcecustSelです。この比較SourcecustSel2です。結果のSourceresult1)の要素は、比較SourceにあるcustSelの各要素について1セットのcustSelの要素となります。visibleパラメータの値がtrueであるため、結合Sourceresult1の出力になります。

2番目のjoinメソッドのベースはcustSel、比較SourcecustSel2ですが、結合SourcecustSel.value()メソッドの結果です。custSelは結合Sourceの入力であるため、ベースSourceはその入力と一致します。この入力の関係により、結果のSourceresult2)は、比較SourceにもあるcustSelの要素のみを持ちます。

例6-7 Sourceの要素のサブセットの選択

StringSource custSel = (StringSource) 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の値を示します。

          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

その他のSourceメソッドの使用方法

基本メソッドの様々なシグネチャであるメソッドに加え、Sourceクラスには、基本メソッドと組み合せて使用するその他のメソッドが多数あります。このようなメソッドの中には、atoffsetメソッドのように、単一の位置に基づいて選択を実行するメソッドがあります。また、intervalメソッドのように、位置の範囲に基づいて処理を行うメソッドもあります。さらに、eqgtのように比較を行うメソッド、selectValueremoveValueのように1つ以上の要素を選択するメソッド、sortAscendingsortDescendingHierarchicallyのように要素をソートするメソッドもあります。

Sourceの各サブクラスにも、その他の特殊なメソッドがあります。たとえば、NumberSourceクラスには、算術関数を実行するメソッド(absdivおよびcosなど)や、集計を実行するメソッド(averageおよびtotalなど)が数多くあります。

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

extractメソッドの使用方法

要素値としてSourceオブジェクトを持つSourceの値を抽出するには、extractメソッドを使用します。Sourceの要素にSourceオブジェクトでない要素値が含まれている場合、extractメソッドの処理は、valueメソッドと同様になります。

例6-8では、extractメソッドを使用して、オブジェクト自体がmeasDimの要素値である、NumberSourceオブジェクトの値を取得します。各NumberSourceオブジェクトは、メジャーを表します。

この例では、UNITSメジャーおよびSALESメジャーについてNumberSourceのディメンションの階層から値を選択します。これらのディメンションのうち2つは、UNIT_PRICEメジャーのNumberSourceのディメンションです。

次に、この例では、要素値として3つのNumberSourceオブジェクトを持つ、リストSourcemeasDim)を作成します。その後、extractメソッドを使用して、NumberSourceオブジェクトの値を取得します。結果のSource(名前なし)は、抽出入力としてmeasDimを持ちます。最初の結合操作によって入力の一致が行われます。この操作では、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[] {units, unitPrice, 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         UNIT PRICE   UNITS SOLD   SALES AMOUNT
--------     ----------   ----------   -------------
ENVY ABM       2,993.29       26          77,825.54
ENVY EXE       3,147.85       37         116,470.45
ENVY STD       2,395.63       39          93,429.57

キューブの作成およびエッジのピボット

一般的なOLAP操作として、キューブの作成があります。キューブは、データの多次元配列です。キューブのデータは、キューブの列、行およびページ・エッジの要素で指定されます。キューブのデータは、メジャーのディメンションの要素で指定されたメジャーのデータになる場合があります。また、メジャー・データを計算して指定されたディメンション要素がキューブのデータになる場合もあります(たとえば、販売台数が指定の数量を超える製品など)。

この項のほとんどの例では、キューブを作成します。例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 default hierarchies
// of the Customer and Product 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 elements 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 dimension 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

階層内でのドリルアップおよびドリルダウン

もう1つの一般的なOLAP操作として、ディメンション階層内でのドリルアップおよびドリルダウンがあります。例6-10では、ディメンション階層の1つのレベルの要素を取得し、要素を1つ選択して、その要素の親、子および祖先を取得します。

この例では、次のオブジェクトが使用されています。

  • levelSrc。製品ディメンションのPRODUCT_PRIMARY階層のFAMILYレベルのSourceです。

  • prodHier。PRODUCT_PRIMARY階層のSourceです。

  • prodHierParentAttr。階層の親属性のSourceです。

  • prodHierAncsAttr。階層の祖先属性のSourceです。

  • prodShortLabel。製品ディメンションの値の簡単な説明属性のSourceです。

例6-10 階層内のドリル操作

int pos = 5;
// Get the element at the specified position of the level Source.
Source levelElement = levelSrc.at(pos);

// Select the element of the hierarchy with the specified value.
Source levelSel = prodHier.join(prodHier.value(), levelElement);

// Get ancestors of the level element.
Source levelElementAncs = prodHierAncsAttr.join(prodHier, levelElement);
// Get the parent of the level element.
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 element.
Source levelElementChildren = prodHierChildren.join(prodHier, levelElement);


// Get the short value descriptions for the elements 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 element values:");
getContext().displayResult(levelSrcWithShortDescr);
println("\nLevel element at position " + pos + ":");
getContext().displayResult(levelElement);
println("\nParent of the level element:");
getContext().displayResult(levelElementParent);
println("\nChildren of the level element:");
getContext().displayResult(levelElementChildrenWithShortDescr);
println("\nAncestors of the level element:");
getContext().displayResult(levelElementAncs);

次のリストは、displayResultsメソッドによって作成されたCursorオブジェクトの値を示しています。

Level element values:

1: (PRODUCT_PRIMARY::FAMILY::ACC,Accessories)
2: (PRODUCT_PRIMARY::FAMILY::DISK,CD/DVD)
3: (PRODUCT_PRIMARY::FAMILY::DOC,Documentation)
4: (PRODUCT_PRIMARY::FAMILY::DTPC,Portable PCs)
5: (PRODUCT_PRIMARY::FAMILY::LTPC,Desktop PCs)
6: (PRODUCT_PRIMARY::FAMILY::MEM,Memory)
7: (PRODUCT_PRIMARY::FAMILY::MOD,Modems/Fax)
8: (PRODUCT_PRIMARY::FAMILY::MON,Monitors)
9: (PRODUCT_PRIMARY::FAMILY::OS,Operating Systems)

Level element at position 5:

1: PRODUCT_PRIMARY::FAMILY:LTPC

Parent of the level element:

1: (PRODUCT_PRIMARY::CLASS::HRD,Hardware)

Children of the level element:

1: (PRODUCT_PRIMARY::ITEM::ENVY ABM,Envoy Ambassador)
2: (PRODUCT_PRIMARY::ITEM::ENVY EXE,Envoy Executive)
3: (PRODUCT_PRIMARY::ITEM::ENVY STD,Envoy Standard)

Ancestors of the level element:

1: (PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL,Total Product)
2: (PRODUCT_PRIMARY::CLASS::HRD,Hardware)
3: (PRODUCT_PRIMARY::FAMILY::LTPC,Portable PCs)

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

例6-11では、recursiveJoinメソッドを使用して、製品ディメンションのPRODUCT_PRIMARY階層の要素を、UNITSメジャー値の昇順で階層的にソートします。この例では、ソートされた製品をディメンションの値の簡単な説明属性に結合してから、その操作の結果sortedProductsShortDescrunitsに結合します。

連続しているjoinHiddenメソッドは、unitsの他のディメンションの選択を結合して、要素値としてメジャーのデータを持ち、出力としてsortedProductsShortDescrを持つresult Sourceを生成します。この例でjoinHiddenメソッドを使用するのは、他のディメンションの選択が結果の出力にならないようにするためです。

この例では、次のオブジェクトが使用されています。

  • prodHier。PRODUCT_PRIMARY階層のSourceです。

  • units。製品の販売台数のUNITSメジャーのSourceです。

  • prodParent。PRODUCT_PRIMARY階層の親属性のSourceです。

  • prodShortDescr。製品ディメンションの値の簡単な説明属性のSourceです。

  • custSel。顧客ディメンションのデフォルト階層の単一の要素を指定するSourceです。要素の値は、すべての顧客の合計を示すSHIPMENTS::TOTAL_CUSTOMER::TOTALです。

  • chanSel。チャネル・ディメンションのデフォルト階層の単一の要素を指定するSourceです。要素の値は、直販チャネルを示すCHANNEL_PRIMARY::CHANNEL::DIRです。

  • timeSel。時間ディメンションのデフォルト階層の単一の要素を指定するSourceです。要素の値は、2001年を示すCALENDAR_YEAR::YEAR::CY2001です。

例6-11 メジャー値による階層的ソート

Source sortedProduct =
            prodHier.recursiveJoin(units,
                                   units.getDataType(),
                                   prodParent,
                                   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クラスの販売台数の方が多いためです。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

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

例6-12では、NumberSourceメソッドのdivおよびtimesを使用して、選択した時間、顧客およびチャネルの値について、製品の販売台数の総数に対するDesktop PCおよびPortable PCファミリのシェアを指定するSourceを生成します。この例では、製品ディメンションの階層のSourceである、prodHierselectValueメソッドを最初に使用して、階層の最上位の集計レベルである値PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTALで単一の要素を指定するtotalProdsを生成します。

NumberSource unitsjoinHiddenメソッドは、すべての製品のレベルでUNITSメジャー値を指定するtotalUnitsを生成します。この場合、totalUnitsの出力としてtotalProdsは使用されません。次に、unitsdivメソッドが、販売台数の総数で除算された各販売台数の値を表すSourceを生成します。そして、timesメソッドは、divメソッドの処理の結果を100倍して、販売台数の総数に対するある製品要素の割合(シェア)を表すproductShareを生成します。productShare Sourceは、入力としてunitsメジャーの入力を持ちます。

prodFamiliesオブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSourceです。productSharejoinメソッドは、結合SourceとしてprodFamiliesを使用して、製品の販売総数に対する製品ファミリごとのシェアを指定するSourceを生成します。

custSelchanSelおよびtimeSelの各Sourceオブジェクトは、顧客、チャネルおよび時間ディメンションの階層の単一の要素の選択です。残りのjoinメソッドは、これらのSourceオブジェクトと他のproductShareの入力との一致を行い、resultを作成します。joinメソッドのjoin(Source joined, String comparison)シグネチャは、出力としてjoined 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 Element         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%

時系列操作に基づいた選択

この項では、時系列ディメンションの要素を処理するメソッドの使用例を2つ示します。例6-13では、unitPrice(UNIT_PRICEメジャーのSource)のlagメソッドを使用して、unitPriceLag4を生成します。これは、unitPriceの要素ごとに、同じ時間階層のレベルでその要素より前の4つの期間を示すunitPriceの要素を指定します。

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

unitPriceunitPriceLag4メジャーは、ともに入力として製品および時間ディメンションを持ちます。2番目のjoinメソッドは、quarterLevel(時間ディメンションのCALENDAR_YEAR階層のQUARTERレベルのSource)を、時間ディメンションのメジャー入力と一致させ、結果のSourceの出力とします。

joinHiddenメソッドは、prodSelを製品ディメンションのメジャー入力に一致させますが、prodSelを結果のSourceの出力にはしません。prodSel Sourceは、Desktop PCを示す単一の階層の要素PRODUCT_PRIMARY::FAMILY::DTPCを指定します。

lagResult Sourceは、Desktop PC製品ファミリの4つ前の四半期の集計単位価格および各四半期の集計単位価格を指定します。

例6-13 lagメソッドの使用方法

NumberSource unitPriceLag4 = unitPrice.lag(mdmTimeHier, 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階層の最初の四半期であるため、右の列の先頭から4つの値は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では、例6-13と同じunitPricequarterLevelおよびprodSelオブジェクトを使用します。ただし、measuresDimの2番目の要素としてunitPriceMovingTotalメジャーを使用します。unitPriceMovingTotal Sourceは、unitPricemovingTotalメソッドによって生成されます。このメソッドでは、dimensionパラメータとして時間ディメンションのMdmLevelHierarchyコンポーネントであるmdmTimeHierを、開始および終了オフセットの値として整数0および3を指定します。

movingTotalResult Sourceは、各四半期について、その四半期のDesktop PCファミリのメンバーの単位価格の集計を指定し、その単位価格と次の3つの四半期の単位価格を加えた合計を指定します。

例6-14 movingTotalメソッドの使用方法

NumberSource unitPriceMovingTotal =
                            unitPrice.movingTotal(mdmTimeHier, 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
...

パラメータ化Sourceオブジェクトを使用した要素のセットの選択

例6-15では、NumberParameterオブジェクトを使用して、パラメータ化Sourceオブジェクトを作成します。これらのオブジェクトは、prodHierintervalメソッドのbottomおよびtopパラメータです。このメソッドはparamProdSelIntervalを生成します。これは、階層のbottomの位置からtopの位置までのprodHierの要素のセットを指定するSourceです。

製品の要素は、result Sourceに表示されるunitsメジャーの要素を指定します。Parameterオブジェクトの値を変更すると、同じCursorを使用して、販売台数の値の異なるセットを選択できます。この場合、新しいSourceおよびCursorオブジェクトを生成する必要はありません。

この例では、次のオブジェクトが使用されています。

  • dp。セッションのDataProviderです。

  • prodHier。製品ディメンションのPRODUCT_PRIMARY階層のSourceです。

  • prodShortDescr。製品ディメンションの値の簡単な説明属性のSourceです。

  • units。製品の販売台数のUNITSメジャーのSourceです。

  • chanHier。チャネル・ディメンションのCHANNEL_PRIMARY階層のSourceです。

  • calendar。時間ディメンションのCALENDAR_YEAR階層のSourceです。

  • shipHier。顧客ディメンションのSHIPMENTS階層のSourceです。

  • getContextメソッドによって戻されるContext11gオブジェクト。Context11gは、現行のTransactionのコミット、SourceCursorの作成、テキストの表示、およびCursorの値の表示を行う複数のメソッドを持ちます。

prodShortDescrjoinメソッドは、paramProdSelIntervalの要素値の簡単な説明を取得します。その次の4つのjoinメソッドは、Sourceオブジェクトをunitsメジャーの入力と一致させます。この例では、Cursorを作成して、問合せの結果セットを表示します。次に、resultCursorsetPositionメソッドは、Cursorの位置を最初の要素に設定します。

NumberParameterオブジェクトのsetValueメソッドは、これらのオブジェクトの値を変更します。つまり、問合せで指定された製品要素の選択を変更します。その後、この例では、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(calendar, "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