Использование enum в drools
Я решаю проблему составления списка сотрудников. Одно из ограничений заключается в том, что сотрудник каждого "типа" должен присутствовать каждый день. Тип определяется как перечисление.
Я прямо сейчас настроил это правило следующим образом:
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 ответ
Решение
Думаю, проблема в том, что вы никогда не вставляете перечисления в вашу сессию (это не факты). Один из способов ее решения - вставить их вручную:
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
Надеюсь, поможет,