累积函数如何实际工作?

时间:2017-03-10 10:52:07

标签: drools

让我们说下一个例子:

某些产品属于某些产品组,我们希望总价格在逻辑事实中总结为产品组中的产品更改或价格变化。

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。

以下是三种情况如何完成该过程:

  1. 进行恒定时间计算。只考虑已发生的更改并从总计中减去旧价格,并为已更改的一个产品添加新价格。 (外观极好)
  2. 完成总和,但符合条件的产品实例(来自给定的ProductGroup)已知,但不会搜索它们。 (良好)
  3. 除了求和之外,还会完成工作内存中所有Product实例的循环,以查看哪些符合条件(来自给定的ProductGroup)。 (坏)
  4. 这三种情况中的一种是逻辑实现的还是其他的?

1 个答案:

答案 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的附加规则。