流口水:如何在规则的末尾使用枚举



我在编写与lhs中的enum值匹配的规则时遇到了困难。

例如,如果我有以下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版本

这个适合我:

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

这样也可以了:

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

验证它是否仍然在Drools 5.3中发生,如果在jira中发生,则提交一个错误

我尝试在LHS上使用Enum [Ticket(status == EStatus.OK)],我得到编译时错误如下:

BuildError: cannot to analyze Expression status == EStatus。好吧错误:无法使用严格模式解析方法:....

解决方案:

在LHS规则中,我们必须与一个常量值进行比较…例如:user: user (age> 60) -这里我们将age与常量值60进行比较。

所以对于使用Enum, Ticket(status == EStatus.OK)…我必须用一些常数来代替EStatus。把这个和状态比较一下。因此,我在Enum中使用了一个静态方法。

因此,规则的LHS现在看起来像:Ticket(status == EStatus.getEStatus(1))

和状态枚举如下:

public enum状态{

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

EStatus (int数){这一点。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;
}

}

我已经在Linux和Windows环境下使用jdk 1.6进行了测试。

享受编码!

另一个解决方案。您只需要在Estatus enum中添加getter,如下所示。

public enum EStatus  {
OK,
NOT_OK;
public EStatus getValue(){
    return this;
}

}

那么你可以写规则如下

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

这也应该有效果:

rule "my rule"
when
    $status : EStatus()
    eval ( $status == EStatus.OK )
then
    ...
end

最新更新