3

Drools 5.5 final を使用して String 値のフィールドを比較すると、不可解な問題がいくつか発生します。

本質的に、私は同じ名前を共有する人物のペアが存在するかどうかを見つけようとしています. 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)

システムは期待どおりに機能します。つまり、人物の名前が異なるすべてのペアが検出されます。

さらに掘り下げた結果、name フィールドを Integer 型に変更すると、元のルールが正常に機能することがわかりました。それは、文字列比較のバグが原因だと思いました。そのため、文字列型として定義された名前フィールドを使用して、次のことを試しました。

  1. not (name == $n1)
  2. (name == $n1)
  3. name.toString() = $n1.toString()
  4. name == $p1.getName()

残念ながら、どれも機能しませんでした。

最後に、それを動作させる唯一の方法は、ルールを次のように記述することです。

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

this これは、おそらく問題がどのように機能するか、どのように文字列比較が行われるかの組み合わせによって引き起こされていると思いました。

これは非常に基本的な機能であり、Drools 5.5 final のバグが原因であることに驚きました。しかし、再び、私は道が見えませんでした。どなたかお助けいただけませんか?

ありがとう。

GW

4

1 に答える 1