OpenRules入門2 (旅費規程のサンプル)

Decisionのテーブル

 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のテーブル

となります。今回の場合、Decision Table は、日当の表だけしかないので1行ですが、複数のDecision Tableがあるときには、
実行の順にそれらのDecision Tableが並ぶことになります。

次に実際の判断を行う Decision Table を書いてみます。実は、上に記載した日当の表をそのままOpenRulesのフォーマットで
記述するだけでDecision Tableの完成です。

 DecisionTable テーブル

最後に Glossary の記述をしておきましょう。Decision Table の記述から抜き出してきた項目(用語)をまとめて記述しましょう。

 Glossary テーブル

論理的にはこれだけなのですが、実際のデータを入れる際にはJava実装の際のクラスの実際の属性名を入れておく
必要があるので、ここで先回りしてちょっと入れておきました。 

これでルールそのものの定義は完了です。

テストデータの作成

次は、ルールをテストする上でのテストデータをExcelファイル上に作成します。 まずは上記Glossaryで定義した属性名に
対してDatatypeテーブルでデータ型を定義しておきます。Business ConceptのBusinessTripに対して 

DataTypeのテーブル 

さらにテストデータの一覧を、 Dataテーブルに並べておきます。

Data テーブル 

実はDataテーブルは、テストデータを並べるだけなので、実際にテストを実行するデータを、DecisionObject に記述します。

 DecisionObjectテーブル

 

テスト環境の整備

  includeファイルの存在場所を設定しておきます。Javaで言えばクラスパスなどにあたると考えればよいでしょう。 

 Environmentテーブル 

 

 

ルールのテスト

以上を実際に動かすには、Excelファイルの外側の枠組みが必要になってきます。

基本的な枠組みは、付属のexampleを流用してしまいましょう。exampleは、openrules.decisions というフォルダに
保存されているので、このうち最も簡単な DecisionHello の例をコピーしてフォルダ名として適当な名称をつけておきます
(ここでは、TestDecision1としておきました)。さて、このフォルダの中身は、

 DecisionHelloフォルダ構成

ですが、このうちこの当座動かすうえでの必要なファイル・フォルダ構成は、

 

  • 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);
    とします。

 を変更して保存します。

Javaランチャープログラム 

 

ここで、通常ですと 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のオブジェクトをデータとして扱うことの方が多いと思いますので
次回は、このあたりを中心にまとめていきましょう。