Drools条件匹配失败

时间:2014-06-22 03:56:01

标签: drools

我正在使用Drools 4,当我将两个hashmap值与==进行比较时,它无效。所有其他运营商,如> =,< =,<,>,!=正常运行。我比较如下。我使用地图作为。声明有什么问题吗?地图值将在规则的操作中更新。我能够在地图中看到更新的值,但值的比较失败。我正在使用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))) 
 && (date >= 1263925800000)
 && (date <= 4102338600000) && (date >= 1263925800000) && (date <= 4102338600000)
 && eval(1 == 1)  
 && 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 个答案:

答案 0 :(得分:0)

我从未使用过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”的更新是否已在另一条规则中同样完成?然后,即使他们是Java,他们也不会等于Drools ......