Drools JBOSS 规则嵌套 IF

标签 drools business-rules

我是 Jboss Rule 的新手。我已经阅读了文档,但我找不到开始为以下代码示例编写规则的方法。

For each User code in the list 
{
    If User code = ‘11’ 
    {
        If User code ‘17’ present in the group 
        {
            Add letter id 1
        }
        Else If User code ‘18’ present in the group 
        {
            Add letter id 2
        }
    }
    Else 
    {
        Add letter id 3 which is the letter need to be sent for code 11
    }
}
编辑:
到目前为止,这是我可以为上面讨论的用户案例开发的内容。
  • 我正在将(列表 UserDetailVo)插入到流口水 session 中。
  • 对象( UserDetailVo )包含( UserInfoVo 的列表)。每UserInfoVo包含一个代码。

  • 现在我想遍历( UserInfoVo 的列表)并将( letterId )更新到每个( UserDetailVo ),就像我在下面尝试做的那样。
    Case1 : 当 codeList 有 110,121
    rule "USER LETTER GROUPING 110,121" 
    salience 300
    no-loop true
    
        when
            userDetailVo : UserDetailVo ()
            UserInfoVo(code=="110") from userDetailVo.codeList
            UserInfoVo(code=="121") from userDetailVo.codeList
        then
            userDetailVo.addLetterId(1);
            //modify(trrDetailRequestVo)
    end
        
    
    Case2 : 当 codeList 有 110,127
    rule "USER LETTER GROUPING 110,127" 
            salience 300
            no-loop true
        
                when
                    userDetailVo : UserDetailVo ()
                    UserInfoVo(code=="110") from userDetailVo.codeList
                    UserInfoVo(code=="127") from userDetailVo.codeList
                then
                    userDetailVo.addLetterId(2);
                    //modify(trrDetailRequestVo)
            end
    
    Case3 : 当 codeList 只有 110
    rule "USER LETTER GROUPING 110" 
        salience 300
        no-loop true
        
            when
                userDetailVo : UserDetailVo (this.letterID.size() == 0) // Checking size of the list
                UserInfoVo(code=="110") from userDetailVo.codeList
            then
                userDetailVo.addLetterId(3);
                //modify(trrDetailRequestVo)
        end
    
    我面临的问题是我是否在规则结束时修改/更新。它进入无限循环。如果我删除修改/更新,如果大于 0 的列表大小仍然会触发规则 3。

    最佳答案

    “else”的概念并没有真正直接翻译成声明性语言。相反,您必须明确定义“其他”在您的数据方面的真正含义,并根据该条件编写一个(或多个)规则。例如,请考虑以下条件:

    If Order Total >= 1000
      Discount = 15%
    Else If Order Total >= 500
      Discount = 10%
    Else If Order Total >= 250
      Discount = 5%
    Else
      Discount = 0%
    

    对这些条件规则的自然第一次尝试可能是:
    rule "15% discount"
      when
        $o : Order( total >= 1000 )
      then
        modify($o) { setDiscount(.15); }
    end
    
    rule "10% discount"
      when
        $o : Order( total >= 500 )
      then
        modify($o) { setDiscount(.10); }
    end
    
    etc...
    

    这种方法的问题在于,10% 和 15% 规则都将匹配总订单数为 1200 的订单。这是因为“else if”的“else”部分固有地包含订单总额不大于1000. 所以我们把规则写成这样:
    rule "15% discount"
      when
        $o : Order( total >= 1000, discount == null )
      then
        modify($o) { setDiscount(.15); }
    end
    
    rule "10% discount"
      when
        $o : Order( total >= 500, total < 1000, discount == null )
      then
        modify($o) { setDiscount(.10); }
    end
    
    rule "5% discount"
      when
        $o : Order( total >= 250, total < 500, discount == null )
      then
        modify($o) { setDiscount(.05); }
    end
    
    rule "no discount"
      when
        $o : Order( total < 250, discount == null )
      then
        modify($o) { setDiscount(0); }
    end
    

    (您会注意到我还添加了 discount == null 条件。这是为了防止在更新订单事实时重新激活规则。)

    我一直专注于一个简单的例子而不是你的具体用例来演示编写条件来模仿“else”的概念。我仍然不确定我是否完全理解您的用例,但希望我已经回答了您问题的关键概念部分。

    关于Drools JBOSS 规则嵌套 IF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771396/

    相关文章:

    java - Drools 重用 StatefulKnowledgeSession?

    java - PatternDescr 内的 Drools AndDescr(和 OrDescr)

    java - 如何将规则存储在数据库中并在 java 文件中访问它们而不是在 Drools 中使用 .drl 文件?

    c# - 动态业务规则

    python - 如何在 Python 中实现规则集

    php - PHP 中的约束编程

    angular - 为什么 Angular 验证是在组件/表单中完成的,而不是在域模型上完成的?

    domain-driven-design - 流口水与 DDD : Does Drools require Flat Object Models?

    drools - 如何使用 Drools 向后链接来列出满足目标所需的初始事实?

    scala - 什么是基于规则验证的 Scala 惯用方法?