Drools中重复的POJO验证规则 [英] Duplicate pojo validation rule in drools

查看:16
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆