Drools处理子集的技术?

时间:2014-09-10 11:52:52

标签: 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 B |  7
6 | Type B |  7
7 | Type B |  7

(我正在添加第三栏)

when
    $listA : ArrayList( ) from collect( Thing(type == 'A') )
    $listB : ArrayList( ) from collect( Thing(type == 'B') )
    erm...
then
    um...
end

任何人都有任何好主意吗?

1 个答案:

答案 0 :(得分:1)

在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中有一个字段可用于指示已执行此更新。