6 Sourceメソッドを使用した問合せの作成
問合せを作成するには、取得するデータとそのデータに対して実行する操作を指定するSource
を作成します。 問合せを生成するには、問合せ対象のメジャーおよびディメンションとその属性を表すプライマリSource
オブジェクトから開始します。 通常、プライマリSource
オブジェクトのメソッドを使用して、他の多数のSource
オブジェクトを導出します。各オブジェクトは、ディメンション・メンバーの選択やデータに対して実行する操作など、問合せの一部を指定します。 次に、必要なデータおよび操作を指定するSource
オブジェクトを結合します。 結果は、問合せを表す1つのSource
です。 その後、Source
のCursor
を作成してデータを取得できます。
この章では、様々な種類のSource
メソッドについて簡単に説明し、その一部について詳細に説明します。 また、これらのメソッドを使用した一般的なOLAP問合せの作成方法を説明し、一部については例も示します。
この章では、次の項目について説明します。
6.1 基本Sourceメソッド
Source
クラスには、導出されたSource
を戻す多数のメソッドがあります。 導出されたSource
の要素は、導出されたSource
を戻すSource
である「塩基」 Source
に対する操作の結果です。 Source
クラスの最も基本的な操作を実行するのは、いくつかのメソッドのみです。
Source
クラスの他の多くのメソッドでは、1つ以上の基本メソッドを使用して、値または位置による基本Source
の要素の選択や要素のソートなどの操作を実行します。 この章および「Sourceオブジェクトの理解」の例の多くでは、これらのメソッドの一部を使用します。 その他のSource
メソッドは、getID
、getInputs
、getType
メソッドなどのSource
に関する情報を持つオブジェクトを取得したり、ge
メソッドやgt
メソッドなどの比較を実行したり、Source
の値をあるデータ型から別のデータ型(toDoubleSource
メソッドなど)に変換したりします。
表6-1 基本Sourceメソッド
メソッド | 説明 |
---|---|
ベース |
|
ベース |
|
メソッド・コールの |
|
ベース |
|
|
|
ベース |
次のトピックでは、基本的なSource
メソッドについて説明し、その使用例をいくつか示します。
親トピック: Sourceメソッドを使用した問合せの作成
6.2 基本メソッドの使用方法
- aliasメソッドの使用方法
- distinctメソッドの使用方法
- joinメソッドの使用方法
- positionメソッドの使用方法
- 「recursiveJoinメソッドの使用」
- valueメソッドの使用方法
親トピック: Sourceメソッドを使用した問合せの作成
6.2.1 aliasメソッドの使用方法
alias
メソッドを使用して、入力に対するSource
の一致を制御します。 たとえば、メジャーのディメンションのメンバーによって指定されたメジャー値が、同じディメンションの他のメンバーによって指定されたメジャー値よりも大きいかどうかを調べる場合は、同じ結合操作でメジャーの入力を2回照合する必要があります。 そのためには、同じディメンションの別名である2つのSource
オブジェクトを導出し、メジャーから導出された2つのSource
オブジェクトの入力を作成し、各導出メジャーSource
を関連する別名ディメンションSource
オブジェクトに結合してから、結果を比較します。
例6-1では、このような操作を実行します。 CHANNEL_AWJディメンションの各値の販売単位数が、CHANNEL_AWJディメンションの他の値の販売単位数より多いかどうかを指定するSource
が生成されます。
この例では、メジャーのSource
であるunits
を、メジャーの3つのディメンションの単一値の選択肢であるSource
オブジェクトに結合して、unitsSel
を生成します。 unitsSel
Source
は、unitsSel
の出力であるtimeSel
、custSel
およびprodSel
オブジェクトによって指定されるディメンション値のunits
要素を指定します。 unitsSel
Source
には、入力としてCHANNEL_AWJディメンションのSource
があります。
timeSel
、custSel
およびprodSel
Source
オブジェクトは、それぞれTIME_AWJ、CUSTOMER_AWJおよびPRODUCT_AWJディメンションの階層から1つの値を指定します。 timeSel
値はCALENDAR_YEAR::MONTH::2001.01
で、2001年1月を識別し、custSel
値はSHIPMENTS::SHIP_TO::BUSN WRLD SJ
で、Business World San Joseの顧客を識別し、prodSel
値はPRODUCT_PRIMARY::ITEM::ENVY ABM
で、Envoy AmbassadorポータブルPCを識別します。
次の例では、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSource
であるchanHier
に対して、2つの別名chanAlias1
およびchanAlias2
を作成します。 次に、chanAlias1.value()
によって戻されるSource
とunitsSel
を結合して、unitsSel1
を生成します。 unitsSel1
Source
は、unitsSel
の要素と出力を持ち、入力としてchanAlias1
を持ちます。 同様に、この例では、入力としてchanAlias2
を持つunitsSel2
が生成されます。
この例では、unitsSel1
のgt
メソッドを使用して、unitsSel1
の値がunitsSel2
の値より大きいかどうかを判断します。 最終結合操作は、chanAlias1
とunitsSel1
の入力を一致させ、chanAlias2
とunitsSel2
の入力を一致させます。
例6-1 aliasメソッドを使用したソース付き入力照合の制御
Source unitsSel = units.join(timeSel).join(custSel).join(prodSel); Source chanAlias1 = chanHier.alias(); Source chanAlias2 = chanHier.alias(); NumberSource unitsSel1 = (NumberSource) unitsSel.join(chanAlias1.value()); NumberSource unitsSel2 = (NumberSource) unitsSel.join(chanAlias2.value()); Source result = unitsSel1.gt(unitsSel2) .join(chanAlias1) // Output 2, column .join(chanAlias2); // Output 1, row;
result
Source
は、chanAlias1
のチャネル値に対するunitsSel1
の販売ユニット値が、chanAlias2
のチャネル値に対するunitsSel2
の販売ユニット値より大きいかどうかという問合せを指定 result
は、unitsSel1.gt(unitsSel2).join(chanAlias1)
によって戻されるSource
へのchanAlias2
の結合によって生成されるため、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メソッドの使用方法
「例6-2」に示すように、distinct
メソッドを使用して、重複した値がないSource
を生成します。 この例では、ディメンション・メンバーの2つの選択を結合します。 ディメンション・メンバーの中には、両方の選択肢に存在するものがあります。 この例では、distinct
メソッドを使用して、重複値のない一意のディメンション・メンバーのみを含むSource
を生成します。
この例では、CUSTOMER_AWJディメンションのMdmStandardDimension
オブジェクトを取得し、そのディメンションのMARKETS階層のMdmLevelHierarchy
オブジェクトを取得します。 MdmLevelHierarchy
のStringSource
オブジェクトmktHier
を取得します。 次に、mktHier
のselectValues
メソッドを使用して、階層のメンバーcustomersToSelect
とmoreCustomersToSelect
の2つの選択を生成します。 customersToSelect
のメンバーの2つもmoreCustomersToSelect
に存在します。
この例では、appendValues
メソッドを使用して、combinedCustomers
Source
のcustomersToSelect
とmoreCustomersToSelect
の要素を結合します。 最後に、この例では、combinedCustomers
のdistinct
メソッドを使用して、階層の個別のメンバーのみを持つSource
、distinctCombinedCustomers
を返します。
例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メソッドの使用方法
「Sourceオブジェクトの理解」で説明されているように、join
メソッドを使用して、メソッドのjoined
、comparison
およびcomparisonRule
パラメータによって決定される、ベースSource
の要素を含むSource
を生成します。 visible
パラメータは、joined
パラメータSource
が、結合操作によって生成されるSource
の出力であるかどうかを決定します。 また、join
メソッドを使用して、Source
をベースまたはjoined
パラメータSource
の入力と照合します。
この章の例のほとんどは、「Sourceオブジェクトの理解」の例の多くと同様に、join
メソッドの1つ以上のシグネチャを使用します。 「例6-3」は、完全なjoin
シグネチャと最も単純なjoin
シグネチャを使用します。 この例では、完全なjoin
シグネチャは、comparisonRule
パラメータとしてCOMPARISON_RULE_DESCENDING
を使用することを示しています。
「例6-3」は、次のSource
オブジェクトを使用します。
-
prodSelWithShortDescr
。これは、PRODUCT_AWJディメンションの簡単な説明属性を、ディメンションのPRODUCT_PRIMARY階層のFAMILY階層レベルのSource
と結合することによって生成されるSource
です。 -
salesMeasure
。これは、UNITS_CUBE_AWJキューブのSALESメジャーのSource
です。 -
timeSelWithShortDescr
。これは、ディメンションのCALENDAR_YEAR階層の選択したメンバーについて、TIME_AWJディメンションの簡単な説明属性をSource
と結合することによって生成されるSource
です。 -
custSelWithShortDescr
。これは、ディメンションのSHIPMENTS階層の選択したメンバーのCUSTOMER_AWJディメンションの簡単な説明属性をSource
と結合することによって生成されるSource
です。 -
chanSelWithShortDescr
。これは、ディメンションのCHANNEL_PRIMARY階層の選択したメンバーについて、CHANNEL_AWJディメンションの簡単な説明属性をSource
と結合することによって生成されるSource
です。
最初の結合操作では、prodSelWithShortDescr
をベースSource
、salesMeasure
を結合Source
、Numberデータ型のSource
を比較Source
として使用し、COMPARISON_RULE_DESCENDING
を比較ルールとして使用して、join
メソッドの完全なシグネチャを使用します。 その結合操作によって返されるSource
には、製品ファミリ・レベルのメンバーおよび関連する製品の概略値がベース値として、売上額が降順で出力されます。
次の3つの結合操作は、メジャーの他の3つのディメンションの1つのメンバー選択を結合します。 result
Source
は、すべての顧客およびすべてのチャネルについて、2001年5月の売上金額の降順で製品ファミリ・レベルのメンバーを指定します。
例6-3 COMPARISON_RULE_DESCENDINGの使用
Source result = prodSelWithShortDescr.join(salesMeasure, salesMeasure.getDataType(), Source.COMPARISON_RULE_DESCENDING, true) .join(timeSelWithShortDescr) .join(custSelWithShortDescr) .join(chanSelWithShortDescr);
result
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メソッドの使用方法
position
メソッドを使用して、ベース要素の位置を持ち、入力としてベースを持つSource
を生成します。 「例6-4」は、position
メソッドを使用して、TIME_AWJディメンションの階層のレベルの最初と最後のメンバーの選択を指定するSource
を生成します。
この例では、mdmTimeDim
はTIME_AWJディメンションのMdmPrimaryDimension
です。 この例では、ディメンションのレベル属性とCALENDAR_YEAR階層を取得します。 次に、属性および階層のSource
オブジェクトを取得します。
次に、この例ではSource
オブジェクトの配列を作成し、階層のMdmHierarchyLevel
コンポーネントのList
を取得します。 各レベルのSource
オブジェクトを取得して配列に追加し、そのレベルのSource
オブジェクトを要素値として持つリストSource
を作成します。
この例では、levelMembers
が生成されます。これは、階層レベルのメンバーを指定するSource
です。 結合操作のcomparison
パラメータはlevelList.value()
によって生成されるSource
であるため、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メソッドの使用
recursiveJoin
メソッドを使用して、階層的に順序付けされた要素を含むSource
を生成します。 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
の結果をパッケージ属性に結合して、パッケージ属性値を要素値として、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
メソッドは、custSel
を生成します。これは、shipHier
の一部の要素の選択です。 custSel
のselectValues
メソッドは、その選択のサブセットであるcustSel2
を生成します。
最初のjoin
メソッドのベースはcustSel
で、結合されたSource
です。 比較Source
としてcustSel2
があります。 結果のSource
、result1
の要素は、ベースのデカルト積であり、比較Source
で指定された結合Source
オブジェクトです。 result1
Source
には、比較Source
にあるcustSel
の各要素について、custSel
の要素の1セットがあります。 visible
パラメータのtrue
値により、結合されたSource
がresult1
の出力になります。
2番目のjoin
メソッドには、ベースとしてcustSel
、比較Source
としてcustSel2
もありますが、結合Source
としてcustSel.value()
メソッドによって戻されるSource
があります。 custSel
は結合されたSource
の入力であるため、ベースSource
はその入力と一致します。 この入力関係により、結果のSource
、result2
は、比較Source
にも含まれるcustSel
の要素のみを持ちます。
例6-6 ソースの要素のサブセットの選択
StringSource custSel = shipHier.selectValues(new String[] {"SHIPMENTS::SHIP_TO::COMP WHSE SIN", "SHIPMENTS::SHIP_TO::COMP WHSE LON", "SHIPMENTS::SHIP_TO::COMP WHSE SJ", "SHIPMENTS::SHIP_TO::COMP WHSE ATL"}); Source custSel2 = custSel.selectValues(new String[] {"SHIPMENTS::SHIP_TO::COMP WHSE SIN", "SHIPMENTS::SHIP_TO::COMP WHSE SJ"}); Source result1 = custSel.join(custSel, custSel2, true); Source result2 = custSel.join(custSel.value(), custSel2, true);
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
親トピック: valueメソッドの使用
6.2.6.2 リレーションの戻し処理
value
メソッドのもう1つの使用方法は、「例6-7」に示すように、リレーションを逆にすることです。 この例では、CUSTOMER_AWJディメンションの祖先属性リレーションを逆にして、子孫リレーションを表すSource
、marketsDescendants
を生成します。 marketsDescendants
Source
は、ディメンションのMARKETS階層のSource
を入力として持ちます。 marketsDescendants
を、その入力と一致するSource
と結合すると、階層の参加メンバーの子孫を指定するSource
が取得されます。
リレーションを戻すもう1つの例は、「例6-10」です。 親属性を戻して親の子を取得する際に、value
メソッドを使用します。
「例6-7」は、最初にCUSTOMER_AWJディメンションのMdmStandardDimension
オブジェクトと、そのディメンションのMARKETS階層のMdmLevelHierarchy
オブジェクトを取得します。 階層のSource
を取得します。
次の例では、ディメンションの祖先属性とディメンションのSource
を取得します。 祖先属性は、各ディメンション・メンバーをそのメンバーの祖先に関連付けます。
ディメンションの各メンバーの子孫を表すSource
を生成するために、この例では、階層mktHier
のSource
を祖先属性ancestorsAttr
と結合して、祖先のリレーションを逆にします。 結合操作では、mktHier.value()
が比較Source
として使用されるため、結合操作marketsDescendants
によって返されるSource
が入力としてmktHier
を持ちます。 marketsDescendants
Source
は、ancestorsAttr
の各要素に対して、ancestorsAttr
要素を祖先とするmktHier
の要素を指定します。 入力としてmktHier
があるため、marketsDescendants
Source
は、階層の子孫関係を表す属性と同じように機能します。
この例では、次の行でmktHier
をmarketsDescendants
に結合する場合を示しています。
Source selValDescendants = marketsDescendants.join(mktHier, selVal);
結合操作では、結合されたSource
、mktHier
がmarketsDescendants
の入力と一致します。 比較Source
は、階層の1つのメンバーを指定するselVal
です。 結合操作では、selVal
メンバーの子孫であるmarketsDescendants
の要素を指定するselValDescendants
が返されます。 結果には、祖先メンバー自体も含まれます。 mktHier
Source
は、selValDescendants
の出力ではありません。使用されるjoin
メソッドのシグネチャは、結合されたSource
を出力として持たないSource
を導出するためです。
次の例では、join
メソッドの完全なシグネチャを使用して、祖先の値ではなく子孫のみを含むselValDescendantsOnly
を生成します。 祖先の値を削除するには、この例ではvalue
メソッドを再度使用し、今度はselValDescendantsOnly
を戻す結合操作のjoined
パラメータであるSource
を戻します。 比較Source
はselVal
で、比較ルールはCOMPARISON_RULE_REMOVE
です。
最後に、この例では、removeValue
メソッドを使用して、selValDescendantsOnly
と同じselValDescendantsOnly2
を生成します。 これは、removeValue
メソッドが、selValDescendantsOnly
を戻した結合操作のショートカットであることを示しています。
例6-7 値メソッドを使用したリレーションの戻し処理
MdmStandardDimension mdmCustDim = mdmDBSchema.findOrCreateStandardDimension("CUSTOMER_AWJ"); MdmLevelHierarchy mdmMktHier = mdmCustDim.findOrCreateLevelHierarchy("MARKETS"); StringSource mktHier = (StringSource)mdmMktHier.getSource(); MdmAttribute mdmAncestorsAttr = mdmCustDim.getAncestorsAttribute(); Source ancestorsAttr = mdmAncestorsAttr.getSource(); // Reverse the ancestors relation to get the descendants relation. Source marketsDescendants = mktHier.join(ancestorsAttr, mktHier.value()); Source selVal = mktHier.selectValue("MARKETS::ACCOUNT::BUSN WRLD"); // Select the descendants of the specified hierarchy member. StringSource selValDescendants = (StringSource)marketsDescendants.join(mktHier, selVal); // Remove the ancestor value so that only the descendants remain. Source selValDescendantsOnly = selValDescendants.join(selValDescendants.value(), selVal, Source.COMPARISON_RULE_REMOVE), false; // Produce the same result using the removeValue method. Source selValDescendantsOnly2 = selValDescendants.removeValue("MARKETS::ACCOUNT::BUSN WRLD");
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
親トピック: valueメソッドの使用
6.3 その他のSourceメソッドの使用方法
Source
クラスには、基本メソッドの様々なシグネチャであるメソッドとともに、基本メソッドの組合せを使用する他の多くのメソッドがあります。 一部のメソッドは、at
メソッドやoffset
メソッドなど、単一の位置に基づいて選択を実行します。 その他は、interval
メソッドなど、様々な位置で動作します。 eq
やgt
などの比較を実行したり、selectValue
やremoveValue
などの要素を1つ以上選択したり、sortAscending
やsortDescendingHierarchically
などの要素をソートします。
Source
のサブクラスには、他の特殊なメソッドもあります。 たとえば、NumberSource
クラスには、abs
、div
、cos
などの数学的関数を実行する多数のメソッドと、average
やtotal
などの集計を実行するメソッドがあります。
次のトピックでは、Source
メソッドの一部の使用例を示します。 例の中には、OLAPアプリケーションで一般的に実行するタスクもあります。
- extractメソッドの使用方法
- キューブの作成およびエッジのピボット
- 階層内でのドリルアップおよびドリルダウン
- メジャー値による階層的ソート
- NumberSourceメソッドを使用した販売台数のシェアの計算
- 時系列操作に基づいた選択
- パラメータ化Sourceオブジェクトを使用した要素のセットの選択
親トピック: Sourceメソッドを使用した問合せの作成
6.3.1 extractメソッドの使用方法
extract
メソッドを使用して、別のSource
の要素の値であるSource
の値を抽出します。 Source
の要素にSource
オブジェクトではない要素値がある場合、extract
メソッドはvalue
メソッドと同様に動作します。
「例6-8」は、extract
メソッドを使用して、リストSource
measDim
の要素の値であるNumberSource
オブジェクトの値を取得します。 各NumberSource
オブジェクトは1つのメジャーを表します。
この例では、UNITS_CUBE_AWJキューブのディメンションの階層のStringSource
オブジェクトから要素を選択します。 cost
、units
およびsales
オブジェクトは、キューブのCOST、UNITSおよびSALESメジャーに対するNumberSource
オブジェクトです。
次に、この例ではmeasDim
を作成します。これは、3つのNumberSource
オブジェクトを要素値として持つリストSource
です。 次に、extract
メソッドを使用して、NumberSource
オブジェクトの値を取得します。 結果の名前のないSource
は、抽出入力としてmeasDim
を持ちます。 最初の結合操作には、ベースSource
としてmeasDim.extract()
があります。 ベースSource
の入力は、joined
パラメータであるmeasDim
と一致します。 次に、ディメンション選択を結合してresult
Source
を生成し、メジャーの他の入力を照合します。
例6-8 extractメソッドの使用方法
Source prodSel = prodHier.selectValues(new String[] {"PRODUCT_PRIMARY::ITEM::ENVY STD", "PRODUCT_PRIMARY::ITEM::ENVY EXE", "PRODUCT_PRIMARY::ITEM::ENVY ABM"}); Source chanSel = chanHier.selectValue("CHANNEL_PRIMARY::CHANNEL::DIR"); Source timeSel = timeHier.selectValue("CALENDAR_YEAR::MONTH::2001.05"); Source custSel = custHier.selectValue("SHIPMENTS::TOTAL_CUSTOMER::TOTAL"); Source measDim = dp.createListSource(new Source[] {cost, units, sales}); Source result = measDim.extract().join(measDim) // column .join(prodSel) // row .join(timeSel) // page .join(chanSel) // page .join(custSel); // page
次のクロス集計では、result
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
親トピック: その他のSourceメソッドの使用
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
親トピック: その他のSourceメソッドの使用
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
親トピック: その他のSourceメソッドの使用
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
。Source
で、CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層の単一メンバーを指定します。 メンバー値は、直接販売チャネルであるCHANNEL_PRIMARY::CHANNEL::DIR
です。 -
timeSel
。Source
で、TIME_AWJディメンションのCALENDAR_YEAR階層の単一メンバーを指定します。 メンバーはCALENDAR_YEAR::YEAR::CY2001
で、2001年です。
例6-11 メジャー値による階層的ソート
Source sortedProduct = prodHier.recursiveJoin(units, units.getDataType(), prodParentAttr, Source.COMPARISON_RULE_ASCENDING, true, // Parents first true); // Restrict parents to base Source sortedProductShortDescr = prodShortDescr.join(sortedProduct); Source result = units.join(sortedProductShortDescr) .joinHidden(custSel) .joinHidden(chanSel) .joinHidden(timeSel);
result
Source
のCursor
には、列見出しおよび書式設定が追加された表に表示される次の値があります。 左側の列には、PRODUCT_PRIMARY
階層内のレベルの名前があります。 左から2番目の列は製品識別子の値を示し、左から3番目の列は製品の値の簡単な説明を示します。 一番右の列は、2001年に直販チャネルを介して全顧客に販売された製品の単位数を示します。
表には、Cursor
の最初の9個と最後の11個の値、およびSoftware/Otherクラス値のみが含まれます。 製品値は、販売ユニット別に階層的かつ昇順でリストされます。 Software/Otherクラスの販売台数が多いため、Software/Otherクラスの前にHardwareクラスが表示されます。 Hardwareクラスでは、Portable PCsファミリが最も少ないユニットを販売しているため、最初に表示されます。 Software/Otherクラスでは、Accessoriesファミリの販売台数が最も多いため、最後に表示されます。
Product Level ID Description Units Sold ------------- ------------ ----------------------------- ---------- TOTAL_PRODUCT TOTAL Total Product 43,785 CLASS HRD Hardware 16,543 FAMILY LTPC Portable PCs 1,192 ITEM ENVY ABM Envoy Ambassador 330 ITEM ENVY EXE Envoy Executive 385 ITEM ENVY STD Envoy Standard 477 FAMILY MON Monitors 1,193 ITEM 19 SVGA Monitor- 19" Super VGA 207 ITEM 17 SVGA Monitor- 17"Super VGA 986 ... CLASS SFT Software/Other) 27,242 ... FAMILY ACC Accessories 18,949 ITEM ENVY EXT KBD Envoy External Keyboard 146 ITEM EXT KBD External 101-key keyboard 678 ITEM MM SPKR 5 Multimedia speakers- 5" cones 717 ITEM STD MOUSE Standard Mouse 868 ITEM MM SPKR 3 Multimedia speakers- 3" cones 1,120 ITEM 144MB DISK 1.44MB External 3.5" Diskette 1,145 TEM KBRD REST Keyboard Wrist Rest 2,231 ITEM LT CASE Laptop carrying case 3,704 ITEM DLX MOUSE Deluxe Mouse 3,884 ITEM MOUSE PAD Mouse Pad 4,456
親トピック: その他のSourceメソッドの使用
6.3.5 NumberSourceメソッドを使用した販売台数のシェアの計算
「例6-12」は、NumberSource
メソッドdiv
およびtimes
を使用して、デスクトップPCおよびポータブルPCファミリが、選択した時間、顧客およびチャネル値に対して販売された製品ユニットの合計数量を保持するシェアを指定するSource
を生成します。 この例では、最初にPRODUCT_AWJディメンションの階層のSource
であるprodHier
のselectValue
メソッドを使用して、階層の最上位の集計レベルであるPRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL
という値を持つ単一の要素を指定するtotalProds
を生成します。
NumberSource
units
のjoinHidden
メソッドは、totalUnits
を生成します。このメソッドは、totalProds
がtotalUnits
の出力として表示されることなく、合計製品レベルでUNITSメジャー値を指定します。 次に、units
のdiv
メソッドにより、各販売ユニットの値を合計販売ユニット数で割った値を表すSource
が生成されます。 times
メソッドは、そのdiv
操作の結果に100を乗算して、製品メンバーが販売ユニットの合計数量を持つ割合(シェア)を表すproductShare
を生成します。 productShare
Source
は、units
メジャーの入力を入力として持ちます。
prodFamilies
オブジェクトは、PRODUCT_PRIMARY階層のFAMILYレベルのSource
です。 productShare
のjoin
メソッド(結合Source
としてprodFamilies
を指定)は、各製品ファミリが販売した製品の合計数量を持つシェアを指定するSource
を生成します。
custSel
、chanSel
およびtimeSel
Source
オブジェクトは、CUSTOMER_AWJ、CHANNEL_AWJおよびTIME_AWJディメンションの階層の単一メンバーの選択です。 残りのjoin
メソッドは、result
を生成するために、これらのSource
オブジェクトをproductShare
の他の入力と一致させます。 join
メソッドのjoin(Source joined, String comparison)
シグネチャは、結合されたSource
を出力として持たないSource
を生成します。
result
Source
は、2001年の直接販売チャネルを介してすべての顧客に販売された製品の合計数量の各製品ファミリのシェアを指定します。
例6-12 販売台数のシェアの取得
Source totalProds = prodHier.selectValue("PRODUCT_PRIMARY::TOTAL_PRODUCT::TOTAL"); NumberSource totalUnits = (NumberSource) units.joinHidden(totalProds); Source productShare = units.div(totalUnits).times(100); Source result = productShare.join(prodFamilies) .join(timeHier, "CALENDAR_YEAR::YEAR::CY2001") .join(chanHier, "CHANNEL_PRIMARY::CHANNEL::DIR") .join(custHier, "SHIPMENTS::TOTAL_CUSTOMER::TOTAL"); Source sortedResult = result.sortAscending();
sortedResult
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%
親トピック: その他のSourceメソッドの使用
6.3.6 時系列操作に基づいた選択
このトピックでは、TIME_AWJディメンションのCALENDAR_YEAR階層に対してMdmLevelHierarchy
の一連の要素を操作するメソッドの使用例を2つ示します。 「例6-13」は、UNIT_PRICEメジャーのSource
であるunitPrice
のlag
メソッドを使用して、階層のメンバーと一致するunitPrice
の各要素について、階層内の同じレベルで4つの期間前の階層メンバーと一致するunitPrice
の要素を指定するunitPriceLag4
を生成します。
この例では、dp
はDataProvider
です。 createListSource
メソッドは、unitPrice
およびunitPriceLag4
Source
オブジェクトを要素値として持つmeasuresDim
を作成します。 measuresDim
のextract
メソッドは、measuresDim
の要素の値を取得します。 extract
メソッドによって生成されるSource
は、抽出入力としてmeasuresDim
を持ちます。 最初のjoin
メソッドは、Source
、measuresDim
、extract
メソッドによって返されるSource
の入力に一致します。
unitPrice
メジャーとunitPriceLag4
メジャーはどちらも、PRODUCT_AWJディメンションとTIME_AWJディメンションのSource
オブジェクトを入力として持ちます。 2番目のjoin
メソッドは、TIME_AWJディメンションのCALENDAR_YEAR階層のQUARTERレベルのSource
であるquarterLevel
と、メジャーのTIME_AWJディメンション入力と一致し、結果のSource
の出力になります。
joinHidden
メソッドは、prodSel
とメジャーのPRODUCT_AWJディメンション入力を照合し、prodSel
を結果のSource
の出力にしません。 prodSel
Source
は、デスクトップPCである単一の階層メンバーPRODUCT_PRIMARY::FAMILY::DTPC
を指定します。
lagResult
Source
は、各四半期および4四半期前の四半期のデスクトップPC製品ファミリの総単価を指定します。
例6-13 lagメソッドの使用方法
NumberSource unitPriceLag4 = unitPrice.lag(mdmCalHier, 4); Source measuresDim = dp.createListSource(new Source[] {unitPrice, unitPriceLag4}); Source lagResult = measuresDim.extract() .join(measuresDim) .join(quarterLevel) .joinHidden(prodSel);
lagResult
Source
のCursor
には、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列には四半期があり、中央の列にはその四半期のデスクトップPCファミリのメンバーの単価の合計があり、右の列には4四半期前の四半期の単価の合計があります。 右側の列の最初の4つの値はNA
です。これは、四半期5のQ1-98がCALENDAR_YEAR階層の最初の四半期であるためです。 表には、最初の8つの四半期のみが含まれます。
Unit Price Quarter Unit Price Four Quarters Before --------------------------------- ---------- -------------------- CALENDAR_YEAR::QUARTER::CY1998.Q1 2687.54 NA CALENDAR_YEAR::QUARTER::CY1998.Q2 2704.48 NA CALENDAR_YEAR::QUARTER::CY1998.Q3 2673.27 NA CALENDAR_YEAR::QUARTER::CY1998.Q4 2587.76 NA CALENDAR_YEAR::QUARTER::CY1999.Q1 2394.79 2687.54 CALENDAR_YEAR::QUARTER::CY1999.Q2 2337.18 2704.48 CALENDAR_YEAR::QUARTER::CY1999.Q3 2348.39 2673.27 CALENDAR_YEAR::QUARTER::CY1999.Q4 2177.89 2587.76 ...
例6-14 movingTotalメソッドの使用方法
この例では、「例6-13」と同じunitPrice
, mdmCalHier
, quarterLevel
およびprodSel
オブジェクトを使用しますが、measuresDim
の2番目の要素としてunitPriceMovingTotal
メジャーを使用します。 unitPriceMovingTotal
Source
は、unitPrice
のmovingTotal
メソッドによって生成されます。 このメソッドは、dimension
パラメータとしてTIME_AWJディメンションのCALENDAR_YEAR階層のMdmLevelHierarchy
であるmdmCalHier
を提供し、開始オフセット値と終了オフセット値として整数0
および3
を提供します。
movingTotalResult
Source
は、四半期ごとに、その四半期のデスクトップPCファミリのメンバーの単価の集計と、その単価の合計に次の3四半期の単価を加算した値を指定します。
NumberSource unitPriceMovingTotal = unitPrice.movingTotal(mdmCalHier, 0, 3); Source measuresDim = dp.createListSource(new Source[]{unitPrice, unitPriceMovingTotal}); Source movingTotalResult = measuresDim.extract() .join(measuresDim) .join(quarterLevel) .joinHidden(prodSel);
movingTotalResult
Source
のCursor
には、列見出しおよび書式設定が追加された表に表示される次の値があります。 左の列には四半期があり、中央の列にはその四半期のデスクトップ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.3.7 パラメータ化Sourceオブジェクトを使用した要素のセットの選択
「例6-15」は、NumberParameter
オブジェクトを使用して、パラメータ化されたSource
オブジェクトを作成します。 これらのオブジェクトは、prodHier
のinterval
メソッドのbottom
およびtop
パラメータです。 このメソッドは、paramProdSelInterval
を返します。これは、bottom
から階層のtop
位置までのprodHier
要素のセットを指定するSource
です。
製品Source
の要素は、result
Source
に表示されるunits
メジャーの要素を指定します。 Parameter
オブジェクトの値を変更すると、同じCursor
を使用し、新しいSource
およびCursor
オブジェクトを生成することなく、異なる販売単位値セットを選択できます。
この例では、次のオブジェクトが使用されています。
-
dp
。これはセッションのDataProvider
です。 -
prodHier
。PRODUCT_AWJディメンションのPRODUCT_PRIMARY階層のSource
です。 -
prodShortDescr
。これは、PRODUCT_AWJディメンションの短縮値記述属性のSource
です。 -
units
。これは、販売された製品ユニットのUNITSメジャーのSource
です。 -
chanHier
。CHANNEL_AWJディメンションのCHANNEL_PRIMARY階層のSource
です。 -
calHier
。TIME_AWJディメンションのCALENDAR_YEAR階層のSource
です。 -
shipHier
。CUSTOMER_AWJディメンションのSHIPMENTS階層のSource
です。 -
getContext
メソッドによって返されるContext11g
オブジェクト。Context11g
には、現在のTransaction
をコミットするメソッドがあり、テキストを表示する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
親トピック: その他のSourceメソッドの使用