在Drools中对属性值进行排序

时间:2015-09-21 15:34:29

标签: sorting drools rule

我有以下事实

declare PriceInfo
    price : Integer
end

我正在使用此规则插入:

规则“插入”     议程小组“寻找轮换的房子”     当

then
    PriceInfo p1 = new PriceInfo();
    PriceInfo p2 = new PriceInfo();
    PriceInfo p3 = new PriceInfo();
    PriceInfo p4 = new PriceInfo();
    PriceInfo p5 = new PriceInfo();

    p1.setPrice(200);
    p2.setPrice(300);
    p3.setPrice(400);
    p4.setPrice(500);
    p5.setPrice(600);

    insert(p1);
    insert(p2);
    insert(p3);
    insert(p4);
    insert(p5);
end

这会将PriceInfo的5个事实插入到规则引擎中。 我试图按照这条规则按升序或降序对其进行排序。

rule "sort-number"
    agenda-group "find-rotated-house"
    when
        $priceInfo : PriceInfo( $price : price)
        not PriceInfo(price < $price)
    then
        $logger.info($priceInfo.toString());
        retract($priceInfo);
end

然而,在这条规则中,我正在收回这个事实。如果我没有撤回,我将获得最低价值,即200.其他事实未激活。 我希望在排序后保持RE中的完整性。

这条规则也有效,但撤回。

rule "sort-number-1"
    agenda-group "find-rotated-house"
    when
         Number($intValue : intValue ) from accumulate( PriceInfo( $price : price), min($price) )
         $p : PriceInfo( price == $intValue)
    then
        $logger.info($p.toString());
        retract($p);
end

请帮忙。

由于

1 个答案:

答案 0 :(得分:1)

一个好的答案取决于您需要的排序顺序,是否需要在最终插入时进行维护,修改(价格确实更改)和删除,是否必须重复使用等等。

这是一种可能性:

rule "sort price info"
when
    $list: ArrayList() from collect( PriceInfo() )
then
    $list.sort( ... ); // use suitable Comparator
end

现在您有一个PriceInfo对象的排序列表。

您可以将此列表包装到对象中并将其作为事实插入。这可能会让您编写诸如

之类的规则
rule "10 cheap ones"
when
    $p: PriceInfo()
    PriceList( $l: list )
    eval( $l.indexOf($p) < 10 )
then ... end