【问题标题】:Is Drools 'and' keyword act as bitwise &?Drools 'and' 关键字是按位 & 吗?
【发布时间】:2019-07-16 06:18:28
【问题描述】:

我正在尝试编写一个有多个条件的滑动窗口规则。我要写的规则是:

rule "1"
when
$test : Test (num1 > 100 && num2 > 101) && $number:Number() from accumulate(Test($t : num1) over window:time(20s), sum($t))
then
    System.out.println("Output is "+$test.getNum1()+" and sum is "+$number+"");
end

在上述规则中,引擎正在累积 num1 和 num2 的值,即使它们不满足条件。 && 关键字按位 AND 工作,即它正在评估 LHS 和 RHS。 谁能向我解释一下这种行为?

【问题讨论】:

    标签: drools drools-fusion


    【解决方案1】:

    在您的情况下,您有 2 个完全独立的模式:另一个没有对 on 模式的引用。然后 Drools 将独立评估这些模式。

    你可以做的就是把所有东西都写成一个单一的模式:

    $number:Number() from accumulate(Test($t : num1 > 100, num2 > 101) over window:time(20s), sum($t))

    或者在模式之间建立一个“连接”:

    $test : Test (num1 > 100 && num2 > 101) && $number:Number() from accumulate(Test(this == $test, $t : num1) over window:time(20s), sum($t))
    

    希望对你有帮助,

    【讨论】:

    • 如果我遵循您编写此规则的第一种方法,如何在我的 then 部分中获取测试对象?
    • 这完全取决于您想要的 RHS 中的内容。如果您有 300 个 Test 对象,假设其中 50 个与范围约束匹配,您希望 RHS 执行多少次,您希望 $number 的值在每个对象中是多少?
    • 我想根据您的问题获得该事件的发生次数,即 50 次。我还希望在规则的 RHS 部分中使用当前 Test 对象中的一些参数。假设只要满足条件,我就想要 num3 变量的值。
    • 然后您可以使用 collectList 累积函数而不是 sum
    • 好的,谢谢。最后一个问题。有没有办法从drools的工作记忆中获取最新事件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2020-10-24
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多