处理子集的Drools技术?

处理子集的Drools技术?,drools,Drools,假设我有以下清单: id| type | var 1 | Type A | 4 2 | Type A | 4 3 | Type A | 4 4 | Type A | 4 5 | Type B | 3 6 | Type B | 3 7 | Type B | 3 我需要将此更改为: id| type | var 1 | Type A | 7 2 | Type A | 7 3 | Type A | 7 4 | Type A | 7 5 | Type

假设我有以下清单:

id| type   | var     
1 | Type A |  4
2 | Type A |  4
3 | Type A |  4
4 | Type A |  4
5 | Type B |  3
6 | Type B |  3
7 | Type B |  3
我需要将此更改为:

id| type   | var     
1 | Type A |  7
2 | Type A |  7
3 | Type A |  7
4 | Type A |  7
5 | Type B |  7
6 | Type B |  7
7 | Type B |  7
(我正在添加第三列)


有人有什么好主意吗?

在OP更新后编辑

declare SumOfVal
  sum: int
end

rule "computeSum"
when
    not SumOfVal()
    Number( $iv: intValue )
        from accumulate( Thing( $var: var )
                         init( int sum = 0; Set nums = new HashSet(); )
                         action( if( nums.add( $var ) ) sum += $var; )
                         result( sum ) )
then
    insert( new SumOfVal( $iv ) );
end

rule "setSum"
when
    SumOfVal( $sum: sum )
    $t: Thing( var != $sum )
then
    modify( $t ){ setVar( $sum ) }
end

事实
SumOfVal
必须保留在工作内存中,以避免重复相同的过程,除非在Thing中有一个字段可用于指示已执行此更新。

oops,我解释得很糟糕。7只是一个例子,一组有3个,另一组有4个。它们可以是任何值。我需要将它们设置为这些集合的不同值之和。好的,请检查修改后的答案。谢谢,我以前没有看到init/action/result代码。我也可以检查一下,修改和更新有区别吗?我总是使用更新。现在对你有用吗?--修改是首选。有一些细微的差别,例如,当一次更改多个事实时,或者(如专家手册所述)与“细粒度属性更改侦听器”结合使用。谢谢,好信息。我正在使用向导式规则编辑器在Workbench中重做我的所有规则,以便业务部门能够参与其中,因此大约一周内也不会测试代码。但我会标记为正确,因为我认为它会起作用。
declare SumOfVal
  sum: int
end

rule "computeSum"
when
    not SumOfVal()
    Number( $iv: intValue )
        from accumulate( Thing( $var: var )
                         init( int sum = 0; Set nums = new HashSet(); )
                         action( if( nums.add( $var ) ) sum += $var; )
                         result( sum ) )
then
    insert( new SumOfVal( $iv ) );
end

rule "setSum"
when
    SumOfVal( $sum: sum )
    $t: Thing( var != $sum )
then
    modify( $t ){ setVar( $sum ) }
end