Слюни - используя накопление, чтобы найти мин и макс - PullRequest
3 голосов
/ 25 августа 2011

У меня есть вопрос слюни, который беспокоит меня в течение некоторого времени. Я хочу узнать минимальную и максимальную цену из списка объектов Предмета (содержит цену), используя накопление. Вставляется объект Member (который содержит список объектов Item), который содержит список Item.

groovy/java source pseudo code
-------------------------------
class Item {
   BigDecimal price
}

class Member {
   List<Item>> items
}

...
droolsStatefulSession.insert(member)
session.fireAllRules()
...

rule.drl
---------
rule "rule1"
when 
   member : Member ($itemList : items)
/*

*/
then
 System.out.println("condition met...")
end

Теперь вопросы в приведенном выше правиле: возможно ли, если да, то как мне найти предмет с минимальной и максимальной ценой, используя функцию накопления слюней? Я не хочу использовать утилиты java / groovy.

Я вижу, что функция "собирать" позволяет использовать "из", а затем источник данных. Интересно, похоже ли «накопить» на коллекционирование?

Ответы [ 2 ]

6 голосов
/ 25 августа 2011

Не нужно использовать accumulate, просто сделайте что-то вроде

Item($lowestPrice : price, $id : id)
not Item(price > $lowestPrice, id < $id)

Это если ваши Предметы вставлены в рабочую память.

0 голосов
/ 14 сентября 2012

Я новичок в правиле слюни и пытаюсь решить эту проблему.

Вы можете узнать минимальную и максимальную цену товара просто - вам нужно написать несколько правил и добавить две переменные в классе Order:

Class Order
{
    private List<Item> itemList;
    private int highPrice;
    private int lowPrice;
}

Используя следующее правило, вы можете рассчитать минимальное и максимальное значение элемента:

package com.sample

import com.sample.DroolsTest.Message;

rule "rule1"

    when
        $order : Order($itemList:itemList)

         $item:Item() from $order.itemList
    then
              insertLogical($item);
    end

rule "highPriceRule"
    when
         $order : Order()

         $item:Item($price:price,price>=$order.getHighPrice())

    then
        $order.setHighPrice($item.getPrice());
end

rule "lowPriceRule"

    when

         $order : Order()


         $item:Item($price:price,price<=$order.getLowPrice()||$order.getLowPrice()==0)

    then

        $order.setLowPrice($item.getPrice());

end

rule "highPrice"

salience -1

    when

         $order : Order()

    then

        System.out.println( "higher Item Price is  "+$order.getHighPrice());

end
rule "LowPrice"
salience -1
    when
         $order : Order()
    then
        System.out.println( "Lower Item Price is  "+$order.getLowPrice());
end


in main method you have to write this code and run it


List<Item>  items=new ArrayList<Item>();

        Item item1=new Item();
        item1.setPrice(10);

        Item item2=new Item();
        item2.setPrice(20);


        Item item3=new Item();
        item3.setPrice(10);

        Item item4=new Item();
        item4.setPrice(5);

        items.add(item1);
        items.add(item2);
        items.add(item3);
        items.add(item4);


           Order order=new Order();
           order.setItemList(items);
            ksession.insert(order);
            ksession.fireAllRules();

Выход: ---

Lower Item Price is  5


higher Item Price is  20

Поскольку я новичок в правиле слюни, я хотел бы спросить, правильная ли это процедура? Или есть другой способ решить эту проблему?

...