让我们说下一个例子:
某些产品属于某些产品组,我们希望总价格在逻辑事实中总结为产品组中的产品更改或价格变化。
private class ProductGroup {
private String name;
}
public class Product {
private ProductGroup productGroup;
private int price;
}
这是将用于Drools中的求和规则插入的逻辑事实的类。
private class ProductGroupTotalPrice {
private ProductGroup productGroup;
private int totalPrice;
}
有一条规则可以总结给定ProductGroup的总价格。
rule "total price for product group"
when
$productGroup : ProductGroup()
$totalPrice : Number() from accumulate(
Product(productGroup == $productGroup, $price : price),
sum($price)
)
then
insertLogical(new ProductGroupTotalPrice($productGroup, $totalPrice));
end
所以我的问题是,当从工作内存中添加/删除给定ProductGroup的产品时,逻辑是什么,它们会更改ProductGroup还是它们的价格会被更改? - 假设总和是在应用程序的开始时根据当前状态完成的,并且逻辑事实以总价格插入到工作存储器中。然后在一个点上更改一个产品的价格,因此需要更新totalPrice。
以下是三种情况如何完成该过程:
这三种情况中的一种是逻辑实现的还是其他的?
答案 0 :(得分:1)
您可以查看其他形式的累积文档,即可以定义初始化步骤,处理(注意复数!)并返回任意函数的文档。一些功能允许反向操作,以便可以处理已经用于计算功能结果的事实:例如,' sum'。 (但比较' max'。)
所以我认为你的累积模式会有效更新。
但是,我认为这并不意味着您的逻辑插入ProductGroupTotalPrice
将会更新。 (试试吧,我可能错了。)
我会使用一个简单的规则
rule "total price for product group"
when
$productGroup: ProductGroup()
Number( $totalPrice: intValue ) from accumulate(
Product(productGroup == $productGroup, $price : price),
sum($price)
)
$pgtp: ProductGroupTotalPrice( productgroup == $productGroup,
totalPric != $totalPrice )
then
modify( $pgtp ){ setTotalPrice( $totalPrice ) }
end
以及使用totalPrice 0为产品组插入初始ProductGroupTotalPrice
的附加规则。