2017-04-19 103 views
0

我有这样的类层次结构:Drools的 - FORALL自蕴不工作

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

这枚举:

TypeEnum{Type1, Type2, Type3} 

我想创建一个检查一个Drools的规则,如果所有的SubDetails有要么Type1或Type2以及另一个规则,如果SubDetails列表包含Type的任何不同组合,则触发另一个规则。

到目前为止,我有这个规则,它获取无论什么执行,即使所有的SubDetails具有类型3:

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

重写你的规则来计算的子​​细节对象的扁平列表。

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是棘手的,不是你认为的(我认为)。