Drool 无法正确排序数字

Posted

技术标签:

【中文标题】Drool 无法正确排序数字【英文标题】:Drool does not sort numbers correctly 【发布时间】:2012-12-31 14:43:09 【问题描述】:

我是 Drools 的新手,正在尝试让示例程序正常工作。 这个示例在drools 文档http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/index.html#d0e9542 中给出。 这个流口水规则预计会对整数进行排序。我只是更改了示例中给出的数字,但它们没有按预期排序。 尝试使用drools 5.5.0、5.5.1 和master 6.0.0 版本,但得到相同的错误结果。

以下是主要代码:

包 com.sample; 公共类示例2 公共静态 void main(String[] args) 抛出异常 Number[] numbers = new Number[] wrap(5), wrap(6), wrap(4), wrap(1), wrap(2) ; new RuleRunner().runRules(new String[] "Example3.drl" , numbers); 私人静态整数换行(int i) 返回新整数(i);

RuleRunner 类与示例中给出的相同,我认为我不应该在这里给出它,因为它会使问题变得混乱。它只是创建知识库、有状态会话,插入上面“数字”数组中给出的事实,然后在会话上调用 fireAllRules 方法。

规则文件(Example3.drl)为:

规则“规则 04” 方言“mvel” 什么时候 $number : 数字() 不是数字(intValue 然后 System.out.println("找到值的数字:" + $number.intValue()); 收回($number); 结束

我得到的输出如下:

加载文件:Example3.drl 插入事实:5 插入事实:6 插入事实:4 插入事实:1 插入事实:2 找到值的数字:1 找到值的数字:4 找到值的数字:2 找到值的数字:5 找到值的数字:6

不是正确的预期升序排序。

我可能做错了什么?我无法想象 drools 规则引擎会在这个基本级别上被打破。

【问题讨论】:

【参考方案1】:

这似乎是从 5.5.0 开始引入的错误,并且仍然存在。 此排序代码适用于 5.4.0。

解决方法:

代替:  “not Number(intValue 如果您使用:  “not Number(intValue() 然后就可以了。

不知道它是函数的非 getter 方法似乎会产生问题。

在评估阶段降低对产品的信心的令人衰弱的问题。

【讨论】:

这很可能是 mvel 的问题。当规则执行超过 20 次并启动 JIT 编译器时,您可能会遇到类似的问题。 Bug 与结合 、>= 的 'not' 和 'exist' 约束有关。根据邮件列表中的人的说法,这个问题现在已经在 5.6 和 6.0 中得到修复,并且已经为 5.5 创建了一个反向移植。

以上是关于Drool 无法正确排序数字的主要内容,如果未能解决你的问题,请参考以下文章

如果混合数字和文本,Tablesorter 插件无法正确排序列

MySQL 'Order By' - 正确排序字母数字

反应表没有正确排序数字

如何正确排序带有数字的字符串? [复制]

Orderby() 没有正确排序数字 c#

无法正确按日期排序