Drools,如何在列表中检查具有特定属性的对象是否存在多次

时间:2014-11-12 11:26:16

标签: drools

我的工作记忆中有很多PersonEntity。我需要编写一个规则来检查工作内存中是否存在两个具有相同someProperty的PersonEntity。我写的如下,但问题是,当真的有两个具有相同someProperty的PersonEntity时,sys.out正在执行两次:

when 
    $person : PersonEntity(person.personType == PersonType.LegalPerson);
    $personList : ArrayList( size > 1 ) from collect( PersonEntity(someProperty.id == $legalPerson.someProperty.id))    

then
    System.out.println("error occured");

我也尝试了这个,但我认为因为我的工作记忆有许多PersonEntities,规则执行4次(PersonEntitys数量)和我的"错误发生"句子在控制台中显示4次​​:

  PersonEntity(some conditions, $relatedId :relatedPerson.id); 
  exists PersonEntity(some conditions, relatedPerson.id > $relatedId)

1 个答案:

答案 0 :(得分:0)

此问题的标准解决方案是使用唯一属性添加另一个约束,以保证排序。

when
   PersonEntity(personType == PersonType.LegalPerson, $pid: personId)
   exists PersonEntity(personType == PersonType.LegalPerson, personId > $pid)
then
   // two LegalPerson

如果您期望三个或更多相同,您甚至可能需要添加另一个模式来阻止多次激活:

when
   PersonEntity(personType == PersonType.LegalPerson, $pid: personId)
   not PersonEntity(personType == PersonType.LegalPerson, personId < $pid )
   exists PersonEntity(personType == PersonType.LegalPerson, personId > $pid)
then
   // two or more LegalPerson

(除非你真的需要所有这些,否则使用收集的建议并不好。)

即使您需要检查任何personType:

,这也会有效
 when
   PersonEntity( $pt: personType, $pid: personId)
   not PersonEntity(personType == $pt, personId < $pid )
   exists PersonEntity(personType == $pt, personId > $pid)
then
   // two or more $pt

在这里,您可以添加一个集合而不是第三个模式来获取所有此类PersonEntity事实。