积累从一组元素 - drools

时间:2016-06-09 14:16:13

标签: drools optaplanner

我想总结具有(至少)一个活动观看的独特小组成员的重量。观看者具有小组成员,小组成员具有权重(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

3 个答案:

答案 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))