2011-11-21 13 views
5

Mam trudności z pisaniem reguły, która pasuje do wartości wyliczeniowej w jej jednostkach.Drools: Jak używać wyliczenia w lhach reguły?

Na przykład, jeśli mam następujące wyliczenia:

public enum EStatus { 
    OK, 
    NOT_OK 
} 

chciałbym użyć go w coś takiego:

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 

Czy to w ogóle możliwe w Drools? Używam wersji 5.1.1.

Odpowiedz

6

Działa to dla mnie:

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

tak, że powinno działać zbyt:

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

Sprawdź, czy nadal występuje w Drools 5.3 i zgłosić błąd, jeśli to robi w jira

+0

Dzięki za wskazanie go. Teraz działa również dla mnie. To dziwne, ponieważ kilkakrotnie weryfikowałem problem przed opublikowaniem go tutaj. Najprawdopodobniej coś wymknęło się ... – Calin

0

Próbowałem użyć Enum na LHS [Ticket (status == EStatus.OK)], otrzymałem komunikat o błędzie kompilacji podobny do następującego:

BuildError: Nie można analizować stan Expression == EStatus.OK BŁĄD: Nie można rozwiązać stosując metodę ścisłą-mode: ....

Rozwiązanie:

W LHS reguły, musimy porównać o stałej wartości ... na przykład: użytkownik: użytkownik (wiek> 60) - tutaj porównujemy wiek ze stałą wartością 60.

Tak więc za korzystanie z Enum, bilet (status == EStatus.OK) ... Musiałem użyć trochę stałej zamiast EStatus.OK, aby porównać to ze statusem. Z tego powodu użyłem jednej metody statycznej w Enum.

Tak, LHS z reguły wygląda teraz tak: Ticket (status == EStatus.getEStatus (1))

i EStatus enum jest jak następuje:

public enum EStatus {

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

private int value; 

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

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; 
} 

}

Ja testowałem to przy użyciu JDK 1.6 i zarówno w środowisku Linux i Windows.

Ciesz się kodowaniem!

0

Inne rozwiązanie. Trzeba tylko dodać getter w enum Estatus, jak poniżej.

public enum EStatus { 
OK, 
NOT_OK; 

public EStatus getValue(){ 
    return this; 
} 

}

Następnie można napisać regułę jak poniżej

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