問合せを作成するには、データ・ストアから取り出すデータおよびそのデータに対して実行する操作を指定するSource
を作成します。問合せを作成する場合、問合せ対象のメジャー、ディメンションおよび属性のメタデータを表す、プライマリSource
オブジェクトを最初に作成します。通常、プライマリSource
オブジェクトのメソッドを使用して、ディメンション要素の選択やデータに対して実行する操作など、問合せの一部を指定する他のSource
オブジェクトを多数導出します。次に、データおよび目的の操作を指定する、プライマリおよび導出Source
オブジェクトを結合します。これにより、問合せを表す1つのSource
が生成されます。
この章では、様々な種類のSource
メソッドの概要を説明し、一部については詳細に説明します。また、これらのメソッドを使用した一般的なOLAP問合せの作成方法を説明し、一部については例も示します。
この章では、次の項目について説明します。
Source
クラスには、導出Source
を戻す多くのメソッドがあります。導出Source
の要素は、ベースSource
での操作によって生成されます。これは、自身のメソッドがコールされて導出Source
を生成するSource
です。小数のメソッドで、Source
クラスのほとんどの基本操作を実行できます。
Source
クラスには、1つ以上の基本メソッドを使用して、値または位置を基準としたベースSource
の要素の選択や、要素のソートなどの操作を実行する、基本メソッド以外のメソッドが多くあります。この章および第5章「Sourceオブジェクトの理解」に記載されている例の大部分で、これらのメソッドの一部が使用されています。その他のSource
メソッドには、Source
に関する情報を保持するオブジェクトを取得するメソッド(getDefinition
、getInputs
およびgetType
など)、またはSource
の値をあるデータ型から別のデータ型に変換するメソッド(toDoubleSource
など)があります。
この項では、基本Source
メソッドについて説明し、その使用例をいくつか示します。表6-1に、基本Source
メソッドを示します。
表6-1 基本Sourceメソッド
メソッド | 説明 |
---|---|
ベース |
|
ベースでコピーされた要素は導出 |
|
メソッド・コールの |
|
ベース |
|
このメソッドは、生成する |
|
ベース |
Source
と入力の一致を制御するには、alias
メソッドを使用します。たとえば、メジャーのディメンションの要素で指定されたメジャー値が、同じディメンションの他の要素で指定されたメジャー値より大きいかどうかを調べる場合、メジャーの入力を同じ結合操作で2回一致させる必要があります。これを行うには、Source
オブジェクトを同じディメンションの別名として2つ作成し、それらをメジャーの2つのインスタンスの入力とし、各メジャー・インスタンスを別名化された関連ディメンションに結合して、結果を比較します。
例6-1では、このような操作を実行します。この例では、チャネル・ディメンションの各値の販売台数が、チャネル・ディメンションの他の値の販売台数より大きいかどうかを指定するSource
を作成します。
この例の場合、メジャーのSource
であるunits
に、メジャーの3つのディメンションの単一値の選択であるSource
オブジェクトを結合して、unitsSel
を生成します。unitsSel
Source
は、unitsSel
の出力であるtimeSel
、custSel
およびprodSel
オブジェクトによって指定されたディメンション値のunits
要素を指定します。
timeSel
、custSel
および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
)を作成します。そして、chanAlias1
のvalue
メソッドをコールして生成されたSource
に、unitsSel
を結合してunitsSel1
を作成します。このunitsSel1
Source
は、unitsSel
の要素および出力を持ち、入力としてchanAlias1
を持ちます。同様に、入力としてchanAlias2
を持つunitsSel2
を生成します。
この例では、unitsSel1
のgt
メソッドを使用して、unitsSel1
の値がunitsSel2
の値より大きいかどうかを判定します。最後の結合操作では、chanAlias1
とunitsSel1
の入力の一致、およびchanAlias1
とunitsSel2
の入力の一致を行います。
例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)
によって作成されたSource
にchanAlias2
を結合して作成されるため、chanAlias2
がresult
の最初の出力になり、chanAlias1
がresult
の2番目の出力になります。
result
Source
のCursor
は、問合せに回答するboolean
値を値として持ちます。Cursor
の最初の出力値は、chanAlias2
で指定されたチャネル値です。2番目の出力値は、chanAlias1
で指定されたチャネル値です。
次に示すのは、ヘッダー付きのクロス集計形式で表示されたCursor
の値です。列エッジの値はchanAlias1
の値で、行エッジの値はchanAlias2
の値です。クロス集計のセルの値は、列のチャネル値の販売台数の値が、行のチャネル値の販売台数の値より大きいかどうかを示すboolean
値です。たとえば、1列目のクロス集計値の場合、列のチャネル値Total Channel
の販売台数は、行のTotal Channel
値の販売台数より大きくないが、行のDirect Sales
、Catalog
およびInternet
値の販売台数よりは大きいことを示しています。
----------------- chanAlias1 ---------------- chanAlias2 TotalChannel Catalog Direct Sales Internet ------------ ------------ ------- ------------ -------- TotalChannel false false false false Catalog true false false false Direct Sales true true false false Internet true true true false
コピーされた値を持たないSource
を生成するには、distinct
メソッドを使用します。例6-2では、顧客ディメンションの階層から要素を選択し、その要素の子孫を取得します。そして、階層の要素の選択に子孫を追加します。子孫のSource
には祖先の値が含まれているため、例ではdistinct
メソッドを使用して、コピーされた祖先の値を削除し、結果にその値が2回出現するのを回避します。
例6-2では、markets
が、顧客ディメンションのMARKETS階層を表すStringSource
です。marketsAncestors
オブジェクトは、その階層の祖先属性のSource
です。例では、祖先の子孫を表すSource
を取得するために、join
メソッドを使用して、marketsAncestors
の各要素について、祖先としてmarketsAncestors
要素を持つmarkets
の要素を選択します。結合操作では、ベースSource
(markets
)と祖先属性の入力を一致させます。
ただし、結果のSource
(marketsDescendants
)は、入力として引き続きmarkets
を持ちます。これは、markets.value()
メソッドによって生成されたSource
が、結合操作の比較Source
であるためです。結合操作のcomparison
パラメータSource
は、入力とSource
の一致には関与しません。
markets
のselectValue
メソッドは、Business Worldのアカウントを示すMARKETS::ACCOUNT::BUSN WRLD
を値に持つmarkets
の要素を選択して、selVal
を生成します。marketsDescendants
のjoin
メソッドは、selVal
を比較Source
として使用します。このメソッドは、markets
とselVal
の両方に存在するmarketsDescendants
の要素を持つselValDescendants
を生成します。marketsDescendants
の入力は、結合Source
markets
と一致します。markets
Source
は、結合操作のvisible
パラメータの値がfalse
であるため、selValDescendants
の出力とはなりません。
selVal
のappendValues
メソッドは、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
Source
のCursor
の値は次のとおりです。
MARKETS::ACCOUNT::BUSN WRLD MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
この例にdistinct
メソッドのコールを含めなかった場合、selValPlusDescendants
のCursor
の値は次のようになります。
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
メソッドを使用すると、メソッドのjoined
、comparison
および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
)も使用しています。
この例では、最初に階層の要素を選択します。次に、marketsDescendants
のjoin
メソッドでmarketsDescendantsOnly
を生成します。これは、markets
の子孫を指定します。また、結合操作のcomparison
パラメータがmarkets.value()
メソッドによって生成されたSource
であるため、入力としてmarkets
を持ちます。
COMPARISON_RULE_REMOVE
は、marketsDescendantsOnly
を生成した結合操作の比較規則であるため、Source
とmarketsDescendantsOnly
の入力との一致を行う結合操作によって、結合操作の比較Source
に存在しないmarketsDescendantsOnly
の要素のみを持つSource
が生成されます。
次の結合操作では、この一致が実行されます。この操作では、結合Source
(markets
)とmarketsDescendantsOnly
の入力の一致が行われ、selValDescendantsOnly
が生成されます。これは、選択された階層の値の子孫を指定しますが、選択された値は含みません。これは、marketsDescendantsOnly
が、比較Source
(selVal
)の値と一致する値の削除を指定しているためです。
これに対して、最後の結合操作では、選択された階層値の子孫を指定し、選択された値も含む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);
selValDescendants
のCursor
の値は次のとおりです。
MARKETS::ACCOUNT::BUSN WRLD MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
selValDescendantsOnly
のCursor
の値は次のとおりです。
MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
例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
Source
のCursor
の値は、次のように表形式で表示されます。表には、ディメンション要素の値の簡単な説明および単位価格値のみが含まれ、書式が追加されています。
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
ベースの要素の位置を持ち、そのベースを入力として持つ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
Source
のCursor
の値は、次のように、列ヘッダーおよび書式が追加された表として表示されます。左の列はレベル名、中央の列はレベル内のメンバーの位置、右の列はメンバーのローカル値です。
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
階層的に順序付けられた要素を持つSource
を生成するには、recursiveJoin
メソッドを使用します。recursiveJoin
メソッドは、MdmHierarchy
のSource
またはこのようなSource
のサブタイプでのみ使用します。このメソッドは、階層における親とその子で階層的に順序付けられた要素を持つSource
を生成します。
join
メソッドと同様に、メソッドのjoined
、comparison
および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
Source
のCursor
の値は、ヘッダー付きで次のように表示されます。ここでは、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
Source
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。表では、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
Source
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。ここでは、メンバーはパッケージ属性値を基準に、降順のアルファベット順でソートされています。
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 ...
自身を入力として持つSource
を作成するには、value
メソッドを使用します。この関係により、Source
の要素のサブセットを選択できます。
例6-7では、このようなサブセットの選択を示します。この例では、shipHier
が顧客ディメンションのSHIPMENTS
階層のSource
です。shipHier
のselectValues
メソッドは、custSel
を生成します。これは、shipHier
の一部の要素の選択です。custSel
のselectValues
メソッドは、custSel2
を生成します。これは、その選択のサブセットです。
最初のjoin
メソッドのベースおよび結合Source
はcustSel
です。この比較Source
はcustSel2
です。結果のSource
(result1
)の要素は、比較Source
にあるcustSel
の各要素について1セットのcustSel
の要素となります。visible
パラメータの値がtrue
であるため、結合Source
はresult1
の出力になります。
2番目のjoin
メソッドのベースはcustSel
、比較Source
はcustSel2
ですが、結合Source
はcustSel.value()
メソッドの結果です。custSel
は結合Source
の入力であるため、ベースSource
はその入力と一致します。この入力の関係により、結果のSource
(result2
)は、比較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);
result1
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。左の列は、Cursor
の出力の要素値を示します。右の列は、Cursor
の値を示します。
Output Value result1 Value --------------------------------- --------------------------------- SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE ATL SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE LON SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE ATL SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE LON
result2
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。左の列は、Cursor
の出力の要素値を示します。右の列は、Cursor
の値を示します。
Output Value result2 Value --------------------------------- --------------------------------- SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN
基本メソッドの様々なシグネチャであるメソッドに加え、Source
クラスには、基本メソッドと組み合せて使用するその他のメソッドが多数あります。このようなメソッドの中には、at
やoffset
メソッドのように、単一の位置に基づいて選択を実行するメソッドがあります。また、interval
メソッドのように、位置の範囲に基づいて処理を行うメソッドもあります。さらに、eq
やgt
のように比較を行うメソッド、selectValue
やremoveValue
のように1つ以上の要素を選択するメソッド、sortAscending
やsortDescendingHierarchically
のように要素をソートするメソッドもあります。
Source
の各サブクラスにも、その他の特殊なメソッドがあります。たとえば、NumberSource
クラスには、算術関数を実行するメソッド(abs
、div
およびcos
など)や、集計を実行するメソッド(average
およびtotal
など)が数多くあります。
この項では、一部のSource
メソッドについて使用例を示します。例の中には、OLAPアプリケーションで一般的に実行するタスクもあります。
要素値としてSource
オブジェクトを持つSource
の値を抽出するには、extract
メソッドを使用します。Source
の要素にSource
オブジェクトでない要素値が含まれている場合、extract
メソッドの処理は、value
メソッドと同様になります。
例6-8では、extract
メソッドを使用して、オブジェクト自体がmeasDim
の要素値である、NumberSource
オブジェクトの値を取得します。各NumberSource
オブジェクトは、メジャーを表します。
この例では、UNITSメジャーおよびSALESメジャーについてNumberSource
のディメンションの階層から値を選択します。これらのディメンションのうち2つは、UNIT_PRICEメジャーのNumberSource
のディメンションです。
次に、この例では、要素値として3つのNumberSource
オブジェクトを持つ、リストSource
(measDim
)を作成します。その後、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
Source
のCursor
の値が表示されます。
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
の値を表示した後、顧客選択用のパラメータ化Source
のParameter
の値を変更し、同じ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メジャー値の昇順で階層的にソートします。この例では、ソートされた製品をディメンションの値の簡単な説明属性に結合してから、その操作の結果sortedProductsShortDescr
をunits
に結合します。
連続している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
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。一番左の列は、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
例6-12では、NumberSource
メソッドのdiv
およびtimes
を使用して、選択した時間、顧客およびチャネルの値について、製品の販売台数の総数に対するDesktop PCおよびPortable PCファミリのシェアを指定するSource
を生成します。この例では、製品ディメンションの階層のSource
である、prodHier
のselectValue
メソッドを最初に使用して、階層の最上位の集計レベルである値PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL
で単一の要素を指定するtotalProds
を生成します。
NumberSource
units
のjoinHidden
メソッドは、すべての製品のレベルでUNITSメジャー値を指定するtotalUnits
を生成します。この場合、totalUnits
の出力としてtotalProds
は使用されません。次に、units
のdiv
メソッドが、販売台数の総数で除算された各販売台数の値を表すSource
を生成します。そして、times
メソッドは、div
メソッドの処理の結果を100倍して、販売台数の総数に対するある製品要素の割合(シェア)を表すproductShare
を生成します。productShare
Source
は、入力としてunits
メジャーの入力を持ちます。
prodFamilies
オブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSource
です。productShare
のjoin
メソッドは、結合Source
としてprodFamilies
を使用して、製品の販売総数に対する製品ファミリごとのシェアを指定するSource
を生成します。
custSel
、chanSel
および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
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。左の列は製品ファミリの値を、右の列は、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
を生成します。このmeasuresDim
のextract
メソッドは、measuresDim
の要素値を取得します。extract
メソッドによって生成されるSource
は、抽出入力としてmeasuresDim
を持ちます。最初のjoin
メソッドは、Source
(measuresDim
)を、extract
メソッドで生成されるSource
の入力と一致させます。
unitPrice
とunitPriceLag4
メジャーは、ともに入力として製品および時間ディメンションを持ちます。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
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。左の列は四半期、中央の列はその四半期の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と同じunitPrice
、quarterLevel
およびprodSel
オブジェクトを使用します。ただし、measuresDim
の2番目の要素としてunitPriceMovingTotal
メジャーを使用します。unitPriceMovingTotal
Source
は、unitPrice
のmovingTotal
メソッドによって生成されます。このメソッドでは、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
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。左の列は四半期を示します。中央の列は、その四半期のDesktop PCファミリのメンバーの単位価格の合計を示します。右の列は、その四半期と次の3つの四半期の単位価格の合計を示します。表には、最初の8つの四半期のみが含まれます。
Unit Price Moving Total Quarter Unit Price Current Plus Next Three Periods --------------------------------- ---------- ------------------------------- CALENDAR_YEAR::QUARTER::CY1998.Q1 2687.54 10653.05 CALENDAR_YEAR::QUARTER::CY1998.Q2 2704.48 10360.30 CALENDAR_YEAR::QUARTER::CY1998.Q3 2673.27 9993.00 CALENDAR_YEAR::QUARTER::CY1998.Q4 2587.76 9668.12 CALENDAR_YEAR::QUARTER::CY1999.Q1 2394.79 9258.25 CALENDAR_YEAR::QUARTER::CY1999.Q2 2337.18 8911.87 CALENDAR_YEAR::QUARTER::CY1999.Q3 2348.39 8626.48 CALENDAR_YEAR::QUARTER::CY1999.Q4 2177.89 8291.37 ...
例6-15では、NumberParameter
オブジェクトを使用して、パラメータ化Source
オブジェクトを作成します。これらのオブジェクトは、prodHier
のinterval
メソッドの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
のコミット、Source
のCursor
の作成、テキストの表示、およびCursor
の値の表示を行う複数のメソッドを持ちます。
prodShortDescr
のjoin
メソッドは、paramProdSelInterval
の要素値の簡単な説明を取得します。その次の4つのjoin
メソッドは、Source
オブジェクトをunits
メジャーの入力と一致させます。この例では、Cursor
を作成して、問合せの結果セットを表示します。次に、resultCursor
のsetPosition
メソッドは、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