在 drools 中使用枚举

Using enum in drools

我正在解决员工排班问题。那里的限制之一是每个 "type" 的员工应该每天都在场。类型定义为枚举。

我现在已将此规则配置如下:

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

我做错了什么?

我想问题是您从来没有在会话中插入枚举(它们不是事实)。 解决它的一种方法是手动插入它们:

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

希望对您有所帮助,