我一直试图在很长一段时间内打开和关闭它。我可以想象很多非常冗长和非流氓的方法来实现这一目标。但是,我想知道处理这种情况的最佳做法。我想知道如何在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。
答案 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)
希望它有所帮助,