2012-02-24 15 views
10

Drools(バージョン5.1.0)を使用し始めたばかりですので、この質問に既に回答している場合は、私に同行してください。Droolsのリスト内の特定の要素を確認してください

などでIは、複合型Aのオブジェクトが含まjava.util.Listにオブジェクトを持っている:

class A { 
    String name; 
    String Value;} 

リストならびにその要素はDroolsのエンジンのワーキングメモリです。リスト内の要素の名前と値が特定の値と一致している場合にのみルールを起動する簡単な方法はありますか?

現在、Droolsルール内で自己定義関数を使用していますが、これはリストを反復し、仕様に一致する要素がある場合はtrueを返しますが、これが最も効率的で使いやすいかどうか疑問です。

答えて

14

あなたは(理想的なシナリオ)言うようにAのインスタンスがワーキングメモリにある場合、それを使用してルールを記述します。ワーキングメモリに集(リスト、木、など)を挿入

rule X 
when 
    A(name == "bob", value == 10) 
... 

が直接でありますなぜならそれらは本質的なセマンティックを持たない抽象データ構造であるからである。しかし、アドレスのリストを含むPersonクラスがあり、アドレス自体をfacとして挿入することなく、カナダのモントリオールで各アドレスのルールを実行したいとします。あなたは書くことができます:

最後に
rule X 
when 
    Person($addresses : addresses) 
    Address(city == "Montreal", country == "CA") from $addresses 
... 

、あなたが本当に事実(再び、悪い習慣)としてリスト自体を使用したい場合は、次の操作を行うが、それはワーキングメモリ内のすべてのリストと一致することに注意してくださいすることができます:

rule X 
when 
    $list : List() 
    A(name == "bob", value == 10) from $list 
... 
+1

+1私は本質的に同じ答えで私を叩いて私を打つための書き込みの途中だった。 – mike9322

+0

回答ありがとう – serena

+0

@Edson Tirelliどのようにループから脱出するのですか? 各アドレスに対して、ブール値を返す関数があります。したがって私は 'Person($ addresses:addresses); $ a:$ addressesからのアドレス()。 eval($ e.returnBoolean()); ' 'それから//何かをしてください; ' 今、それが本当であれば;それは '何かをする 'と私はループから抜け出すために願っています。それについてどうすればいいですか? – Kraken

関連する問題