Слюни: Как использовать enum в lhs правила? - PullRequest
5 голосов
/ 21 ноября 2011

У меня трудности с написанием правила, которое соответствует значению enum в его 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.

Ответы [ 3 ]

7 голосов
/ 21 ноября 2011

Это работает для меня:

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 голосов
/ 27 июля 2015

Другое решение. Вам просто нужно добавить геттер в перечисление Estatus, как показано ниже.

public enum EStatus  {
OK,
NOT_OK;

public EStatus getValue(){
    return this;
}

}

Тогда вы можете написать правило, как показано ниже

rule "my rule"
when
    EStatus(value == EStatus.OK)
then
    ...
end
0 голосов
/ 13 сентября 2012

Я пытался использовать Enum на LHS [Ticket (status == EStatus.OK)], я получаю ошибку времени компиляции, например, такую:

BuildError: Невозможно проанализировать состояние выражения == EStatus.OK Ошибка: невозможно разрешить метод с использованием строгого режима: ....

Решение:

В правиле LHS мы должны сравнить со значением константы ... дляпример: пользователь: пользователь (возраст> 60) - здесь мы сравниваем возраст со значением константы 60.

Так что для использования Enum, Ticket (status == EStatus.OK) ... Мне пришлось использовать некоторую константувместо EStatus.OK, чтобы сравнить это со статусом.По этой причине я использовал один статический метод в Enum.

Итак, LHS правила теперь выглядит так: Ticket (status == EStatus.getEStatus (1))

и перечисление EStatus равнонапример:

public enum 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.

Наслаждайтесь кодированием!

...