【问题标题】:Drools checking for duplicate fields in a listDrools 检查列表中的重复字段
【发布时间】:2014-02-26 13:43:55
【问题描述】:

我有一个对象 A,其中包含一个对象 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

知道我做错了什么吗?

我还需要通过 A 中的名称字段来限制它,因为 A 可以有多个实例...

我想离得更近一点……

when
    a : A

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

但这会检查 B 的所有实例,即使它们不在此 A 实例的列表中(即使只有 6 个 B 实例,规则也会触发 1200 次!?)...我如何限制检查是否仅在此 A 实例中查找重复项?

【问题讨论】:

  • when a : A b1 : B( d : date, date!= null ) b2: B( date == d , eval( this != b1) ) 但这会检查所有实例B 的即使它们不在此 A 实例的列表中...如何限制检查?

标签: drools


【解决方案1】:

这是我想出的..它有效:

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

then

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

【讨论】:

  • 好吧,你总是可以这样理解:给我来自 A 的所有集合,其中 name == "xyz",然后给我挑选两个不同的项目(this != otherOne)并检查规则(日期在你的案子)。没有约束的 b1 和 b2 是列表元素的笛卡尔积,您的约束只是帮助从产品中获得两个不同的。
【解决方案2】:

我认为最好创建一个单独的方法来检查重复项, 例如ListUtils.hasDuplicate(list)

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 2013-04-19
    • 2012-03-15
    • 2011-07-03
    • 2017-05-31
    • 1970-01-01
    • 2012-12-06
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多