6 Sourceメソッドを使用した問合せの作成
取得するデータとそのデータに対して実行する操作を指定するSource
を生成して、問合せを作成します。 問合せを作成する場合、問合せ対象のメジャー、ディメンションおよび属性のメタデータを表す、プライマリSource
オブジェクトを最初に作成します。 通常、プライマリSource
オブジェクトのメソッドを使用して、ディメンション・メンバーの選択やデータに対して実行する操作など、問合せの一部を指定するその他のSource
オブジェクトを派生させます。 次に、必要なデータと操作を指定するSource
オブジェクトを結合します。 これにより、問合せを表す1つのSource
が生成されます。 次に、Source
のCursor
を作成してデータを取得できます。
この章では、様々な種類のSource
メソッドの概要を説明し、一部については詳細に説明します。 また、これらのメソッドを使用した一般的なOLAP問合せの作成方法を説明し、一部については例も示します。
この章では、次の項目について説明します。
6.1 基本Sourceメソッド
Source
クラスには、派生したSource
を返す多くのメソッドがあります。 導出されたSource
の要素は、base Source
(Source
が導出されたSource
を返すメソッド)の操作の結果になります。 Source
クラスの最も基本的な操作は、ほんのわずかのメソッドでしか実行できません。
Source
クラスの他の多くのメソッドは、値または位置によるベースSource
の要素の選択、または要素のソートなどの操作を実行するための基本メソッドの1つ以上を使用します。 この章および「ソース・オブジェクトの理解」の例の多くは、これらのメソッドのいくつかを使用しています。 他のSource
メソッドは、getID
、getInputs
、getType
メソッドなどのSource
に関する情報を持つオブジェクトを取得し、ge
メソッドやgt
メソッドなどの比較を実行するか、Source
の値をあるデータ型から別のデータ型に変換します。toDoubleSource
メソッド。
表6-1 基本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
の出力であるtimeSel
、custSel
、およびprodSel
オブジェクトで指定されるディメンション値のunits
要素を指定します。 unitsSel
Source
には、入力としてCHANNEL_AWJディメンションのSource
があります。
timeSel
、custSel
、および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を識別します。
次に、chanHier
のchanAlias1
とchanAlias2
の2つの別名を作成します。chanHier
は、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSource
です。 次に、unitsSel
とchanAlias1.value()
によって返されたSource
を結合して、unitsSel1
を生成します。 このunitsSel1
Source
は、unitsSel
の要素および出力を持ち、入力としてchanAlias1
を持ちます。 同様に、入力としてchanAlias2
を持つunitsSel2
を生成します。
この例では、unitsSel1
のgt
メソッドを使用して、unitsSel1
の値がunitsSel2
の値より大きいかどうかを判断します。 最後の結合操作では、chanAlias1
とunitsSel1
の入力が一致し、chanAlias2
とunitsSel2
の入力が一致します。
例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
の販売単位の値よりも大きいかという問合せを指定 result
はchanAlias2
とunitsSel1.gt(unitsSel2).join(chanAlias1)
によって返されるSource
との結合によって生成されるため、chanAlias2
はresult
の最初の出力であり、chanAlias1
はresult
の2番目の出力です。
result
Source
のCursor
は、問合せに応答するboolean
値を値として持ちます。 Cursor
の最初の出力の値はchanAlias2
で指定されたチャネル値であり、2番目の出力の値はchanAlias1
で指定されたチャネル値です。
次に示すのは、ヘッダー付きのクロス集計形式で表示されたCursor
の値です。 列エッジの値はchanAlias1
の値で、行エッジの値はchanAlias2
の値です。 クロス集計のセルの値は、列のチャネル値の販売台数の値が、行のチャネル値の販売台数の値より大きいかどうかを示すboolean
値です。 たとえば、最初の列のクロス集計値は、列チャネル値Total Channel
の販売単位の値が、行Total Channel
の値の単価を超えていませんが、Direct Sales
、Catalog
、Internet
行の値。
----------------- chanAlias1 ---------------- chanAlias2 TotalChannel Catalog Direct Sales Internet ------------ ------------ ------- ------------ -------- TotalChannel false false false false Catalog true false false false Direct Sales true true false false Internet true true true false
6.2.2 distinctメソッドの使用方法
distinct
メソッドを使用して、重複した値を持たないSource
を生成します(「例6-2」に示されています)。 この例では、ディメンション・メンバーの2つの選択肢を結合します。 両方の選択肢にはディメンション・メンバーがあります。 この例では、distinct
メソッドを使用して、値が重複しない一意のディメンション・メンバーのみを含むSource
を生成します。
この例では、CUSTOMER_AWJディメンションのMdmStandardDimension
オブジェクトを取得し、そのディメンションのMARKETS階層のMdmLevelHierarchy
オブジェクトを取得します。 StringSource
オブジェクトmktHier
を取得します。 次に、mktHier
のselectValues
メソッドを使用して、階層のメンバーであるcustomersToSelect
とmoreCustomersToSelect
の2つの選択肢を生成します。 customersToSelect
のメンバーのうちの2つは、moreCustomersToSelect
にも存在します。
この例では、appendValues
メソッドを使用して、combinedCustomers
Source
のcustomersToSelect
とmoreCustomersToSelect
の要素を結合します。 最後に、この例では、combinedCustomers
のdistinct
メソッドを使用します。Source
、distinctCombinedCustomers
が返されます。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
Source
のCursor
には、次の値があります:
MARKETS::SHIP_TO::KOSH ENT BOS MARKETS::SHIP_TO::KOSH ENT TOK MARKETS::SHIP_TO::KOSH ENT WAN MARKETS::SHIP_TO::KOSH ENT BOS MARKETS::SHIP_TO::KOSH ENT TOK MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
distinctCombinedCustomers
Source
のCursor
には、次の値があります:
MARKETS::SHIP_TO::KOSH ENT BOS MARKETS::SHIP_TO::KOSH ENT TOK MARKETS::SHIP_TO::KOSH ENT WAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
6.2.3 joinメソッドの使用方法
「ソース・オブジェクトの理解」で説明されているように、join
メソッドを使用して、メソッドのjoined
、comparison
、およびcomparisonRule
パラメータによって決定される基本Source
の要素を持つSource
を生成します。 visible
パラメータは、joined
パラメータSource
が結合操作によって生成されたSource
の出力であるかどうかを決定します。 また、join
メソッドを使用して、Source
をbaseまたはjoined
パラメータSource
の入力と照合します。
この章のほとんどの例では、join
メソッドの1つ以上のシグネチャを使用しています。「ソース・オブジェクトの理解」の例の多くはそうです。 「例6-3」は完全なjoin
シグネチャと最も単純なjoin
シグネチャを使用します。 この例では、完全なjoin
シグネチャは、COMPARISON_RULE_DESCENDING
をcomparisonRule
パラメータとして使用する方法を示しています。
「例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
です。
最初の結合操作では、prodSelWithShortDescr
をSource
、salesMeasure
を結合Source
、Source
をNumberデータ型のSource
、COMPARISON_RULE_DESCENDING
を比較ルールとして使用するjoin
メソッドの完全なシグネチャが使用されます。 その結合操作によって戻されたSource
には、製品ファミリ・レベルのメンバーと、関連する製品の短い記述値が基本値として格納され、出力が降順で出力されます。
次の3つの結合操作は、メジャーの他の3つのディメンションの1つのメンバー選択を結合します。 result
Source
は、すべての顧客とすべてのチャネルについて、2001年5月分の売上金額の降順で製品ファミリのレベル・メンバーを指定します。
例6-3 COMPARISON_RULE_DESCENDINGの使用
Source result = prodSelWithShortDescr.join(salesMeasure, salesMeasure.getDataType(), Source.COMPARISON_RULE_DESCENDING, true) .join(timeSelWithShortDescr) .join(custSelWithShortDescr) .join(chanSelWithShortDescr);
result
Source
のCursor
の値は、次のように表形式で表示されます。 表には、階層メンバーの短い値の説明と売上金額の値のみが含まれ、見出しと書式が追加されています。
Total Channel Total Customer MAY-01 Total Sales Amounts Product Family ------------------- ----------------- 3,580,239.72 Desktop PCs 2,508,560.92 Portable PCs 891,807.30 CD/DVD 632,376.84 Modems/Fax 444,444.38 Memory 312,389.39 Accessories 291,510.88 Monitors 222,995.92 Operating Systems 44,479.32 Documentation
6.2.4 positionメソッドの使用方法
ベースの要素の位置を持ち、そのベースを入力として持つ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
Source
のCursor
の値は、次のように、列ヘッダーおよび書式が追加された表として表示されます。 左の列はレベル名、中央の列はレベル内のメンバーの位置、右の列はメンバーのローカル値です。 TOTAL_TIMEレベルにはメンバーが1つしかありません。
Level Member Position in Level Member Value ---------- ------------------------ ------------ TOTAL_TIME 1 TOTAL YEAR 1 CY1998 YEAR 10 CY2007 QUARTER 1 CY1998.Q1 QUARTER 40 CY2007.Q4 MONTH 1 1998.01 MONTH 120 2007.12
6.2.5 recursiveJoinメソッドの使用
階層的に順序付けられた要素を持つSource
を生成するには、recursiveJoin
メソッドを使用します。 recursiveJoin
メソッドは、MdmHierarchy
のSource
またはそのようなSource
のサブタイプとともにのみ使用します。 このメソッドは、階層における親とその子で階層的に順序付けられた要素を持つSource
を生成します。
join
メソッドと同様に、recursiveJoin
メソッドを使用して、メソッドのjoined
、comparison
、およびcomparisonRule
パラメータによって決定されるベースSource
の要素を持つSource
を生成します。 visible
パラメータは、結合されたSource
が再帰結合操作によって生成されたSource
の出力であるかどうかを決定します。
完全なrecursiveJoin
メソッドには、階層の親属性を指定するその他のパラメータ、結果が子の前後に親を持つかどうか、結果に子が含まれているが親は含まれていない場合は結果の要素を順序付ける方法があります。 recursiveJoin
メソッドには、完全なシグネチャのショートカットであるいくつかのシグネチャがあります。
「例6-5」は、親を最初にリストし、親をベースに限定し、結合されたSource
を出力として追加しないrecursiveJoin
メソッドを使用します。 この例では、まずPRODUCT_AWJディメンションのPRODUCT_PRIMARY階層のメンバーを階層レベルでソートし、次に各メンバーのパッケージ属性の値でソートします。
最初のrecursiveJoin
メソッドでは、COMPARISON_RULE_ASCENDING
パラメータは、prodHier
階層のメンバーが各レベル内でアルファベット昇順になるように指定します。 prodParentAttr
オブジェクトは、階層の親属性のSource
です。
2番目のrecursiveJoin
メソッドのprodPkgAttr
オブジェクトは、ディメンションのパッケージ属性のSource
です。 ITEMレベルのメンバーだけが、関連するパッケージ属性値を持っています。 集計レベルTOTAL_PRODUCT、CLASS、およびFAMILYのメンバーは関連パッケージを持たないため、これらのレベルのメンバーのパッケージ属性値はnull
であり、結果にはNA
と表示されます。 ITEMレベル・メンバーの中には、関連パッケージ値がないものもあります。そのため、値はNA
です。
2番目のrecursiveJoin
メソッドは、パッケージの属性値を関連する階層メンバーに結合し、レベルごとに階層的にメンバーをソートし、レベルの昇順アルファベット順にソートします。 COMPARISON_RULE_ASCENDING_NULLS_FIRST
パラメータは、null
値を持つメンバーが同じレベルの他のメンバーの前に表示されるように指定します。 この例では、メソッドsortedHierAscending
の結果を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
Source
のCursor
の値は、ヘッダー付きで次のように表示されます。 ここでは、Cursor
の最初の17個の値のみが表示されています。
Product Primary Hierarchy Value ------------------------------------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL PRODUCT_PRIMARY::CLASS::HRD PRODUCT_PRIMARY::FAMILY::DISK PRODUCT_PRIMARY::ITEM::EXT CD ROM PRODUCT_PRIMARY::ITEM::EXT DVD PRODUCT_PRIMARY::ITEM::INT 8X DVD PRODUCT_PRIMARY::ITEM::INT CD ROM PRODUCT_PRIMARY::ITEM::INT CD USB PRODUCT_PRIMARY::ITEM::INT RW DVD PRODUCT_PRIMARY::FAMILY::DTPC PRODUCT_PRIMARY::ITEM::SENT FIN PRODUCT_PRIMARY::ITEM::SENT MM PRODUCT_PRIMARY::ITEM::SENT STD PRODUCT_PRIMARY::FAMILY::LTPC PRODUCT_PRIMARY::ITEM::ENVY ABM PRODUCT_PRIMARY::ITEM::ENVY EXE PRODUCT_PRIMARY::ITEM::ENVY STD ...
result2
Source
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。 表では、Cursor
の最初の17個の値のみが表示されています。 左の列は階層のメンバー値、右の列はメンバーのパッケージ属性値です。
null
値を持つITEMレベル・メンバーが最初に表示され、次に他のレベル・メンバーがパッケージ値の昇順に表示されます。 パッケージ属性のデータ型はStringであるため、パッケージの値は昇順のアルファベット順になります。
Product Primary Hierarchy Value Package Attribute Value ------------------------------------- ----------------------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL NA PRODUCT_PRIMARY::CLASS::HRD NA PRODUCT_PRIMARY::FAMILY::DISK NA PRODUCT_PRIMARY::ITEM::EXT CD ROM NA PRODUCT_PRIMARY::ITEM::INT 8X DVD NA PRODUCT_PRIMARY::ITEM::INT CD USB NA PRODUCT_PRIMARY::ITEM::EXT DVD Executive PRODUCT_PRIMARY::ITEM::INT CD ROM Laptop Value Pack PRODUCT_PRIMARY::ITEM::INT RW DVD Multimedia PRODUCT_PRIMARY::FAMILY::DTPC NA PRODUCT_PRIMARY::ITEM::SENT FIN NA PRODUCT_PRIMARY::ITEM::SENT STD NA PRODUCT_PRIMARY::ITEM::SENT MM Multimedia PRODUCT_PRIMARY::FAMILY::LTPC NA RODUCT_PRIMARY::ITEM::ENVY ABM NA PRODUCT_PRIMARY::ITEM::ENVY EXE Executive PRODUCT_PRIMARY::ITEM::ENVY STD Laptop Value Pack ...
result3
Source
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。 ここでは、メンバーはパッケージ属性値を基準に、降順のアルファベット順でソートされています。
Product Primary Hierarchy Value Package Attribute Value ------------------------------------- ----------------------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL NA PRODUCT_PRIMARY::CLASS::HRD NA PRODUCT_PRIMARY::FAMILY::DISK NA PRODUCT_PRIMARY::ITEM::EXT CD ROM NA PRODUCT_PRIMARY::ITEM::INT 8X DVD NA PRODUCT_PRIMARY::ITEM::INT CD USB NA PRODUCT_PRIMARY::ITEM::INT RW DVD Multimedia PRODUCT_PRIMARY::ITEM::INT CD ROM Laptop Value Pack PRODUCT_PRIMARY::ITEM::EXT DVD Executive PRODUCT_PRIMARY::FAMILY::DTPC NA PRODUCT_PRIMARY::ITEM::SENT FIN NA PRODUCT_PRIMARY::ITEM::SENT STD NA PRODUCT_PRIMARY::ITEM::SENT MM Multimedia PRODUCT_PRIMARY::FAMILY::LTPC NA PRODUCT_PRIMARY::ITEM::ENVY ABM NA PRODUCT_PRIMARY::ITEM::ENVY STD Laptop Value Pack PRODUCT_PRIMARY::ITEM::ENVY EXE Executive ...
6.2.6 valueメソッドの使用方法
「"入力によるソースの導出"」で説明したように、value
メソッドを使用して、それ自体を入力として持つSource
を作成します。 この関係により、Source
の要素のサブセットを選択できます。 また、valueメソッドを使用して関係を逆転させることもできます。
以下のトピックには、これらの操作の例があります。
6.2.6.1 ソースの要素の選択
「例5-11」と「例6-6」は、Source
の要素のサブセットの選択を示します。 「例6-6」では、shipHier
はCUSTOMER_AWJディメンションのSHIPMENTS階層のSource
です。 shipHier
のselectValues
メソッドは、shipHier
のいくつかの要素の選択であるcustSel
を生成します。 custSel
のselectValues
メソッドは、その選択のサブセットであるcustSel2
を生成します。
最初のjoin
メソッドのベースおよび結合Source
はcustSel
です。 この比較Source
はcustSel2
です。 結果として生じるSource
、result1
の要素は、比較Source
で指定されたベースと結合されたSource
オブジェクトのデカルト積です。 result1
Source
は、比較Source
にあるcustSel
の各要素に対してcustSel
の要素の1つのセットを持っています。 visible
パラメータの値がtrue
であるため、結合Source
はresult1
の出力になります。
2番目のjoin
メソッドも、ベースとしてcustSel
を持ち、比較Source
としてcustSel2
を持ちますが、custSel.value()
メソッドによって結合されたSource
として返されたSource
を持っています。 custSel
は結合されたSource
の入力であるため、ベースSource
はその入力と一致します。 その入力関係により、結果として得られるSource
、result2
は、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);
result1
のCursor
には、次の表に示す値があります。 表には、Cursor
にない書式と見出しがあります。 左の列は、Cursor
の出力の要素値を示します。 右側の列には、Cursor
の基本値があります。
Output Value result1 Value --------------------------------- --------------------------------- SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE ATL SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE LON SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE ATL SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE LON
result2
のCursor
の値は、次のようにヘッダー付きの表形式で表示されます。 左の列は、Cursor
の出力の要素値を示します。 右側の列には、Cursor
の基本値があります。
Output Value result2 Value --------------------------------- --------------------------------- SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SJ SHIPMENTS::SHIP_TO::COMP WHSE SIN SHIPMENTS::SHIP_TO::COMP WHSE SIN
6.2.6.2 関係を逆転
value
メソッドの別の使い方は、「例6-7」に示すように、リレーションを逆転させることです。 この例では、CUSTOMER_AWJディメンションの祖先属性の関係を逆にして子孫の関係を表すSource
、marketsDescendants
を生成しています。 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
として使用するため、結合操作によって戻されたSource
はmarketsDescendants
に入力としてmktHier
を持ちます。 marketsDescendants
Source
は、ancestorsAttr
要素を祖先とするmktHier
の要素を、ancestorsAttr
の各要素に対して指定します。 marketsDescendants
Source
は、mktHier
を入力として持つため、階層の子孫関係を表す属性と同じように機能します。
この例は、次の行でmktHier
とmarketsDescendants
を結合するときにこれを示します。
Source selValDescendants = marketsDescendants.join(mktHier, selVal);
結合操作では、結合されたSource
、mktHier
は、marketsDescendants
の入力と一致します。 比較Source
は、階層の単一メンバーを指定するselVal
です。 結合操作は、selVal
の子孫であるmarketsDescendants
の要素を指定するselValDescendants
を返します。 結果には祖先メンバー自体も含まれます。 mktHier
Source
は、使用されたjoin
メソッドのシグネチャが、結合されたSource
を出力として持たないSource
を導出するため、selValDescendants
の出力ではありません。
次の例では、join
メソッドの完全シグネチャを使用してselValDescendantsOnly
を生成します。selValDescendantsOnly
には、祖先値ではなく子孫のみが含まれています。 祖先の値を削除するには、この例ではvalue
メソッドを再度使用します。このとき、selValDescendantsOnly
を戻す結合操作のjoined
パラメータであるSource
を戻します。 比較Source
はselVal
であり、比較ルールは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");
selValDescendants
のCursor
の値は次のとおりです。
MARKETS::ACCOUNT::BUSN WRLD MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
selValDescendantsOnly
のCursor
の値は次のとおりです。
MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
selValDescendantsOnly2
のCursor
には、次の値があります。
MARKETS::SHIP_TO::BUSN WRLD HAM MARKETS::SHIP_TO::BUSN WRLD NAN MARKETS::SHIP_TO::BUSN WRLD NY MARKETS::SHIP_TO::BUSN WRLD SJ
6.3 その他のSourceメソッドの使用方法
基本メソッドの様々なシグネチャであるメソッドに加え、Source
クラスには、基本メソッドと組み合せて使用するその他のメソッドが多数あります。 このようなメソッドの中には、at
やoffset
メソッドのように、単一の位置に基づいて選択を実行するメソッドがあります。 また、interval
メソッドのように、位置の範囲に基づいて処理を行うメソッドもあります。 さらに、eq
やgt
のように比較を行うメソッド、selectValue
やremoveValue
のように1つ以上の要素を選択するメソッド、sortAscending
やsortDescendingHierarchically
のように要素をソートするメソッドもあります。
Source
の各サブクラスにも、その他の特殊なメソッドがあります。 たとえば、NumberSource
クラスには、算術関数を実行するメソッド(abs
、div
および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
オブジェクトから要素を選択します。 cost
、units
、および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
Source
のCursor
の値が表示されます。
SHIPMENTS::TOTAL_CUSTOMER::TOTAL CHANNEL_PRIMARY::CHANNEL::DIR CALENDAR_YEAR::MONTH::2001.05 ITEM COST UNITS SOLD SALES AMOUNT -------- ---------- ---------- ------------- ENVY ABM 73,316.10 26 77,825.54 ENVY EXE 111,588.30 37 116,470.45 ENVY STD 92,692.47 39 93,429.57
6.3.2 キューブの作成およびエッジのピボット
典型的なOLAP操作の1つは、多ディメンションのデータ・アレイであるキューブの作成です。 キューブのデータは、キューブの列、行、およびページの辺の要素によって指定されます。 キューブのデータは、メジャーのディメンションのメンバーによって指定されたメジャーからのデータにすることができます。 キューブ・データは、指定された金額を超える単価の販売数量を持つ製品など、メジャー・データの計算によって指定されるディメンション・メンバーでもあります。
このトピックの例の多くは、キューブを作成します。 例6-9では、販売台数をデータとして持つキューブを作成します。 列のエッジ値は、最初はチャネルのディメンション階層から、行のエッジ値は時間ディメンションの階層から、ページのエッジ値は製品および顧客のディメンションの階層からのものです。 ページのエッジ上の製品および顧客メンバーの値は、パラメータ化されたSource
オブジェクトによって表されます。
この例では、階層メンバーの選択肢をディメンションの短い値の説明属性に結合して、結果に属性値が含まれるようにします。 この例では、階層から派生したSource
オブジェクトをメジャーのSource
に結合してcube
問合せを生成します。 この例では、現行のTransaction
をコミットし、次に問合せのCursor
を作成して、その値を表示します。
この例では、Cursor
の値を表示した後、顧客選択のパラメータ化されたSource
のParameter
の値を変更し、同じTransaction
内の同じCursor
を使用して異なる結果セットを取得します。 この例では、Cursor
の位置がリセットされ、Cursor
の値が再び表示されます。
この例では、列の値が時間メンバーであり、行の値がチャネルのメンバーになるように列と行の端をピボットします。 それから、Transaction
をコミットし、問合せに別のCursor
を作成して、その値を表示します。 そして、各Parameter
オブジェクトの値を変更して、Cursor
の値を再表示します。
dp
オブジェクトは、DataProvider
です。 getContext
メソッドは、クロス集計形式でCursor
の値を表示するメソッドを持つContext11g
オブジェクトを取得します。
例6-9 キューブの作成およびエッジのピボット
// Create Parameter objects with values from the hierarchies // of the CUSTOMER_AWJ and PRODUCT_AWJ dimensions. StringParameter custParam = new StringParameter(dp, "SHIPMENTS::REGION::EMEA"); StringParameter prodParam = new StringParameter(dp, "PRODUCT_PRIMARY::FAMILY::LTPC"); // Create parameterized Source objects using the Parameter objects. Source custParamSrc = custParam.createSource(); Source prodParamSrc = prodParam.createSource(); // Select single values from the hierarchies, using the Parameter // objects as the comparisons in the join operations. Source paramCustSel = custHier.join(custHier.value(), custParamSrc); Source paramProdSel = prodHier.join(prodHier.value(), prodParamSrc); // Select members from the other dimensions of the measure. Source timeSel = timeHier.selectValues(new String[] {"CALENDAR_YEAR::YEAR::CY1999" "CALENDAR_YEAR::YEAR::CY2000", "CALENDAR_YEAR::YEAR::CY2001"}); Source chanSel = chanHier.selectValues(new String[] {"CHANNEL_PRIMARY::CHANNEL::DIR", "CHANNEL_PRIMARY::CHANNEL::CAT ", "CHANNEL_PRIMARY::CHANNEL::INT"}); // Join the hierarchy selections to the short description attributes // for the dimensions. Source columnEdge = chanSel.join(chanShortDescr); Source rowEdge = timeSel.join(timeShortDescr); Source page1 = paramProdSel.join(prodShortDescr); Source page2 = paramCustSel.join(custShortDescr); // Join the dimension selections to the measure. Source cube = units.join(columnEdge) .join(rowEdge) .join(page2) .join(page1); // The following method commits the current Transaction. getContext().commit(); // Create a Cursor for the query. CursorManager cursorMngr = dp.createCursorManager(cube); CompoundCursor cubeCursor = (CompoundCursor) cursorMngr.createCursor(); // Display the values of the Cursor as a crosstab. getContext().displayCursorAsCrosstab(cubeCursor); // Change the customer parameter value. custParam.setValue("SHIPMENTS::REGION::AMER"); // Reset the Cursor position to 1 and display the values again. cubeCursor.setPosition(1); println(); getContext().displayCursorAsCrosstab(cubeCursor); // Pivot the column and row edges. columnEdge = timeSel.join(timeShortDescr); rowEdge = chanSel.join(chanShortDescr); // Join the dimension selections to the measure. cube = units.join(columnEdge) .join(rowEdge)) .join(page2) .join(page1); // Commit the current Transaction. getContext().commit(); // Create another Cursor. cursorMngr = dp.createCursorManager(cube); cubeCursor = (CompoundCursor) cursorMngr.createCursor(); getContext().displayCursorAsCrosstab(cubeCursor); // Change the product parameter value. prodParam.setValue("PRODUCT_PRIMARY::FAMILY::DTPC"); // Reset the Cursor position to 1 cubeCursor.setPosition(1); println(); getContext().displayCursorAsCrosstab(cubeCursor);
次のクロス集計の値は、最初のdisplayCursorAsCrosstab
メソッドによって表示されるcubeCursor
の値です。
Portable PCs Europe Catalog Direct Sales Internet 1999 1986 86 0 2000 1777 193 10 2001 1449 196 215
次のクロス集計の値は、custParam
Parameter
オブジェクトの値を変更した後のcubeCursor
の値です。
Portable PCs North America Catalog Direct Sales Internet 1999 6841 385 0 2000 6457 622 35 2001 5472 696 846
次のクロス集計の値は、列エッジおよび行エッジをピボットした後のcubeCursor
の値です。
Portable PCs North America 1999 2000 2001 Catalog 6841 6457 5472 Direct Sales 385 622 696 Internet 0 35 846
最後のクロス集計の値は、prodParam
Parameter
オブジェクトの値を変更した後のcubeCursor
の値です。
Desktop PCs North America 1999 2000 2001 Catalog 14057 13210 11337 Direct Sales 793 1224 1319 Internet 0 69 1748
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メジャーの値の昇順で階層的にソートします。 この例では、ソートされた製品をディメンションの値の簡単な説明属性に結合してから、その操作の結果sortedProductsShortDescr
をunits
に結合します。
連続しているjoinHidden
メソッドは、units
の他のディメンションの選択を結合して、要素値としてメジャーのデータを持ち、出力としてsortedProductsShortDescr
を持つresult
Source
を生成します。 この例でjoinHidden
メソッドを使用するのは、他のディメンションの選択が結果の出力にならないようにするためです。
この例では、次のオブジェクトが使用されています。
-
prodHier
は、PRODUCT_PRIMARY階層のSource
です。 -
units
は、販売された製品単位のUNITS指標のSource
です。 -
prodParentAttr
は、PRODUCT_PRIMARY階層の親属性のSource
です。 -
prodShortDescr
は、PRODUCT_AWJディメンションの短い値の説明属性のSource
です。 -
custSel
は、CUSTOMER_AWJディメンションのSHIPMENTS階層の単一メンバーを指定するSource
です。 メンバーはすべての顧客の合計であるSHIPMENTS::TOTAL_CUSTOMER::TOTAL
です。 -
chanSel
は、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
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 一番左の列は、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ディメンションの階層のprodHier
のselectValue
メソッドを使用して、階層の最高集約レベルであるPRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL
という値を持つ単一要素を指定するtotalProds
を生成します。
NumberSource
units
のjoinHidden
メソッドは、totalProds
をtotalUnits
の出力として表示させずに、合計製品レベルでUNITSメジャー値を指定するtotalUnits
を生成します。 units
のdiv
メソッドは、販売されたユニットの総量で割った各ユニットの販売額を表すSource
を生成します。 times
メソッドは、div
操作の結果に100を掛けてproductShare
を生成します。productShare
は、製品メンバーが販売した総量のパーセンテージまたはシェアを表します。 productShare
Source
には、入力としてunits
メジャーの入力があります。
prodFamilies
オブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSource
オブジェクトです。 結合されたSource
としてproductShare
のjoin
メソッド(prodFamilies
が結合されたもの)は、各製品ファミリが販売する製品の総量のうちのどれかを共有することを指定するSource
を生成します。
custSel
、chanSel
、および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
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列は製品ファミリの値を、右の列は、2001年の直販チャネルを介した全顧客を対象とした販売台数の総数に対する製品ファミリのシェアを表しています。
Product Family Member Share of Total Units Sold ----------------------------- ------------------------- PRODUCT_PRIMARY::FAMILY::LTPC 2.72% PRODUCT_PRIMARY::FAMILY::MON 2.73% PRODUCT_PRIMARY::FAMILY::MEM 3.57% PRODUCT_PRIMARY::FAMILY::DTPC 5.13% PRODUCT_PRIMARY::FAMILY::DOC 6.4% PRODUCT_PRIMARY::FAMILY::DISK 11.71% PRODUCT_PRIMARY::FAMILY::MOD 11.92% PRODUCT_PRIMARY::FAMILY::OS 12.54% PRODUCT_PRIMARY::FAMILY::ACC 43.28%
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
を生成します。 measuresDim
のextract
メソッドは、measuresDim
の要素の値を取得します。 extract
メソッドによって生成されるSource
は、抽出入力としてmeasuresDim
を持ちます。 最初のjoin
メソッドは、extract
メソッドによって返されたSource
の入力にSource
、measuresDim
をマッチさせます。
unitPrice
とunitPriceLag4
の両方のメジャー値には、PRODUCT_AWJおよびTIME_AWJディメンションのSource
オブジェクトが入力として格納されています。 2番目のjoin
メソッドは、TIME_AWJディメンションのCALENDAR_YEAR階層のQUARTERレベルのSource
であるquarterLevel
と、メジャーのTIME_AWJディメンション入力を照合し、結果のSource
の出力にします。
joinHidden
メソッドは、prodSel
とメジャーのPRODUCT_AWJディメンション入力を一致させ、prodSel
を結果のSource
の出力にしません。 prodSel
Source
は、デスクトップPCである単一の階層メンバーPRODUCT_PRIMARY::FAMILY::DTPC
を指定します。
lagResult
Source
は、四半期ごとおよび四半期前の四半期ごとのデスクトップPC製品ファミリの総単価を指定します。
例6-13 lagメソッドの使用方法
NumberSource unitPriceLag4 = unitPrice.lag(mdmCalHier, 4); Source measuresDim = dp.createListSource(new Source[] {unitPrice, unitPriceLag4}); Source lagResult = measuresDim.extract() .join(measuresDim) .join(quarterLevel) .joinHidden(prodSel);
lagResult
Source
のCursor
の値は、次のように列ヘッダーおよび書式が追加された表形式で表示されます。 左の列には四半期が、中央の列には四半期の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メソッドの使用方法
この例では、同じunitPrice
、mdmCalHier
、quarterLevel
、およびprodSel
オブジェクトを「例6-13」として使用しますが、unitPriceMovingTotal
をmeasuresDim
の第2要素として使用します。 unitPriceMovingTotal
Source
は、unitPrice
のmovingTotal
メソッドによって生成されます。 このメソッドは、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
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.3.7 パラメータ化Sourceオブジェクトを使用した要素のセットの選択
「例6-15」は、NumberParameter
オブジェクトを使用して、パラメータ化されたSource
オブジェクトを作成します。 これらのオブジェクトは、prodHier
のinterval
メソッドの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
の値を表示します。
prodShortDescr
のjoin
メソッドは、paramProdSelInterval
の要素値の簡単な説明を取得します。 次の4つのjoin
メソッドは、Source
オブジェクトをunits
メジャーの入力と一致させます。 この例では、Cursor
を作成して、問合せの結果セットを表示します。 次に、resultCursor
のsetPosition
メソッドは、Cursor
の位置を最初の要素に設定します。
NumberParameter
オブジェクトのsetValue
メソッドは、これらのオブジェクトの値を変更し、問合せによって指定された製品Source
の要素の選択を変更します。 この例では、Cursor
の値が再び表示されます。
例6-15 NumberParameterオブジェクトを使用した範囲の選択
NumberParameter startParam = new NumberParameter(dp, 1); NumberParameter endParam = new NumberParameter(dp, 6); NumberSource startParamSrc = (NumberSource)startParam.createSource(); NumberSource endParamSrc = (NumberSource)endParam.createSource(); Source paramProdSelInterval = prodHier.interval(startParamSrc, endParamSrc); Source paramProdSelIntervalShortDescr = prodShortDescr.join(paramProdSelInterval); NumberSource result = (NumberSource)units.join(chanHier, "CHANNEL_PRIMARY::CHANNEL::INT") .join(calHier, "CALENDAR_YEAR::YEAR::CY2001") .join(shipHier, "SHIPMENTS::TOTAL_CUSTOMER::TOTAL") .join(paramProdSelIntervalShortDescr); // Commit the current transaction. getContext().commit(); CursorManager cursorMngr = dp.createCursorManager(result); Cursor resultCursor = cursorMngr.createCursor(); getContext().displayCursor(resultCursor); //Reset the Cursor position to 1. resultCursor.setPosition(1); // Change the value of the parameterized Source. startParam.setValue(7); endParam.setValue(12); // Display the results again. getContext().displayCursor(resultsCursor);
次の表は、列ヘッダーおよび書式を追加して、resultCursor
の値を表示したものです。 左の列には製品階層メンバーがあり、中央の列には短い値の説明があり、右の列には販売台数があります。
Product Description Units Sold ------------------------------------- ---------------------- ---------- PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL Total Product 55,872 PRODUCT_PRIMARY::CLASS::HRD Hardware 21,301 PRODUCT_PRIMARY::FAMILY::DISK Memory 6,634 PRODUCT_PRIMARY::ITEM::EXT CD ROM External 48X CD-ROM 136 PRODUCT_PRIMARY::ITEM::EXT DVD External - DVD-RW - 8X 1,526 PRODUCT_PRIMARY::ITEM::INT 8X DVD Internal - DVD-RW - 8X 1,543 Product Description Units Sold ------------------------------------- ---------------------- ---------- PRODUCT_PRIMARY::ITEM::INT CD ROM Internal 48X CD-ROM 380 PRODUCT_PRIMARY::ITEM::INT CD USB Internal 48X CD-ROM USB 162 PRODUCT_PRIMARY::ITEM::INT RW DVD Internal - DVD-RW - 6X 2,887 PRODUCT_PRIMARY::FAMILY::DTPC Desktop PCs 2,982 PRODUCT_PRIMARY::ITEM::SENT FIN Sentinel Financial 1,015 PRODUCT_PRIMARY::ITEM::SENT MM Sentinel Multimedia 875