中間式の定義
状況によっては、Business Intelligence に、類似のロジックを使用し、同じサブルーチンを実行したり、SQL を使用して別のテーブルを参照したりする、複数のメジャーまたはディメンジョンが存在することがあります。キューブ構築のパフォーマンスを向上させるため、中間値 (各ファクトに値 1 つ) が含まれる式を定義して、その式を他のキューブ要素の定義内で使用することができます。
"BI サンプルのアクセス方法" も参照してください。
スタジオでの中間式の定義と使用
スタジオで式を定義するには、以下の操作を実行します。
-
スタジオでキューブ・クラスを開きます。
-
<cube> 開始要素を見つけます。
<cube name="Patients" displayName="Patients" owner="_SYSTEM" sourceClass="BI.Study.Patient" nullReplacement="None" defaultListing="Patient details">
-
大なり記号 (>) の後ろに、1 つ以上の <expression> 要素を追加します。以下はその例です。
<expression name="patDetails" sourceExpression='%cube.GetPatientDetails(%source.PatientID)' />
<expression> 要素には少なくとも以下の属性が必要です。
属性 値 name 式の名前。 sourceExpression 必要に応じて、指定されたソース・レコードに対して単一の値を返す ObjectScript 式を指定します。これを指定した場合は、sourceProperty を指定しないでください。 <expression> 要素では、sourceExpression を使用する可能性が高くなります (<expression> によって指定される中間ステップがなくても、キューブ要素がプロパティを直接使用できるため)。
<expression> 要素は、別の <expression> 要素を参照できます。
sourceProperty 必要に応じて、キューブで使用されるベース・クラスに関連するプロパティ名を指定します。ドット構文を使用してプロパティのプロパティを参照できます。これを指定した場合は、sourceExpression を指定しないでください。 sourceExpression および sourceProperty の追加オプションについては、"ディメンジョンまたはレベルのソース値の定義" および "ソース式の詳細" を参照してください。
-
メジャー、ディメンジョン、レベルまたは別の <expression> の定義内では、以下の構文を使用して式を参照します。
%expression.expressionName
-
クラスを保存し、リコンパイルします。
-
キューブを再構築するか、式を使用する任意のキューブ要素の選択的構築を実行します。
例
まず、<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 BI_Study.PatientDetails
WHERE PatientID=:patientID)
If (SQLCODE'=0) {
Set ReturnValue=""
}
Quit ReturnValue
}
Profession および Industry のレベルの定義は類似しています。このため、Patients キューブの構築時に、PatientDetails テーブルに対する 3 つのクエリがソース・クラスの行ごとに実行されます。
ソース・クラスの行ごとに、PatientDetails テーブルに対してクエリが 1 つだけ実行されるように、このキューブを再定義することができます。そのためには、以下の操作を実行します。
-
エディタで、Patients キューブ・クラス BI.Model.PatientsCube を開きます。
-
このクラスの <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 BI_Study.PatientDetails WHERE PatientID=:patientID) If (SQLCODE'=0) { Set Industry="",Profession="",FavoriteColor="" } Set ReturnValue=$LISTBUILD(Industry,Profession,FavoriteColor) Quit ReturnValue }
このメソッドは、指定の患者の複数のフィールドを取得し、その情報を含むリストを構築して、そのリストを返します。
-
以下のように PatientDetail テーブルを使用するレベルを再定義します。
-
以下の sourceExpression を使用するように、Industry レベルを再定義します。
sourceExpression='$LI(%expression.patDetails,1)'
-
以下の sourceExpression を使用するように、Profession レベルを再定義します。
sourceExpression='$LI(%expression.patDetails,2)'
-
以下の sourceExpression を使用するように、Favorite Color レベルを再定義します。
sourceExpression='$LI(%expression.patDetails,3)'
-
-
クラスを保存し、リコンパイルします。
-
キューブを再構築するか、再定義されたレベルの選択的構築を実行します。
アーキテクトでの中間式の定義
アーキテクトで式を定義するには、以下の操作を実行します。
-
アーキテクトでキューブ定義を開きます。
-
[要素を追加] を選択します。
ダイアログ・ボックスが表示されます。
-
[新規項目名の入力] に、名前を入力します。
-
[式] を選択します。
-
[OK] を選択します。
-
右側の [詳細] タブで、それぞれのフィールに値を指定します。