我有这个类层次结构:
DomainParent{List<Details>, Boolean isCalculatedTypes(defaults false)}
Detail{List<SubDetail>}
SubDetail{TypeEnum}
这个枚举:
TypeEnum{Type1, Type2, Type3}
我想创建一个drools规则来检查所有SubDetails是否具有 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 :(得分: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
答案 1 :(得分: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
很棘手,并不是您认为的(我认为)。