2011-11-21 35 views
5

我在编写与lhs中的枚举值相匹配的规则时遇到困难。Drools:如何在规则的lhs中使用枚举?

举例来说,如果我有以下枚举:

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

确实提交Bug我试图在LHS上使用Enum [Ticket(status == EStatus.OK)],我得到的编译时错误如下:

BuildError:无法分析表达状态== EStatus.OK 错误:无法用严格的模式解决方法:....

解决方案:

在规则LHS,我们要比较与恒定值...例如:用户:用户(年龄> 60) - 这里我们比较年龄与常数值60.

因此,对于使用枚举,票(状态== EStatus.OK)...我必须使用一些常量来代替EStatus.OK,以便将其与状态进行比较。出于这个原因,我在Enum中使用了一种静态方法。

因此,规则的LHS现在看起来像:票务(状态== EStatus.getEStatus(1))

和EStatus枚举就像是以下几点:

公共枚举EStatus {

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

private int value; 

EStatus(int number) { this.value = number; }

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

另一种解决方案。您只需要在Estatus枚举中添加getter即可,如下所示。

public enum EStatus { 
OK, 
NOT_OK; 

public EStatus getValue(){ 
    return this; 
} 

}

然后你可以编写规则如下

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