当前位置: 首页 > 知识库问答 >
问题:

Drools条件匹配失败

颛孙铭
2023-03-14

我使用的是Drools 4,当我用==比较两个hashmap值时,它不起作用。所有其他运营商,如

评估((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个答案

陈德泽
2023-03-14

我从来没有用过Drools 4。x、 因此,这些是基于我(以前)对5.1.1的了解而得出的观察结果-在你的情况下,它们可能不准确。

 eval(fireNextPriority==true)

这真是不可思议<代码>求值(code>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。。。

 类似资料:
  • 问题内容: 请帮助我创建一个包含10个’where’子句的select查询,其顺序应为:查询结果应按大多数关键字(where条件)匹配到最不匹配的顺序显示。 注意:所有10个条件都带有“或”。 请帮助我创建此查询。我正在使用MS-SQL Server 2005 喜欢: 在上面的查询中,所有与最大条件匹配的记录都应位于顶部,而较少匹配条件的记录应位于底部。 问题答案:

  • 我一定错过了什么。我正在计算一个列表,想跳过特定的数字,所以我做了一个switch语句: 以下是输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 50 52 53 注意,44出现了,尽管我没

  • 问题内容: 这将更好地显示在我的示例中: 我有一张桌子,存储着用户从一种大表格中得到的答案。每个表格有139个问题。这些问题存储在不同的表中,并在需要时与questionID结合在一起。对于每个用户,都有一个ID。现在,我需要进行过滤,以仅显示与特定问题匹配一个或 多个 答案的用户。 例如,我希望用户在问题14中回答为“是”,问题54不为空且问题100大于10的情况下。表的外观如下: 结果,我只希

  • 本文向大家介绍Rust 与守卫的条件模式匹配,包括了Rust 与守卫的条件模式匹配的使用技巧和注意事项,需要的朋友参考一下 示例 可以根据独立于使用if防护匹配的值的值来匹配模式: 这将显示“不可用”。

  • 问题内容: 我有一个.DRL文件,其中有10条规则。插入事实后,可能会匹配一些规则-如何找出以编程方式匹配的规则? 问题答案: 请注意,此答案对不超过5.x的Drools版本有效。 如果您已升至6或更高,请查看@ melchoir55的修改后答案。我还没有亲自测试过,但是我相信它会起作用。 若要跟踪规则激活,可以使用AgendaEventListener。下面是一个示例,可在此处找到: https

  • 我正在通过drools-guvnor创建规则。我已经导入了我的POJO模型,并且一切都设置正确(我已经进行了测试),但我似乎无法弄清楚如何让“匹配”运算符正确工作。这是我到目前为止所拥有的(源代码): 有谁能给我一些关于在drools guvnor中使用多个正则表达式检查的提示,或者一些让它工作的方法。他们的论坛似乎真的很陈腐。我在网上找到的大多数答案都没有答案。 任何帮助都将不胜感激。