Skip to content

Commit 5852a0f

Browse files
authored
Mark TermInSetQuery ctors with varargs terms as deprecated (#12864)
1 parent b3ba451 commit 5852a0f

File tree

11 files changed

+140
-56
lines changed

11 files changed

+140
-56
lines changed

lucene/CHANGES.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ http://s.apache.org/luceneversions
77

88
API Changes
99
---------------------
10-
(No changes)
10+
* GITHUB#12243: Mark TermInSetQuery ctors with varargs terms as @Deprecated. SortedSetDocValuesField#newSlowSetQuery,
11+
SortedDocValuesField#newSlowSetQuery, KeywordField#newSetQuery now take a collection of terms as a param. (Jakub Slowinski)
1112

1213
New Features
1314
---------------------

lucene/core/src/java/org/apache/lucene/document/KeywordField.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.lucene.document;
1818

19+
import java.util.Collection;
1920
import java.util.Objects;
2021
import org.apache.lucene.index.DocValuesType;
2122
import org.apache.lucene.index.IndexOptions;
@@ -170,7 +171,9 @@ public static Query newExactQuery(String field, String value) {
170171
* @param values the set of values to match
171172
* @throws NullPointerException if {@code field} is null.
172173
* @return a query matching documents with this exact value
174+
* @deprecated Use {@link #newSetQuery(String, Collection)} instead.
173175
*/
176+
@Deprecated(forRemoval = true, since = "9.10")
174177
public static Query newSetQuery(String field, BytesRef... values) {
175178
Objects.requireNonNull(field, "field must not be null");
176179
Objects.requireNonNull(values, "values must not be null");
@@ -179,6 +182,22 @@ public static Query newSetQuery(String field, BytesRef... values) {
179182
return new IndexOrDocValuesQuery(indexQuery, dvQuery);
180183
}
181184

185+
/**
186+
* Create a query for matching any of a set of provided {@link BytesRef} values.
187+
*
188+
* @param field field name. must not be {@code null}.
189+
* @param values the set of values to match
190+
* @throws NullPointerException if {@code field} is null.
191+
* @return a query matching documents with this exact value
192+
*/
193+
public static Query newSetQuery(String field, Collection<BytesRef> values) {
194+
Objects.requireNonNull(field, "field must not be null");
195+
Objects.requireNonNull(values, "values must not be null");
196+
Query indexQuery = new TermInSetQuery(field, values);
197+
Query dvQuery = new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, values);
198+
return new IndexOrDocValuesQuery(indexQuery, dvQuery);
199+
}
200+
182201
/**
183202
* Create a new {@link SortField} for {@link BytesRef} values.
184203
*

lucene/core/src/java/org/apache/lucene/document/SortedDocValuesField.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.lucene.document;
1818

19+
import java.util.Collection;
1920
import org.apache.lucene.index.DocValuesType;
2021
import org.apache.lucene.search.IndexOrDocValuesQuery;
2122
import org.apache.lucene.search.MultiTermQuery;
@@ -98,8 +99,23 @@ public static Query newSlowExactQuery(String field, BytesRef value) {
9899
* slow if they are not ANDed with a selective query. As a consequence, they are best used wrapped
99100
* in an {@link IndexOrDocValuesQuery}, alongside a set query that executes on postings, such as
100101
* {@link TermInSetQuery}.
102+
*
103+
* @deprecated Use {@link #newSlowSetQuery(String, Collection)} instead.
101104
*/
105+
@Deprecated(forRemoval = true, since = "9.10")
102106
public static Query newSlowSetQuery(String field, BytesRef... values) {
103107
return new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, values);
104108
}
109+
110+
/**
111+
* Create a query matching any of the specified values.
112+
*
113+
* <p><b>NOTE</b>: Such queries cannot efficiently advance to the next match, which makes them
114+
* slow if they are not ANDed with a selective query. As a consequence, they are best used wrapped
115+
* in an {@link IndexOrDocValuesQuery}, alongside a set query that executes on postings, such as
116+
* {@link TermInSetQuery}.
117+
*/
118+
public static Query newSlowSetQuery(String field, Collection<BytesRef> values) {
119+
return new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, values);
120+
}
105121
}

lucene/core/src/java/org/apache/lucene/document/SortedSetDocValuesField.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
package org.apache.lucene.document;
1818

19+
import java.util.Collection;
1920
import org.apache.lucene.index.DocValuesType;
2021
import org.apache.lucene.search.IndexOrDocValuesQuery;
2122
import org.apache.lucene.search.MultiTermQuery;
@@ -102,8 +103,25 @@ public static Query newSlowExactQuery(String field, BytesRef value) {
102103
* slow if they are not ANDed with a selective query. As a consequence, they are best used wrapped
103104
* in an {@link IndexOrDocValuesQuery}, alongside a set query that executes on postings, such as
104105
* {@link TermInSetQuery}.
106+
*
107+
* @deprecated Use {@link #newSlowSetQuery(String, Collection)} instead.
105108
*/
109+
@Deprecated(forRemoval = true, since = "9.10")
106110
public static Query newSlowSetQuery(String field, BytesRef... values) {
107111
return new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, values);
108112
}
113+
114+
/**
115+
* Create a query matching any of the specified values.
116+
*
117+
* <p>This query also works with fields that have indexed {@link SortedDocValuesField}s.
118+
*
119+
* <p><b>NOTE</b>: Such queries cannot efficiently advance to the next match, which makes them
120+
* slow if they are not ANDed with a selective query. As a consequence, they are best used wrapped
121+
* in an {@link IndexOrDocValuesQuery}, alongside a set query that executes on postings, such as
122+
* {@link TermInSetQuery}.
123+
*/
124+
public static Query newSlowSetQuery(String field, Collection<BytesRef> values) {
125+
return new TermInSetQuery(MultiTermQuery.DOC_VALUES_REWRITE, field, values);
126+
}
109127
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ public TermInSetQuery(String field, Collection<BytesRef> terms) {
8484
this(field, packTerms(field, terms));
8585
}
8686

87+
/**
88+
* @deprecated Use {@link #TermInSetQuery(String, Collection)} instead.
89+
*/
90+
@Deprecated(since = "9.10")
8791
public TermInSetQuery(String field, BytesRef... terms) {
8892
this(field, packTerms(field, Arrays.asList(terms)));
8993
}
@@ -96,7 +100,12 @@ public TermInSetQuery(RewriteMethod rewriteMethod, String field, Collection<Byte
96100
termDataHashCode = termData.hashCode();
97101
}
98102

99-
/** Creates a new {@link TermInSetQuery} from the given array of terms. */
103+
/**
104+
* Creates a new {@link TermInSetQuery} from the given array of terms.
105+
*
106+
* @deprecated Use {@link #TermInSetQuery(RewriteMethod, String, Collection)} instead.
107+
*/
108+
@Deprecated(since = "9.10")
100109
public TermInSetQuery(RewriteMethod rewriteMethod, String field, BytesRef... terms) {
101110
this(rewriteMethod, field, Arrays.asList(terms));
102111
}

lucene/core/src/test/org/apache/lucene/document/TestKeywordField.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package org.apache.lucene.document;
1818

1919
import java.io.IOException;
20+
import java.util.ArrayList;
2021
import java.util.Collections;
22+
import java.util.List;
2123
import org.apache.lucene.index.DirectoryReader;
2224
import org.apache.lucene.index.IndexReader;
2325
import org.apache.lucene.index.IndexWriter;
@@ -126,15 +128,15 @@ public void testIndexStringValue() throws IOException {
126128
}
127129

128130
public void testValueClone() {
129-
BytesRef[] values = new BytesRef[100];
131+
List<BytesRef> values = new ArrayList<>(100);
130132
for (int i = 0; i < 100; i++) {
131133
String s = TestUtil.randomSimpleString(random(), 10, 20);
132-
values[i] = new BytesRef(s);
134+
values.add(new BytesRef(s));
133135
}
134136

135137
// Make sure we don't modify the input values array.
136-
BytesRef[] expected = values.clone();
138+
List<BytesRef> expected = new ArrayList<>(values);
137139
KeywordField.newSetQuery("f", values);
138-
assertArrayEquals(expected, values);
140+
assertEquals(expected, values);
139141
}
140142
}

lucene/core/src/test/org/apache/lucene/document/TestSortedSetDocValuesSetQuery.java

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -61,51 +61,60 @@ public void testMissingTerms() throws Exception {
6161
List<BytesRef> terms = new ArrayList<>();
6262
terms.add(new BytesRef("5"));
6363
results =
64-
searcher.search(
65-
SortedDocValuesField.newSlowSetQuery(fieldName, terms.toArray(new BytesRef[0])),
66-
numDocs)
67-
.scoreDocs;
64+
searcher.search(SortedDocValuesField.newSlowSetQuery(fieldName, terms), numDocs).scoreDocs;
6865
assertEquals("Must match nothing", 0, results.length);
6966

7067
terms = new ArrayList<>();
7168
terms.add(new BytesRef("10"));
7269
results =
73-
searcher.search(
74-
SortedDocValuesField.newSlowSetQuery(fieldName, terms.toArray(new BytesRef[0])),
75-
numDocs)
76-
.scoreDocs;
70+
searcher.search(SortedDocValuesField.newSlowSetQuery(fieldName, terms), numDocs).scoreDocs;
7771
assertEquals("Must match 1", 1, results.length);
7872

7973
terms = new ArrayList<>();
8074
terms.add(new BytesRef("10"));
8175
terms.add(new BytesRef("20"));
8276
results =
83-
searcher.search(
84-
SortedDocValuesField.newSlowSetQuery(fieldName, terms.toArray(new BytesRef[0])),
85-
numDocs)
86-
.scoreDocs;
77+
searcher.search(SortedDocValuesField.newSlowSetQuery(fieldName, terms), numDocs).scoreDocs;
8778
assertEquals("Must match 2", 2, results.length);
8879

8980
reader.close();
9081
rd.close();
9182
}
9283

9384
public void testEquals() {
85+
List<BytesRef> bar = new ArrayList<>();
86+
bar.add(new BytesRef("bar"));
87+
88+
List<BytesRef> barbar = new ArrayList<>();
89+
barbar.add(new BytesRef("bar"));
90+
barbar.add(new BytesRef("bar"));
91+
92+
List<BytesRef> barbaz = new ArrayList<>();
93+
barbaz.add(new BytesRef("bar"));
94+
barbaz.add(new BytesRef("baz"));
95+
96+
List<BytesRef> bazbar = new ArrayList<>();
97+
bazbar.add(new BytesRef("baz"));
98+
bazbar.add(new BytesRef("bar"));
99+
100+
List<BytesRef> baz = new ArrayList<>();
101+
baz.add(new BytesRef("baz"));
102+
94103
assertEquals(
95-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar")),
96-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar")));
104+
SortedDocValuesField.newSlowSetQuery("foo", bar),
105+
SortedDocValuesField.newSlowSetQuery("foo", bar));
97106
assertEquals(
98-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar")),
99-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar"), new BytesRef("bar")));
107+
SortedDocValuesField.newSlowSetQuery("foo", bar),
108+
SortedDocValuesField.newSlowSetQuery("foo", barbar));
100109
assertEquals(
101-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar"), new BytesRef("baz")),
102-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("baz"), new BytesRef("bar")));
103-
assertFalse(
104-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar"))
105-
.equals(SortedDocValuesField.newSlowSetQuery("foo2", new BytesRef("bar"))));
106-
assertFalse(
107-
SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("bar"))
108-
.equals(SortedDocValuesField.newSlowSetQuery("foo", new BytesRef("baz"))));
110+
SortedDocValuesField.newSlowSetQuery("foo", barbaz),
111+
SortedDocValuesField.newSlowSetQuery("foo", bazbar));
112+
assertNotEquals(
113+
SortedDocValuesField.newSlowSetQuery("foo", bar),
114+
SortedDocValuesField.newSlowSetQuery("foo2", bar));
115+
assertNotEquals(
116+
SortedDocValuesField.newSlowSetQuery("foo", bar),
117+
SortedDocValuesField.newSlowSetQuery("foo", baz));
109118
}
110119

111120
public void testDuelTermsQuery() throws IOException {
@@ -159,9 +168,7 @@ public void testDuelTermsQuery() throws IOException {
159168
bytesTerms.add(term.bytes());
160169
}
161170
final Query q2 =
162-
new BoostQuery(
163-
SortedDocValuesField.newSlowSetQuery("f", bytesTerms.toArray(new BytesRef[0])),
164-
boost);
171+
new BoostQuery(SortedDocValuesField.newSlowSetQuery("f", bytesTerms), boost);
165172
assertSameMatches(searcher, q1, q2, true);
166173
}
167174

@@ -221,9 +228,7 @@ public void testApproximation() throws IOException {
221228
bytesTerms.add(term.bytes());
222229
}
223230
final Query q2 =
224-
new BoostQuery(
225-
SortedDocValuesField.newSlowSetQuery("f", bytesTerms.toArray(new BytesRef[0])),
226-
boost);
231+
new BoostQuery(SortedDocValuesField.newSlowSetQuery("f", bytesTerms), boost);
227232

228233
BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
229234
bq1.add(q1, Occur.MUST);

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -193,40 +193,42 @@ public void testHashCodeAndEquals() {
193193
}
194194
}
195195

196-
TermInSetQuery tq1 = new TermInSetQuery("thing", newBytesRef("apple"));
197-
TermInSetQuery tq2 = new TermInSetQuery("thing", newBytesRef("orange"));
196+
TermInSetQuery tq1 = new TermInSetQuery("thing", List.of(newBytesRef("apple")));
197+
TermInSetQuery tq2 = new TermInSetQuery("thing", List.of(newBytesRef("orange")));
198198
assertFalse(tq1.hashCode() == tq2.hashCode());
199199

200200
// different fields with the same term should have differing hashcodes
201-
tq1 = new TermInSetQuery("thing", newBytesRef("apple"));
202-
tq2 = new TermInSetQuery("thing2", newBytesRef("apple"));
201+
tq1 = new TermInSetQuery("thing", List.of(newBytesRef("apple")));
202+
tq2 = new TermInSetQuery("thing2", List.of(newBytesRef("apple")));
203203
assertFalse(tq1.hashCode() == tq2.hashCode());
204204
}
205205

206206
public void testSimpleEquals() {
207207
// Two terms with the same hash code
208208
assertEquals("AaAaBB".hashCode(), "BBBBBB".hashCode());
209-
TermInSetQuery left = new TermInSetQuery("id", newBytesRef("AaAaAa"), newBytesRef("AaAaBB"));
210-
TermInSetQuery right = new TermInSetQuery("id", newBytesRef("AaAaAa"), newBytesRef("BBBBBB"));
209+
TermInSetQuery left =
210+
new TermInSetQuery("id", List.of(newBytesRef("AaAaAa"), newBytesRef("AaAaBB")));
211+
TermInSetQuery right =
212+
new TermInSetQuery("id", List.of(newBytesRef("AaAaAa"), newBytesRef("BBBBBB")));
211213
assertFalse(left.equals(right));
212214
}
213215

214216
public void testToString() {
215217
TermInSetQuery termsQuery =
216-
new TermInSetQuery("field1", newBytesRef("a"), newBytesRef("b"), newBytesRef("c"));
218+
new TermInSetQuery("field1", List.of(newBytesRef("a"), newBytesRef("b"), newBytesRef("c")));
217219
assertEquals("field1:(a b c)", termsQuery.toString());
218220
}
219221

220222
public void testDedup() {
221-
Query query1 = new TermInSetQuery("foo", newBytesRef("bar"));
222-
Query query2 = new TermInSetQuery("foo", newBytesRef("bar"), newBytesRef("bar"));
223+
Query query1 = new TermInSetQuery("foo", List.of(newBytesRef("bar")));
224+
Query query2 = new TermInSetQuery("foo", List.of(newBytesRef("bar"), newBytesRef("bar")));
223225
QueryUtils.checkEqual(query1, query2);
224226
}
225227

226228
public void testOrderDoesNotMatter() {
227229
// order of terms if different
228-
Query query1 = new TermInSetQuery("foo", newBytesRef("bar"), newBytesRef("baz"));
229-
Query query2 = new TermInSetQuery("foo", newBytesRef("baz"), newBytesRef("bar"));
230+
Query query1 = new TermInSetQuery("foo", List.of(newBytesRef("bar"), newBytesRef("baz")));
231+
Query query2 = new TermInSetQuery("foo", List.of(newBytesRef("baz"), newBytesRef("bar")));
230232
QueryUtils.checkEqual(query1, query2);
231233
}
232234

@@ -346,12 +348,13 @@ public void testPullOneTermsEnum() throws Exception {
346348

347349
public void testBinaryToString() {
348350
TermInSetQuery query =
349-
new TermInSetQuery("field", newBytesRef(new byte[] {(byte) 0xff, (byte) 0xfe}));
351+
new TermInSetQuery("field", List.of(newBytesRef(new byte[] {(byte) 0xff, (byte) 0xfe})));
350352
assertEquals("field:([ff fe])", query.toString());
351353
}
352354

353355
public void testIsConsideredCostlyByQueryCache() throws IOException {
354-
TermInSetQuery query = new TermInSetQuery("foo", newBytesRef("bar"), newBytesRef("baz"));
356+
TermInSetQuery query =
357+
new TermInSetQuery("foo", List.of(newBytesRef("bar"), newBytesRef("baz")));
355358
UsageTrackingQueryCachingPolicy policy = new UsageTrackingQueryCachingPolicy();
356359
assertFalse(policy.shouldCache(query));
357360
policy.onUse(query);
@@ -362,7 +365,7 @@ public void testIsConsideredCostlyByQueryCache() throws IOException {
362365

363366
public void testVisitor() {
364367
// singleton reports back to consumeTerms()
365-
TermInSetQuery singleton = new TermInSetQuery("field", newBytesRef("term1"));
368+
TermInSetQuery singleton = new TermInSetQuery("field", List.of(newBytesRef("term1")));
366369
singleton.visit(
367370
new QueryVisitor() {
368371
@Override

lucene/monitor/src/java/org/apache/lucene/monitor/MultipassTermFilteredPresearcher.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package org.apache.lucene.monitor;
1919

20+
import java.util.Arrays;
2021
import java.util.Collections;
2122
import java.util.HashMap;
2223
import java.util.List;
@@ -125,7 +126,7 @@ public Query build() {
125126
BooleanQuery.Builder child = new BooleanQuery.Builder();
126127
for (String field : terms.keySet()) {
127128
child.add(
128-
new TermInSetQuery(field(field, i), collectedTerms.get(field)),
129+
new TermInSetQuery(field(field, i), Arrays.asList(collectedTerms.get(field))),
129130
BooleanClause.Occur.SHOULD);
130131
}
131132
parent.add(child.build(), BooleanClause.Occur.MUST);

0 commit comments

Comments
 (0)