OpenRules のプログラムは具体的にどのような形でルールが書かれるのか、ここではDroolsでも用いた旅費規程のサンプルで試してみます。
旅費規程のサンプルプログラム
旅費規程は、以下のとおりでした。
旅費規程
-
1日の出張時間が、4時間未満のとき 日当なし。
-
4時間以上、8時間未満のとき日当Cで1000円。
-
8時間以上、12時間未満のとき日当Bで2000円。
-
12時間以上のとき日当Aで3000円。
これをデシジョンテーブルで書くと、
出張時間(以上) | 出張時間(未満) | 日当 |
4時間未満 | 日当なし | |
4時間以上 | 8時間未満 | 日当C (1000円) |
8時間以上 | 12時間未満 | 日当B (2000円) |
12時間以上 | 日当A (3000円) |
ということになるでしょう。
OpenRulesによるルール実装
上記のデシジョンテーブルをOpenRulesのデシジョンテーブル(DecisionTable)で書いていってみましょう。前の記事で、業務用語で
記述するルールは、
・Decision
・Decision Table
・Glossary
で記述されると書きました。これに沿って Decision.xls というExcelファイルを作ってルールを実装してみます
(サンプルルールのExcelファイル(Decision.xls))。
まずは、一番トップのDecisionから。Decisionは、どの順番にDecision Table を実行するかということですから、
となります。今回の場合、Decision Table は、日当の表だけしかないので1行ですが、複数のDecision Tableがあるときには、
実行の順にそれらのDecision Tableが並ぶことになります。
次に実際の判断を行う Decision Table を書いてみます。実は、上に記載した日当の表をそのままOpenRulesのフォーマットで
記述するだけでDecision Tableの完成です。
最後に Glossary の記述をしておきましょう。Decision Table の記述から抜き出してきた項目(用語)をまとめて記述しましょう。
論理的にはこれだけなのですが、実際のデータを入れる際にはJava実装の際のクラスの実際の属性名を入れておく
必要があるので、ここで先回りしてちょっと入れておきました。
これでルールそのものの定義は完了です。
テストデータの作成
次は、ルールをテストする上でのテストデータをExcelファイル上に作成します。 まずは上記Glossaryで定義した属性名に
対してDatatypeテーブルでデータ型を定義しておきます。Business ConceptのBusinessTripに対して
さらにテストデータの一覧を、 Dataテーブルに並べておきます。
実はDataテーブルは、テストデータを並べるだけなので、実際にテストを実行するデータを、DecisionObject に記述します。
テスト環境の整備
includeファイルの存在場所を設定しておきます。Javaで言えばクラスパスなどにあたると考えればよいでしょう。
ルールのテスト
以上を実際に動かすには、Excelファイルの外側の枠組みが必要になってきます。
基本的な枠組みは、付属のexampleを流用してしまいましょう。exampleは、openrules.decisions というフォルダに
保存されているので、このうち最も簡単な DecisionHello の例をコピーしてフォルダ名として適当な名称をつけておきます
(ここでは、TestDecision1としておきました)。さて、このフォルダの中身は、
ですが、このうちこの当座動かすうえでの必要なファイル・フォルダ構成は、
- run.bat (ルールを実行するバッチファイル)
- compile.bat (ルールをコンパイルするバッチファイル)
- build.xml (コンパイルするためのantのファイル)
- build.properties (build.xml から コンパイル対象となるファイルを切り出したプロパティファイル)
- src
- hello
- Main.java (通常のランチャープログラム)
- rules
- main
- Decision.xls (ルールを記述したExcelファイル 当記事の主対象)
- bin
ルールを実行するうえでは、まず一番最初に引金をひく Java の ランチャープログラムが必要になります。
それが上記のMain.javaになるわけですが、これは元々のDecisionHelloのMain.javaから、今回の状況に合わせて
一部修正する必要があります。とは言っても、元のプログラムが簡単なだけに修正するところはわずかです。ソース中の
- ファイル名(fileName)
ルールを記述したファイルの名称ですが、今回は、たまたまフォルダ構成もファイル名も
同じにしたので、file:rules/main/Decision.xlsのままとします。 - デシジョン名
これは、上記で決めたDecision名、BusinessTripExpansesを入力して、
Decision decision = new Decision(“BusinessTripExpenses”,fileName);
とします。
を変更して保存します。
ここで、通常ですと build.properties の中のコンパイル対象のファイル名を修正するのですが、
今回は、(DecisionHelloをコピーしてきたので)たまたまファイルパス、ファイル名が下記
- main.java.class=hello.Main
- main.xls.file=file:${project.dir}/rules/main/Decision.xls
のようになっているはずなので修正の必要はないはずです。
さて、これで一通りの準備ができました。まず、
compile.bat
を起動して、コンパイルします。
さらに、
run.bat
を起動して、これを実行すると、
となります。
今回は、テストデータを Excel のファイルに記述しましたが、Javaのオブジェクトとしてテストデータを設定することも当然できます。
テストではなく実際に実行する環境としてはJavaのオブジェクトをデータとして扱うことの方が多いと思いますので
次回は、このあたりを中心にまとめていきましょう。