2016-07-20 5 views
0

私はに従うオブジェクトのリストを構築する必要がある状況にあります。これは2つの条件の論理和( 'または')です。です。これらの基準自体は私にとって原子質であり、私はそれらを変更することはできません。Drools:リストを構築するために基準で 'or'を使用する

複数のパターンを許可していないため、from collectは使用できません。 accumulateはそうしますが、条件部分に矛盾があった場合はそれを許しません。例えば

、私が行うことができます。

$myList: ArrayList() from accumulate (
    (and 
     $book: Book() 
     <Constraint A> 
     <Constraint B> 
    ); 
    collectList($book) 
) 

これらの制約は、何らかの方法で$帳および/またはそのプロパティに適用されることを他のパターンやeval文することができます。しかし私は、が何をしたいが、を行うことができないもの:このついて行くには

$myList: ArrayList() from accumulate (
    (and 
     $book: Book() 
     (
      <Constraint A> 
      or 
      <Constraint B> 
     ) 
    ); 
    collectList($book) 
) 

もう一つの方法は、例えば、accumulate句の外に論理和をもたらすことです:については

$listA: ArrayList() from accumulate (
    (and 
     $book: Book() 
     <Constraint A> 
    ); 
    collectList($book) 
) 
$listB: ArrayList() from accumulate (
    (and 
     $book: Book() 
     <Constraint A> 
    ); 
    collectList($book) 
) 
$myList: <somehow concatenate lists listA and listB> 

これは2つのリストを連結する必要があり、これまで可能であったことはわかりませんでした。私はちょっとこだわっている...

+0

代わりにクエリを使用すると便利ですか? –

+0

ルールでクエリを使用できますか? (私は見てきましたが、これに言及している文書の例は見つかりませんでした) - 編集:doh!あなたは私をもう一度見て、今私はそれを見つけました。それは私にとって以前の多くの終わりの道の一つに過ぎませんでした。私は今これを最初に試してみるでしょう。 – Devaro

+0

はい、あなたが必要とするかもしれないkie apiを使用することもできます(そして、おそらく外からも)?見てみましょうhttps://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/ html_single /#QuerySection –

答えて

0

だから、@のraphaëλの助けを借りて、これは今で実用的なソリューションです:

query listBuilder(Book book) 
    (or 
     <ConstraintA> 
     <ConstraintB> 
    ) 
end 

rule "some rule using a list" 
    when 
     ... 
     accumulate (
      (and 
       $book: Book() 
       listBuilder($book;) 
      ); 
      $myList: collectList($book) 
     ) 
     ... 
end 

$myListは今、私が構築するために探していたリストであり、そしてそれはまだあるので、 accumulateで構築されているので、accumulateの強力な集約関数もすべて使用できます。

関連する問題