我有一个类层次结构如下:
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。
答案 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变化可见,我使用了修改并添加了一个约束来避免循环。