2017-04-19 10 views
0

を働いていない私は、このクラス階層があります。のDrools - forallは蓄積から

DomainParent{List<Details>, Boolean isCalculatedTypes(defaults false)} 
Detail{List<SubDetail>} 
SubDetail{TypeEnum} 

そして、この列挙型:

TypeEnum{Type1, Type2, Type3} 

を私はすべてのSubDetailsはどちらかを持っているかどうかを確認するDroolsのルールを作成したいですType1またはType2と、SubDetailsリストにTypeの異なる組み合わせが含まれている場合にトリガーする別のルール。

これまでのところ、私はすべてのSubDetailsがType3の場合であっても、どんな実行されません取得し、このルール、持っている:

rule "calculate sub details with types 1 and 2" 
    when 
     $parent: DomainParent(!isCalculatedTypes()) 
     $subDetails: List() from accumulate($detail: Detail() from $parent.getDetails(); 
          collectList($detail.getSubDetails())) 
     forall(SubDetail(getTypeEnum() == TypeEnum.1() || getTypeEnum() == TypeEnum.2() from $subDetails) 
    then 
     System.out.println("begin calculating types"); 
     //DO SOMETHING 
     $parent.setCalculatedTypes(true); 
     update($parent); 
     System.out.println("DONE calculating types"); 
end 

答えて

0

私はあなたが列挙型には、この方法を参照するための管理方法がわからない:TypeEnum.1()を。 代わりにこれを試してみてください:

rule "calculate sub details with types 1 and 2" 
    when 
     $parent: DomainParent(!isCalculatedTypes()) 
     $subDetails: List() from accumulate($detail: Detail() from $parent.getDetails(); 
          collectList($detail.getSubDetails())) 
     forall($x : SubDetail(getTypeEnum() == TypeEnum.Type1 || getTypeEnum() == TypeEnum.Type2) 
    then 
     //DO SOMETHING 
end 
+0

あなたの異論は確かに有効ですが、これはOPの問題にはまったく対応していません。これをコメントにするかもしれません。 – laune

0

がSubDetailオブジェクトの平坦化一覧を計算するために、あなたのルールを書き換えます。

rule "calculate sub details with types 1 and 2" 
when 
    $dp: DomainParent(! calculatedTypes, $details: details) 
    $sds: List(size > 0) 
    from accumulate($detail: Detail() from $details, 
        init(List list = new ArrayList();) 
        action(list.addAll($detail.getSubDetails());) 
        result(list)) 
    not(SubDetail(type != Type.Type1 && != Type.Type2) from $sds) 
then 
    System.out.println("begin calculating types"); 
end 

あなたが作った間違いはリストに List<X>を追加すると、そのリスト内のすべてのXのを追加していることを信じることですが、それはしていません:それはちょうどリストにリストを追加します。

forallはトリッキーですが、私はあなたが考えるとは思っていません。

関連する問題