2015-09-21 2 views
0

У меня есть следующие фактыСортировки по значению атрибута в Drools

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 

Введено 5 фактов PriceInfo в правила двигателя. Я пытаюсь сортировать его в порядке возрастания или убывания от этого правила.

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

Хороший ответ зависит от того, для чего вам нужен порядок сортировки, нужно ли его поддерживать в течение возможных вставок, модифицирует (цены меняются) и удаляет ли придется использовать повторно, и т.д.

Вот одна возможность:

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 
+0

Спасибо, laune за ваш ответ. – Kumar

Смежные вопросы