計算ディメンジョンの定義
計算ディメンジョンは強力で、メンバを実行時にクエリ経由で定義できる高度な InterSystems IRIS Business Intelligence モデル・オプションです。ここでは、これらを定義する方法を説明します。
計算ディメンジョンとその他の基本 Business Intelligence モデル要素との比較については、"InterSystems Business Intelligence のモデルの定義" の "モデル・オプションの概要" を参照してください。
計算ディメンジョンには計算メンバとの関連付けはありません。計算ディメンジョンは Business Intelligence に固有です。計算メンバは、MDX の標準的な概念です。
SQL 計算ディメンジョンの定義
SQL 計算ディメンジョンには、実行時に SQL クエリによって決定されるメンバが含まれます。メンバごとにクエリを指定します。
NULL 置換オプションは、計算ディメンジョンに影響しません。
計算ディメンジョンの例
Patients キューブには ComputedD ディメンジョンがあります。これは、2 つのメンバ (member 1 および member 2) を定義します。これらの各メンバは、特定の患者の ID を取得する SQL クエリによって定義されます。以下は、アナライザの左の領域に示すように、これらのメンバを示します。
このディメンジョン、Computed レベル、およびメンバは、キューブの他の要素を使用する場合と同様に使用できます。
同様に、HoleFoods キューブには、Comments ディメンジョンがあります。これは、2 つのメンバ Complaints および Compliments を定義します。これらのメンバは、SQL クエリによっても定義されます。
SQL 計算ディメンジョンの定義
以下の手順を使用すると、容易に SQL 計算ディメンジョンを定義できます。
-
アーキテクトを使用して、必要な名前でディメンジョン、階層、およびレベルを追加します。
後で変更するため、選択するディメンジョンのタイプは重要でありません。
ソース・プロパティやソース式は指定しないでください。
この手順では、スタジオでの編集が容易なシェルを作成します。またアーキテクトでは、便宜上、表示名を初期化して名前と同じにします。
-
スタジオでキューブ・クラスを開きます。
-
計算ディメンジョンに対応する <dimension> 要素を変更します。以下のように変更します。
-
type 属性を以下のように編集します。
type="computed"
-
<dimension> 要素に以下のいずれかを追加します。
dimensionClass="SQL" dimensionClass="%DeepSee.ComputedDimension.SQL
dimensionClass 属性は、ヘルパー・クラスを参照します。完全なパッケージおよびクラス名を指定しないと、このクラスは %DeepSee.ComputedDimension パッケージ内にあると見なされます。%DeepSee.ComputedDimension.SQLOpens in a new tab クラスは、SQL ベースの計算ディメンジョンのヘルパー・クラスです。その他のタイプの計算ディメンジョンは、このドキュメントの対象ではありません。
以下に例を示します。
<dimension name="New Computed Dimension" displayName="New Computed Dimension" disabled="false" hasAll="false" type="computed" dimensionClass="SQL" >
既定では、このようには改行されません。この例では読みやすくするために改行が追加されています。
-
-
レベルを定義するセクションを見つけます。
<level name="New Computed Level" displayName="New Computed Level" disabled="false" list="false" useDisplayValue="true"> </level>
-
</level> 行の直前で、以下のように行を追加します。
<member name="" displayName="" spec="" />
以下のように編集します。
属性 値 name メンバ名。 displayName このメンバのオプションの表示名。 description アナライザの左側の領域にツールヒントとして表示するオプションのテキスト。 spec このキューブで使用されるファクト・テーブルの 1 つ以上のレコードの ID を返す SQL SELECT クエリ。ファクト・テーブルを参照するには、トークン $$$TABLE または完全なテーブル名を使用します。ファクト・テーブルの詳細は、"InterSystems Business Intelligence のモデルの定義" の "ファクト・テーブルおよびディメンジョン・テーブルの詳細" を参照してください。"spec のバリエーション" も参照してください。 以下に例を示します。
member name="example member 1" displayName="member 1" spec="select ID from BI_Model_PatientsCube.Fact WHERE MxAge<50 AND DxHomeCity->DxHomeCity='Elm Heights'" />
これらの属性で XML 予約文字を使用することはできません。置換については、"XML 予約文字" を参照してください。
-
その他の <member> 要素を必要に応じて追加します。
これらの要素の順序によって、対応するメンバの既定の並べ替え順序が決まります。
-
クラスを保存し、リコンパイルします。
これを実行するとすぐに、新しいディメンジョンとそのメンバを使用できるようになります。
サンプルの詳細
Patients キューブでは ComputedD ディメンジョンに以下のメンバが含まれています。
-
member 1 は、以下の SQL クエリによって定義されます。
select ID from BI_Model_PatientsCube.Fact WHERE MxAge<50 AND DxHomeCity->DxHomeCity='Elm Heights'
このクエリは、キューブのファクト・テーブルを使用します。詳細は、"InterSystems Business Intelligence のモデルの定義" の "ファクト・テーブルおよびディメンジョン・テーブルの詳細" を参照してください。
-
member 2 は、以下の SQL クエリによって定義されます。
select ID from $$$TABLE WHERE MxAge=40 AND DxHomeCity->DxHomeCity='Juniper'
このクエリは $$$TABLE を使用します。これはファクト・テーブルの実際の名前に置き換えられます。前のクエリとは異なり、このクエリは $$$TABLE トークンを変換するための情報がないため、管理ポータルでは有効ではありません。
以下のピボット・テーブルに、これらのメンバが示されています。
例えば、この例の member 1 は、平均年齢 24.50 歳の 801 人の患者で構成されています。
spec のバリエーション
可能な spec のバリエーションは以下のとおりです。
-
キューブのベース・クラスにクエリに適したインデックスがある場合は、代わりにそのクラスをクエリで参照することもできます。このクラスの ID は、ファクト・テーブルで使用される ID と同じです。
これは、頻繁に変更されるグループを反映するディメンジョンが必要な場合やキューブの再構築や同期化を回避したい場合に役立ちます。
-
省略表現として、SELECT 文の代わりに WHERE 節を使用することができます。この場合は、WHERE 節を使用する SELECT 文が生成されます。この文では、ファクト・テーブルから ID を選択します。
例は、このセクションで後述する計算ディメンジョンの例の By Industry レベルのメンバを参照してください。
-
省略表現として、トークン $$$FACT を使用してファクト・テーブル内のフィールドを参照できます。そのためには、レベルで、factName 属性にそのフィールドの名前を指定します。以下に例を示します。
<level name="By Allergy Count" factName="Mx1968652733I" >
次に、SELECT 文 (または WHERE 節) で、$$$FACT を使用してこのフィールドを参照します。このトークンが適切に解析されるように、トークンの前後に必ずスペースを挿入してください。
例は、このセクションで後述する計算ディメンジョンの例の By Allergy Count レベルのメンバを参照してください。
-
SELECT 文または WHERE 節を使用する代わりに、ストアド・プロシージャを呼び出す CALL 文を使用できます。以下に例を示します。
spec="CALL MyStoredProcedure()"
ストアド・プロシージャでは、メソッド・キーワード SqlProc およびReturnResultsets の両方を必ず True に指定してください。以下に例を示します。
ClassMethod GetPatientIsDiabetic() As %Integer [ ReturnResultsets, SqlProc ] { // Note that %sqlcontext is created when SQLPROC is defined Try { Set rc = 1 Set sql = "SELECT f.id id FROM HSAA_PatientCurrentConditionsCube.Fact f, HSAA.Diagnosis d " _" WHERE d.Patient = f.%sourceid and d.Diagnosisgroup in ('249', '250', '253')" Set st = ##class(%SQL.Statement).%New() Set sc = st.%Prepare(sql) If ($$$ISERR(sc)) { Set rc = 0 Quit } Set rs = st.%Execute() Do %sqlcontext.AddResultSet(rs) } Catch(ex) { Set %sqlcontext.%SQLCODE = ex.AsSQLCODE() Set %sqlcontext.%Message = ex.SQLMessageString() Set rc = 0 } Quit rc }
以下の計算ディメンジョンは、Patients キューブで機能します。これを使用するには、コピーしてキューブ・クラスに貼り付け、そのキューブ・クラスをリコンパイルします。
<dimension name="Other Groups" displayName="Groups (Computed Dimension)"
hasAll="false" type="computed" dimensionClass="SQL">
<hierarchy name="H1">
<level name="By Industry" >
<member name="Retail Trade"
spec="WHERE DxIndustry->DxIndustry='Retail Trade'">
</member>
<member name="Finance and Insurance"
spec="select ID from $$$TABLE WHERE DxIndustry->DxIndustry='Finance and Insurance'">
</member>
</level>
</hierarchy>
<hierarchy name="H2">
<level name="By Allergy Count" factName="Mx1968652733I" >
<member name="Highly allergic"
spec="WHERE $$$FACT > 2">
</member>
<member name="Not allergic"
spec="select ID from $$$TABLE WHERE $$$FACT = 0">
</member>
</level>
</hierarchy>
</dimension>
MDX 計算ディメンジョンの定義
MDX 計算ディメンジョンには、実行時にMDX クエリによって決定されるメンバが含まれます。メンバごとにクエリを指定します。
NULL 置換オプションは、計算ディメンジョンに影響しません。
MDX 計算ディメンジョンの定義
以下の手順を使用すると、容易に MDX 計算ディメンジョンを定義できます。
-
アーキテクトを使用して、必要な名前でディメンジョン、階層、およびレベルを追加します。
後で変更するため、選択するディメンジョンのタイプは重要でありません。
ソース・プロパティやソース式は指定しないでください。
この手順では、スタジオでの編集が容易なシェルを作成します。またアーキテクトでは、便宜上、表示名を初期化して名前と同じにします。
-
スタジオでキューブ・クラスを開きます。
-
計算ディメンジョンに対応する <dimension> 要素を変更します。以下のように変更します。
-
type 属性を以下のように編集します。
type="computed"
-
以下を <dimension> 要素に追加します。
dimensionClass="MDX"
dimensionClass 属性は、ヘルパー・クラスを参照します。完全なパッケージおよびクラス名を指定しないと、このクラスは %DeepSee.ComputedDimension パッケージ内にあると見なされます。
以下に例を示します。
<dimension name="AgeBuckets" type="computed" dimensionClass="MDX"> <hierarchy name="H1"> <level name="Years"/> </hierarchy> </dimension>
-
-
以下のいずれかの方法でメンバを定義します。
-
以下の例のように、<level> の子として <member> 要素を追加します。
<member name="Boston" spec="[OUTLET].[CITY].[BOSTON]"/>
<member> 要素を配置する場所の例については、"SQL 計算ディメンジョンの定義" を参照してください。
-
キューブ・クラスの %OnGetComputedMembers() コールバックを定義します。次のサブセクションを参照してください。
-
-
キューブ・クラスを保存してリコンパイルします。
これを実行するとすぐに、新しいディメンジョンとそのメンバを使用できるようになります。
%OnGetComputedMembers()
%OnGetComputedMembers() コールバックには、以下のシグニチャがあります。
ClassMethod %OnGetComputedMembers(pDimName As %String,
pHierName As %String,
pLevelName As %String,
ByRef pMemberList,
pRollupKey As %String = "",
ByRef pRange As %String = "") As %Status
pDimName、pHierName、および pLevelName はそれぞれ、ディメンジョン、階層、およびレベルの名前です。このメソッドは参照により pMemberList を返します。これは、以下の形式の多次元配列です。
配列ノード | 配列値 |
pMemberList(i)。I は整数です。 | 指定レベルのメンバを定義する $LISTBUILD リスト。このリストには、以下の項目が以下の順序で含まれている必要があります。
|
以下に例を示します。
ClassMethod %OnGetComputedMembers(pDimName As %String, pHierName As %String, pLevelName As %String,
ByRef pMemberList, pRollupKey As %String = "", ByRef pRange As %String = "") As %Status
{
If (pDimName="AgeBuckets") {
If (pLevelName="Years") {
// $LB(MDX,Name,Key)
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-1y-1d]:[NOW])","1 year(s)","1")
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-2y-1d]:[NOW-1y])","2 year(s)","2")
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-3y-1d]:[NOW-2y])","3 year(s)","3")
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-4y-1d]:[NOW-3y])","4 year(s)","4")
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-5y-1d]:[NOW-4y])","5 year(s)","5")
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-6y-1d]:[NOW-5y])","6 year(s)","6")
Set pMemberList($I(pMemberList)) =
$LB("%OR([DateOfSale].[Actual].[DaySold].[NOW-7y-1d]:[NOW-6y])","7 year(s)","7")
}
}
Quit $$$OK
}