从集合的元素中积累 - 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