从集合的元素中积累 - drools
accumulate from elements of a set - drools
我想总结具有(至少)一次活跃观看的独特小组成员的权重。一个观看有一个评委,一个评委有一个权重(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
。
如何访问集合的元素,最好使用惯用的流口水而不是 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
出于某种原因,当我不链接 accumulate
而是使用中间变量时,它可以正常工作。不过很想得到解释。
这是从集合中累加的工作方式:
$viewers : Set() from accumulate(
Viewing(
active==true,
$p : panelist),
collectSet($p))
$actualReach : Number( ) from accumulate (
Panelist($weight : weight) from $viewers,
sum($weight))
在第一条规则中,内部 accumulate 收集一组对象,这些对象可以使用 getPanelist 从 Viewing 对象访问。这(我想 - 因为您懒得提供信息)returns 一位小组成员。但是一组小组成员不是小组成员,因为累积:
Panelist(...) from accumulate ( Viewing(...$p:...), collectSet($p) )
因此,Set 无法转换为... Panelist。
第二个版本确实有 Set() 作为上述累积的结果。
每个评委都有权重,您只需
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from
accumulate ( Viewing( active==true, $p : panelist),
sum($p.getWeight() )
then
...
end
编辑
既然我们知道我们要消除Panelist Set中的重复项,我们就知道我们必须积累一个中间Set:
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
进一步借鉴 laune 的想法:
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from
accumulate ( $p : Panelist
and exists Viewing( active==true, panelist == $p),
sum($p.getWeight() )
then
...
end
我想总结具有(至少)一次活跃观看的独特小组成员的权重。一个观看有一个评委,一个评委有一个权重(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
。
如何访问集合的元素,最好使用惯用的流口水而不是 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
出于某种原因,当我不链接 accumulate
而是使用中间变量时,它可以正常工作。不过很想得到解释。
这是从集合中累加的工作方式:
$viewers : Set() from accumulate(
Viewing(
active==true,
$p : panelist),
collectSet($p))
$actualReach : Number( ) from accumulate (
Panelist($weight : weight) from $viewers,
sum($weight))
在第一条规则中,内部 accumulate 收集一组对象,这些对象可以使用 getPanelist 从 Viewing 对象访问。这(我想 - 因为您懒得提供信息)returns 一位小组成员。但是一组小组成员不是小组成员,因为累积:
Panelist(...) from accumulate ( Viewing(...$p:...), collectSet($p) )
因此,Set 无法转换为... Panelist。
第二个版本确实有 Set() 作为上述累积的结果。
每个评委都有权重,您只需
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from
accumulate ( Viewing( active==true, $p : panelist),
sum($p.getWeight() )
then
...
end
编辑
既然我们知道我们要消除Panelist Set中的重复项,我们就知道我们必须积累一个中间Set:
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
进一步借鉴 laune 的想法:
rule "targetLevelReach"
when
$actualReach : Number(intValue>10) from
accumulate ( $p : Panelist
and exists Viewing( active==true, panelist == $p),
sum($p.getWeight() )
then
...
end