ODM for Developerをさわってみた②ルール開発

ODMのルール開発は、Rule Designerで行います。ODM for Developer用の無料のRule Designerは、Eclipseマーケットプレイスからプラグインとして取得・導入することができます。

今回は、Rule Designerで簡単なルールを開発してみたいと思います。

# Eclipseのインストール
最新のRule DesignerはEclipse v4.7.3(Oxygen)をベースとしているため、同じバージョンをインストールする必要があります。Eclipseの最新版や日本語化プラグインを導入していると、Rule Designerの言語ロケールを変更できなくなる場合があるので注意してください。

1. Eclipseがない、またはバージョンが違う場合は、[Eclipse Oxygen](https://www.eclipse.org/downloads/packages/release/oxygen)をインストールしてください。

2. Eclipseを起動し、Eclipse Marketplaceウィンドウを開きます。「odm」で検索して、IBM ODM Rule Designer for Developer V8.10.1をインストールします。
![a1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/00899b13-0ffc-4736-379c-0f9f1d1afc0f.png)

3. ライセンス確認のウィンドウで「I accept the terms…」を選択して、「Finish」ボタンをクリックします。

4. インストールが完了したら、Eclipseを再起動します。ルール・パースペクティブが追加されていることを確認してください。
![a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/1eb343f1-ed50-dbed-613c-151c08aadf65.png)

ルールの開発環境の準備ができました。
以下の手順では、シンプルなルールを開発していきます。


# 実行モデル(XOM)の作成

顧客ランクに応じて割引率を返す、シンプルなルールを開発します。（シンプルなロジックであればルールを使用する必要はありませんが、ODMの仕組みとルールの作り方を理解するためにシナリオを単純化しています。）

ODMのルールは、日本語でルールを記述するために、実行モデル（XOM）とビジネス・オブジェクト・モデル（BOM）を対応づける辞書を定義します。ルールの開発の初めには、ルールで使用するデータ項目を設計し、JavaのクラスやXMLスキーマ等によって実行モデルを作成します。ここではJavaを使用してXOMを作成します。

1. EclipseのJavaパースペクティブを開きます。「新規(New) > Javaプロジェクト(Java Project)」をクリックしてください。
![b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/99240388-6fcc-9abd-797c-dae622d258f1.png)

2. プロジェクトの名前に「CustomerLoyaltyXOM」と入力し、JREのバージョンが1.8になっていることを確認して「Finish」をクリックします。
![b2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/286b9248-a256-ceb9-3ed0-8d9f427c98b4.png)

3. パッケージ・エクスプローラーで作成したJavaプロジェクトを右クリックして、「新規(New) > クラス(Class)」を選択してください。
![b3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/6c601972-920c-5b66-1587-c252c373c749.png)

4. パッケージの名前に「my.first.rule」、クラスの名前に「Loyalty」と入力し、「Finish」をクリックします。
![b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/dc10d112-77ac-0d32-77be-252a829acfb2.png)

5. Javaエディターが開きます。以下のように、３つのPrivate変数を作成してください。
![b5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/0fd351ba-f6c4-c97e-73bc-58aa2dd57271.png)

6. Javaエディター上で右クリックして、「ソース(Source) > GetterとSetterの生成(Generate Getter and Setter)」を選択してください。

7. 右側の「すべて選択(Select all)」をクリックしてから、「OK」ボタンをクリックしてください。
![b7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/61096e73-d8f4-8e0f-77f9-9f1b2397523d.png)

8. 再度Javaエディター上で右クリックして、「ソース(Source) > フィールドを使用してコンストラクタを生成(Generate Constructor using Fields)」を選択します。

9. デフォルトで３つのフィールドが選択されていることを確認し、「OK」をクリックしてください。
![b9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/a81c7155-b3bb-7857-ac08-0bd7e6ac7358.png)

10. 再度Javaエディター上で右クリックして、「ソース(Source) > スーパークラスからコンストラクタを生成(Generate Constructor from Superclass)」を選択します。

11. デフォルトのまま「OK」をクリックしてください。
![b11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/190ba56e-ffe3-4f85-a6a5-a09c0f8c949d.png)

12. 以下のようなコードになっているはずです。Ctrl+Sを押して保存してください。
![b12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/0f7c1f9e-9957-2fea-1f54-7e1e78286200.png)

# ルール・プロジェクト作成とXOMインポート
1. Eclipseの右上にあるアイコンをクリックして、ルール・パースペクティブに切り替えてください。
![c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/91820fba-f9e5-36de-44b0-c0b05047daf3.png)

2. 画面下に、意思決定サービスマップが表示されます。これがルールの開発を進めるステップのガイドとなっています。一番左上にある、「メイン・ルール・プロジェクトの作成」をクリックしてください。
![c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/f2436651-9299-3a1b-affd-e6db68d93098.png)

3. テンプレートに「メイン・ルール・プロジェクト」が選択されていることを確認して「Next」をクリックしてください。
![c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/944d65d2-7c5b-c73a-cffd-caaa23fe6113.png)

4. ルールプロジェクトの名前に「CustomerLoyaltyRule」と入力し、「Finish」をクリックします。
![c4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/e2574d91-d68e-f95d-7d1f-4416aa7001c8.png)

5. 画面下に表示されている意思決定サービスマップから、「XOMのインポート」をクリックしてください。

6. 「Java実行オブジェクト・モデル」が選択されていることを確認して、「OK」をクリックします。
![c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/e2281c94-6908-fcd9-7a23-3f927ce59dd5.png)

7. リストから「CustomerLoyaltyXOM」をチェックして、「適用して閉じる(Apply and Close)」をクリックしてください。
![c7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/ab158b88-6c07-1ad5-fd16-f856f4af3fda.png)


# ビジネス・オブジェクト・モデル(BOM)の作成
BOMはルール記述の中で使用する業務用語の辞書です。XOMのインターフェースに使用した語句だけでなく、計算や判定ロジックの中で必要となる語句を定義します。

商品名や事業所名などパターンが限定される語句を「ドメイン」として定義することで、ルールの開発や検証を効率的に行うこともできます。

1. 意思決定サービスマップで「BOMの作成」をクリックしてください。

2. デフォルトのまま「Next」をクリックします。
![d2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/efdd8faf-f3fd-33d4-2b59-dd77901dcb85.png)

3. 右にある「XOMの参照」ボタンをクリックして、先ほど作成した「CustomerLoyaltyXOM」を選択して「終了(Finish)」をクリックしてください。
![d3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/8e69f65c-8a66-80d6-207f-3fb4f4059edf.png)

4. ルール・エクスプローラで「モデル」をダブルクリックして開きます。
![d4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/b9ad72f8-94f5-4607-2743-a2a19a736d13.png)

5. パッケージを展開し、「Loyalty」クラスをダブルクリックしてください。
![d5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/290c0ea0-d17e-9eb4-4ef8-f580a260577e.png)

6. クラスの言語化セクションで、「用語の編集」をクリックしてください。
![d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/54dcf94f-9199-43a6-ecb4-5aac06967fdb.png)

7. ラベルを「ロイヤルティプログラム」に変更して「OK」ボタンをクリックします。
![d7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/c128eae5-a3a4-7352-97a9-7e8a99a84bc8.png)

8. 続いてメンバーの言語化を行います。メンバー・セクションで一番上にある「discount_rate」をダブルクリックしてください。

9. メンバーの言語化セクションで「語句で使用されている主語を編集する」のリンクをクリックします。
![d9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/6a62c8b6-4919-4ca7-f5d1-246b619477da.png)

10. ラベルを「割引率」に変更し、「OK」をクリックしてください。
![d10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/37374d04-d704-66c6-ab42-78b6d941e440.png)

11. アクションのテンプレートにはdiscount rateの用語が残っています。テキストを編集して「割引率」に変更してください。
![d11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/0a813c5d-b741-b69b-efc2-2866d9e376a7.png)

12. 同様の手順で、他のメンバーの言語化を行います。BOMエディターの下にある、クラス・タブを選択し、メンバーセクションから２番目の「lank」をダブルクリックしてください。

13. メンバーの言語化セクションで「語句で使用されている主語を編集する」をクリックします。

14. ラベルを「顧客ランク」に変更し、「OK」ボタンをクリックしてください。

15. アクションのテンプレートに残っている「lank」の語句を「顧客ランク」に編集します。

16. 顧客ランクはいくつかの種類に限られるため、用語を特定するためのドメインを作成します。ドメイン・セクションで「ドメインを作成する」をクリックしてください。
![d16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/22c4675a-4234-e4eb-ef4b-9d2703355018.png)

17. ドメイン型から、「リテラル」を選択し、「次へ(Next)」をクリックします。
![d17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/078981bc-8ece-457d-47fb-8fe5e0eb8e67.png)

18. 右にある「追加」ボタンをクリックし、リストに追加されたnewValueを「プラチナ」に変更してください。同様に、ゴールド・シルバー・ブロンズを追加して「Finish」をクリックします。
![d18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/8fc31fb3-e521-dde1-3a14-19758657e29b.png)

19. BOMエディターの下にある、クラス・タブを選択し、メンバーセクションから3番目の「message」をダブルクリックしてください。

20. メンバーの言語化セクションで「語句で使用されている主語を編集する」のリンクをクリックします。

21. ラベルを「メッセージ」に変更し、「OK」ボタンをクリックしてください。

22. アクションのテンプレートに残っている「message」の語句を「メッセージ」に編集します。

23. Ctrl+Sをクリックして、変更を保存してください。

# 意思決定操作とルール・フローの作成
意思決定操作は、ルールが外部から呼び出される際のインターフェース定義です。前の手順で作成したXOMをパラメーターとして持つ、オペレーションにあたります。ここでは意思決定操作を定義して言語化（日本語化）し、ルール内での計算や判定の順序をルール・フローとして定義します。

1. 意思決定サービス・マップから、「意思決定操作の追加」をクリックしてください。
2. 操作の名前に「getDiscount」と入力し、「Finish」ボタンをクリックします。
![e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/249da2f8-d8c8-97ac-7cb1-b3fff4e8c68a.png)

3. 意思決定サービス・マップから、「操作マップに移動する」をクリックしてください。
4. 意思決定操作の選択ウィンドウで、「getDiscount」を選択し「OK」ボタンをクリックします。
![e4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/6d77cc01-1f58-7c82-111d-49e0306ec9d2.png)

5. 操作マップが開きます。「変数セットの追加」をクリックしてください。
![e5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/dfd6a95c-1893-76ef-d747-a5fce808c282.png)

6. 変数セットの名前に「param」と入力し、「Finish」をクリックしてください。
![e6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/4f947000-b127-ef06-84f1-d91e803c99db.png)

7. 変数セットのエディター右側にある「追加」ボタンをクリックし、タイプを「Loyalty」言語化を「ロイヤルティプログラム」に変更してください。
![e7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/caaf90a9-7dc1-7bdf-a598-fffce62782c8.png)

8. Ctrl+Sをクリックして変更を保存し、変数セットのエディターを閉じてください。
9. 操作マップで「変数のバインド」をクリックします。
10. 先ほど追加した変数(myVar)を入出力パラメーターのセクションにドラッグ＆ドロップしてください。
![e10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/d55e6c05-4e2d-eb3a-5bbb-577db38d2937.png)

11. Ctrl+Sをクリックして変更を保存し、意思決定操作のエディターを閉じます。
12. 続いて操作マップで「ルール・パッケージの追加」をクリックします。
13. パッケージの名前に「判定」と入力して、「Finish」ボタンをクリックしてください。
![e13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/c47fa367-cf32-f166-9430-db664eb04021.png)

14. 操作マップで、「ルール・フローの追加」をクリックします。
15. ルール・フローの名前に「メインフロー」と入力し、「Finish」ボタンをクリックしてください。
![e15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/414275c6-0008-ec26-59bf-d8d7849739e1.png)

16. ルール・フロー・エディターが開きます。左側のパレットで「開始ノード」（一番上の矢印アイコン）をクリックしてから、エディター上をクリックしてください。
17. 同様に、「終了ノード」（二番目にある赤丸アイコン）をクリックしてから、エディター上をクリックしてください。以下のように開始ノードと終了ノードが配置されるはずです。
![e18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/0546bf4a-898b-9a77-3277-adc505de764b.png)

18. 左側のパレットで「ルール・タスク」（三番目にある歯車アイコン）をクリックしてから、エディター上の開始ノードと終了ノードの間をクリックしてください。
19. エディターの下にあるプロパティで、ルール・タスクのラベルを「判定」に変更してください。
![e20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/b2fc7eea-5189-613e-83a0-c192177515a1.png)

20. プロパティの「ルールの選択」タブで「編集」ボタンをクリックしてください。
21. ルールの選択ウィンドウで「＞＞」ボタンをクリックし、「判定」ルール・パッケージを選択します（右側のリストに表示されます）。
![e22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/75667fbb-7c8a-7d10-50f7-ac9e207ebb3a.png)

22. ルール・フロー・エディターのパレットから「遷移」（一番下にある下向き矢印）をクリックします。開始ノード、ルール・タスク、終了ノードを順にクリックして接続してください。
23. エディター上を右クリックして、「すべてのノードのレイアウト」を選択してください。以下のようなフローになります。
![e24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/42191fa6-d8bf-82fb-4eee-b2f8d65d2b7a.png)

24. 再度、操作マップを表示します。「ルール・フローのバインド」をクリックしてください。
25. 意思決定操作のエディターが開きます。ルール・フローのセクションで、「ルール・フローの選択」リンクをクリックし、先ほど作成した「メインフロー」を選択してください。
![e26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/bc0b9e38-9a6c-e5e6-058f-3f1cc16bb189.png)

26. Ctrl+Sをクリックして変更を保存し、意思決定操作エディターを閉じてください。

# ルール定義
1. 操作マップから、「アクション・ルールの追加」をクリックします。
2. パッケージの横にある「参照」ボタンをクリックして、「判定」パッケージを選択します。これによりアクション・ルールが「判定」パッケージに含まれ、ルール・フロー内で実行されます。
3. 名前に「空のランクチェック」と入力し、「Finish」をクリックしてください。
![f3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/47b00419-9175-1afc-26a6-7236dd7a16dc.png)

4. ルール・エディターが開きます。Ctrl+Space をクリックすると、コードアシスト機能によりルールの語句が表示されます。以下のようなルールを作成してください。（直接テキスト入力も可能です）
![f4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/e726fd9d-8248-91cf-f088-c11783264f59.png)

5. 画面下のプロパティで優先度に「1」を入力してください。同じルール・パッケージに複数ルールがある場合、この設定によりルールが先に実行されます。
6. 再度、操作マップに戻り、「意思決定表の追加」をクリックしてください。
7. パッケージに「判定」を選択し、名前に「割引判定」と入力します。「Finish」ボタンをクリックしてください。
![f7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/94a50e58-58e5-4d04-7b32-13e0214bb4d5.png)

8. 空の意思決定表が作成されます。A列を右クリックして、「条件列の編集」を選択してください。
![f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/faad6fa7-2be9-a020-8f6c-0b6eac293967.png)

9. 列の編集ウィンドウのテストセクションで、コードアシストを使いながら以下のように入力してください。「’ロイヤルティプログラム’の顧客ランクは<オブジェクト>と同一である」
![f9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/ca559e9e-c411-d773-ec64-91ffee4cd20b.png)

10. タイトルを「顧客ランク」に変更し、「OK」ボタンをクリックします。
11. 意思決定表のB列、C列を右クリックして、条件列を削除してください。
12. 意思決定表のアクション列（グレーがかった列）を右クリックし、「アクション列の編集」を選択します。
![f12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/9fdcbde7-a490-8732-de9b-df29154cc910.png)

13. アクションを「’ロイヤルティプログラム’の割引率を<数値>とする」に変更します。
14. タイトルに「割引率」と入力して、「OK」ボタンをクリックしてください。
![f14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/e11a798d-f7f2-5a79-5ea3-5285a9413f8a.png)

15. 条件列「顧客ランク」で右クリックして、「追加 > すべてのドメイン値」を選択してください。BOM で定義したドメインがすべて追加されます。
![f15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/9969cd4d-b323-0be9-4382-2b7b7bd39de5.png)

16. アクション列「割引率」に適当な数値（0.01から0.99までの小数）を入力してください。
![f16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/22a16b5c-a90a-0ded-d6a4-09a1b322155d.png)

17. 割引率の表示を％表示にすることも可能です。アクション列を右クリックして、「フォーマット」を選択してください。（一つのセルではなく、列を選択してください）
18. フォーマットのリストから、「{0, number, percent}」を選択してください。「OK」ボタンをクリックしてウィンドウを閉じます。
![f18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444402/892bfc7c-02d2-16e0-a45a-92584cac99de.png)

19. 意思決定表の割引率が％表示になっていることを確認してください。
20. Ctrl+Sをクリックして変更を保存し、意思決定表エディターを閉じます。

# まとめ
今回はRule Designerを使用して、簡単なルールの開発を行いました。
次回はこのルールをサーバーにデプロイして、テストしたり編集したりする方法をご紹介します。