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?

その他のオプション

この章では、キューブとサブジェクト領域のその他のオプションの使用方法について説明します。以下のトピックについて説明します。

キューブ定義内の maxFacts の指定

キューブの開発時は、一般にリコンパイルと再構築を頻繁に行います。大量のデータ・セットを使用している場合は、キューブをより迅速に再構築するため、ファクト・テーブル内のファクト数を制限することがあります。そのためには、%BuildCube()pMaxFacts 引数を指定できます。"DeepSee モデルの定義" の “ターミナルでのキューブの構築” を参照してください。

または、以下のように maxFacts 属性を指定できます。

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

  2. <cube> 要素を見つけます。

    <cube name="HoleFoods" 
    caption="HoleFoods Sales"
    defaultListing="Listing"
    nullReplacement="Missing Value"
    actionClass="HoleFoods.KPIAction"
    sourceClass="HoleFoods.Transaction">
    
  3. この要素に maxFacts 属性を追加します。

    <cube name="HoleFoods" 
    caption="HoleFoods Sales"
    defaultListing="Listing"
    nullReplacement="Missing Value"
    actionClass="HoleFoods.KPIAction"
    sourceClass="HoleFoods.Transaction"
    maxFacts="10000">
    

    指定した値によって、ファクト・テーブルの最大サイズが決まります。

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

  5. キューブを再構築します。

Important:

maxFacts 属性は、必ずキューブの配置前に削除してください。

キューブで使用するレコードの制限

既定では、DeepSee はソース・クラスのすべてのレコードを使用します。キューブ定義を変更して、レコードの一部を無視することができます。このためには、以下のいずれかまたは両方を実行します。

  • キューブ定義の [ビルド制限] オプションを指定する。"DeepSee モデルの定義" の “キューブの定義” を参照してください。

    キューブがデータ・コネクタに基づいている場合、このオプションは何の効果も持ちません。

  • キューブ・クラスの %OnProcessFact() コールバックを定義する。

%OnProcessFact() コールバック

ベース・テーブルのレコードの一部を無視して、それらをキューブに含めないようにするために、キューブ定義クラスで %OnProcessFact() メソッドを定義できます。

classmethod %OnProcessFact(pID As %String, ByRef pFacts As %String,         Output pSkip As %Boolean, pInsert As %Boolean) as %Status

DeepSee では、ファクト・テーブルの構築または更新時に、ベース・テーブル内の各行へのアクセスの直後にこのメソッドを呼び出します。このメソッドには以下の値が渡されます。

  • pID : 処理対象のソース・データ内の行の ID。

  • pFacts : 行で使用される値を含む多次元配列。この配列の構造は以下のとおりです。

    ノード
    pFacts(factName)factName は、[ファクト・テーブルのフィールド名] オプションで指定された、ファクト・テーブル内のレベルまたはメジャーの名前です。 そのレベルまたはメジャーの値。例 : Magnolia、47。
  • pInsert : 新規の行の場合は 1。

このレコードをスキップする場合はメソッドで pSkip を True に設定し、スキップしない場合は pSkip を False に設定します。

例えば、以下のコールバックでは、キューブは好きな色が青であるすべての患者を無視します。

ClassMethod %OnProcessFact(pID As %String, ByRef pFacts As %String, 
Output pSkip As %Boolean, pInsert As %Boolean) As %Status
{
    if pFacts("DxColor")="Blue"
    {
        set pSkip=1 
    } else {
            set pSkip=0
            }
     quit $$$OK
}

この例では、キューブが [ファクト・テーブルのフィールド名] オプションで好きな色のレベルとして DxColor を定義していると想定しています。

別の例として、以下のコールバックでは、キューブは ID が 1000000 未満であるすべてのレコードを無視します。

ClassMethod %OnProcessFact(pID As %String, ByRef pFacts As %String, 
Output pSkip As %Boolean, pInsert As %Boolean) As %Status
{
    if pID<1000000
    {
        set pSkip=1 
    } else {
            set pSkip=0
            }
     quit $$$OK
}

レベルのメンバの手動指定

アーキテクトでレベルを定義した後に、メンバおよびその順序を手動で指定できます。そのためには、以下のように、スタジオでキューブ・クラスを変更します。

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

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

    <level name="MyLevel" displayName="MyLevel" ... >
    </level>
    
  3. </level> 行の直前で、以下のように一連の <member> 要素を追加します。

    <level name="MyLevel" displayName="MyLevel" ... >
    <member name="first" displayName="first" spec="1" />
    <member name="second" displayName="second" spec="2" />
    <member name="third" displayName="third" spec="3" />
    <member name="fourth" displayName="fourth" spec="4" />
    <member name="fifth" displayName="fifth" spec="5" />
    </level>
    

    <member> 要素によって 1 つのメンバが識別されます。<member> 内では、name はそのメンバの名前を指定し、displayName はそのメンバのオプションのローカライズ表示名を指定し、spec はそのメンバのオプションのキー仕様を指定します。

    namespec のルールは以下のとおりです。

    シナリオ 必要な権限 結果
    name のみを指定する場合 name の値は、大文字と小文字の区別も含めて、ソース・プロパティまたはソース式の値と完全に一致している必要があります。 name の値がキーになります。
    namespec の両方を指定する場合 spec の値は、大文字と小文字の区別も含めて、ソース・プロパティまたはソース式の値と完全に一致している必要があります。 spec の値がキーになります。

    その他の注意事項 :

    • これらの属性で XML 予約文字を使用することはできません。この後のサブセクションを参照してください。

    • <member> 要素を必要な数だけ組み込みます。

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

    • レベルのすべてのメンバを組み込みます (ワイルドカード・オプションはありません)。

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

  5. キューブを再構築します。

Note:

このオプションは、メンバのセットに変更が発生しないと予測される場合にのみ有益です。新規レコードを受信し、そのレコードに <member> 要素のいずれかで指定される値が含まれない場合、そのレコードはこのレベルに表示されません。

XML 予約文字

スタジオでキューブ・クラスを編集する際は、namedisplayName などの属性の値に XML 予約文字を使用することはできません。代わりに、以下のように置き換えます。

予約文字 代わりに使用する文字
< &lt;
& &amp;
" &quot;
' &apos;

> を使用してもエラーにはなりませんが、この文字の代わりに &gt; を使用できます。

これらの文字をアーキテクトの入力フィールドに入力すると、上記の置換が自動的に行われます。スタジオでキューブ・クラスを検証すると、アーキテクトで他の置き換えも行われる場合があります。前述のテーブルは、必須の置換のみを示しています。

ファクト・テーブルへのカスタム・インデックスの追加

DeepSee では、必要なすべてのインデックスが自動的に定義されます。ただし、ファクト・テーブルは独自の用途に直接的に使用でき、このように使用する際は追加のインデックスが必要となる場合があります。このようなインデックスを追加するには、スタジオでキューブ・クラスを編集し、必要に応じて <index> 要素を追加します。

"DeepSee モデルの定義" の “キューブ・クラスのリファレンス情報” を参照してください。

その他のキューブ・コールバックのカスタマイズ

クラス %DeepSee.CubeDefinitionOpens in a new tab には、オーバーライドしてキューブの動作をさらにカスタマイズできるコールバック・メソッドがあります。このセクションでは、一般的にオーバーライドされるいくつかのメソッドについて説明します。

また、この章の “%OnProcessFact() コールバック” および “キューブまたはサブジェクト領域の動的フィルタ処理” も参照してください。

その他のオプションの詳細は、%DeepSee.CubeDefinitionOpens in a new tab のクラスリファレンスを参照してください。

%OnAfterProcessFact() コールバック

%OnAfterProcessFact() コールバックを使用すると、任意の指定されたレコードがキューブのファクト・テーブルで追加または更新されたに実行されるカスタム・コードを追加できます。

ClassMethod %OnAfterProcessFact(pID As %String, ByRef pFactArray As %String, pUpdateStatus As %Status) as %Status

DeepSee は、以下の情報をこのコールバックに渡します。

  • pID : 処理対象のソース・データにおける行の ID。

  • pFacts : ファクト名を添え字とした、行で使用される値を含む配列。

  • pUpdateStatus%ProcessFact() によって返されようとしている状態。エラーが渡されると、このエラーは DeepSee ログおよび ^DeepSee.BuildErrors グローバルにすぐに記録されます。

%ProcessFact() メソッドは、このメソッドによって返される値を無視します。

%OnGetDefaultListing() コールバック

%OnGetDefaultListing() コールバックを使用すると、DeepSee で既定のリストが使用されている場合に、使用するリストの名前をプログラムで指定できます。このメソッドのシグニチャは、以下のとおりです。

ClassMethod %OnGetDefaultListing() as %String

このコールバックは、ユーザが既定のリストを要求したときに呼び出され、特定のリストが要求されたときには効果を示しません。以下に例を示します。

ClassMethod %OnGetDefaultListing() As %String {     Quit "Listing By Product" }

例えば、これを使用すると、ユーザが属するロールをチェックし、そのロールで適切なリストを表示できます。

%OnExecuteListing() コールバック

リスト・クエリを実行するために追加の設定作業が必要になる場合もあります。

そのためには、キューブ定義クラスに %OnExecuteListing() メソッドを実装します。

ClassMethod %OnExecuteListing(pSQL As %String) as %Status

DeepSee は、リスト・クエリを実行する直前にこのメソッドを呼び出します。DeepSee はこのメソッドを呼び出すと、実行対象のリスト・クエリである値 pSQL を渡します。

%OnAfterBuildCube() コールバック

%OnAfterBuildCube() コールバックは、定義されている場合、キューブの構築後に呼び出されます。

ClassMethod %OnAfterBuildCube(pBuildStatus As %Status, pBuildErrors As %Boolean = 0) As %Status

DeepSee は、%DeepSee.UtilsOpens in a new tab%BuildCube メソッドの最後のステップとしてこれを呼び出します。DeepSee は、以下の情報をこのコールバックに渡します。

  • buildStatus は、その時点でのキューブ構築状況です。

  • factErrorCount は、構築エラーが発生したファクトの数です。

お使いの実装は、%StatusOpens in a new tab のインスタンスを返す必要があります。

このメソッドは、キューブ構築のロックが解放される前に呼び出されるため、一度に 1 つのプロセスのみがこのコールバックを実行できます。

キューブまたはサブジェクト領域の動的フィルタ処理

サブジェクト領域に対してハードコードされたフィルタを指定する代わりに (またはこの指定に加えて)、%OnGetFilterSpec() コールバックを実装できます。これによって、実行時にフィルタのコンテンツを指定できます。このコールバックは、キューブ・クラスでも使用できます。したがって、キューブおよびサブジェクト領域の両方を動的にフィルタ処理できます。

このメソッドのシグニチャは、以下のとおりです。

classmethod %OnGetFilterSpec(pFilterSpec As %String) as %String

pFilterSpec<subjectArea>filterSpec 属性の値です。このメソッドは、有効な MDX セット式を返す必要があります。以下に例を示します。

ClassMethod %OnGetFilterSpec(pFilterSpec As %String) As %String
{
    Quit "AgeD.H1.[20 to 29]"
}

以下に簡単な例をもう 1 つ示します。この例では、メソッドが $ROLES 特殊変数をチェックして、ユーザが %All ロールに属する場合は、フィルタ処理を解除します。

ClassMethod %OnGetFilterSpec(pFilterSpec As %String) As %String
{
    if $ROLES["%All" {
        //remove any filtering
        set pFilterSpec=""
        }
    Quit pFilterSpec

}

別の例では、以下のコールバックが元の値と追加のフィルタの交差結合を実行することにより、元のフィルタ値を変更します。

ClassMethod %OnGetFilterSpec(pFilterSpec As %String) As %String
{
    //test to see if $ROLES special variable includes TestRole
    if $ROLES["%DB_SAMPLE" {
        //a member expression like the following is a simple set expression
        set colorrestrict="colord.h1.[favorite color].red"

        //create a tuple that intersects the old filter with the new filter
        //this syntax assumes original is just a member
        set newfilter="CROSSJOIN("_pFilterSpec_","_colorrestrict_")"
        set pFilterSpec=newfilter
        }
    Quit pFilterSpec

}
FeedbackOpens in a new tab