キューブ定義の拡張
前の章では、単純なキューブを作成してテストしました。この章では、そのキューブを展開して、Patients データのさらに多くの部分を使用し、さまざまな DeepSee 機能を試してみます。以下の項目について説明します。
階層へのレベルの追加
これまでのところ、作成した各ディメンジョンには、レベルが 1 つある階層が 1 つ含まれています。ここでは、HomeD ディメンジョンの階層にレベルを追加します。
-
アーキテクトで、以下のように HomeD ディメンジョンにレベルを追加します。
-
クラス・ビューワで [HomeCity] を展開します。
-
[PostalCode] をドラッグして、[HomeD] ディメンジョン内の [H1] 階層にドロップします。
この手順によって、City レベルの後に新規レベル PostalCode が追加されます。
-
[PostalCode] をクリックします。
-
[詳細] ペインで、[名前] を ZIP Code に変更します。
-
-
キューブをコンパイルします。
コンパイルすると、アーキテクトでキューブが保存されます。
-
キューブを構築します。
-
Analyzer にアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[DeepSee]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
左側の [HomeD] ディメンジョンを展開します。以下のように表示されます。
-
ZIP Code レベルを行として表示します。以下のような表示になります。
一部のメンバに同じ名前があることに注意してください。同名で複数のメンバが存在することが適切である場合もあります。ただし、郵便番号は一意であるため、この場合はエラーです。
レベルに同じ名前の複数のメンバが存在する可能性がある状況は以下の 2 つのみです。
-
レベル名が一意でないレベル・プロパティに基づいている場合 (この例については、前の章で定義した Doctor レベルを参照してください)。
-
レベルに親レベルがある場合。DeepSee がレベルのメンバを作成するときは、ソース・プロパティまたは式だけではなく、親メンバも考慮されます。
現実には、郵便番号と市区町村には多対多のリレーションシップが存在するため、どちらも他方の親にはなりません。Patients サンプルの郵便番号には、以下のように小さい市区町村が含まれています。
ZIP Code レベルを追加する際、このレベルを City レベルの後に配置しました。これは、City が ZIP Code の親であることを意味します。これが、ZIP Code のメンバの生成方法に影響していました。例えば、システムは Juniper 市の郵便番号 32006 と、Spruce 市の郵便番号 32006 を同じではないと見なしていました。
-
-
アーキテクトに戻り、HomeD ディメンジョンを修正します。
-
[ZIP Code] レベルをクリックします。
-
上矢印ボタンをクリックします。
-
キューブをコンパイルします。
コンパイルすると、アーキテクトでキューブが保存されます。
-
キューブを構築します。
-
-
Analyzer にアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[DeepSee]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
左側の [HomeD] ディメンジョンを展開します。以下のように、修正されて表示されます。
-
ZIP Code レベルを行として表示します。これで、以下のような適正な表示になります。
-
行 [34577] をダブルクリックします。これで、この郵便番号内に市区町村が表示されます。
-
必要に応じて、以下のように実行し、この変更がファクト・テーブルおよびレベル・テーブルにどのように影響したかを確認します。
-
管理ポータルにアクセスし、前述したように SAMPLES ネームスペースに移動します。
-
[システム・エクスプローラ]→[SQL] をクリックします。
-
左側の領域で、テーブル Tutorial_Cube.Fact に移動します。
このテーブル行に、DxNameViaHomeCity に加えてフィールド DxPostalCodeViaHomeCity が存在することに注意してください。つまり、このファクト・テーブルには、レベルが関連付けられたものであっても各レベルの値が格納されています。
-
左側の領域で、テーブル StarNameViaHomeCity に移動し、これを開きます。
以下のように表示されます。
このテーブルには、市区町村ごとにその市区町村が属する郵便番号が格納されていることに注意してください。
-
このテーブルを閉じて、テーブル [Tutorial_Cube.StarPostalCodeViaHomeCity] に移動します。
以下のように表示されます。
このレベル・テーブルは、他のレベル・テーブルと同様で、レベル・メンバごとに行が 1 行あります。
-
時間レベルの追加
ここでは、キューブに時間レベルを追加します。
Patients クラスには、患者の生年月日が複数の形式で含まれています (このため DeepSee の各種形式を試してみることができます)。
Property BirthDate As %Date;
Property BirthDateTimeStamp As %TimeStamp;
Property BirthDateMV As %MV.Date;
DeepSee には、$HOROLOG 形式などだけではなく、これら 3 つすべての形式の組み込みサポートが用意されています (詳細は "DeepSee モデルの定義" を参照してください)。
このクラスには、BirthDateTimeStamp プロパティの一部として、または以下のプロパティとして、患者の出生時間も含まれます。
Property BirthTime As %Time;
最も柔軟性の高いプロパティは BirthDateTimeStamp です。このプロパティには出生日付と出生時間の両方が格納されているため、時間レベルの基礎として使用します。
-
アーキテクトにアクセスし、Tutorial キューブを表示します。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、BirthD と入力します。
-
[時刻ディメンジョン] をクリックします。
-
[OK] をクリックします。
ディメンジョン、階層およびレベルが生成されます。
-
ディメンジョンを以下のように変更します。
-
[プロパティ] の横の検索ボタンをクリックし、[BirthDateTimeStamp] をクリックしてから [OK] をクリックします。
-
-
レベルを以下のように変更します。
-
レベルの名前を Year に変更します。
-
[関数で値を抽出] で [年] を選択します。
このオプションは、このレベルが患者の誕生年にのみ基づくことを意味します。
-
-
以下のように別のレベルを追加します。
-
このディメンジョンの階層 [H1] をクリックします。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、Month Year と入力します。
-
[レベル] をクリックします。
-
[OK] をクリックします。
階層 H1 で、既存の Year レベルの後に新しいレベルが作成されます。
-
-
Month Year レベルを、以下のように変更します。
-
[関数で値を抽出] で [月年] を選択します。
このオプションは、このレベルが誕生年と月を結合したものに基づくことを意味します。
-
-
以下のように BirthD ディメンジョンにさらに階層とレベルを追加します。
-
ディメンジョン名をクリックします。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、H2 と入力します。
-
[階層] をクリックします。
-
[OK] をクリックします。
新しい階層とレベルが生成されます。
-
新しいレベルを、以下のように変更します。
-
レベルの名前を Time に変更します。
-
[関数で値を抽出] で [時間] を選択します。
このオプションは、このレベルが患者が生まれた日の時間に基づくことを意味します。
-
-
-
キューブをコンパイルします。
コンパイルすると、アーキテクトでキューブが保存されます。
-
キューブを構築します。
-
Analyzer にアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[DeepSee]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
新しいレベルを使用してみます。以下のように表示されます。
-
左の領域で [Year] を展開すると、以下のように表示されます。
NOW は、現在の年 (このコンテキストの場合) を参照する特殊なメンバです。
-
Month Year レベルにも NOW メンバが存在し、これは現在の年および月を参照します。
-
Year を行として使用すると、以下のように表示されます。
-
Month Year を行として使用すると、以下のように表示されます。
-
Time を行として使用すると、以下のように表示されます。
-
時間レベルにはテーブルが生成されません。このレベルでは特殊な内部処理が行われます。
コレクション・プロパティの使用
レベルは、コレクション・プロパティに基づいて作成できます。具体的には、システムは、$LIST によって返されるタイプのリスト %ListOpens in a new tab、または文字区切りリストのいずれかを直接使用することができます。コレクション・プロパティで、データが別の方法で格納されている場合は、必要なデータを抽出して、サポートされるリスト・タイプのいずれかを作成する必要があります。
DeepSee.Study.Patient クラスには、Allergies、DiagnosesAsLB など、いくつかのコレクション・プロパティがあります。DiagnosesAsLB プロパティは以下のように定義されます。
Property DiagnosesAsLB As %List;
Allergies プロパティは以下のように定義されます。
Property Allergies As list Of DeepSee.Study.PatientAllergy;
ここでは、これらのプロパティを使用するレベルおよびメジャーの作成方法を説明します。
-
アーキテクトにアクセスし、Tutorial キューブを表示します。
-
DiagnosesAsLB プロパティを使用するディメンジョン、階層およびレベルを以下のように追加します。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、DiagD と入力します。
-
[データ・ディメンジョン] をクリックします。
-
[OK] をクリックします。
ディメンジョン、階層およびレベルが生成されます。
-
レベルの名前を Diagnoses に変更します。
-
レベルが選択されている状態で、[プロパティ] の検索ボタンをクリックし、[DiagnosesAsLB] プロパティを選択して、[OK] をクリックします。
-
[ソース値のリストのタイプ] で、[$LIST] をクリックします。このタイプは、$LIST 関数によって返される形式、または %ListOpens in a new tab タイプを持つデータを参照します。
-
キューブ・クラスを保存します。
-
-
アーキテクトで、前出の手順と同様にディメンジョン、階層、およびレベルを追加しますが、以下の変更点があります。
-
ディメンジョン名は AllerD にします。
-
レベル名は Allergies にします。
-
[プロパティ] の値は指定しないでください。
直接使用できるプロパティはありません。式を使用してアレルギーのリストを抽出する必要があります。
-
[式] に以下の値を指定します。
##class(Tutorial.Cube).GetAllergies(%source.%ID)
キューブを構築する際に、この式がファクト・テーブルの行ごとに 1 回ずつ評価されます。
変数 %source は、現在のレコードを参照します。この式は、患者の ID を取得し、ユーティリティ・メソッド (これから作成) を呼び出して、患者のアレルギーのリストを返します。
-
忘れずに [ソース値のリストのタイプ] で [$LIST] を選択してください。
キューブ・クラスを保存します。
次の手順では、このユーティリティ・メソッドを作成します。
-
-
スタジオを開き、SAMPLES ネームスペースにアクセスします。
-
作成したキューブ・クラス [Tutorial.Cube] を開きます。
-
以下のように、GetAllergies() という名前のメソッドを追加します。
ClassMethod GetAllergies(ID As %Numeric) As %List { Set allergies=##class(DeepSee.Study.Patient).%OpenId(ID,0).Allergies If (allergies.Count()=0) {Quit $LISTFROMSTRING("")} Set list="" For i=1:1:allergies.Count() { Set $LI(list,i)=allergies.GetAt(i).Allergen.Description } Quit list }
このメソッドは、患者の ID が指定されると、作成したレベルで期待される形式でその患者のアレルギーのリストを返します。
%OpenId() の 2 番目の引数によって、使用する同時処理ロックのレベルが指定されます。オブジェクトからのデータの読み取りのみが必要であるため、この値を 0 に指定して同時処理ロックを設定しないことで、より高速に実行します。
-
スタジオでキューブ・クラスを保存して、コンパイルします。
-
患者が持っているアレルギーの数を含むメジャーを追加します。このためには、以下のように Allergies プロパティを使用します。
-
アーキテクトに戻ります。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、Avg Allergy Count と入力します。
-
[メジャー] をクリックします。
-
[OK] をクリックします。
新しいメジャーがテーブルに追加されます。
-
[モデル・コンテンツ] 領域でメジャーをクリックします。
-
[集計] で [AVG] をクリックします。
-
[式] に、以下を入力します。
##class(Tutorial.Cube).GetAllergyCount(%source.%ID)
このメソッドは、後で作成する必要があります。
-
アーキテクトでキューブ・クラスを保存します。
-
クラスをスタジオで編集したため、アーキテクトでは保存された定義をオーバーライドするかどうかを尋ねるダイアログ・ボックスが表示されます。[OK] をクリックします。アーキテクトでは、クラス定義のうちアーキテクトで編集可能な部分のみをオーバーライドします。このため、クラスに追加したメソッドはオーバーライドしません。
-
スタジオで、以下のメソッドをキューブ・クラスに追加します。
ClassMethod GetAllergyCount(ID As %Numeric) As %Numeric { Set allergies=##class(DeepSee.Study.Patient).%OpenId(ID,0).Allergies Quit allergies.Count() }
-
スタジオでキューブ・クラスを保存して、コンパイルします。
-
-
DeepSee キューブを再構築します。
そのためには、アーキテクトに戻り、以前と同じ方法で再構築します。
または、ターミナル・ウィンドウを開いて、SAMPLES ネームスペースに以下のコマンドを入力することもできます。
do ##class(%DeepSee.Utils).%BuildCube("tutorial")
メソッドはキューブの論理名 (クラス名ではなく) を使用します。また、キューブ名では大文字と小文字は区別されません。
-
アナライザにアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[DeepSee]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
Diagnoses レベルを行として表示します。以下のように表示されます。
データには、もっとまれなてんかんの診断も表示される場合があります。
代わりに以下のような表示になることがあります。
これは、[ソース値のリストのタイプ] に適切なタイプを指定しなかった場合に発生します。
-
[新規作成] をクリックします。
-
新しい Allergies レベルを行として表示し、Count メジャーと Avg Allergy Count メジャーを表示します。表示は以下のようになります。
nil known allergies メンバは、既知のアレルギーのない患者を表します。一部の医療情報システムでは、以下の技法を使用して患者に既知のアレルギーがないことを記録します。
-
システムには nil known allergies と呼ばれる特別な “アレルゲン” が含まれます。
-
システムのユーザが患者にアレルギーがあるかどうか質問して、その回答が “いいえ” の場合、ユーザは値 nil known allergies を選択します。
DeepSee は、この文字列に特別な意味を割り当てません。このディメンジョンは、この “アレルゲン” をその他のアレルゲンと同じように処理します。
Null メンバ (None と呼ばれる) は、Allergies プロパティが Null である患者を表します。これらの患者にアレルギーがないと見なすことは不適切であるため、このメンバの名前では語弊があります。No Data Available といった名前のほうが適しています。
Null メンバに属する患者については、Avg Allergy Count メジャーは 0 です。これらの患者の場合は Avg Allergy Count メジャーが Null である必要があります。
また、既知のアレルギーがない患者の場合は Avg Allergy Count メジャーが 1 になります。これは、Allergies プロパティに特殊な nil known allergies アレルゲンが含まれているためです。これらの患者の場合は Avg Allergy Count メジャーが 0 である必要があります。
このセクションの後続部分で、Null メンバの名前を修正し、Avg Allergy Count メジャーのロジックを調整します。
-
-
アーキテクトに戻ります。
-
[Allergies] レベルをクリックします。
-
[ヌル置換文字列] に No Data Available を指定します。
-
キューブ・クラスを保存します。
-
スタジオで、メソッド GetAllergyCount() を以下のように編集します。
ClassMethod GetAllergyCount(ID As %Numeric) { Set allergies=##class(DeepSee.Study.Patient).%OpenId(ID,0).Allergies //check to see if patient has any recorded allergy data //if not, count is null If allergies.Count()=0 { Set allcount="" } //check to see if patient has "Nil known allergies" //in this case, the patient has one "allergen" whose code is 000 Elseif ((allergies.Count()=1) && (allergies.GetAt(1).Allergen.Code="000")) { Set allcount=0 } Else { Set allcount=allergies.Count() } Quit allcount }
-
キューブ・クラスを保存します。
-
スタジオまたはアーキテクトでキューブ・クラスをコンパイルします。
-
アーキテクトでキューブを構築します。
-
アナライザにアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[DeepSee]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
Allergies を行として表示し、Count および Avg Allergy Count メジャーを表示します。以下のような画面が表示されているはずです。
-
必要に応じて、以下のように実行して、リストベースのレベルがファクト・テーブルおよびレベル・テーブルでどのように表されるのかを確認します。
-
管理ポータルにアクセスし、前述したように SAMPLES ネームスペースに移動します。
-
[システム・エクスプローラ]→[SQL] をクリックします。
-
左側の領域で、テーブル Tutorial_Cube.Fact に移動してこれを開き、フィールド DxDiagnosesAsLB にスクロールします。
以下のように表示されます。
このフィールドには、患者の診断が格納されます。複数の値が格納される場合もあります。
このテーブルには、以下のようなアレルギー・レベルも表示されます。
レベル自体が式に基づいていて、このフィールドの名前は生成されたものであるため、明確性に欠けています。
これもリストベースのレベルであるため、複数の値が格納される場合があります。
-
テーブル Tutorial_Cube.StarDiagnosesAsLB に移動して、これを開きます。
このレベル・テーブルは、他のレベル・テーブルと同様で、レベル・メンバごとに行が 1 行あります。
アレルギーのレベル・テーブルも同様で、レベル・メンバごとに行が 1 行あります。
-
Avg Allergy Count に使用したメソッドはかなり単純なものでした。以下のメソッドについて考えてみます。
ClassMethod GetScore(ID As %Numeric) As %String
{
//get customer rating data & call duration from source record
set call=##class(MyPackage.MyClass).%OpenId(ID,0)
set professionalism=call.Professionalism
set knowledge=call.Knowledge
set speed=call.OpenDuration
If ...
//logic to check for nulls and combine these values into weighted overall score
Quit score
}
総合的なスコアを示すメジャーを定義するには、このようなメソッドを使用できます。
置換の定義
ここでは、レベルの元の値を別の値に変換するオプションを使用します。ここでは患者の Age プロパティを使用します。患者を 1 年より大きいバケットに配置するレベルを定義します。
Age Group レベルには以下のメンバが含まれます。
-
0 to 29 メンバは 30 歳未満の患者で構成されます。
-
30 to 59 メンバは 30 歳から 59 歳まで (端点を含む) の患者で構成されます。
-
60+ メンバは 60 歳以上の患者で構成されます。
同様に、Age Bucket レベルには、0 to 9、10 to 19 などのメンバが含まれます。
-
アーキテクトにアクセスします。
-
以下のように AgeD ディメンジョンにもう 1 つレベルを追加します。そのためには、以下の操作を実行します。
-
[Age] レベルをクリックします。これによって、粒度の粗い新しいレベルが Age レベルの前に追加されます。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、Age Group と入力します。
-
[レベル] をクリックします。
-
[OK] をクリックします。
-
-
範囲式を含むように、新しい Age Group レベルを以下のように再定義します。
-
新しい [Age Group] レベルをクリックします。
-
[ファクト・テーブルのフィールド名] に DxAgeGroup を指定します。
これで、このレベル定義が生成されたテーブルにどのように影響するかを理解しやすくなります。
-
[プロパティ] に、Age と入力します。
-
[範囲式] の横にある検索ボタンをクリックします。
置換セットを指定するダイアログ・ボックスが表示されます。このダイアログ・ボックスの最初の表示は以下のようになります。
数値データの場合は、置換ごとに、代わりに使用する新しい値のほかに元の値の範囲も指定します。
-
[までの] に 29 と入力します。
[までの] の右にあるボタンの初期表示は次のようになります:
-
このボタンをクリックすると表示がこのように変わります:
-
[置換値] に 0 to 29 と入力します。この結果は次のようになります。
この範囲の下限値は指定されていないため、[から] の横にあるボタンはどれでもかまいません。
-
[置換の追加] をクリックします。
-
新しい行で、[から] および [までの] の横にある切り替えボタンをクリックします。
-
[から] には 30、[までの] には 59 と入力します。
-
[置換値] に 30 to 59 と入力します。
-
[置換の追加] をクリックして、最終行を追加すると、結果は以下のようになります。
-
[OK] をクリックします。
ダイアログ・ボックスが閉じられ、[範囲式] フィールドに以下のように値が表示されます。
この値は、指定した置換の表記に DeepSee が内部的に使用する構文を示します。
-
-
キューブを保存します。
Age Bucket レベルでも同じ方法を使用できます。ただし、このチュートリアルでは別の方法、つまり、年単位の年齢を適切な 10 年バケットに対応する文字列に変換するソース式を使用します。
-
スタジオでクラス [DeepSee.Model.PatientsCube] を開きます。
-
メソッド GetAgeBucket() の定義を確認します。これは次のようになります。
ClassMethod GetAgeBucket(age As %Numeric) As %String { If (age="") {Set return=""} ElseIf (age<10) {Set return="0 to 9"} ElseIf (age<20) {Set return="10 to 19"} ElseIf (age<30) {Set return="20 to 29"} ElseIf (age<40) {Set return="30 to 39"} ElseIf (age<50) {Set return="40 to 49"} ElseIf (age<60) {Set return="50 to 59"} ElseIf (age<70) {Set return="60 to 69"} ElseIf (age<80) {Set return="70 to 79"} ElseIf (age>=80) {Set return="80+"} Else {Set return=""} Quit return }
このメソッドへの入力は、患者の ID ではなく単なる数値であることに注意してください。
-
アーキテクトで、AgeD に以下のように別のレベルを追加します。
-
[Age] レベルをクリックします。これによって、粒度の粗い新しいレベルが Age レベルの前に追加されます。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、Age Bucket と入力します。
-
[レベル] をクリックします。
-
[OK] をクリックします。
Age の前、Age Group の後ろに新しいレベルが追加されます。
-
[ファクト・テーブルのフィールド名] に DxAgeBucket を指定します。
これで、このレベル定義が生成されたテーブルにどのように影響するかを理解しやすくなります。
-
[式] に、以下を入力します。
##class(DeepSee.Model.PatientsCube).GetAgeBucket(%source.Age)
Note:実際には、(この例のように別のキューブではなく) ユーティリティ・メソッドを使用するキューブ・クラスなどの一元的な場所にユーティリティ・メソッドを組み込む傾向にあります。この演習のポイントの 1 つは、このネームスペースでアクセス可能などのクラス・メソッドも呼び出しが可能であることを示すことにあります。同様に、任意のルーチンやシステム関数も呼び出すことができます。
-
-
キューブを保存します。
クラスをスタジオで編集したため、アーキテクトでは保存された定義をオーバーライドするかどうかを尋ねるダイアログ・ボックスが表示されます。[OK] をクリックします。アーキテクトでは、クラス定義のうちアーキテクトで編集可能な部分のみをオーバーライドします。このため、クラスに追加したメソッドはオーバーライドしません。
-
キューブをコンパイルします。
-
キューブを再構築します。
-
アナライザにアクセスします。
(アナライザが別のブラウザ・タブで開かれている場合は、そのタブに切り替えて、[DeepSee]→[アナライザ] リンクをクリックし、最新のモデルで更新します。)
-
新しい Age Group レベルを行として表示します。以下のような画面が表示されているはずです。
-
新しい Age Bucket レベルを行として表示します。以下のような画面が表示されているはずです。
-
新しいレベル・テーブルの 1 つを調べて、システムの動作を理解します。
-
管理ポータルにアクセスし、前述したように SAMPLES ネームスペースに移動します。
-
[システム・エクスプローラ]→[SQL] をクリックします。
-
左側の領域で、テーブル Tutorial_Cube.Fact に移動して、これを開きます。
現在このテーブルには、AgeD 階層のレベルの値を格納する 3 つのフィールドがあります。
-
テーブル Tutorial_Cube.DxAgeGroup に移動して、これを開きます。
以下のように表示されます。
システムでは指定した範囲式を使用してこのデータが作成されています。
-
テーブル [Tutorial_Cube.DxAgeBucket] を開きます。
以下のように表示されます。
このレベルは階層の最上位ではないため、各要素について Age Group レベル内の親メンバへの参照が含まれます。DxAgeGroup 列を参照してください。
システムは GetAgeBucket() メソッドを使用して、このデータを生成します。
-
これらの 2 レベルは、同等の方法で定義されています。つまり、[範囲式] オプションを使用することは、変換を行う独自のメソッドを実行することと同等です。メソッドには単純な置換よりはるかに複雑なロジックを組み込むことができます。以下のメソッドについて考えてみます。
ClassMethod GetClassification(ID As %Numeric) As %String
{
//get customer rating data & call duration from source record
set customer=##class(MyPackage.MyClass).%OpenId(ID,0)
set detail1=customer.Detail1
set detail2=customer.Detail2
set detail3=customer.Detail3
...
If ...
//logic to use these details and return a string, either "A", "B", or "C"
Quit classification
}
このようなメソッドを使用すると、顧客に関する複数の情報を使用するアルゴリズムに基づいて顧客をグループ化するレベルにデータを入力することができます。
他のクラスへのアクセス
DeepSee アーキテクトでは、ベース・クラス内のプロパティのほとんどに簡単にアクセスすることができますが、SQL を介してのみアクセス可能なクラスのプロパティなど、その他のプロパティも使用できます。ここでは、DeepSee.Study.PatientDetails クラスのデータをキューブのレベルとして使用します。
DeepSee.Study.Patient クラスと DeepSee.Study.PatientDetails クラスはクラス・プロパティによる接続はなく、仮接続もありません。ただし、双方のテーブルに PatientID プロパティがあり、規約によってこれらを接続します。つまり、指定の患者の情報を検出するには、これら 2 つのテーブルで同じ PatientID を持つレコードを検索する必要があります。
この演習では、DeepSee.Study.PatientDetails のデータを検証し、さまざまな SQL クエリを試行して、レベルの定義に使用できるようにメソッド内にクエリをラップします。SQL に習熟している場合は、最初のほうの手順を省略してもかまいません。
-
管理ポータルにアクセスし、前述したように SAMPLES ネームスペースに移動します。
-
[システム・エクスプローラ]→[SQL] をクリックします。
-
[クエリ実行] タブをクリックします。
-
以下のクエリを実行します。
SELECT PatientID FROM DeepSee_Study.Patient
-
後で参照できるように、いずれかの PatientID 値をメモしておきます。
-
以下のクエリを実行します。
SELECT * FROM DeepSee_Study.PatientDetails WHERE PatientID='SUBJ_100301'
以下のように表示されます。
-
以下のクエリを実行します。
SELECT FavoriteColor FROM DeepSee_Study.PatientDetails WHERE PatientID='SUBJ_100301'
以下のように表示されます。
このクエリは値を 1 つ、つまり文字列 Blue を返します。
次に、同様のクエリを実行し、クエリによって取得された値を返すクラス・メソッドを作成する必要があります。
このメソッドにはクエリが組み込まれ、sql() 内にラップされます。クエリを以下のように変更する必要があります。
-
FavoriteColor の代わりに FavoriteColor INTO :ReturnValue を使用して、返り値が ReturnValue という名前のホスト変数に書き込まれるようにします。
-
'SUBJ_100301' を使用する代わりに、ベース・クラスの PatientID フィールドを渡す必要があります。
埋め込み SQL の実行後に、メソッドは変数 SQLCODE をチェックする必要があります。この変数は正常に行われたクエリの場合のみ 0 になります。レコードが見つからなかった場合、このクエリは失敗です。その場合は、空の文字列を返すことが適切です。
-
-
スタジオで、以下のメソッドをキューブ・クラス Tutorial.Cube に追加します。
ClassMethod GetFavoriteColor(patientID As %String) As %String { &sql(SELECT FavoriteColor INTO :ReturnValue FROM DeepSee_Study.PatientDetails WHERE PatientID=:patientID) If (SQLCODE'=0) { Set ReturnValue="" } Quit ReturnValue }
Note:DeepSee.Study.PatientDetails の PatientID フィールドにはインデックスがあります。このことにより、クエリがより早く実行されます。
この例のように、SQL クエリを使用することで最も簡単に関連付けることが可能なテーブルがアプリケーションに含まれている場合、既に関連フィールドにインデックスが存在している可能性が大きくなります。ただし、このようなメソッドを作成する場合は常に、適切なインデックスが存在することを確認する必要があります。
-
クラスを保存して、コンパイルします。
-
ターミナルで、以下のようにメソッドをテストします。
SAMPLES>write ##class(Tutorial.Cube).GetFavoriteColor("SUBJ_100301") Blue
-
アーキテクトにアクセスします。
-
次のようにして、新しいディメンジョン、階層およびレベルを作成します。
-
[要素の追加] をクリックします。
-
[新規要素名の入力] に、ColorD と入力します。
-
[データ・ディメンジョン] をクリックします。
-
[OK] をクリックします。
ディメンジョン、階層およびレベルが生成されます。
-
レベルの名前を Favorite Color に変更します。
-
[ファクト・テーブルのフィールド名] に DxFavColor を指定します。
これで、このレベル定義が生成されたテーブルにどのように影響するかを理解しやすくなります。
-
レベルには、[式] に以下のように入力します。
##class(Tutorial.Cube).GetFavoriteColor(%source.PatientID)
この式は、インデックス構築時に実行されます。前の手順のパフォーマンスについての注意を参照してください。
-
-
キューブを保存します。
クラスをスタジオで編集したため、アーキテクトでは保存された定義をオーバーライドするかどうかを尋ねるダイアログ・ボックスが表示されます。[OK] をクリックします。アーキテクトでは、クラス定義のうちアーキテクトで編集可能な部分のみをオーバーライドします。このため、クラスに追加したメソッドはオーバーライドしません。
-
キューブをコンパイルします。
-
キューブを再構築します。
ベース・テーブルの各レコードに対して 1 回ずつ、作成したメソッドおよび埋め込み SQL が実行されます。
-
アナライザを開き、新しいレベルを行として表示します。以下のような画面が表示されているはずです。
-
必要に応じて、このレベルのレベル・テーブルを開きます。
-
管理ポータルにアクセスし、前述したように SAMPLES ネームスペースに移動します。
-
[システム・エクスプローラ]→[SQL] をクリックします。
-
左側の領域で、テーブル Tutorial_Cube.DxFavColor に移動して、これを開きます。
以下のように表示されます。
-