处理子集的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