Uploaded image for project: 'Red Hat Decision Manager'
  1. Red Hat Decision Manager
  2. RHDM-509

Drools @Watch not working with accumulate in code

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Major
    • 7.0.1.GA
    • 7.0.0.GA
    • None
    • None
    • CR1

    Description

      I'm using Drools 7.6 and for some reason @watch doesn't stop the rule from reactivating itself or other rules when only the unwatched property is changed. Which results in an infinite loop.

      Can someone figure out what am I doing wrong?

      The rule:

      package com.model
      
      import com.model.*;
      import java.util.List;
      
      rule "10% for 15 High-range Items"
          when
              $o: Order($lines: orderLines) @watch(!discount)
              Number(intValue >= 15) from accumulate(
                  OrderLine($item: item, $q: quantity) from $lines and
                  Item(category == Item.Category.HIGH_RANGE) from $item,
                  sum($q)
              )
          then
              modify($o) {increaseDiscount(0.10)}
      end
      

      The model used is from the book Mastering JBoss Drools. The method increase discount has been annotated with @Modifes. The order class:

      public class Order implements Serializable {
      
          private static final long serialVersionUID = 1L;
      
          private Long orderId;
          private Date date;
          private Customer customer;
          private List<OrderLine> orderLines = new ArrayList<>();
          private Discount discount;
      
          public Order() {
          }
      
          public Long getOrderId() {
              return orderId;
          }
      
          public void setOrderId(Long orderId) {
              this.orderId = orderId;
          }
      
          public Customer getCustomer() {
              return customer;
          }
      
          public void setCustomer(Customer customer) {
              this.customer = customer;
          }
      
          public Date getDate() {
              return date;
          }
      
          public void setDate(Date date) {
              this.date = date;
          }
      
          public List<OrderLine> getOrderLines() {
              return orderLines;
          }
      
          public void setItems(List<OrderLine> orderLines) {
              this.orderLines = orderLines;
          }
      
      
          public double getTotal() {
              return this.getOrderLines().stream()
                      .mapToDouble(item -> item.getItem().getSalePrice() *     item.getQuantity())
                      .sum();
          }
      
          public int getTotalItems() {
              return this.getOrderLines().stream()
                      .mapToInt(item -> item.getQuantity())
                      .sum();
          }
      
          @Modifies({"discount"})
          public void increaseDiscount(double increase) {
              if (discount == null) {
                  discount = new Discount(0.0);
              }
              discount.setPercentage(discount.getPercentage() + increase);
          }
      
          public Discount getDiscount() {
              return discount;
          }
      
          public double getDiscountPercentage() {
              return discount.getPercentage();
          }
      
          public void setDiscount(Discount discount) {
              this.discount = discount;
          }
      }
      

      Attachments

        Issue Links

          Activity

            People

              mfusco@redhat.com Mario Fusco
              mfusco@redhat.com Mario Fusco
              Tibor Zimányi Tibor Zimányi
              Tibor Zimányi Tibor Zimányi
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: