代码之家  ›  专栏  ›  技术社区  ›  asachet

从一组口水的元素中积累

  •  0
  • asachet  · 技术社区  · 8 年前

    我想总结一下拥有(至少)一个活跃观众的独特小组成员的权重。观看者有一个小组成员,小组成员有一个权重(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黑客?

    这是我的尝试:

    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
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   Geoffrey De Smet    8 年前

    以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
  •   laune    8 年前

    在第一个规则中,内部累加收集一组对象,这些对象可以使用getPanelist从Viewing对象访问。这(我想是因为你不愿意提供信息)会返回一个专家组。但一组专家组不是专家组,这是累积的结果:

    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集合中的重复项,我们就知道我们必须累积一个中间集合:

    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
    
        3
  •  -1
  •   asachet    8 年前

    由于某些原因,当我不链接 accumulate 而是使用中间变量。不过,我很想得到一个解释。

    这是一种从集合中积累的工作方式:

    $viewers : Set() from accumulate(
                                Viewing(
                                    active==true,
                                    $p : panelist),
                                collectSet($p))
    
    $actualReach : Number( ) from accumulate (
        Panelist($weight : weight) from $viewers,
        sum($weight))