提问者:小点点

RuleUnit Quarkus示例的drl文件-“修改”和“更新”有什么区别?


我不明白这个drl代码的几个部分,但我只会在这里发布一个问题:

https://github.com/kiegroup/kogito-examples/blob/stable/ruleunit-quarkus-example/src/main/resources/org/kie/kogito/queries/RuleUnitQuery.drl

完整的drl代码在这里:

package org.kie.kogito.queries;
unit LoanUnit;
import org.kie.kogito.queries.LoanApplication;
import org.kie.kogito.queries.AllAmounts;
rule SmallDepositApprove when
    $l: /loanApplications[ applicant.age >= 20, deposit < 1000, amount <= 2000 ]
then
    modify($l) { setApproved(true) };
end
rule SmallDepositReject when
    $l: /loanApplications[ applicant.age >= 20, deposit < 1000, amount > 2000 ]
then
    modify($l) { setApproved(false) };
end
rule LargeDepositApprove when
    $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount <= maxAmount ]
then
    modify($l) { setApproved(true) };
end
rule LargeDepositReject when
    $l: /loanApplications[ applicant.age >= 20, deposit >= 1000, amount > maxAmount ]
then
    modify($l) { setApproved(false) };
end
rule NotAdultApplication when
    $l: /loanApplications[ applicant.age < 20 ]
then
    modify($l) { setApproved(false) };
end
query FindApproved
    $l: /loanApplications[ approved ]
end
query FindNotApprovedIdAndAmount
    /loanApplications[ !approved, $id: id, $amount : amount ]
end
rule AllAmounts
when
    accumulate ( $a : /loanApplications ; $sum : sum($a.amount))
then
    allAmounts.add(new AllAmounts($sum));
end
query FindAllApplicationAmounts
    $a : /allAmounts
end

修改($l){setAp的(true)};

我见过update在其他drl文件中的使用。修改更新有什么区别?是否有链接的文件被修改?


共1个答案

匿名用户

Drools留档很好地涵盖了这一点。

修改用于更改工作内存中对象中字段的值。

update用于用修改后的实例完全替换工作内存中的对象。

这两个规则都会触发对工作记忆的重新评估。具体来说,应该谨慎调用update,因为它会再次触发对所有规则的全面评估。(这就像使用新数据第二次调用“触发所有规则”。)

这些操作之所以重要,是因为对工作内存对象中的字段进行常规更改不会导致规则重新评估。也就是说,如果您有两个这样的规则:

rule "Remove invalid houses"
when
  $house: House( forSale == true, price == 0 )
then
  $house.setForSale(false);
end

rule "Schedule inspection for all for-sale houses"
when
  $house: House( forSale == true )
then
  InspectionUtil.schedule($house);
end

…在这种情况下,即使第一个规则也会触发,您的第二个规则也会触发。在此示例中,我们有一个带有“待售”标志(真/假)和价格的House对象。如果价格为0,则列表出现问题,因此我们希望删除“待售”指标。同时,我们希望安排所有待售房屋进行检查。当我们将“待售”标志的状态更改为false时,该更改对第二个“计划检查”规则不可见;为了使更改可见,您必须使用修改:

rule "Remove invalid houses"
when
  $house: House( forSale == true, price == 0 )
then
  modify( $house ) {
    setForSale(false)
  }
end

现在第二条规则不会触发,因为它会“看到”房子不再出售。如果你想了解更多细节以及为什么它以这种方式工作,我在另一个答案中简要概述了Drools如何评估规则条件。