Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

計算ディメンジョンの定義

計算ディメンジョンは強力で、メンバを実行時にクエリ経由で定義できる高度な DeepSee モデル・オプションです。この章では、これらを定義する方法を説明します。以下のトピックについて説明します。

計算ディメンジョンとその他の基本 DeepSee モデル要素との比較については、"DeepSee モデルの定義" の “モデル・オプションの概要” の章を参照してください。

Important:

計算ディメンジョンには計算メンバとの関連付けはありません。計算ディメンジョンは DeepSee に固有です。計算メンバは、MDX の標準的な概念です。

SQL 計算ディメンジョンの定義

SQL 計算ディメンジョンには、実行時に SQL クエリによって決定されるメンバが含まれます。メンバごとにクエリを指定します。

Note:

NULL 置換オプションは、計算ディメンジョンに影響しません。

計算ディメンジョンの例

Patients キューブには ComputedD ディメンジョンがあります。これは、2 つのメンバ (member 1 および member 2) を定義します。これらの各メンバは、特定の患者の ID を取得する SQL クエリによって定義されます。以下は、アナライザの左の領域に示すように、これらのメンバを示します。

generated description: computed dimension example

このディメンジョン、Computed レベル、およびメンバは、キューブの他の要素を使用する場合と同様に使用できます。

同様に、HoleFoods キューブには、Comments ディメンジョンがあります。これは、2 つのメンバ Complaints および Compliments を定義します。これらのメンバは、SQL クエリによっても定義されます。

SQL 計算ディメンジョンの定義

以下の手順を使用すると、容易に SQL 計算ディメンジョンを定義できます。

  1. アーキテクトを使用して、必要な名前でディメンジョン、階層、およびレベルを追加します。

    後で変更するため、選択するディメンジョンのタイプは重要でありません。

    ソース・プロパティやソース式は指定しないでください。

    この手順では、スタジオでの編集が容易なシェルを作成します。またアーキテクトでは、便宜上、表示名を初期化して名前と同じにします。

  2. スタジオでキューブ・クラスを開きます。

  3. 計算ディメンジョンに対応する <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" >
    

    既定では、このようには改行されません。この例では読みやすくするために改行が追加されています。

  4. レベルを定義するセクションを見つけます。

    <level name="New Computed Level" displayName="New Computed Level" 
        disabled="false"
        list="false"
        useDisplayValue="true">
    </level>
    
  5. </level> 行の直前で、以下のように行を追加します。

    <member name="" displayName=""  spec="" />
    

    以下のように編集します。

    属性
    name メンバ名。
    displayName このメンバのオプションの表示名。
    description アナライザの左側の領域にツールヒントとして表示するオプションのテキスト。
    spec このキューブで使用されるファクト・テーブルの 1 つ以上のレコードの ID を返す SQL SELECT クエリ。ファクト・テーブルを参照するには、トークン $$$TABLE または完全なテーブル名を使用します。ファクト・テーブルの詳細は、"DeepSee モデルの定義" の “ファクト・テーブルおよびディメンジョン・テーブルの詳細” を参照してください。この章で後述する “spec のバリエーション” も参照してください。

    以下に例を示します。

    member name="example member 1" displayName="member 1"          
    spec="select ID from DeepSee_Model_PatientsCube.Fact WHERE MxAge&lt;50 AND DxHomeCity->DxHomeCity='Elm Heights'" />
    

    これらの属性で XML 予約文字を使用することはできません。置換の詳細は、“XML 予約文字” を参照してください。

  6. その他の <member> 要素を必要に応じて追加します。

    これらの要素の順序によって、対応するメンバの既定の並べ替え順序が決まります。

  7. クラスを保存し、リコンパイルします。

    これを実行するとすぐに、新しいディメンジョンとそのメンバを使用できるようになります。

サンプルの詳細

Patients キューブでは ComputedD ディメンジョンに以下のメンバが含まれています。

  • member 1 は、以下の SQL クエリによって定義されます。

    select ID from DeepSee_Model_PatientsCube.Fact WHERE MxAge&lt;50 AND DxHomeCity->DxHomeCity='Elm Heights'
    

    このクエリは、キューブのファクト・テーブルを使用します。詳細は、"DeepSee モデルの定義" の “ファクト・テーブルおよびディメンジョン・テーブルの詳細” を参照してください。

  • member 2 は、以下の SQL クエリによって定義されます。

    select ID from $$$TABLE WHERE MxAge=40 AND DxHomeCity->DxHomeCity='Juniper'
    

    このクエリは $$$TABLE を使用します。これはファクト・テーブルの実際の名前に置き換えられます。前のクエリとは異なり、このクエリは $$$TABLE トークンを変換するための情報がないため、管理ポータルでは有効ではありません。

以下のピボット・テーブルに、これらのメンバが示されています。

generated description: computed members in pivot

例えば、この例の member 1 は、平均年齢 24.50 歳の 801 人の患者で構成されています。

spec のバリエーション

可能な spec のバリエーションは以下のとおりです。

  • キューブのベース・クラスにクエリに適したインデックスがある場合は、代わりにそのクラスをクエリで参照することもできます。このクラスの ID は、ファクト・テーブルで使用される ID と同じです。

    これは、頻繁に変更されるグループを反映するディメンジョンが必要な場合やキューブの再構築や同期化を回避したい場合に役立ちます。

  • 省略表現として、SELECT 文の代わりに WHERE 節を使用することができます。この場合、WHERE 節を使用する SELECT 文が DeepSee によって生成されます。この文は、ファクト・テーブルから 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 クエリによって決定されるメンバが含まれます。メンバごとにクエリを指定します。

Note:

NULL 置換オプションは、計算ディメンジョンに影響しません。

MDX 計算ディメンジョンの定義

以下の手順を使用すると、容易に MDX 計算ディメンジョンを定義できます。

  1. アーキテクトを使用して、必要な名前でディメンジョン、階層、およびレベルを追加します。

    後で変更するため、選択するディメンジョンのタイプは重要でありません。

    ソース・プロパティやソース式は指定しないでください。

    この手順では、スタジオでの編集が容易なシェルを作成します。またアーキテクトでは、便宜上、表示名を初期化して名前と同じにします。

  2. スタジオでキューブ・クラスを開きます。

  3. 計算ディメンジョンに対応する <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>
    
  4. 以下のいずれかの方法でメンバを定義します。

    • 以下の例のように、<level> の子として <member> 要素を追加します。

      <member name="Boston" spec="[OUTLET].[CITY].[BOSTON]"/>
      

      <member> 要素を配置する場所の例については、“SQL 計算ディメンジョンの定義” を参照してください。

    • キューブ・クラスの %OnGetComputedMembers() コールバックを定義します。次のサブセクションを参照してください。

  5. キューブ・クラスを保存してリコンパイルします。

    これを実行するとすぐに、新しいディメンジョンとそのメンバを使用できるようになります。

%OnGetComputedMembers()

%OnGetComputedMembers() コールバックには、以下のシグニチャがあります。

ClassMethod %OnGetComputedMembers(pDimName As %String, 
                                  pHierName As %String, 
                                  pLevelName As %String, 
                                  ByRef pMemberList, 
                                  pRollupKey As %String = "", 
                                  ByRef pRange As %String = "") As %Status

pDimNamepHierName、および pLevelName はそれぞれ、ディメンジョン、階層、およびレベルの名前です。このメソッドは参照により pMemberList を返します。これは、以下の形式の多次元配列です。

配列ノード 配列値
pMemberList(i)。ここで、i は整数です。 指定レベルのメンバを定義する $LISTBUILD リスト。このリストには、以下の項目が以下の順序で含まれている必要があります。
  • メンバを定義する MDX 式

  • メンバの表示名

  • メンバのキー

以下に例を示します。

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
}
FeedbackOpens in a new tab