はじめに
IRIS BIチュートリアル試してみたシリーズの8回目です。このシリーズもだいぶ長くなってきました。
今回も、前回に引き続きチュートリアルの「キューブ定義の拡張」ページの内容です。
最後に残った2つのトピックについて進めていきます。では、はじめていきましょう。
置換の定義
タイトルには「置換」とありますが、ディメンジョンのレベルを集約した新しいレベルを作成する方法、と理解していただくのがよいかもしれません。
2回目の記事でちょっとだけ触れた Age Group と Age Bucket レベルを作成していきます。
まず Age Group レベルを作成します。こちらは以下のような3つのグルーピングになります。
- 0 to 29:30歳未満の患者
- 30 to 59:30歳から59歳までの患者
- 60+:60歳以上の患者
アーキテクト画面を開き、Tutorial キューブを開きます。
新しいレベルを作成しますので、AgeD ディメンジョンの Age レベルをクリックし、その後に [要素を追加] リンクをクリックします。
要素名に Age Group、要素選択に レベル を指定します。
Age Groupレベルが追加されました。
詳細ペインで Age Group レベルの設定を変更します。[プロパティ] に Age と入力し、[範囲表現] の虫眼鏡アイコンをクリックします。
すると、範囲表現を設定するダイアログが現れます。これを使用して範囲設定を行っていきます。
まず、画面中ほどの [To] の欄に 29 と入力、その横にある [置換する値] に 0 to 29 と入力します。
その後に、入力したフィールドの間にある丸括弧 [ ) ] のボタンを1度クリックします。そうしますと丸括弧が角括弧 [ ] ] に替わります。
これらの意味ですが、丸括弧は From や To に入力された値を含まない、となり、角括弧は入力された値を含みます。
不等号の <・> と ≦・≧ の違いと考えていただければよいかと思います。
続いて 30 to 59 を定義します。[置換を追加] ボタンを押して、設定行を追加します。
[From] に 30、[To] に 59 と入力します。どちらも入力値を含ませたいので角括弧で囲むように変更します。
60歳以上のグループを追加します。[置換を追加] で1行追加し、[From] に 60、入力値を含むので角括弧に切り替えます。
最終的には以下のような設定になります。最後に [OK] で確定しましょう。
詳細ペインの [範囲表現] 欄に数式が設定されました。
また、[ファクトテーブルのフィールド名] に DxAgeGroup と入力しておきます。これは、後ほどテーブルを確認した際に項目名を分かりやすくするためです。
ここまでできたら、一旦キューブを保存します。
続いて Age Bucket レベルを作成していきます。
Age Group と同じように範囲表現で作成することもできますが、別の方法、クラスメソッドを使用する方法で実装します。
既にクラスメソッドが BI.Model.PatientsCube クラスにありますので、そちらを確認しましょう。スタジオまたはVSCode から BI.Model.PatientsCube クラスを開き、GetAgeBucket クラスメソッドを探します。
受け取った age の値に応じて Age Bucket の値を返すようになってますね。
では、Age Bucket レベルを作成していきます。先ほどと同様に、Age レベルをクリックして選択した後に [要素を追加] リンクをクリックします。
[要素名] には Age Bucket、要素選択では レベル を指定します。
Age Bucket レベルが追加されました。レベルの順番も Age Group → Age Bucket → Age となっています。
詳細ペインで Age Bucket の設定を変更します。[ソース値] の表現 に以下の数式を入力します。
##class(BI.Model.PatientsCube).GetAgeBucket(%source.Age)
また、[ファクトテーブルのフィールド名] に DxAgeBucket と入力します。
ここまでできたら、キューブを保存します。その後にコンパイル、ビルドも行ってください。
では、作成したレベルをアナライザで確認します。
アナライザ画面を開きます。モデル・コンテンツ領域の AgeD ディメンジョンを展開すると、Age Group レベルと Age Bucket レベルが追加されています。
まず、Age Group を [行] にドラッグ&ドロップします。問題なく動作してそうです。
※注意:サンプルデータはランダムに作成されるため、こちらの画面表示とみなさまの実行結果は一致しないことがあります。
今度は Age Bucket を [行] に設定します。こちらも問題なさそうです。
では、ファクトテーブルやレベルテーブルがどのようになっているのかを確認します。システムエクスプローラ → SQL でSQL画面を開き、Tutorial_Cube.Fact テーブルを開きます。
AgeD ディメンジョンに関連する3つの項目(DxAge、DxAgeBucket、DxAgeGroup)が存在することが分かります。
続いて Tutorial_Cube.DxAgeGroup テーブルを開きます。
範囲表現を用いて作成した3つのグループに沿ったレコードが作成され、先ほどのファクトテーブルと紐づいています。
もう1つ、Tutorial_Cube.DxAgeBucket テーブルを開きます。
こちらも10歳刻みでレコードが作成されています。また DxAgeGroup との紐づけも保持されています。階層の上下関係があるためですかね。
他のクラスへのアクセス
これまではベースクラスと、それに関連したクラスを基にキューブを作成してきましたが、SQL を介してのみアクセス可能なクラスのプロパティなど、その他のプロパティを使用する例を試していきます。
まず、今まで使ってきたベースクラス、BI_Study.Patient テーブルにある PatientID プロパティを確認します。以下のSQLを実行します。
SELECT PatientID FROM BI_Study.Patient
私の環境では以下のような結果が返ってきました。各患者には "SUBJ" から始まる11桁のIDが付与されているようです。
では、この PatientID を用いて別のテーブルをのぞいてみます。 以下のSQLを実行し、PatientDetails テーブルの中を確認します。
SELECT * FROM BI_Study.PatientDetails WHERE PatientID='SUBJ_100301'
PatientID の他に、FavoriteColor、Profession という項目があります。
このFavoriteColor の値を新たなディメンジョンとして追加していきます。
ただし、アーキテクト画面では PatientDetails の情報は出てきませんので、今までとは違ったアプローチが必要になります。
キューブのクラスに対してメソッドを追加し、スタジオまたはVSCodeから Tutorial.Cube クラスを開き、以下のクラスメソッドを追加します。
ClassMethod GetFavoriteColor(patientID As %String) As %String
{
&sql(SELECT FavoriteColor INTO :ReturnValue FROM BI_Study.PatientDetails WHERE PatientID=:patientID)
If (SQLCODE'=0) {
Set ReturnValue=""
}
Quit ReturnValue
}
PatientID を引数として受け取り、それをWHERE条件としたSQLを実行して FavoriteColor の値を返すようになっています。
SQLの実行結果が0件だった場合には、戻り値に空の文字列をセットするようにしています。上記画面ショットの121~123行目のところです。
クラスを変更したら保存、コンパイルします。
コンパイルできたら、メソッドの動作確認をします。ターミナルを開き、以下のコマンドを実行します。
write ##class(Tutorial.Cube).GetFavoriteColor("SUBJ_100301")
戻り値として Purple が返ってきました。大丈夫なようです。
では、これをキューブに組み入れていきます。アーキテクト画面を開き Tutorial キューブを開いて [要素を追加] をクリックします。
[要素名] に ColorD と入力し、要素選択は データ・ディメンジョン を選択します。
ColorD ディメンジョンが作成されました。あわせて作成されたレベルに対して、以下のように変更します。
- 名前:Favorite Color
- ソース値:[表現] を選択し、式に ##class(Tutorial.Cube).GetFavoriteColor(%source.PatientID) と入力
- ファクトテーブルのフィールド名:DxFavColor
変更できたら、キューブを保存、コンパイル、ビルドまで行います。キューブのクラスを変更したダイアログが表示されると思いますが、[OK] で進めます。
ビルドが完了したら、アナライザで確認しましょう。前の画面が開いている場合は再読み込みを行ってください。
ColorD ディメンジョンと Favorite Color レベルが追加されているかと思います。
Favorite Color レベルを [行] に追加してピボットテーブルを作成します。ちゃんと動作しますね。
再び、SQL画面からファクトテーブルとレベルテーブルを確認してみます。Tutorial_Cube.Fact テーブルを開きます。
DxFavColor という項目が追加されているのが分かります。
続いてレベルテーブルの確認です。Tutorial_Cube.DxFavColor テーブルを開きます。
ファクトテーブルと紐づく形でディメンジョンテーブルが作られているのが分かります。
おわりに
今回はキューブ構築で必要となる2つのトピックについて学びました。
特に2つめのトピックは利用のシーンが多そうですので、知っておいた方がよいのではないかと感じました。
3回に渡って実施してきた「キューブ定義の拡張」も、ようやく終了です。次回は新しいトピック「サブジェクト領域の作成」です。お楽しみに!