Drools在集合中找到除P之外的约束对象

时间:2013-11-21 21:18:54

标签: collections drools negation

我一直试图在很长一段时间内打开和关闭它。我可以想象很多非常冗长和非流氓的方法来实现这一目标。但是,我想知道处理这种情况的最佳做法。我想知道如何在drools方言中写下我所描述的约束。

我希望编写一个处理集合的约束。假设我们有CustomType,它有一个字段Collection。约束应该表示我们想要查找CustomType的事实,该事实在集合中具有除指定对象(P)之外的任何对象。重要的是,指定的对象是否存在并不重要。只有在集合中至少有一个其他对象时才重要。

有问题的集合不是一套。可能在同一集合中有多个P实例。

在伪Java中,我可能会写一个类似的方法:

public Boolean isThereANotP(CustomType cs){
for(str : cs.Collection){
    if(str != P){
        return true}
}
return false
}

如何在流口水的when子句中表达?我最接近的是指定一个P,但这不是我想要的。我想知道而不是P。

2 个答案:

答案 0 :(得分:1)

也许这个?

$c: CustomType()
$notP: Object(this != objectP) from $c.collection

实际上,这将激活集合中不是objectP的每个对象。这可能会更好:

$c: CustomType()
exists Object(this != objectP) from $c.collection

答案 1 :(得分:0)

小心,如果你的集合中的第一个元素不是P,你发布的伪代码将返回true。或者,如果你在P之前没有P或者根本没有P,那么它将返回true 。 假设你要找的是:

  

查找CustomType中包含除指定对象(P)之外的任何对象的事实

你可以写一个类似的规则:

global P objectP; //I'm using a global, but you could use a fact, or a binding in one of your fact's fields. 

rule "Find CustomType with no P"
when
    $c: CustomType(collection not contains objectP)
then
    //use $c
end

我不知道如何解释你的其余要求:

  

重要的是,指定的对象是否存在并不重要。只有在集合中存在至少一个其他对象时才重要。

如果您的要求是集合不应为空,那么您可以将模式编写为:

CustomType(collection.empty == false , collection not contains objectP)

希望它有所帮助,