我有一个流口水问题一直困扰着我。我想使用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实用程序函数。
我看到“收集”功能允许使用“从”然后使用数据源。我想知道“积累”是否类似于收集。
答案 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
由于我是流口水规则的新手,我想问一下这是不是正确的程序?或者还有另一种方法可以解决这个问题吗?