Drools检查列表中的重复字段

Drools检查列表中的重复字段,drools,Drools,我有一个对象A,它包含一个对象B的列表,对象B有各种字段,包括一个日期字段。我需要写一个规则来检查整个列表中的日期是否唯一,但我有点被困在如何做到这一点上…我有一些类似于: rule "Check Unique Dates" dialect "mvel" when a : A list : java.util.List( ) from collect ( Date B.date (B.date!= null)) set : java.util.Set( ) from co

我有一个对象A,它包含一个对象B的列表,对象B有各种字段,包括一个日期字段。我需要写一个规则来检查整个列表中的日期是否唯一,但我有点被困在如何做到这一点上…我有一些类似于:

rule "Check Unique Dates"
dialect "mvel"
when
    a : A
    list : java.util.List( ) from collect ( Date B.date (B.date!= null))
    set : java.util.Set( ) from collect ( Date B.date(B.date!= null))
    eval(list.size() == set.size())
then
    //do something
end
我尝试将对象B的日期添加到列表和集合中,并比较2的大小,但我得到一个错误:

[ERR 102] Line 15:54 mismatched input 'B' in rule "Check Unique Dates" [0,0]: Parser returned a null Package
知道我做错了什么吗

我还需要通过在中的名称字段对其进行限制,因为可以有多个

越来越近了,我想

when
    a : A

    b1 : B( d : date, date!= null )
    b2: B( date == d , eval( this != b1) )

但这会检查B的所有实例,即使它们不在该A实例的列表中(并且规则会触发1200次,即使只有6个B实例!?)…如何限制检查仅在该A实例中查找重复的实例?

以下是我提出的解决方案..并且有效:

when
    a : A( name == "xyz", coll : listOfB)       
    b1 : B( date1 : date, date!= null ) from coll
    b2 : B( date == date1, this != b1) from coll

then

现在我需要去一个黑暗的房间躺下…

我认为最好创建一个单独的方法来检查副本,
e、 当a:ab1:B(d:date,date!=null)b2:B(date==d,eval(this!=b1))时,g.ListUtils.hasDuplicate(list)

但这会检查B的所有实例,即使它们不在A实例的列表中……我如何限制检查?您可以这样理解:给我A中的所有集合,其中name==“xyz”,然后选择两个不同的项目(这个!=另一个)并检查规则(日期在您的情况下)。没有约束的b1和b2是列表元素的笛卡尔积,您的约束只是帮助从该积中获得两个不同的。