当前位置: 首页 > 知识库问答 >
问题:

Drools布尔比较

诸葛柏
2023-03-14

为什么false==(cancelationCode=='C')(cancelationCode=='C')==false有不同的

我正在使用Drools DSL,我必须实现一个规则:

rule "my business rule"
    dialect "mvel"
    when
        There is a trade that
        - Supervised Trade
        ...
    then
        ...
end

我有这些DSL定义:

[when] Supervised Trade = 
    Customer Trade 
    AND NOT Canceled 

[when] Customer Trade = (recordTypeCode is equal to '910')
[when] Canceled = (cancellationCode is equal to 'C')

[when] is equal to = ==

[when] {var1}?(?<![\w'])\s*AND\s*(?![\w']){var2}? = {var1} && {var2}
[when] {var1}?(?<![\w'])\s*OR\s*(?![\w']){var2}? = {var1} || {var2}
[when] {var1}?(?<![\w'])\s*NOT\s*(?![\w']){var2}? = {var1} false == {var2}

要求是以肯定的方式编写可重用的DSL语句,并具有否定它们的能力。

$trade: Trade((recordTypeCode == '910') && false == (cancellationCode == 'C'))    
$trade: Trade((recordTypeCode == '910') && (cancellationCode == 'C') == false)

共有1个答案

陶超
2023-03-14

由于使用DRL6 lexer对其进行了不同的解析,因此它的行为确实不同。
org.drools.compiler.compiler.drlexprparser.parse将这些文本段保持原样,但
baseDescr expr=parser.conditionalorexpression();揭示了ANTLR解析器以不同的方式处理这些文本段。

false==(cancelationCode=='C')更改为true^(cancelationCode=='C')时,出现错误:“谓词'true^cancelationCode=='C''必须是布尔表达式”。这揭示了问题的根本原因--ANTLR解析器在单个语句周围去掉大括号,这就是为什么

false == cancelationCode == 'C' -> doesn't work as expected    
cancelationCode == 'C' == false -> works as expected

但复杂语句周围没有去掉大括号,因此两者都能正常工作:

false == (true && cancelationCode == 'C')
(true && cancelationCode == 'C') == false

我会说这个‘优化’是一个bug。

 类似资料:
  • 问题内容: 以这个为例(摘自Java regexchecker不起作用): 是否用于检查的值是否重要? 我知道有这是颇为相似。但是,很明显,这个问题只针对原始对象,而不是对象包装器;因此,将不适用。 另外,应该以不同于其他的方式对待? 问题答案: 从您的评论看来,您正在寻找使用包装器类的“最佳实践” 。但是实际上 并没有 最佳实践,因为使用此类开始是一个坏主意。使用对象包装的唯一原因是在您绝对 必

  • 我创建了一个规则,其“when”条件如下:- 上述条件运行良好。现在我如何在一个规则中添加多个布尔条件?为(如)。上面的规则可以概括为:a和b,所以如果我想创建一个规则:(a和b)或c,那么它的实际drl语法是什么。我对drools是新手,所以请帮助我了解规则(a和b)或C的语法。 我确实创建了一个语法 错误消息:Message[id=1,level=Error,path=mapiteration

  • 嘿,好吧,所以我在阅读Python的文档,它指出任何空字符串、列表、字典,我想它们都被称为对象(我真的不理解对象的概念:\n如果有人能向我解释,我会很高兴)。无论如何,我的问题是

  • 我有一个布尔方法正在对字符串进行一些错误检查。我有一个int类常量叫“numwords”=8。我将一个字符串传递给布尔方法,在该方法中,我使用.split和.length对字符串进行单词计数。一个名为“words”的int计算字符串中的单词数。完成之后,我要执行一个if语句,比较单词和数字单词。如果它们的数目相等,则返回true,否则为false。我试过==和.等于,但都没用。有什么想法吗? 我试

  • 我正在尝试这个代码编写练习,我太迷路了! 它甚至不编译,但即使它编译了,我肯定它也不会工作。

  • 问题内容: 我在mysql db表中有一个布尔字段。 要获得所有未过时的测试用例的计数,可以像这样简单地完成: 效果很好,但是flake8报告以下警告: E712:与False的比较应为“如果cond为False:”或“如果非cond:” 好吧,我认为这是有道理的。因此,将我的代码更改为此: 要么 但是它们都不起作用。结果始终为0。我认为filter子句不支持运算符“ is”或“ is not”。