2012-03-19 246 views
1

我是一個Jboss規則的新手。我已經閱讀了文檔,但是我沒有找到開始爲以下代碼示例編寫規則的方法。Drools JBOSS規則嵌套IF的

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 
    } 
} 

我真的很感激,如果有人可以給我一個提示/想法如何去呢?

編輯:

嗨,

到目前爲止,這是我能爲上述討論的用戶的情況下發展。

  1. 我插入(列表UserDetailVo)到drools會話。
  2. 對象(UserDetailVo)包含(列表UserInfoVo)。每個UserInfoVo包含一個代碼。

現在我想遍歷(的UserInfoVo列表)和更新(letterId)的每一個(UserDetailVo),因爲我想在下面做。

情況1:當編碼表具有110121

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 

情況2:當編碼表具有110127

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 

情形3:當編碼表僅具有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 

我面臨的問題是如果我在規則的末尾修改/更新用戶。它進入無限循環。如果我刪除修改/更新,在情況3,但如果列表大小,如果大於0仍然規則被激發。

+0

還沒有足夠的信息,讓我們來算你的類型。我看到'User','Letter',但不明白'Group'是什麼以及它與'User'的關係。 – Osw 2012-03-19 21:14:27

+0

我已更新問題陳述。 Thanx – 2012-03-20 07:02:53

回答

6

「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」的「其他」部分固有地包括訂單總數不大於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條件。這是爲了防止訂單事實更新時規則重新激活。)

我一直專注於一個簡單的示例,而不是您的特定用例來演示編寫條件以模擬「其他」的概念。我仍不確定自己完全理解了你的用例,但希望我已經回答了你的問題的關鍵概念部分。

+0

非常好的解釋。但是,當我們在幾個參數的基礎上將它們組合在一起時,我正在努力設計規則。 對於實施例 - 如果(地區== 'US'): 如果(披薩== '蔬菜')返回0.05; if(Pizza =='non-veg')return 0.15; if(Pizza =='sea-food')return 2.05; //多個這樣的規則100 如果(地區== 'AUS') 如果(比薩餅== 'ABC')返回1.04; if(pizza =='xyz')return 2.04; ' – Bhushan 2015-03-17 10:06:05