这个流口水规则能不能写得简单一点?
Can this drools rule be written simpler?
我刚开始写 drools 规则,想出了这个:
rule "Premium to high."
when
PricingResponse($netPremium : this.getTotalNetPremium(),
$paymentTerm : this.getPaymentTerm().getMonths());
$newPremium : BigDecimal() from $netPremium.multiply($paymentTerm);
$currentPremium : BigDecimal();
BigDecimal($newPremium.divide($currentPremium, MathContext.DECIMAL128) > 1.2B);
then
insert(new Validation("New premium " + $newPremium + " (" + $netPremium +
" * " + $paymentTerm + ") " +
" is larger than 120% of the current premium " +
$currentPremium, Department.K_EN_A));
end
上面的 drools 规则有效。但是,对于我正在解决的问题,LHS 似乎有点复杂,所以我的问题是它可以写得更简单吗?如果可以,怎么做?
将PricingResponse
和一个BigDecimal
对象插入到KieSession
中。在触发规则后,将检索所有 Validation
对象。我认为这是一个非常标准的规则问题。在 PricingResponse
对象中有一个 BigDecimal totalNetPremium
属性和一个 'PaymentTerm paymentTerm' 属性。我想验证 paymentTerm 和 totalNetPremium 的乘积是否大于原始保费的 120%,作为 BigDecimal
插入。 PaymentTerm
class 和 enum
有一个 BigDecimal month
属性。
该规则确实不必要地复杂,主要是因为您认为必须将所有 BigDecimal
对象提取为模式。这是我的第一个提案:
rule "Premium to high."
when
PricingResponse($netPrem: totalNetPremium,
$paymtTerm: paymentTerm)
$currPrem: BigDecimal();
eval( isTooHigh( $netPrem, $paymtTerm.getMonths(), $currPrem ) )
then
除了通过仅使用字段名称省略分号和 .this.get...()
之外,我将笨拙的 BigDecimal 操作提取到一个函数中,该函数可以作为 DRL 函数实现或作为静态函数导入 Java函数。
我不喜欢使用 "raw" JDK classes 作为事实(此处:BigDecimal)。这些对象没有区别。该值应来自包含 class 的 Policy,而后者又应链接到 PricingResponse
.
我刚开始写 drools 规则,想出了这个:
rule "Premium to high."
when
PricingResponse($netPremium : this.getTotalNetPremium(),
$paymentTerm : this.getPaymentTerm().getMonths());
$newPremium : BigDecimal() from $netPremium.multiply($paymentTerm);
$currentPremium : BigDecimal();
BigDecimal($newPremium.divide($currentPremium, MathContext.DECIMAL128) > 1.2B);
then
insert(new Validation("New premium " + $newPremium + " (" + $netPremium +
" * " + $paymentTerm + ") " +
" is larger than 120% of the current premium " +
$currentPremium, Department.K_EN_A));
end
上面的 drools 规则有效。但是,对于我正在解决的问题,LHS 似乎有点复杂,所以我的问题是它可以写得更简单吗?如果可以,怎么做?
将PricingResponse
和一个BigDecimal
对象插入到KieSession
中。在触发规则后,将检索所有 Validation
对象。我认为这是一个非常标准的规则问题。在 PricingResponse
对象中有一个 BigDecimal totalNetPremium
属性和一个 'PaymentTerm paymentTerm' 属性。我想验证 paymentTerm 和 totalNetPremium 的乘积是否大于原始保费的 120%,作为 BigDecimal
插入。 PaymentTerm
class 和 enum
有一个 BigDecimal month
属性。
该规则确实不必要地复杂,主要是因为您认为必须将所有 BigDecimal
对象提取为模式。这是我的第一个提案:
rule "Premium to high."
when
PricingResponse($netPrem: totalNetPremium,
$paymtTerm: paymentTerm)
$currPrem: BigDecimal();
eval( isTooHigh( $netPrem, $paymtTerm.getMonths(), $currPrem ) )
then
除了通过仅使用字段名称省略分号和 .this.get...()
之外,我将笨拙的 BigDecimal 操作提取到一个函数中,该函数可以作为 DRL 函数实现或作为静态函数导入 Java函数。
我不喜欢使用 "raw" JDK classes 作为事实(此处:BigDecimal)。这些对象没有区别。该值应来自包含 class 的 Policy,而后者又应链接到 PricingResponse
.