実行する必要があるさまざまなことの例をいくつか示します。それらを組み合わせて、アプリケーション内で機能するルールを作成するのはあなたに任せます。
警告 - 以下の例は実行していないため、バグやタイプミスがある可能性があります。
まず、次のコードは、作業メモリ内の各患者に対して実行されたすべてのサービスを収集します。
rule "Count patient services"
when
$patient : Patient()
$serviceList : ArrayList() from collect (
Service(patientId == $patient.id)
)
then
System.out.println("Patient " + $patient.id
+ " has received " + $serviceList.size() + " services.");
end
以下は、患者が特定のコードで 2 つ以上のサービスを受けた場合に一致します。
$serviceList : ArrayList( size > 2 ) from collect (
Service(
patientId == $patient.id,
serviceCode == "D1234"
)
)
以下は、患者がコードのリストに一致するサービスを 2 つ以上受けた場合に一致します。
$serviceList : ArrayList( size > 2 ) from collect (
Service(
patientId == $patient.id,
serviceCode in ("D1234", "E5678")
)
)
以下は、一致する最新のサービス日付を検索します。
accumulate (
Service(
patientId == $patient.id,
serviceCode in ("D1234", "E5678"),
$datePerformed: datePerformed
);
$mostRecentDate: max($datePerformed)
)
同様に、日付やその他の属性に制約を追加できます。
コード グループを維持するための効果的なメカニズムは、グループ メンバーシップ ファクトを挿入することです。これは、スプレッドシートまたは Web デシジョン テーブルで簡単に行うことができます。または、データベースにクエリを実行して、API 経由で挿入することもできます。すなわち
insert( new ServiceGroup( "HighCostService", "D1234" ) );
insert( new ServiceGroup( "HighCostService", "D5678" ) );
次に、次のような制約を使用してマッチングを行うことができます。
$highCostServices : ArrayList() from accumulate (
ServiceGroup( group == "HighCostService", $serviceCode ),
init( ArrayList list = new ArrayList(); ),
action( list.add($serviceCode); ),
reverse( list.remove($serviceCode); ),
result(list)
)
$serviceList : ArrayList( size > 2 ) from collect (
Service(
patientId == $patient.id,
serviceCode in $highCostServices
)
)
nb - アキュムレータは間違いやすいので、通常はいくつかの単体テストを配置します。上記のコードは、どこにも実行せずにここでフリーハンドで記述したため、修正しなくても動作する場合は幸運です。
詳細については、次のマニュアルを参照してください。
http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/
リストにある一致するアイテム:
4.8.3.3.10.10. 演算子 in および not in (複合値の制限)
一致したファクトのリストの収集:
4.8.3.7.3. 条件要素収集
コレクションの最大値、最小値、合計値などを計算するためのアキュムレータ:
4.8.3.7.4.1. CE の累積 (推奨される構文)