Слюни правила логики не работает, как ожидалось - PullRequest
1 голос
/ 23 октября 2019

Иерархия: Если любому сотруднику платят 100 тыс., Organization.maxSalary = 100 тыс. Если любому сотруднику платят 50 тыс., Organization.maxSalary = 50 тыс., Если никто другой не получает 100 тыс.

ДХО

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

В обоих случаях результат JSON хороший, если Organization.maxSalary установлено правильно. Но почему вывод консоли странный?

1 Ответ

2 голосов
/ 23 октября 2019

Вы хотите запустить правило, проверив org.maxSalary. Однако вам не следует проверять $ org.maxSalary изнутри объекта Employee, поскольку это не свойство Eployee, а свойство Orgranization.

Кроме того, после установки maxSalary в org, вы должны update Факт организации с новым значением (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.

...