第5章 スプレッドシートのデシジョンテーブルの使用
CSV や .XLS などのスプレッドシート形式でルールを保存し、ルールを管理できるようにします。
5.1. デシジョンテーブルを使用する場合
5.2. 概要

図5.1 Excel を使用してデシジョンテーブルを編集

図5.2 ルール行の複数のアクション

図5.3 OpenOffice.org Calc の使用
注記
注記
重要
agenda を消去し、最初の一致が存在する場所に大変単純なデシジョンテーブルをシミュレートすることが可能です。デシジョンテーブルは基本的に DRL パッケージを自動的に生成するツールです。
注記

図5.4 複数のテーブルを使用して同様のルールをグループ化する実例
5.3. デシジョンテーブルの仕組み
重要

図5.5 行と列
注記

図5.6 ルールテンプレートの展開
RuleSet キーワードは、ルールがすべてグループ化される rule package で使用される名前を示します (名前は任意です。デフォルト値もありますが、RuleSet キーワードが存在する必要があります)。C 列に表示される他のキーワードは Import と Sequential です。これらについては本章で後ほど説明します。この段階では、通常、キーワードが名前と値のペアを作成します。
RuleTable は重要になります。
RuleTable キーワードの後には名前があります。この名前は生成されたルール名の先頭に追加するために使用されます (一意のルール名を作成するために行番号が付加されます)。RuleTable の列はルールが開始する列を示します (左側の列は無視されます)。
CONDITION および ACTION キーワードは、下の列にあるデータがルールの LHS または RHS 部分であることを示しています (このように任意に設定できる他の属性もあります)。
Person(age=="42") (42 は 18 行から取得) が生成されます。この場合、== は暗黙的で、フィールド名のみを指定すると完全一致の検索と見なされます。
注記
ObjectType の宣言は複数の列にまたがることができます (マージされたセルにより)。そのため、マージされた範囲の下にあるすべての列が 1 つの制約セットにまとめられます。
$para プレースホルダーを使用して、セルからのデータが投入される場所を示します。$param または $1、$2 などを使用して下のセルにあるコンマ区切りリストからのパラメーターを示します。
RuleTables を使用できます。
RuleTable または RuleSet キーワードが表示される場所と同じである必要があります (この例では、C 列を選択しましたが、代わりに A 列を選択することも可能です)。
ObjectType 行が使用されるため)。
//row 18
rule "Cheese_fans_18"
when
Person(age=="42")
Cheese(type=="stilton")
then
list.add("Old man stilton");
end
[age=="42"] と [type=="stilton"]は上のセルにある対象の ObjectType に追加される単一の制約として解釈されます (上のセルが複数にまたがる場合は、1 つの「列」に対して複数の制約が存在することがあります)。
5.4. キーワードと構文
5.4.1. テンプレートの構文
CONDITION または ACTION であるかによって異なります。ほとんどの場合、LHS (CONDITIONの場合) または RHS (ACTION の場合) の 「vanilla」DRL と同じです。そのため、LHS では制約言語を使用する必要があり、RHS は実行目的のコードのスニペットになります。
$param プレースホルダーが使用されます。$1 を使用することも可能です。セルに値のコンマ区切りリストが含まれる場合、$1 や $2 などのシンボルを使用して、セルの値リストよりどの位置パラメーターを使用するか示すことができます。forall(DELIMITER){SNIPPET} 関数を使用して、使用できるコンマ区切りの値をすべてループすることが可能です。
テンプレートが [Foo(bar == $param)] で、セルが [ 42 ] である場合、結果は [Foo(bar == 42)] になります。 テンプレートが [Foo(bar < $1, baz == $2)] で、セルが [42,43] である場合、結果は [Foo(bar > 42, baz ==43)] になります。
ObjectType 宣言が存在するかどうかによって異なります。存在する場合、スニペットは ObjectType の個別の制約としてレンダリングされます。存在しない場合、そのままレンダリングされます (値は置換されます)。上記の例のようにプレーンフィールドのみが入力された場合、相等であると見なされます。スニペットの最後に別の演算子がある場合、制約の最後で値が補間されます。スニペットの最後に別の演算子がない場合は、前述の通り $param を探します。

図5.7 またがった列
Person ObjectType 宣言がどのように 2 つのスプレッドシート列にまたがっているかを表しています。そのため、両方の制約は Person(age == ... , type == ...) として表示されます。これまでと同様に、フィールド名のみがスニペットに存在するため、等価テストを意味します。

図5.8 パラメーターの使用
Person(age == "42") になります)。

図5.9 演算子の補完

図5.10 バインディングの使用
ObjectType 行にはどのような値でも入力することができます (たとえば、後続するスプレッドシートの列に対する事前条件など)。

図5.11 結果
5.4.2. キーワード
表5.1 キーワード
| キーワード | 説明 | 含まれる状態 |
|---|---|---|
| RuleSet | この右側のセルにはルールセット名が含まれます。 | 1 つのみ (指定しない場合はデフォルト値が使用されます) |
| Sequential | この右側のセルは true または false になります。true の場合は salience が使用され、ルールが上から順に実行されるようにします。 | 任意 |
| Import | 右側のセルには、インポートする Java クラスのコンマ区切りリストが含まれます。 | 任意 |
| RuleTable | RuleTable はルールテーブルの定義の始まりを示します (実際のルールテーブルは次の行で開始します)。ルールテーブルは次の空白行まで、左から右、そして上から下の順に読み取られます。 | 最低 1 つ。複数ある場合は、1 つのルールセットにすべてが追加されます。 |
| CONDITION | この列がルール条件用であることを示します。 | ルールテーブルごとに最低 1 つ。 |
| ACTION | この列がルール結果用であることを示します。 | ルールテーブルごとに最低 1 つ。 |
| PRIORITY | この列の値がルール行に対して salience 値を設定することを示します。Sequential フラグを上書きします。 | 任意 |
| DURATION | この列の値がルール行に対して期間の値を設定することを示します。 | 任意 |
| NAME | この列の値がその行から生成されたルールに対して名前を設定することを示します。 | 任意 |
| Functions | すぐ右側のセルには、ルールスニペットで使用できる関数を指定できます。JBoss Rules は DRL で定義された関数をサポートし、ハードコーディングせずに論理をルールに組み込んだり、論理を変更したりすることができます。使用する際は注意して使用してください。構文は通常の DRL と同じです。 | 任意 |
| Variables | すぐ右側のセルには JBoss Rules がサポートするグローバル宣言を指定できます。タイプの後に変数名を指定したものです。複数の変数が必要な場合はコンマで区切ります。 | 任意 |
| No-loop または Unloop | no-loop または unloop は、テーブルのヘッダーに指定され、ルール (行) のループを許可しない同じ関数を補完します。このオプションが適切に機能するには、セルに値 (true または false) が存在しなければなりません。セルが空白のままであると、このオプションは行に対して設定されません。 | 任意 |
| XOR-GROUP | この列のセル値は、ルール行が指定のアクティベーショングループに属することを意味します。アクティベーショングループとは、名前付きグループの 1 つのルールのみが実行されることを意味します (最初に実行されるルールが他のルールのアクティベーションをキャンセルします)。 | 任意 |
| AGENDA-GROUP | この列のセル値は、ルール行が指定のアジェンダグループに属することを意味します (ルールのグループ間のフローを制御する方法の 1 つです。「ルールフロー」を参照してください)。 | 任意 |
| RULEFLOW-GROUP | この列のセル値は、ルール行が指定のルールフローグループに属することを意味します。 | 任意 |
| Worksheet | デフォルトでは、デシジョンテーブルで最初のワークシートだけが参照されます。 | 該当なし |
HEADER キーワードのユースケースは次の通りです。ほとんどの場合でヘッダー名が最も重要になります。下のセルに値がないと、特定の行に属性が適用されません。

図5.12 キーワードの使用例
Import (コンマ区切り)、Variables (グローバル、コンマ区切り)、および function block (複数の関数で構成されることもあり、普通の DRL 構文を使用) の例になります。RuleSet キーワードと同じ列に指定したり、すべてのルール行の下に指定することもできます。

図5.13 関数などのキーワードの使用例
5.5. スプレッドシートベースのデシジョンテーブルの作成と統合
drools-decisiontables モジュールのスプレッドシートベースのデシジョンテーブルと共に使用されるアプリケーションプログラミングインターフェースを探します。1 つのクラスのみが関連しますが、そのクラスが SpreadsheetCompiler です。このクラスはさまざまな形式のスプレッドシートを取得し、通常通りに使用できる DRL ルールを生成します。
SpreadsheetCompiler を使用して部分的なルールファイルを生成し、後で完全なルールパッケージへアセンブルすることができます (これを使用してルールの技術的な側面と非技術的な側面を区別します)。
Wizard を使用してテンプレートよりスプレッドシートを生成し、XLS 対応のスプレッドシートアプリケーションを用いて編集します。

図5.14 統合開発環境の使用
5.6. デシジョンテーブルにおけるビジネスルールの管理
5.6.1. ワークフローとコラボレーション
- ビジネスアナリストがテンプレートのデシジョンテーブルを取得します (リポジトリまたは IT 部門から)。
- ビジネスアナリストがデシジョンテーブルのビジネス言語の説明をテンプレートに入力します。
- デシジョンテーブルルール (行) が入力されます (下書きとして)。
- デシジョンテーブルが、ビジネス言語 (説明) をスクリプトへマッピングするプログラマーへ渡されます (新しいアプリケーションやデータモデルの場合、ソフトウェアの開発が関係することがあります)。
- プログラマーがビジネスアナリストと共に変更を確認します。
- ビジネスアナリストは必要に応じてルール行の編集を継続して行えます (列の移動など)。
- プログラマーは、システム稼働後にルールの変更を検証するために使用するルールのテストケースを開発します。
5.6.2. スプレッドシート機能の使用

図5.15 スプレッドシートリストの使用
重要

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.