我不明白这个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文档中有讨论。