Drools - 使用累积来查找最小值和最大值

时间:2011-08-24 20:19:55

标签: drools

我有一个流口水问题一直困扰着我。我想使用accumulate从Item对象列表(包含价格)中找出最小和最大价格。插入一个Member对象(包含Item对象列表),其中包含Items列表。

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

现在问题在于上述规则是否可能如果是这样的话如何使用drools累积功能找出具有最低价格和最高价格的项目。我不想使用java / groovy实用程序函数。

我看到“收集”功能允许使用“从”然后使用数据源。我想知道“积累”是否类似于收集。

2 个答案:

答案 0 :(得分:6)

无需使用accumulate,只需执行类似

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

如果您的项目已插入工作记忆中,那就是这样。

答案 1 :(得分:0)

我是流口水规则的新手,我正试图解决这个问题。

您可以简单地找出项目的最低和最高价格 - 您必须编写一些规则并需要在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

由于我是流口水规则的新手,我想问一下这是不是正确的程序?或者还有另一种方法可以解决这个问题吗?