Drools 从累积触发的不必要规则结果
注意:关于这个主题,有一个更好的问题。请投票支持关闭此网站。 我遇到了一个奇怪的案子,我想知道为什么会这样。问题在于,一条规则不断地触发其最后一个事实的后果,而与之相关的任何内容都没有改变我应该注意我使用的是drools 7.0.0 行为分析 我有以下规则:Drools 从累积触发的不必要规则结果,drools,Drools,注意:关于这个主题,有一个更好的问题。请投票支持关闭此网站。 我遇到了一个奇怪的案子,我想知道为什么会这样。问题在于,一条规则不断地触发其最后一个事实的后果,而与之相关的任何内容都没有改变我应该注意我使用的是drools 7.0.0 行为分析 我有以下规则: rule "TicketsBoughtPerClass" when $ticketClass : TicketClass($customer : customer) accumulate(
rule "TicketsBoughtPerClass"
when
$ticketClass : TicketClass($customer : customer)
accumulate(
Ticket
(
customer != null,
customer == $customer,
ticketPrice >= $ticketClass.startPriceRange,
ticketPrice <= $ticketClass.endPriceRange
);
$ticketCount : sum(1)
)
then
System.out.println("Total " + $ticketCount + " bought tickets for " + $ticketClass.getClassName());
insertLogical(new TotalTicketsBoughtForClass($ticketClass, $ticketCount));
end
rule "TicketsNeededForBonus"
when
$ticketClass : TicketClass($minTicketsNeededForBonus : minTicketsNeededForBonus)
TotalTicketsBoughtForClass(ticketClass == $ticketClass, ticketCount < $minTicketsNeededForBonus, $ticketCount : ticketCount)
then
//Do something based on ($minTicketsNeededForBonus - $ticketCount)
end
除非我有什么误解,否则情况不应该是这样
调试
我决定深入研究一下drools的核心,自己去找到一些答案。通过搜索,我找到了phreakAccumerateNode.doRightUpdates
中累加节点中更新元组的计算结果,这似乎就是这个额外触发器的来源。就在方法doRightUpdatesProcessChildren
之前,存在以下代码:
//如果LeftTupleMemory为空,则没有可修改的匹配项
if(leftTuple!=null){
if(leftTuple.getStagedType()==leftTuple.NONE){
trgLeftTuples.addUpdate(leftTuple);//如果我说得对,并且您希望在没有找到规则的单一票证时消除规则触发,那么您应该添加额外的约束
rule "TicketsBoughtPerClass"
when
$ticketClass : TicketClass($customer : customer)
accumulate(
Ticket
(
customer != null,
customer == $customer,
ticketPrice >= $ticketClass.startPriceRange,
ticketPrice <= $ticketClass.endPriceRange
);
$ticketCount : sum(1);
$ticketCount > 0
)
then
System.out.println("Total " + $ticketCount + " bought tickets for " + $ticketClass.getClass().getName());
end
规则“TicketsBoughtPerClass”
什么时候
$ticketClass:ticketClass($customer:customer)
积累(
票
(
客户!=null,
客户==$customer,
ticketPrice>=$ticketClass.startPriceRange,
票务价格0
)
然后
System.out.println(“总计”+$ticketCount+”购买了“+$ticketClass.getClass().getName())的票证;
结束
如果没有$ticketCount>0
约束,您就有了要触发的规则的唯一约束TicketClass()
我不知道累加可能有这样的条件(或者我只是忘记了)。不幸的是,尽管这可以解决额外的触发问题,但我有额外的规则通过insertLogical
使用$ticketCount
,因此我甚至需要一个0的总和。没有得到您,$ticketCount
可见性仅适用于规则,为什么要提及其他规则?关于逻辑事件,这里很有趣(罕见的问题),你有什么要发布的吗?;)我用规则更新了代码片段,以反映我所说的内容。希望这更有意义:)。我还故意没有在第二条规则ticketsNeedforBonus
的那部分写任何东西,因此它与我提供的示例输出一致
rule "TicketsBoughtPerClass"
when
$ticketClass : TicketClass($customer : customer)
accumulate(
Ticket
(
customer != null,
customer == $customer,
ticketPrice >= $ticketClass.startPriceRange,
ticketPrice <= $ticketClass.endPriceRange
);
$ticketCount : sum(1);
$ticketCount > 0
)
then
System.out.println("Total " + $ticketCount + " bought tickets for " + $ticketClass.getClass().getName());
end