2011-11-21 12 views
5

Tengo dificultades para escribir una regla que coincida con un valor enum en su lhs.Drools: ¿Cómo usar una enumeración en el lhs de una regla?

Por ejemplo, si tengo la siguiente enumeración:

public enum EStatus { 
    OK, 
    NOT_OK 
} 

me gustaría usarlo en algo como esto:

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 

Es esto posible en Drools? Yo uso la versión 5.1.1.

Respuesta

6

Esto funciona para mí:

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

por lo que debería funcionar también:

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

comprobar si se sigue produciendo en Drools 5.3 y presentar un error si lo hace en jira

+0

Gracias por señalarlo. Ahora también funciona para mí. Es extraño, porque verifiqué varias veces el problema antes de publicarlo aquí. Algo más probable se le escapó ... – Calin

0

Traté de usar Enum en LHS [Ticket (estado == EStatus.OK)], obtengo error de tiempo de compilación algo así como lo siguiente:

BuildError: No se puede analizar el estado Expresión == EStatus.OK de error: no puede resolver utilizando el método estricta modo: ....

Solución:

En LHS regla, tenemos que comparar con un valor constante ... por ejemplo: usuario: usuario (edad> 60) - aquí estamos comparando la edad con el valor constante 60.

Entonces para usar Enum, Ticket (estado == EStatus.OK) ... Tuve que usar alguna constante en lugar de EStatus.OK para comparar esto con el estado. Por esta razón, utilicé un método estático en Enum.

Así, la regla de LHS ahora queda como: entradas (estado == EStatus.getEStatus (1))

y enumeración estatus es como siguiente:

enumeración pública estatus {

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

private int value; 

EStatus (número int) { 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; 
} 

}

que han probado esta utilizando JDK 1.6 y tanto en Linux y el entorno Windows.

¡Disfrute de la codificación!

0

Otra solución. Solo necesita agregar getter en Estatus enum como se muestra a continuación.

public enum EStatus { 
OK, 
NOT_OK; 

public EStatus getValue(){ 
    return this; 
} 

}

entonces usted puede escribir de la siguiente manera regla

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