2017-03-10 5 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 또는 가격이 변경되는 변경 논리가 될 것입니다 무엇인가? - 합계가 현재 상태를 기반으로하는 응용 프로그램의 시작에서 완료되고 논리적 사실이 총 가격으로 작업 메모리에 삽입됩니다. 그러면 한 제품에 대한 가격이 한 점에서 변경되므로 totalPrice를 업데이트해야합니다.

여기 프로세스가 가능하게 할 것입니다 방법 삼가지 경우입니다

  1. 증분 일정 시간 계산을하고와. 이전에 발생한 변경 사항을 고려하고 전체 가격에서 이전 가격을 빼고 변경된 하나의 제품에 대해 새 가격을 추가하십시오. (Excelent)
  2. 전체 합계가 다시 수행되었지만 지정된 ProductGroup의 기준을 충족하는 Product 인스턴스는 이미 알려져 있으므로 검색되지 않습니다. (Good)
  3. 작업 메모리의 모든 Product 인스턴스를 통과하는 루프가 수행되어 특정 ProductGroup의 조건을 충족시키는 루프를 확인합니다. (불량)

이러한 세 가지 경우 중 하나가 구현되는 논리 또는 다른 것입니까?

답변

1

다른 누적 형태의 문서, 즉 초기화, 처리 (복수형 참고!) 및 임의의 함수 반환을위한 단계를 정의 할 수있는 문서를 볼 수 있습니다. 일부 함수는 역 연산을 허용하여 함수 결과를 계산하는 데 사용 된 사실을 제거 할 수 있습니다 (예 : 'sum'). (하지만 '최대'를 비교하십시오.)

그래서 나는 누적 패턴이 효율적으로 업데이트 될 것이라고 생각합니다.

그러나 이것이 논리적으로 삽입 된 것을 의미하지는 않습니다. ProductGroupTotalPrice이 업데이트됩니다. (내가 잘못 될 수있다, 그것을 시도.)

내가 0

totalPrice과 제품 그룹에 대한 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 

하고 또한 규칙을 사용합니다

관련 문제