【问题标题】:Drools - forall from accumulate not working流口水 - forall 从累积不工作
【发布时间】:2017-04-19 22:12:56
【问题描述】:

我有这个类层次结构:

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

【问题讨论】:

    标签: java drools


    【解决方案1】:

    重写你的规则来计算一个扁平化的 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&lt;X&gt; 到列表中会添加该列表中的所有 X,但它不会:它只是将列表添加到列表中。

    请注意,forall 很棘手,并且不是您认为的(我认为的)。

    【讨论】:

      【解决方案2】:

      我不确定您是如何设法以这种方式引用您的枚举: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
      

      【讨论】:

      • 虽然您的反对肯定是有效的,但这根本不能解决 OP 的问题。您可以将此作为评论。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      相关资源
      最近更新 更多