Skip to content

Commit 13b9536

Browse files
authored
Remove usage of IndexSortSortedNumericDocValuesRangeQuery (#61772)
This change reverts the optimization added in #56657. We found a bug in `IndexSortSortedNumericDocValuesRangeQuery` that can fail the entire shard search request so this commit removes the optimization and restore the old behavior (range query on points) in this release branch. Relates #61766
1 parent 45518b7 commit 13b9536

File tree

12 files changed

+145
-310
lines changed

12 files changed

+145
-310
lines changed

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower
256256
}
257257
hi = Math.round(Math.floor(dValue));
258258
}
259-
Query query = NumberFieldMapper.NumberType.LONG.rangeQuery(name(), lo, hi, true, true, hasDocValues(), context);
259+
Query query = NumberFieldMapper.NumberType.LONG.rangeQuery(name(), lo, hi, true, true, hasDocValues());
260260
if (boost() != 1f) {
261261
query = new BoostQuery(query, boost());
262262
}

modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/ScaledFloatFieldTypeTests.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,8 @@ public void testRangeQuery() throws IOException {
9191
Double u = randomBoolean() ? null : (randomDouble() * 2 - 1) * 10000;
9292
boolean includeLower = randomBoolean();
9393
boolean includeUpper = randomBoolean();
94-
Query doubleQ = NumberFieldMapper.NumberType.DOUBLE.rangeQuery("double", l, u, includeLower, includeUpper, false, MOCK_QSC);
95-
Query scaledFloatQ = ft.rangeQuery(l, u, includeLower, includeUpper, MOCK_QSC);
94+
Query doubleQ = NumberFieldMapper.NumberType.DOUBLE.rangeQuery("double", l, u, includeLower, includeUpper, false);
95+
Query scaledFloatQ = ft.rangeQuery(l, u, includeLower, includeUpper, null);
9696
assertEquals(searcher.count(doubleQ), searcher.count(scaledFloatQ));
9797
}
9898
IOUtils.close(reader, dir);
@@ -103,17 +103,17 @@ public void testRoundsUpperBoundCorrectly() {
103103
= new ScaledFloatFieldMapper.ScaledFloatFieldType("scaled_float", 100);
104104
Query scaledFloatQ = ft.rangeQuery(null, 0.1, true, false, MOCK_QSC);
105105
assertEquals("scaled_float:[-9223372036854775808 TO 9]", scaledFloatQ.toString());
106-
scaledFloatQ = ft.rangeQuery(null, 0.1, true, true, MOCK_QSC);
106+
scaledFloatQ = ft.rangeQuery(null, 0.1, true, true, null);
107107
assertEquals("scaled_float:[-9223372036854775808 TO 10]", scaledFloatQ.toString());
108-
scaledFloatQ = ft.rangeQuery(null, 0.095, true, false, MOCK_QSC);
108+
scaledFloatQ = ft.rangeQuery(null, 0.095, true, false, null);
109109
assertEquals("scaled_float:[-9223372036854775808 TO 9]", scaledFloatQ.toString());
110-
scaledFloatQ = ft.rangeQuery(null, 0.095, true, true, MOCK_QSC);
110+
scaledFloatQ = ft.rangeQuery(null, 0.095, true, true, null);
111111
assertEquals("scaled_float:[-9223372036854775808 TO 9]", scaledFloatQ.toString());
112-
scaledFloatQ = ft.rangeQuery(null, 0.105, true, false, MOCK_QSC);
112+
scaledFloatQ = ft.rangeQuery(null, 0.105, true, false, null);
113113
assertEquals("scaled_float:[-9223372036854775808 TO 10]", scaledFloatQ.toString());
114-
scaledFloatQ = ft.rangeQuery(null, 0.105, true, true, MOCK_QSC);
114+
scaledFloatQ = ft.rangeQuery(null, 0.105, true, true, null);
115115
assertEquals("scaled_float:[-9223372036854775808 TO 10]", scaledFloatQ.toString());
116-
scaledFloatQ = ft.rangeQuery(null, 79.99, true, true, MOCK_QSC);
116+
scaledFloatQ = ft.rangeQuery(null, 79.99, true, true, null);
117117
assertEquals("scaled_float:[-9223372036854775808 TO 7999]", scaledFloatQ.toString());
118118
}
119119

@@ -122,15 +122,15 @@ public void testRoundsLowerBoundCorrectly() {
122122
= new ScaledFloatFieldMapper.ScaledFloatFieldType("scaled_float", 100);
123123
Query scaledFloatQ = ft.rangeQuery(-0.1, null, false, true, MOCK_QSC);
124124
assertEquals("scaled_float:[-9 TO 9223372036854775807]", scaledFloatQ.toString());
125-
scaledFloatQ = ft.rangeQuery(-0.1, null, true, true, MOCK_QSC);
125+
scaledFloatQ = ft.rangeQuery(-0.1, null, true, true, null);
126126
assertEquals("scaled_float:[-10 TO 9223372036854775807]", scaledFloatQ.toString());
127-
scaledFloatQ = ft.rangeQuery(-0.095, null, false, true, MOCK_QSC);
127+
scaledFloatQ = ft.rangeQuery(-0.095, null, false, true, null);
128128
assertEquals("scaled_float:[-9 TO 9223372036854775807]", scaledFloatQ.toString());
129-
scaledFloatQ = ft.rangeQuery(-0.095, null, true, true, MOCK_QSC);
129+
scaledFloatQ = ft.rangeQuery(-0.095, null, true, true, null);
130130
assertEquals("scaled_float:[-9 TO 9223372036854775807]", scaledFloatQ.toString());
131-
scaledFloatQ = ft.rangeQuery(-0.105, null, false, true, MOCK_QSC);
131+
scaledFloatQ = ft.rangeQuery(-0.105, null, false, true, null);
132132
assertEquals("scaled_float:[-10 TO 9223372036854775807]", scaledFloatQ.toString());
133-
scaledFloatQ = ft.rangeQuery(-0.105, null, true, true, MOCK_QSC);
133+
scaledFloatQ = ft.rangeQuery(-0.105, null, true, true, null);
134134
assertEquals("scaled_float:[-10 TO 9223372036854775807]", scaledFloatQ.toString());
135135
}
136136

modules/percolator/src/test/java/org/elasticsearch/percolator/CandidateQueryTests.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@
9595
import org.elasticsearch.index.mapper.MapperService;
9696
import org.elasticsearch.index.mapper.NumberFieldMapper;
9797
import org.elasticsearch.index.mapper.ParseContext;
98-
import org.elasticsearch.index.query.QueryShardContext;
9998
import org.elasticsearch.plugins.Plugin;
10099
import org.elasticsearch.test.ESSingleNodeTestCase;
101100
import org.junit.After;
@@ -124,7 +123,6 @@ public class CandidateQueryTests extends ESSingleNodeTestCase {
124123
private IndexWriter indexWriter;
125124
private DocumentMapper documentMapper;
126125
private DirectoryReader directoryReader;
127-
private IndexService indexService;
128126
private MapperService mapperService;
129127

130128
private PercolatorFieldMapper fieldMapper;
@@ -146,7 +144,7 @@ public void init() throws Exception {
146144
indexWriter = new IndexWriter(directory, config);
147145

148146
String indexName = "test";
149-
indexService = createIndex(indexName, Settings.EMPTY);
147+
IndexService indexService = createIndex(indexName, Settings.EMPTY);
150148
mapperService = indexService.mapperService();
151149

152150
String mapper = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
@@ -199,7 +197,6 @@ public void testDuel() throws Exception {
199197
}
200198
Collections.sort(intValues);
201199

202-
QueryShardContext context = createSearchContext(indexService).getQueryShardContext();
203200
MappedFieldType intFieldType = mapperService.fieldType("int_field");
204201

205202
List<Supplier<Query>> queryFunctions = new ArrayList<>();
@@ -210,10 +207,10 @@ public void testDuel() throws Exception {
210207
queryFunctions.add(() -> new TermQuery(new Term(field1, randomFrom(stringContent.get(field1)))));
211208
String field2 = randomFrom(stringFields);
212209
queryFunctions.add(() -> new TermQuery(new Term(field2, randomFrom(stringContent.get(field2)))));
213-
queryFunctions.add(() -> intFieldType.termQuery(randomFrom(intValues), context));
214-
queryFunctions.add(() -> intFieldType.termsQuery(Arrays.asList(randomFrom(intValues), randomFrom(intValues)), context));
210+
queryFunctions.add(() -> intFieldType.termQuery(randomFrom(intValues), null));
211+
queryFunctions.add(() -> intFieldType.termsQuery(Arrays.asList(randomFrom(intValues), randomFrom(intValues)), null));
215212
queryFunctions.add(() -> intFieldType.rangeQuery(intValues.get(4), intValues.get(intValues.size() - 4), true,
216-
true, ShapeRelation.WITHIN, null, null, context));
213+
true, ShapeRelation.WITHIN, null, null, null));
217214
queryFunctions.add(() -> new TermInSetQuery(field1, new BytesRef(randomFrom(stringContent.get(field1))),
218215
new BytesRef(randomFrom(stringContent.get(field1)))));
219216
queryFunctions.add(() -> new TermInSetQuery(field2, new BytesRef(randomFrom(stringContent.get(field1))),
@@ -338,7 +335,6 @@ public void testDuel2() throws Exception {
338335
ranges.add(new int[]{0, 10});
339336
ranges.add(new int[]{15, 50});
340337

341-
QueryShardContext context = createSearchContext(indexService).getQueryShardContext();
342338
List<ParseContext.Document> documents = new ArrayList<>();
343339
{
344340
addQuery(new TermQuery(new Term("string_field", randomFrom(stringValues))), documents);
@@ -348,13 +344,13 @@ public void testDuel2() throws Exception {
348344
}
349345
{
350346
int[] range = randomFrom(ranges);
351-
Query rangeQuery = intFieldType.rangeQuery(range[0], range[1], true, true, null, null, null, context);
347+
Query rangeQuery = intFieldType.rangeQuery(range[0], range[1], true, true, null, null, null, null);
352348
addQuery(rangeQuery, documents);
353349
}
354350
{
355351
int numBooleanQueries = randomIntBetween(1, 5);
356352
for (int i = 0; i < numBooleanQueries; i++) {
357-
Query randomBQ = randomBQ(1, stringValues, ranges, intFieldType, context);
353+
Query randomBQ = randomBQ(1, stringValues, ranges, intFieldType);
358354
addQuery(randomBQ, documents);
359355
}
360356
}
@@ -379,7 +375,6 @@ public void testDuel2() throws Exception {
379375
MemoryIndex memoryIndex = MemoryIndex.fromDocument(document, new WhitespaceAnalyzer());
380376
duelRun(queryStore, memoryIndex, shardSearcher);
381377
}
382-
383378
for (int[] range : ranges) {
384379
List<Field> numberFields =
385380
NumberFieldMapper.NumberType.INTEGER.createFields("int_field", between(range[0], range[1]), true, true, false);
@@ -392,8 +387,7 @@ public void testDuel2() throws Exception {
392387
}
393388
}
394389

395-
private BooleanQuery randomBQ(int depth, List<String> stringValues, List<int[]> ranges,
396-
MappedFieldType intFieldType, QueryShardContext context) {
390+
private BooleanQuery randomBQ(int depth, List<String> stringValues, List<int[]> ranges, MappedFieldType intFieldType) {
397391
final int numClauses = randomIntBetween(1, 4);
398392
final boolean onlyShouldClauses = randomBoolean();
399393
final BooleanQuery.Builder builder = new BooleanQuery.Builder();
@@ -402,10 +396,10 @@ private BooleanQuery randomBQ(int depth, List<String> stringValues, List<int[]>
402396
for (int i = 0; i < numClauses; i++) {
403397
Query subQuery;
404398
if (randomBoolean() && depth <= 3) {
405-
subQuery = randomBQ(depth + 1, stringValues, ranges, intFieldType, context);
399+
subQuery = randomBQ(depth + 1, stringValues, ranges, intFieldType);
406400
} else if (randomBoolean()) {
407401
int[] range = randomFrom(ranges);
408-
subQuery = intFieldType.rangeQuery(range[0], range[1], true, true, null, null, null, context);
402+
subQuery = intFieldType.rangeQuery(range[0], range[1], true, true, null, null, null, null);
409403
} else {
410404
subQuery = new TermQuery(new Term("string_field", randomFrom(stringValues)));
411405
}

modules/percolator/src/test/java/org/elasticsearch/percolator/PercolatorFieldMapperTests.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,13 @@ public void testExtractTerms() throws Exception {
227227
}
228228

229229
public void testExtractRanges() throws Exception {
230-
QueryShardContext context = createSearchContext(indexService).getQueryShardContext();
231230
addQueryFieldMappings();
232231
BooleanQuery.Builder bq = new BooleanQuery.Builder();
233232
Query rangeQuery1 = mapperService.fieldType("number_field1")
234-
.rangeQuery(10, 20, true, true, null, null, null, context);
233+
.rangeQuery(10, 20, true, true, null, null, null, null);
235234
bq.add(rangeQuery1, Occur.MUST);
236235
Query rangeQuery2 = mapperService.fieldType("number_field1")
237-
.rangeQuery(15, 20, true, true, null, null, null, context);
236+
.rangeQuery(15, 20, true, true, null, null, null, null);
238237
bq.add(rangeQuery2, Occur.MUST);
239238

240239
DocumentMapper documentMapper = mapperService.documentMapper("doc");
@@ -266,7 +265,7 @@ public void testExtractRanges() throws Exception {
266265
bq = new BooleanQuery.Builder();
267266
bq.add(rangeQuery1, Occur.MUST);
268267
rangeQuery2 = mapperService.fieldType("number_field2")
269-
.rangeQuery(15, 20, true, true, null, null, null, context);
268+
.rangeQuery(15, 20, true, true, null, null, null, null);
270269
bq.add(rangeQuery2, Occur.MUST);
271270

272271
parseContext = new ParseContext.InternalParseContext(settings,

server/src/main/java/org/elasticsearch/index/IndexSortConfig.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,6 @@ public boolean hasIndexSort() {
171171
return sortSpecs.length > 0;
172172
}
173173

174-
public boolean hasPrimarySortOnField(String field) {
175-
return sortSpecs.length > 0
176-
&& sortSpecs[0].field.equals(field);
177-
}
178-
179174
/**
180175
* Builds the {@link Sort} order from the settings for this index
181176
* or returns null if this index has no sort.

server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.apache.lucene.search.BoostQuery;
3131
import org.apache.lucene.search.DocValuesFieldExistsQuery;
3232
import org.apache.lucene.search.IndexOrDocValuesQuery;
33-
import org.apache.lucene.search.IndexSortSortedNumericDocValuesRangeQuery;
3433
import org.apache.lucene.search.Query;
3534
import org.apache.lucene.search.TermQuery;
3635
import org.apache.lucene.util.BytesRef;
@@ -390,17 +389,11 @@ public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower
390389
--u;
391390
}
392391
}
393-
394392
Query query = LongPoint.newRangeQuery(name(), l, u);
395393
if (hasDocValues()) {
396394
Query dvQuery = SortedNumericDocValuesField.newSlowRangeQuery(name(), l, u);
397395
query = new IndexOrDocValuesQuery(query, dvQuery);
398-
399-
if (context.indexSortedOnField(name())) {
400-
query = new IndexSortSortedNumericDocValuesRangeQuery(name(), l, u, query);
401-
}
402396
}
403-
404397
if (nowUsed[0]) {
405398
query = new DateRangeIncludingNowQuery(query);
406399
}

0 commit comments

Comments
 (0)