2017-03-10 64 views
0

假設我們有下一個示例:積累函數如何實際工作?

某些產品屬於某些產品組,並且我們希望將總價格按邏輯事實總結爲產品組中的產品更改或價格變化。

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或他們的價格被改變? - 可以說,總結是在基於當前狀態的應用程序開始時完成的,邏輯事實以總價格插入到工作內存中。然後一個產品的價格在一個點上改變,所以總價格需要更新。

以下三種情況如何進程將有可能做到:

  1. 增量與做一個恆定的時間計算。只考慮已發生的變化,從總量中減去舊價格,併爲已更改的一個產品添加新的價格。 (Excelent)
  2. 整個求和再次完成,但符合條件的產品實例(來自給定ProductGroup)已知,但不會搜索它們。 (好)
  3. 除了總和以外,工作內存中的所有產品實例的循環都完成以查看哪些滿足條件(來自給定ProductGroup)。 (壞)

邏輯被執行這三種情況之一還是別的?

回答

1

您可以查看另一種累積形式的文檔,即可以定義初始化,處理步驟(注意複數!)和返回任意函數的文檔。某些函數允許反向操作,因此可以處理已經用於計算函數結果的事實:例如'sum'。 (但比較'最大')。

所以我認爲你的積累模式將被有效更新。

但是,我認爲這並不意味着您的邏輯插入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 

和加法規則插入的初始ProductGroupTotalPrice產品組與totalPrice 0