很长一段时间以来,我一直在努力弄清楚这件事。我可以想象有很多非常冗长和非流口水的方式来实现这一点。不过,我想知道处理这种情况的最佳做法。我想知道如何用drools方言写出下面描述的约束。
我希望编写一个处理集合的约束。假设我们有CustomType,它有一个字段集合。约束应该表示我们希望找到在集合中除指定对象(P)之外有任何对象的CustomType的事实。关键的是,指定的对象是否存在并不重要。只有在集合中至少有一个其他对象时,才有关系。
所讨论的集合不是一个集合。可能在同一个集合中有多个P实例。
在伪Java中,我可能编写如下方法:
public Boolean isThereANotP(CustomType cs){
for(str : cs.Collection){
if(str != P){
return true}
}
return false
}
如何在流口水的when子句中表达这一点?我能做的最接近的就是指定有而不是a P,但这不是我想要的。我想知道是a而不是P。
发布于 2013-11-22 01:04:21
也许这个?
$c: CustomType()
$notP: Object(this != objectP) from $c.collection
实际上,这将激活集合中的每个对象,而不是objectP。这样做可能更好:
$c: CustomType()
exists Object(this != objectP) from $c.collection
发布于 2013-11-22 00:49:34
小心,如果集合的第一个元素不是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)
希望能帮上忙
https://stackoverflow.com/questions/20132074
复制相似问题