RuleUnit + Quarkus 示例的 drl 文件 - 我们是否使用此代码实例化新规则"AllAmounts"?



我不明白这个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

在代码allAmounts.add(new AllAmounts($sum));行中,我们是否使用此代码实例化新规则AllAmounts?规则AllAmounts似乎没有接受任何参数,那么$sum是如何传递给规则的?

这里的情况是,您正在使用RuleUnitLoanUnit提供的方法,即allAmounts数据存储:

public DataStore<AllAmounts> getAllAmounts()

这里的规则是这样的:

rule AllAmounts
when
accumulate ( $a : /loanApplications ; $sum : sum($a.amount))
then
allAmounts.add(new AllAmounts($sum));
end

一行接一行,如下所示:

rule AllAmounts
when
accumulate ( 
$a : /loanApplications ; // for each loan application ($a)
$sum : sum($a.amount)    // sum up the amount; assign output to $sum
)
then
allAmounts.add(
new AllAmounts($sum) // create a new AllAmounts object
);                                  // and add it to the AllAmounts datastore (working memory)
end

回忆口水"发现";属性——因此,当您引用类中的某个字段时,它首先检查是否存在"getter"。对于那个领域。这就是这里这个令人困惑的语法所发生的事情:尽管我们从来没有声明一个名为allAmounts变量,但我们在RuleUnit中确实有一个名为getAllAmounts的getter…这就是我们得到的。

数据存储是Kogito向其规则提供信息的一种方式。在Kogito文档中,它是这样定义的:

数据存储:一个可写存储选项,用于添加或删除数据,然后通知所有订阅者可变数据已被修改。规则可以对传入的值进行模式匹配,并更新或删除可用的值。对于熟悉Drools的用户,此选项相当于入口点的类型化版本。实际上,DataStore<Object>相当于一个旧式的入口点。

注意Drools也有一个非常相似的DataSource接口;你可以用同样的方式来考虑它们。两者基本上都是包装器,围绕工作记忆中特定类型的对象集合。因此,这条规则有效地做的是创建一个新的AllAmounts对象,然后添加到数据存储中,代表工作内存中的数据。

在任何情况下,我们都不会"按名称"执行规则。——对于示例作者来说,这是一个不幸的命名选择。规则不是像这样按需执行的,它们是基于事实匹配条件子句的一系列执行的。

引用

  • 你可以在Drools文档中阅读更多关于规则单元的信息。
  • Drools数据源在Drools文档中也有讨论。
  • /loanApplication语法是OOPath符号,似乎没有专门的文档,但在Drools文档中也有示例。
  • 我找不到Kogito数据存储的Javadoc,但它们在Kogito文档中有讨论。

最新更新