リファレンス collect
昨日のfromとあわせて利用します、文字通り集める(抽出)という宣言になります。例を見た方がわかりやすいので以下に例をば。
when ArrayList( $total : size > 0 ) from collect( Person( weight > 99 ) ) then results.add($total);
とルールを書いてJavaでは前回のPersonをListにつめてましたがPersonオブジェクトをブサイクな例ですがそのままInsertしてみます。
KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); // go ! Person p1 = new Person("内山くん", 130); Person p2 = new Person("伊集院くん", 140); Person p3 = new Person("松村くん", 130); Person p4 = new Person("岡田くん", 99); ksession.insert(p1); ksession.insert(p2); ksession.insert(p3); ksession.insert(p4); ksession.setGlobal("results",new ArrayList()); ksession.fireAllRules();
これで実行するとresultsのListに3人分セットされるようになります。weightが99を超える人で、一人でもいれば(size > 0)、というのがルールでマッチングしたらglobal宣言したresultsに該当文のみセットされます。
大事なポイントはfromより前にあるArrayListですね。これはCollectionをimplしてればどのクラスでもおkです!