Drools规则逻辑未按预期运行

时间:2019-10-22 22:47:16

标签: drools

层次结构:
如果任何员工的薪水为100k,则Organization.maxSalary = 100k。
如果某位员工的薪水为50k,则如果没有其他人获得100k,则Organization.maxSalary = 50k。

DRL

rule "Salary 100000"
    when
        $org: Organization()
        $empDetail: EmployeeDetail() from $org.employeeDetail
        $employee: Employee( $org.maxSalary != 100000,
                             salary == 100000
                           ) from $empDetail.employees
    then
        System.out.println("Salary 100000: " + $org.maxSalary);
        $org.maxSalary = 100000;
end

rule "Salary 50000"
    when
        $org: Organization()
        $empDetail: EmployeeDetail() from $org.employeeDetail
        $employee: Employee( $org.maxSalary != 100000
                          && $org.maxSalary != 50000,
                             salary == 50000
                           ) from $empDetail.milestoneDetails
    then
        System.out.println("Salary 50000: " + $org.maxSalary);
        $org.maxSalary = 50000;
end

输入JSON 1:

{
  "Organization": {
    "EmployeeDetail": {
      "Employees" : [
        {
          "name": "willie"
          "salary": "50000",
        },
        {
          "name": "john"
          "salary": "100000",
        },
        {
          "name": "jack"
          "salary": "50000",
        },
        {
          "name": "jim"
          "salary": "50000",
        }
      ]
    }
  }
}

预期的控制台输出: Salary 100000: null

实际控制台输出: Salary 100000: null

一切都很好。

输入JSON 2:

{
  "Organization": {
    "EmployeeDetail": {
      "Employees" : [
        {
          "name": "willie"
          "salary": "50000",
        },
        {
          "name": "jack"
          "salary": "50000",
        },
        {
          "name": "jim"
          "salary": "50000",
        }
      ]
    }
  }
}

预期的控制台输出: Salary 50000: null

实际控制台输出:

Salary 50000: null
Salary 50000: 50000
Salary 50000: 50000

在两种情况下,正确设置Organization.maxSalary的JSON结果都是好的。但是,为什么控制台输出很奇怪?

1 个答案:

答案 0 :(得分:2)

您要通过检查org.maxSalary触发规则。但是,您不应从Employee对象内部检查$ org.maxSalary,因为这不是Eployee的财产,而是Orgranization的财产。

此外,在org上设置maxSalary之后,您应该使用新值(maxSalary)更新组织事实。 update()使规则引擎意识到事实已被修改。

这是完整的规则代码

rule "Salary 100000"
    when
        $org: Organization(maxSalary != 100000)
        $empDetail: EmployeeDetail() from $org.employeeDetail
        $employee: Employee( salary == 100000
                           ) from $empDetail.employees
    then
        System.out.println("Salary 100000: " + $org.maxSalary);
        $org.maxSalary = 100000;
        update($org);
end

rule "Salary 50000"
    when
        $org: Organization(maxSalary != 100000 && maxSalary != 50000)
        $empDetail: EmployeeDetail() from $org.employeeDetail
        $employee: Employee(
                             salary == 50000
                           ) from $empDetail.employees
    then
        System.out.println("Salary 50000: " + $org.maxSalary);
        $org.maxSalary = 50000;
        update($org);

end

Json2的输出是

Salary 50000: null

我也不明白拥有的逻辑

 System.out.println("Salary 50000: " + $org.maxSalary);
 $org.maxSalary = 50000;

代替

 $org.maxSalary = 50000;
 System.out.println("Salary 50000: " + $org.maxSalary);

先打印一个空的maxSalary然后将金额分配给maxSalary似乎很奇怪。