Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drools 从累积触发的不必要规则结果_Drools - Fatal编程技术网

Drools 从累积触发的不必要规则结果

Drools 从累积触发的不必要规则结果,drools,Drools,注意:关于这个主题,有一个更好的问题。请投票支持关闭此网站。 我遇到了一个奇怪的案子,我想知道为什么会这样。问题在于,一条规则不断地触发其最后一个事实的后果,而与之相关的任何内容都没有改变我应该注意我使用的是drools 7.0.0 行为分析 我有以下规则: rule "TicketsBoughtPerClass" when $ticketClass : TicketClass($customer : customer) accumulate(

注意:关于这个主题,有一个更好的问题。请投票支持关闭此网站。

我遇到了一个奇怪的案子,我想知道为什么会这样。问题在于,一条规则不断地触发其最后一个事实的后果,而与之相关的任何内容都没有改变我应该注意我使用的是drools 7.0.0

行为分析 我有以下规则:

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