У меня есть некоторые загадочные проблемы при использовании 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, исходное правило работало нормально. Это заставило меня подумать, что это было из-за некоторой ошибки со сравнением строк. Таким образом, с именем поля определяется как тип строки, я попытался:
- не (имя == $ n1)
- (имя == $ n1)
- name.toString() = $ n1. ToString()
- имя == $ p1.getName()
К сожалению, ни один из них не работал.
Наконец, единственный способ, которым я мог заставить его вести себя, чтобы написать правила, как:
when
$p1: Person($n1: name)
$p2: Person(name == $n1)
eval($p1!=$p2)
Это заставило меня думать, возможно, проблема вызвана комбинацией того, как «это» работает и как сравнение строк готово.
Это очень простая функция, и я был бы удивлен, что это вызвано ошибкой в финале Drools 5.5. Но опять же, я не мог понять пути. Может ли кто-нибудь из вас помочь?
Спасибо.
GW