有没有办法在drools的drl文件中的'eval'函数中使用'in'关键字

时间:2019-04-18 05:26:01

标签: drools

我想在'eval'函数中使用'in'关键字,在该函数中我得到错误消息,即“流口水”无法识别“ in”。所以我有多个值要对照特定事实的属性进行检查

when
    $person : Person(PIN in ("123","456","789"))
then
    //do something
end

//例如,我想在eval中使用它

when
    $person : Person()
    eval($person.PIN in ("123","456","789"))
then
    //do something
end

但是它显示了编译时错误。 还有其他方法吗?

已编辑

所以我在决策表中有一些条件要使用eval,因为其他方式对我的情况没有帮助,下面的快照将对此进行解释

SnapShot 1: Decision Table without eval()

SnapShot 2: Decision Table with eval()

  1. 第一个快照中的问题: 编译电子表格时,条件会转到第二行对象,如下面的代码所示:这就是它的解释方式
when
   personMap : PersonMap ()
   basicEligiblePerson : Person( personalAddress.PIN in ($param) ) from 
   personMap.AddressesList
   addresses : Address() from basicEligiblePerson.AddressesList
   personalAddress : PersonalAddress() from addresses.PersonalAddress
then
   basicEligiblePerson.setEligibility(true);
end
  1. 第二个快照中的问题: 编译此电子表格时,条件转到eval()函数,但'in'关键字在eval()中不起作用。
when
   personMap : PersonMap ()
   basicEligiblePerson : Person( personalAddress.PIN in ($param) ) from 
   personMap.AddressesList
   addresses : Address() from basicEligiblePerson.AddressesList
   personalAddress : PersonalAddress() from addresses.PersonalAddress
   eval( personalAddress.PIN in ($param) )
then
   basicEligiblePerson.setEligibility(true);
end

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您的问题中给出的第一个样本足以进行验证。您不需要使用eval。

when
    $person : Person(PIN in ("123","456","789"))
then
    //do something
end

如果您的要求是将给定一组PIN的资格设置为true,那么您实际上就不需要决策表。我不完全了解您的POJO结构,因此,如果Person类具有成员变量addressList,而AddressList类具有成员personalAddress,该成员具有成员变量pin,则可以使用以下规则来获得结果。请注意,嵌套字段是使用成员变量名称而不是类名称来引用的。另外,在访问嵌套元素时,如果任何元素都可以为null,请同时添加null检查,以避免null指针异常。

when
   $basicEligiblePerson : Person( addressesList.personalAddress.pin in ("1234", "4567") ) 
then
   $basicEligiblePerson.setEligibility(true);
end