假設我們有下一個示例:積累函數如何實際工作?
某些產品屬於某些產品組,並且我們希望將總價格按邏輯事實總結爲產品組中的產品更改或價格變化。
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或他們的價格被改變? - 可以說,總結是在基於當前狀態的應用程序開始時完成的,邏輯事實以總價格插入到工作內存中。然後一個產品的價格在一個點上改變,所以總價格需要更新。
以下三種情況如何進程將有可能做到:
- 增量與做一個恆定的時間計算。只考慮已發生的變化,從總量中減去舊價格,併爲已更改的一個產品添加新的價格。 (Excelent)
- 整個求和再次完成,但符合條件的產品實例(來自給定ProductGroup)已知,但不會搜索它們。 (好)
- 除了總和以外,工作內存中的所有產品實例的循環都完成以查看哪些滿足條件(來自給定ProductGroup)。 (壞)
邏輯被執行這三種情況之一還是別的?