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?

中間式の定義

状況によっては、類似のロジックを使用し、同じサブルーチンを実行したり、SQL を使用して別のテーブルを参照する、複数のメジャーまたはディメンジョンが存在することがあります。キューブ構築のパフォーマンスを向上させるため、中間値 (各ファクトに値 1 つ) が含まれる式を定義して、その式を他のキューブ要素の定義内で使用することができます。式の定義には、スタジオまたはアーキテクトを使用できます。

スタジオでの中間式の定義と使用

スタジオで式を定義するには、以下の操作を実行します。

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

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

    <cube name="Patients" displayName="Patients"   
       owner="_SYSTEM"
        sourceClass="DeepSee.Study.Patient"
        nullReplacement="None"
        defaultListing="Patient details">
    
  3. 大なり記号 (>) の後ろに、1 つ以上の <expression> 要素を追加します。以下はその例です。

    <expression name="patDetails" sourceExpression='%cube.GetPatientDetails(%source.PatientID)'  />
    

    <expression> 要素には少なくとも以下の属性が必要です。

    属性
    name 式の名前。
    sourceExpression 必要に応じて、指定されたソース・レコードに対して単一の値を返す ObjectScript 式を指定します。これを指定した場合は、sourceProperty を指定しないでください。

    <expression> 要素では、sourceExpression を使用する可能性が高くなります (<expression> によって指定される中間ステップがなくても、キューブ要素がプロパティを直接使用できるため)。

    <expression> 要素は、別の <expression> 要素を参照できます。

    sourceProperty 必要に応じて、キューブで使用されるベース・クラスに関連するプロパティ名を指定します。ドット構文を使用してプロパティのプロパティを参照できます。これを指定した場合は、sourceExpression を指定しないでください。

    sourceExpression および sourceProperty の追加オプションについては、"DeepSee モデルの定義" の “ディメンジョンまたはレベルのソース値の定義” および “ソース式の詳細” を参照してください。

  4. メジャー、ディメンジョン、レベルまたは別の <expression> の定義内では、以下の構文を使用して式を参照します。

    %expression.expressionName
    
  5. クラスを保存し、リコンパイルします。

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

まず、<expression> 要素を使用する場合のシナリオを考えてみましょう。Patients キューブには、PatientDetails テーブルに対する SQL クエリを介してデータにアクセスするソース式によって定義されるレベルが複数存在します。例えば、Favorite Color レベルは以下のソース式で定義されます。

%cube.GetFavoriteColor(%source.PatientID)

GetFavoriteColor() メソッドには、以下のように埋め込み SQL が含まれます。

ClassMethod GetFavoriteColor(patientID As %String) As %String
{
    New SQLCODE
    &sql(SELECT FavoriteColor INTO :ReturnValue 
    FROM DeepSee_Study.PatientDetails 
    WHERE PatientID=:patientID)
    If (SQLCODE'=0) {
        Set ReturnValue=""
        }
    Quit ReturnValue
}

Profession および Industry のレベルの定義は類似しています。このため、Patients キューブの構築時に、PatientDetails テーブルに対する 3 つのクエリがソース・クラスの行ごとに実行されます。

ソース・クラスの行ごとに、PatientDetails テーブルに対してクエリが 1 つだけ実行されるように、このキューブを再定義することができます。そのためには、以下の操作を実行します。

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

  2. このクラスの <cube> 要素内で、以下の要素を追加します。

    <expression name="patDetails" sourceExpression='%cube.GetPatientDetails(%source.PatientID)'  />
    

    この式は、キューブ・クラス内でメソッドを実行します。このメソッドは以下のように定義されます。

    ClassMethod GetPatientDetails(patientID As %String) As %String
    {
        New SQLCODE
        &sql(SELECT Profession->Industry,Profession->Profession,FavoriteColor 
        INTO :Industry,:Profession,:FavoriteColor 
        FROM DeepSee_Study.PatientDetails 
        WHERE PatientID=:patientID)
        
        If (SQLCODE'=0) {
            Set Industry="",Profession="",FavoriteColor=""
        }
        Set ReturnValue=$LISTBUILD(Industry,Profession,FavoriteColor)
        Quit ReturnValue
    }

    このメソッドは、指定の患者の複数のフィールドを取得し、その情報を含むリストを構築して、そのリストを返します。

  3. 以下のように PatientDetail テーブルを使用するレベルを再定義します。

    • 以下の sourceExpression を使用するように、Industry レベルを再定義します。

      sourceExpression='$LI(%expression.patDetails,1)'
      
    • 以下の sourceExpression を使用するように、Profession レベルを再定義します。

      sourceExpression='$LI(%expression.patDetails,2)'
      
    • 以下の sourceExpression を使用するように、Favorite Color レベルを再定義します。

      sourceExpression='$LI(%expression.patDetails,3)'
      
  4. クラスを保存し、リコンパイルします。

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

アーキテクトでの中間式の定義

アーキテクトで式を定義するには、以下の操作を実行します。

  1. アーキテクトでキューブ定義を開きます。

  2. [要素の追加] を選択します。

    ダイアログ・ボックスが表示されます。

  3. [新規項目名の入力] に、名前を入力します。

  4. [式] を選択します。

  5. [OK] を選択します。

  6. 右側の [詳細] タブで、それぞれのフィールに値を指定します。

FeedbackOpens in a new tab