2011-11-21 4 views
5

lhsの列挙値と一致するルールを書くのが難しいです。Drools:ルールのlhsでenumを使用するには?

public enum EStatus { 
    OK, 
    NOT_OK 
} 

私はこのような何かでそれを使用したい:私は、次の列挙型を持っている場合

例えば、

rule "my rule" 
dialect "java" 
    when   
     status : EStatus()      // --> this works, but I want to be more specific 
     // status : EStatus(this == EStatus.OK) // --> doesn't work. How can I make it work? 
    then 
     // ... 
end 

これはDroolsの中でも、可能ですか?私はバージョン5.1.1を使用します。

答えて

6

これは私の作品:

rule "my rule" 
when 
    Ticket(status == EStatus.OK) 
then 
    ... 
end 

ので、それはあまりにも動作するはずです:

rule "my rule" 
when 
    EStatus(this == EStatus.OK) 
then 
    ... 
end 

は、それはまだDroolsの5.3で発生したかどうかを確認し、それがjira

+0

おかげで以下のようにルールを記述することができます。今それはまた私のために働く。問題を複数回確認したので、ここに投稿する前に、それは不思議です。最も有望なものが抜け出した... – Calin

0

でない場合は、バグを報告私は、LHS [チケット(状態== EStatus.OK)]でEnumを使用しようとしましたが、次のようなコンパイルエラーが発生します。

BuildError:厳格モードを使用する方法を解決することができません::== EStatus.OK エラーを発現状態を分析することができません....

ソリューション:ルールのLHSで

、我々は比較する必要がユーザー:ユーザー(年齢> 60) - ここでは年齢を60という定数と比較しています。

したがって、列挙型を使用する場合、チケット(ステータス== EStatus.OK)...これをステータスと比較するには、EStatus.OKの代わりに定数を使用しなければなりませんでした。このため、私はEnumで1つの静的メソッドを使用しました。

ので、ルールのLHSは、今のようになります。チケット(状態== EStatus.getEStatusは、(1))

とEStatus列挙型は、次のようなものです:

パブリック列挙EStatus {

// you can use values other than int also 
OK(1), 
ERROR(2); 

private int value; 

EStatus(INT番号) {this.value =番号。 }

public int valueOf() 
{ 
    return this.value; 
} 

public static EStatus getEStatus(int value){ 
    EStatus eStatus = null; 

    for(EStatus e : EStatus.values()){ 
     if(e.valueOf() == value){ 
      eStatus = d; 
      break; 
     } 
    } 

    return eStatus; 
} 

}

私は、JDK 1.6を使用して、これをテストし、両方のLinuxとWindows環境できました。

コーディングをお楽しみください!

0

もう1つの解決策。下記のように、Estatus列挙体にゲッターを追加するだけです。

public enum EStatus { 
OK, 
NOT_OK; 

public EStatus getValue(){ 
    return this; 
} 

}

次に、あなたがそれを指摘して

rule "my rule" 
when 
    EStatus(value == EStatus.OK) 
then 
    ... 
end 
関連する問題