Java 将规则Drools应用于数值属性低于列表中总百分比的筛选器元素

Java 将规则Drools应用于数值属性低于列表中总百分比的筛选器元素,java,drools,Java,Drools,我刚刚开始在一个小项目上使用Drools,现在我需要编写一个有点复杂的规则,我真的不知道最好的方法是什么 我将这个规则应用于同一类型的对象列表,这个类有一个名为numberOfExecutions的字段。对于列表中的每个元素,我需要选择那些numberOfExecutions超过总numberOfExecutions的5%的元素,即列表中所有元素的numberOfExecutions之和 到目前为止,我想不出一个好的方法来在drools中实现这一点,有人有什么建议吗 编辑1: 到目前为止,我所能

我刚刚开始在一个小项目上使用Drools,现在我需要编写一个有点复杂的规则,我真的不知道最好的方法是什么

我将这个规则应用于同一类型的对象列表,这个类有一个名为numberOfExecutions的字段。对于列表中的每个元素,我需要选择那些numberOfExecutions超过总numberOfExecutions的5%的元素,即列表中所有元素的numberOfExecutions之和

到目前为止,我想不出一个好的方法来在drools中实现这一点,有人有什么建议吗

编辑1:
到目前为止,我所能想到的最好方法是在应用规则之前预先计算执行次数之和,并使该值以某种方式可用于drools规则。

解决方案取决于您修改或创建新对象类的能力。在你的情况下,我会这样做:

rule "Rule 1"
when
  $m : MyObject(counted == false)
  $c : Calculator
then
  modify($m) { setCounted(true); }
  $c.count($m);
end

rule "Rule 2"
when
  not  MyObject(counted == false)
  $m : MyObject(numberOfExecutions > ($c.totalExecutions * 0.05))
  $c : Calculator
then
  $m.markBiggerThan5();
end
我已经介绍了新的计算器类,它计算未计数的对象规则1。
如您所见,只有当所有对象都标记为counted且总计存储在Calculator中时,您请求的规则2才会触发。

您可以使用Java规则方言。制作一个函数来执行numberOfExecutions的逻辑,并设置适当的标志。您可以逐个传递对象列表或单个对象以检查numberOfExecutions条件。此方法将与任何常规java方法一样工作。下面是调用函数的一个小示例。这可能会有帮助

rule "numberOfExecutions "
    dialect "java"
    salience -1

    when

        $obj : yourObject()     
        eval(if not counted)

    then        
        checkNumberOfExecution($obj);

end

function void checkNumberOfExecution(com.test.YourObject obj) {

        //Your logic
}
这只是一个暗示。你可以随心所欲地使用它


谢谢

谢谢您的建议,但要编写这样的规则,我宁愿停止使用drools,而只使用java编写所有内容。无论如何,谢谢你。我不明白一件事,我能保证当触发规则2时,所有对象都已经触发了规则1,因此总执行数就是所有执行的实际总和吗?尽管如此,我仍有几条类似于此的规则需要编写,并且我担心必须为每一条规则编写两条规则会变得太混乱:/1。是的,规则2的第一行保证了这一点。2在一个规则中实现所有功能也可以在LHS中查看“累积”,但速度较慢,可读性较差,无法转换为excel电子表格。