Использование enum в drools - PullRequest
0 голосов
/ 04 января 2019

Я решаю проблему составления списка сотрудников. Одно из ограничений заключается в том, что сотрудник каждого «типа» должен присутствовать каждый день. Тип определяется как перечисление.

Я сейчас настроил это правило следующим образом:

rule "All employee types must be covered"
when
    not Shift(employeeId != null, $employee: getEmployee(), $employee.getType() == "Developer")
then
    scoreHolder.addHardConstraintMatch(kcontext, -100);
end

Это отлично работает. Однако я должен настроить аналогичное правило для всех возможных типов сотрудников.

Чтобы обобщить, я попробовал это:

rule "All employee types must be covered"
when
    $type: Constants.EmployeeType()
    not Shift(employeeId != null, $employee: getEmployee(), $employee.getType() == $type.getValue())
then
    scoreHolder.addHardConstraintMatch(kcontext, -100);
end

Однако это правило не выполняется. Ниже мое перечисление определено в файле констант

public enum EmployeeType {
    Developer("Developer"),
    Manager("Manager");

    private String value;

    Cuisine(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

Что я делаю не так?

1 Ответ

0 голосов
/ 04 января 2019

Полагаю, проблема в том, что вы никогда не вставляете перечисления в вашу сессию (это не факты). Один из способов ее решения - вставить их вручную:

for(EmployeeType type : Constants.EmployeeType.values()){
  ksession.insert(type);
}

Другой способ - заставить ваше правило извлекать все возможные значения из перечисления:

rule "All employee types must be covered"
when
  $type: Constants.EmployeeType() from Constants.EmployeeType.values()       
  not Shift(employeeId != null, $employee: getEmployee(), $employee.getType() == $type.getValue())

then
  scoreHolder.addHardConstraintMatch(kcontext, -100);
end

Надеюсь, это поможет,

...