在 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
我有以下事实
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