如何在规则文件中动态更改运算符

时间:2015-01-21 05:09:40

标签: java drools

我想使用drool引擎动态评估事实。规则条件属性&它们的条件运算符存储在数据库中,并在引擎启动时加载到WM。 所以我想在规则文件中使用该运算符,如下所示。

$dynCx  : DynCustomer()
$attrib : Attribute() from $dynCx.attributes   
$offer  : Offer($ofCode : offer_code, $domainName : domainName ) 
$rdef   : OfferRuleDef($entity : entity,
         $code : code,
         $value : value,
         $atrName : attributeName,
         $atrVal : attributeVal,
         $op : operation,
         $entity == $domainName,
         $code == "OFFER_CODE",
         $value == $ofCode,
         $atrName == $attrib.name,          
         $atrVal $op $attrib.value                           
         ) 

但我的错误

Caused by: java.lang.RuntimeException: [59,14]: [ERR 102] Line 59:14 mismatched input '$op' in rule "Evaluate Generic Offer Eligibility"
[0,0]: Parser returned a null Package

我们如何才能实现这一目标?

1 个答案:

答案 0 :(得分:0)

运算符无法在运行时解析,因此您无法编写此类规则。根据您使用的版本和您想象的运营商数量,您有几个选择。

1)为每个运营商编写规则:

OfferRuleDef( ..., operator == "==", attributeVal == $attrib.value )

为了避免过多的代码重复,请考虑规则可以相互“扩展”。

2)在最新版本中,创建一个静态辅助函数并传递三个值:

OfferRuleDef( ..., MyHelper.applyOperator($attrValue, $op, $attrib.value) )