我想总结具有(至少)一个活动观看的独特小组成员的重量。观看者具有小组成员,小组成员具有权重(int)。
我获得了具有有效观看效果的小组成员的集:
accumulate(
Viewing(active==true,
$p : panelist),
collectSet($p))
编辑:请注意,我使用集合来获取一组独特的小组成员。
我想总结一下这一组中每个小组成员的重量。 我的尝试(下面)正在返回
java.util.Collections$UnmodifiableSet cannot be cast to com...domain.Panelist
基本上, a set is not a panelist, duh
。
如何访问集合的元素,理想情况下使用惯用的drools而不是Java hack?
这是我的尝试:
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from accumulate (
Panelist($weight : weight) from
accumulate(
Viewing(
active==true,
$p : panelist),
collectSet($p)),
sum($weight))
then
...
end
答案 0 :(得分:1)
在第一个规则中,内部累积收集一组可使用getPanelist从Viewing对象访问的对象。这(我想 - 因为你不能打扰提供信息)返回一个小组成员。但是,一组小组成员不是一个小组成员,你有积累的结果:
Panelist(...) from accumulate ( Viewing(...$p:...), collectSet($p) )
因此,Set无法转换为......小组成员。
第二个版本确实有Set()作为上述累积的结果。
由于每个小组成员都有权重,所以你需要做的就是
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from
accumulate ( Viewing( active==true, $p : panelist),
sum($p.getWeight() )
then
...
end
修改强>
现在我们知道我们必须消除小组成员集中的重复项,我们知道我们必须积累一个中介集:
rule "targetLevelReach"
when
$pset: Set() from accumulate ( Viewing( active==true, $p : panelist),
collectSet($p) )
$actualReach: Number(intValue>10) from
accumulate( Panelist( $weight : weight) from $pset,
sum( $weight ) )
then
...
end
rule "targetLevelReach"
when
accumulate ( Viewing( active==true, $p : panelist),
$pset: collectSet($p) )
accumulate( Panelist( $weight : weight) from $pset,
$actualReach: sum( $weight ),
$actualReach > 10 )
then
...
end
答案 1 :(得分:1)
进一步建立laune的想法:
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from
accumulate ( $p : Panelist
and exists Viewing( active==true, panelist == $p),
sum($p.getWeight() )
then
...
end
答案 2 :(得分:-1)
出于某种原因,当我不链接accumulate
但使用中间变量时,它正在工作。但是很想得到解释。
这是从集合累积的一种有效方式:
$viewers : Set() from accumulate(
Viewing(
active==true,
$p : panelist),
collectSet($p))
$actualReach : Number( ) from accumulate (
Panelist($weight : weight) from $viewers,
sum($weight))