#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.