层次结构:
如果任何员工的薪水为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结果都是好的。但是,为什么控制台输出很奇怪?
答案 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似乎很奇怪。