在 Drools 中按属性值排序

Sorting on attribute value in Drools

我有以下事实

declare PriceInfo
    price : Integer
end

我正在使用此规则插入:

规则"insert" 议程组 "find-rotated-house" 当

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

请帮忙。

谢谢

一个好的答案取决于您需要什么排序顺序,是否需要在最终的插入、修改(价格会改变)和删除时维护它,是否必须重复使用等等。

这是一种可能性:

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