Skip to content

Commit 6d876c7

Browse files
authored
Address issue with DateFieldMapper#isFieldWithinQuery(...) (#138032)
If a date field has doc values skippers enabled, then it isn't guaranteed that every segment will actually have skippers. The logic was currently assuming that it did. Closes #138024
1 parent d6fe54b commit 6d876c7

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -841,9 +841,10 @@ public Relation isFieldWithinQuery(
841841
}
842842
for (LeafReaderContext ctx : leaves) {
843843
DocValuesSkipper skipper = ctx.reader().getDocValuesSkipper(name());
844-
assert skipper != null : "no skipper for field:" + name() + " and reader:" + reader;
845-
minValue = Long.min(minValue, skipper.minValue());
846-
maxValue = Long.max(maxValue, skipper.maxValue());
844+
if (skipper != null) {
845+
minValue = Long.min(minValue, skipper.minValue());
846+
maxValue = Long.max(maxValue, skipper.maxValue());
847+
}
847848
}
848849
return isFieldWithinQuery(minValue, maxValue, from, to, includeLower, includeUpper, timeZone, dateParser, context, name());
849850
}

server/src/test/java/org/elasticsearch/index/mapper/DateFieldTypeTests.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,44 @@ public void testIsFieldWithinQueryDateNanosDocValueSkipper() throws IOException
113113
isFieldWithinRangeTestCase(ft);
114114
}
115115

116-
public void isFieldWithinRangeTestCase(DateFieldType ft) throws IOException {
116+
public void testIsFieldWithinQueryDocValueSkipperNotInAllSegments() throws IOException {
117+
var ft = new DateFieldType(
118+
"my_date",
119+
IndexType.skippers(),
120+
false,
121+
DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER,
122+
Resolution.NANOSECONDS,
123+
null,
124+
null,
125+
Collections.emptyMap()
126+
);
117127

128+
try (Directory dir = newDirectory()) {
129+
try (IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(null))) {
130+
// Simulates one segment have no my_date field
131+
LuceneDocument doc = new LuceneDocument();
132+
doc.add(SortedNumericDocValuesField.indexedField("my_other_date", 123456789000L));
133+
w.addDocument(doc);
134+
w.flush();
135+
136+
doc = new LuceneDocument();
137+
Field field = SortedNumericDocValuesField.indexedField("my_date", ft.parse("2015-10-12"));
138+
doc.add(field);
139+
w.addDocument(doc);
140+
field.setLongValue(ft.parse("2016-04-03"));
141+
w.addDocument(doc);
142+
try (DirectoryReader reader = DirectoryReader.open(w)) {
143+
DateMathParser alternateFormat = DateFieldMapper.DEFAULT_DATE_TIME_FORMATTER.toDateMathParser();
144+
doTestIsFieldWithinQuery(ft, reader, null, null);
145+
doTestIsFieldWithinQuery(ft, reader, null, alternateFormat);
146+
doTestIsFieldWithinQuery(ft, reader, ZoneOffset.UTC, null);
147+
doTestIsFieldWithinQuery(ft, reader, ZoneOffset.UTC, alternateFormat);
148+
}
149+
}
150+
}
151+
}
152+
153+
public void isFieldWithinRangeTestCase(DateFieldType ft) throws IOException {
118154
Directory dir = newDirectory();
119155
IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(null));
120156
LuceneDocument doc = new LuceneDocument();

0 commit comments

Comments
 (0)