Drools - forall积累不起作用

时间:2017-04-19 22:12:57

标签: java drools

我有这个类层次结构:

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

2 个答案:

答案 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很棘手,并不是您认为的(我认为)。