2013-05-28 4 views
2

У меня есть некоторые загадочные проблемы при использовании Drools 5.5 final для сравнения полей, оцениваемых по строкам.Сравнение полей с строкой в ​​Drool 5.5

По существу, я пытаюсь найти, если есть пара людей, имеющих одно и то же имя. Класс Person выглядит следующим образом:

public class Person { 
    private String name; 

    public String getName()  { return name; } 
    public void setName(String n) { this.name = n; } 
    public Person(String name) { this.name = name;} 
} 

правило, что я пытаюсь вызвать не:

rule "uniquePersonName" 
when 
    $p1: Person($n1: name) 
    $p2: Person(this != $p1, name == $n1) 
then 
    System.out.println("Duplicated person name found : " + $n1 + " " + $p2.getName()); 
end 

Но это никогда не был запущен. Однако, если я изменить его на:

when 
    $p1: Person($n1: name) 
    $p2: Person(this != $p1, name != $n1) 

Система работает, как и ожидалось, другими словами, он находит все пары, где люди имеют разные имена.

После углубления я обнаружил, что если я изменил поле имени типа Integer, исходное правило работало нормально. Это заставило меня подумать, что это было из-за некоторой ошибки со сравнением строк. Таким образом, с именем поля определяется как тип строки, я попытался:

  1. не (имя == $ n1)
  2. (имя == $ n1)
  3. name.toString() = $ n1. ToString()
  4. имя == $ p1.getName()

К сожалению, ни один из них не работал.

Наконец, единственный способ, которым я мог заставить его вести себя, чтобы написать правила, как:

when 
    $p1: Person($n1: name) 
    $p2: Person(name == $n1) 
    eval($p1!=$p2) 

Это заставило меня думать, возможно, проблема вызвана комбинацией того, как «это» работает и как сравнение строк готово.

Это очень простая функция, и я был бы удивлен, что это вызвано ошибкой в ​​финале Drools 5.5. Но опять же, я не мог понять пути. Может ли кто-нибудь из вас помочь?

Спасибо.

GW

ответ

3

Оказывается «это! = $ P1» превращается в! This.equals ($ p1) под капотом, и в моем коде я имею автоматически сгенерированный метод #equals (код не показан в исходном сообщении), которые полностью меняют поведение сравнения по умолчанию. После удаления этого метода #equals все работало так, как ожидалось.

Смежные вопросы