Skip to content

Commit f94cd17

Browse files
committed
Fix SynonymQuery equals implementation (#12260)
The term member of TermAndBoost used to be a Term instance and became a BytesRef with #11941, which means its equals impl won't take the field name into account. The SynonymQuery equals impl needs to be updated accordingly to take the field into account as well, otherwise synonym queries with same term and boost across different fields are equal which is a bug.
1 parent 246ac4b commit f94cd17

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

lucene/core/src/java/org/apache/lucene/search/SynonymQuery.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public SynonymQuery build() {
114114
*/
115115
private SynonymQuery(TermAndBoost[] terms, String field) {
116116
this.terms = Objects.requireNonNull(terms);
117-
this.field = field;
117+
this.field = Objects.requireNonNull(field);
118118
}
119119

120120
public List<Term> getTerms() {
@@ -147,7 +147,9 @@ public int hashCode() {
147147

148148
@Override
149149
public boolean equals(Object other) {
150-
return sameClassAs(other) && Arrays.equals(terms, ((SynonymQuery) other).terms);
150+
return sameClassAs(other)
151+
&& field.equals(((SynonymQuery) other).field)
152+
&& Arrays.equals(terms, ((SynonymQuery) other).terms);
151153
}
152154

153155
@Override

lucene/core/src/test/org/apache/lucene/search/TestSynonymQuery.java

+18
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ public void testEquals() {
7373
.addTerm(new Term("field", "c"), 0.2f)
7474
.addTerm(new Term("field", "d"))
7575
.build());
76+
77+
QueryUtils.checkUnequal(
78+
new SynonymQuery.Builder("field").addTerm(new Term("field", "a"), 0.4f).build(),
79+
new SynonymQuery.Builder("field").addTerm(new Term("field", "b"), 0.4f).build());
80+
81+
QueryUtils.checkUnequal(
82+
new SynonymQuery.Builder("field").addTerm(new Term("field", "a"), 0.2f).build(),
83+
new SynonymQuery.Builder("field").addTerm(new Term("field", "a"), 0.4f).build());
84+
85+
QueryUtils.checkUnequal(
86+
new SynonymQuery.Builder("field1").addTerm(new Term("field1", "b"), 0.4f).build(),
87+
new SynonymQuery.Builder("field2").addTerm(new Term("field2", "b"), 0.4f).build());
7688
}
7789

7890
public void testBogusParams() {
@@ -127,6 +139,12 @@ public void testBogusParams() {
127139
() -> {
128140
new SynonymQuery.Builder("field1").addTerm(new Term("field1", "a"), -0f);
129141
});
142+
143+
expectThrows(
144+
NullPointerException.class,
145+
() -> new SynonymQuery.Builder(null).addTerm(new Term("field1", "a"), -0f));
146+
147+
expectThrows(NullPointerException.class, () -> new SynonymQuery.Builder(null).build());
130148
}
131149

132150
public void testToString() {

0 commit comments

Comments
 (0)