2012-03-19 3 views
1

私はJboss Ruleを持つ初心者です。私はドキュメンテーションを読みましたが、次のコードサンプルのルールを書き始めるアプローチを見つけることができません。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 
    } 
} 

誰でも私にヒント/アイデアを伝えることができれば本当に感謝していますか?

EDIT:

こんにちは、

今のところ、これは私が上記のユーザーの場合のために開発することができるものです。

  1. 私はdroolsセッションに(List of UserDetailVo)を挿入しています。
  2. オブジェクト(UserDetailVo)には(List of UserInfoVo)が含まれています。すべてUserInfoVoにはコードが含まれています。

今、私は私が下記のやろうとしていて、すべての(UserInfoVoのリスト)と更新(letterId)(UserDetailVo)を反復します。

ケース1:コードリストのみ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 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 

を有する:コードリストは、ケース2 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 

を有します

私が直面する問題は、ユーザーがルールの最後に変更/更新する場合です。それは無限ループに入ります。変更/更新を削除すると、ケース3の場合でもリストサイズが0より大きい場合でもルールは強制的に起動されます。

+0

まだ情報が不足していますので、タイプを数えましょう。私は 'User'、' Letter'を見ていますが、 'Group'とは何か、そしてそれが' User'にどう関係しているのか分かりません。 – Osw

+0

問題文を更新しました。 Thanx –

答えて

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%のルールということですこれは、「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という条件も追加されています。これは、Orderファクトが更新されたときにルールが再アクティブ化されないようにするためです。

"else"を模倣する条件を記述するための具体的なユースケースではなく、簡単な例を中心に説明しました。私はあなたのユースケースを完全に理解しているかどうかまだ分かりませんが、うまくいけば私はあなたの質問の主要な概念的な部分に答えました。

+0

非常に良い説明。しかし、私はいくつかのパラメータに基づいてグループ化されたときにルールを設計するのに苦労しています。例については - (リージョン== '米国')の場合: (ピザ== '野菜')の場合0.05を返します。 if(Pizza == 'veg以外')は0.15を返します。 if(Pizza == 'sea-food')が2.05を返します。 //それ以上の100のルール if(Region == 'AUS') if(pizza == 'abc')return 1.04; if(pizza == 'xyz')は2.04を返します。 ' – Bhushan

関連する問題