Drools中重复的POJO验证规则 [英] Duplicate pojo validation rule in drools
本文介绍了Drools中重复的POJO验证规则的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在将大约1000个A类型的POJO插入到kiesession中,如果kiesession中存在A的重复pojo,我如何在Drools中添加规则来执行某些任务。
class A {
private int someInt;
private String someString;
}
function boolean checkDuplicate(List input) {
int a = input.size();
int b = ((List) input.stream().distinct().collect(Collectors.toList())).size();
return a!=b;
}
dialect "java"
rule "ADuplicateRule"
when
$input : List( ) from collect(A())
eval(checkDuplicate($input))
then
throw new Exception("A list has duplicate values");
end
上述方法是有效的,但有没有更好、更简单的方法来实现这一点?
我想对kiesession中的POJO字段的总和进行验证,我们只需编写以下代码
$sumSomeInt: Integer(this > 90) from accumulate(A( $SomeInt: someInt ), sum($SomeInt))
是否可以在类似的行上执行某些操作以检查重复项?
推荐答案
您非常接近:
rule "Duplicates Found"
when
A( $i: someInt, $s: someString )
List( size > 1 ) from collect( A( someInt == $i, someString == $s ) )
then
// handle the duplicate case
end
根据需要调整您的相等检查。我建议不要从"THEN"中引发异常。
或者,您甚至不需要收集完整的副本列表;至少存在一个副本就足够了。这使您的规则更像这样:rule "Duplicates found - v2"
when
$a: A( $i: someInt, $s: someString )
exists( A( this != $a, someInt == $i, someString == $s ))
then
// handle the duplicates case
end
在这些规则中,我们利用了Drools将隐式检查工作内存中A
的所有实例这一事实。因此,在第一个规则中,对于每个A
,它将检查是否有该实例的重复项;如果有,则触发该规则。否则,它将检查A
的下一个实例,依此类推,直到A
的所有实例都已求值。
exists
子句的this != $a
检查,以验证我们找到的";Duplica";实际上不是我们正在检查的实例。由于第一个规则仅对List( size > 1 )
触发,因此它预计我们正在检查的实例将包含在collect
的结果中。
这篇关于Drools中重复的POJO验证规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文