我目前正在对运行一组 Drools
的 java 批处理进行一些修复。 (是的!)规则。
我必须修正的规则是这样的:
rule "Insert a too old condition"
salience -1
when
$person : Person()
$tooOldInstant : DateTime() from now.minusDays(10)
DateTime( this < $tooOldInstant ) from accumulate (
LastData( $date : lastDate ) from $person.personLastDatas,
maxValue($date)
)
then
insert(new Condition("submitTooOldCondition"));
end
哪里需要简化Person
是一个带有 personLastDatas 的简单 bean Set<LastData>
和 LastData
有一个org.joda.time.DateTime
lastDate 属性。
问题:如何在 if $person.personLastDatas
中插入新条件为 null 则规则适用吗?
类似于:
rule "Insert a too old condition modified"
salience -1
when
$person : Person()
$tooOldInstant : DateTime() from now.minusDays(10)
$maxLastDate : DateTime() from accumulate (
LastData( $date : lastDate ) from $person.personLastDatas,
maxValue($date)
)
($maxLastDate == null || $maxLastDate < $tooOldInstant)
then
insert(new Condition("submitTooOldCondition"));
end
最佳答案
您应该有两条规则,一条用于空条件,一条用于比较日期。
这里是空条件规则;它验证 Person 是否存在,但没有 personLastDatas
属性:
rule "Insert a too old condition modified - null case"
salience -1
when
$person: Person( personLastDatas == null )
then
insert(new Condition("submitTooOldCondition"));
end
您现有的规则足以进行日期比较检查。
一般来说,如果您发现自己尝试在规则的任一侧执行复杂的 if-else 逻辑,则很好地表明您应该有两个规则。由于这两条规则不能同时都为真,因此您只能插入一个这种类型的条件。
话虽这么说,如果您使用的是现代版本的 drools,则可以使用条件和命名空间结果。 documentation详细介绍了这一点(我已链接 7.37.0.Final;大多数最近的 7.30+ 版本都具有此功能。)以下是您的规则的示例:
rule "Insert a too old condition"
salience -1
when
$person : Person( $lastDatas: personLastDatas )
if ( $lastDatas == null ) break[noData]
$tooOldInstant : DateTime() from now.minusDays(10)
DateTime( this < $tooOldInstant ) from accumulate (
LastData( $date : lastDate ) from $person.personLastDatas,
maxValue($date)
)
then
insert(new Condition("submitTooOldCondition"));
then[noData]
// any special logic for the null case goes here
insert(new Condition("submitTooOldCondition"));
end
(这是伪代码;我在这台计算机上没有 drools 项目,但应该类似。)
基本上,这种语法虽然更难阅读,但将允许您处理这些重复/部分共享的案例规则。通常建议您有两个规则,其中一个规则扩展另一个规则,因此常见条件的子集可以触发一个结果,而全套条件可以触发另一个结果。这与您这里所拥有的不完全一样,但是可以根据您的用例对功能进行优化。
break
关键字告诉引擎一旦满足条件就停止计算左侧;还有一个 do
关键字允许继续评估。
关于java - Drools 规则 - 空检查和累积条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61890851/