Ошибка сопоставления условий Drools

#drools

#drools

Вопрос:

Я использую Drools 4, и когда я сравниваю два значения hashmap с ==, это не работает. Все остальные операторы, такие как >=,<=,<,>,!= работают нормально. Я сравниваю, как показано ниже. Я использую map как . Есть ли что-то не так с этим утверждением. Значения карты будут обновлены в действиях правил. Я могу видеть обновленные значения на карте, но сравнение значений не выполняется. Я использую update (abc) для обновления значений.

eval((abc.GetValue(«123»)).intValue() == (abc.GetValue(«456»)).intValue())

Правило:

 rule "008"
salience -18
agenda-group  "CAP"
auto-focus true
when 
  testObj: TestObj(eval(fireNextPriority==true), categoryCount==18,
       eval(!firedRules.contains(Integer.valueOf(23449))) 
 amp;amp; (date >= 1263925800000)
 amp;amp; (date <= 4102338600000) amp;amp; (date >= 1263925800000) amp;amp; (date <= 4102338600000)
 amp;amp; eval(1 == 1)  
 amp;amp; eval(testObj.getVariableValue("C1TC") == testObj.getVariableValue("Y1TC")))

then
  System.out.println("Firing rule: CAP - 008");
  testObj.setStatus(true);
  testObj.setPriority(1);
  testObj.addToFiredRules(23449);
  update(testObj);      
  testObj.addVariableValue("C1PC", testObj.getVariableValue("C1PC")-
  testObj.getVariableValue("C1OF"));
 end
 

Объект, который мы используем:

 public class TestObj{
   Long date;
   Integer categoryCount;
   boolean status = false;
   boolean executeFinalRule = false;
   boolean executeFinalRuleForCatg = true;
   boolean fireNextPriority = true;
   Set<Integer> firedRules = new HashSet<Integer>();
   private int priority;
   Map<String, Integer> variableValues = new HashMap<String, Integer>();
   public Integer getCategoryCount() {
     return categoryCount;
   }
   public void setCategoryCount(Integer categoryCount) {
     this.categoryCount = categoryCount;
   }
   public void increaseCategoryCount(){
     this.categoryCount  ;
   }
   public void addVariableValue(String variableCode, Integer count){
     if (count < 0) count = 0;
     this.variableValues.put(variableCode, count);
   }
   public Integer getVariableValue(String variableCode){
     Integer value = this.variableValues.get(variableCode);
     return value == null? 0 : value;
   }
   public boolean isStatus() {
     return status;
   }
   public Set<Integer> getFiredRules() {
    return firedRules;
   }
   public void setFiredRules(Set<Integer> firedRules) {
     this.firedRules = firedRules;
   }
   public void addToFiredRules(int l){
    this.firedRules.add(l);
   }
}
 

Заранее спасибо.

Комментарии:

1. Обратите внимание, что Drools 4 чрезвычайно устарел и не поддерживается. — Существует множество возможных причин, по которым вы не получаете ожидаемый результат, но невозможно сказать больше без полного правила. Как объявляется abc? Где карты, о которых вы упомянули? Кроме того, покажите правило, в котором выполняется обновление!

2. Привет, Лаун, спасибо за быстрый ответ. Я обновил свой вопрос подробностями. Правило обновит значения карты в объекте, которые являются входными данными для следующих правил. == сбой в состоянии

Ответ №1:

Я никогда не использовал Drools 4.x, поэтому это наблюдения, основанные на моих (старых) знаниях 5.1.1 — они могут быть неточными в вашем случае.

  eval(fireNextPriority==true)
 

Замечательно, что это работает. eval не поддерживает контекст заключающего шаблона (факт), поэтому обычно вам придется писать

  eval(!firedRules.contains(Integer.valueOf(23449))
 

То же самое.

  eval(testObj.getVariableValue("C1TC") == testObj.getVariableValue("Y1TC"))
 

Это так, как я бы написал это начиная с 5.1.

Странная вещь

 testObj.addVariableValue("C1PC", testObj.getVariableValue("C1PC")
testObj.getVariableValue("C1OF"));
 

(Я ЧТО-ТО ПЕРЕПУТАЛ ПРИ РЕДАКТИРОВАНИИ?) Эти изменения происходят после update вызова, что означает, что они не будут видны движку. Было ли выполнено аналогичное обновление записей карты «C1TC» и / или «Y1TC» в другом правиле? Тогда они не будут равны Drools, даже если они относятся к Java…

Комментарии:

1. Спасибо, Лаун. даже я попробовал update в качестве последнего оператора, но обновленные значения недоступны для следующего условия правила. В моем случае измененное значение должно быть доступно для следующего условия правила. equals не выполняется, потому что обновленные значения не обновляются в drools и доступны для java.