在条件下迭代Drools中的列表

时间:2015-09-17 22:50:50

标签: drools

我有一个类层次结构如下:

class Order{
    List<Item> items;
    boolean eligibility;
    //geters and setters
}

class Item{
    boolean eligibility;
    //getters and setters
}

现在,我想要做的是根据订单的资格状态设置订单的资格状态。如果订单中的所有商品的合格性均为false,则订单的合格性应设置为false。基于另一篇文章,我写了一条这样的规则:

rule "Check order eligibility based on item eligibility"
dialect "java"
    when
        $order : Order($items : items)
            Boolean(booleanValue)       
            from accumulate(
                init(int eligibleItems = 0;),  
                action(for(Object item:$items) 
                        if(((Item)item).getEligibility()) eligibleItems++;
                    ),
                result(eligibleItems == 0)
            )
    then
        $order.setEligibility(false);
end

但是,当我运行此功能时,我会继续mismatched input 'eligibleItems' in rule。如何在when条件内迭代列表?我正在使用Drools 6.2.0。

1 个答案:

答案 0 :(得分:0)

要解释错误,请查看规则的这一部分:

        Boolean(booleanValue)       
        from accumulate(
            init(int eligibleItems = 0;),  

使用init-action-result的 accumulate 的语法在关键字累积之后的左括号后面需要模式。因此语法错误。 (当你将init与模式类型名称匹配时,你可以看到它说的原因:解析器无法在eligibleItems继续。)

不是试图修复它,而是可以用更简单的方式编写规则:

rule "Check order eligibility based on item eligibility"
when
  $order : Order($items : items, eligibility )
  not Item( eligibility ) from $items
then
  modify( $order ){ setEligibility(false) }
end

确定在订单中没有资格设置为true的项目。如果你想让IE变化可见,我使用了修改并添加了一个约束来避免循环。