From ecea998a2c81fb8a37b2622ce5803d903bec92b2 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 31 Oct 2025 11:31:02 +0000 Subject: [PATCH 1/3] Add competitive sort tests to MapperTestCase --- .../LegacyGeoShapeFieldMapperTests.java | 5 ++ .../extras/MatchOnlyTextFieldMapperTests.java | 5 ++ .../extras/RankFeatureFieldMapperTests.java | 5 ++ .../extras/RankFeaturesFieldMapperTests.java | 5 ++ .../SearchAsYouTypeFieldMapperTests.java | 5 ++ .../extras/TokenCountFieldMapperTests.java | 5 ++ .../ICUCollationKeywordFieldMapperTests.java | 5 ++ .../AnnotatedTextFieldMapperTests.java | 5 ++ .../murmur3/Murmur3FieldMapperTests.java | 5 ++ .../index/mapper/BinaryFieldMapperTests.java | 5 ++ .../index/mapper/BooleanFieldMapperTests.java | 9 +++ .../mapper/CompletionFieldMapperTests.java | 5 ++ .../index/mapper/DateFieldMapperTests.java | 20 ++++++ .../mapper/GeoPointFieldMapperTests.java | 5 ++ .../index/mapper/IpFieldMapperTests.java | 9 +++ .../index/mapper/KeywordFieldMapperTests.java | 5 ++ .../index/mapper/RangeFieldMapperTests.java | 5 ++ .../index/mapper/TextFieldMapperTests.java | 4 ++ .../flattened/FlattenedFieldMapperTests.java | 5 ++ .../SyntheticVectorsMapperTestCase.java | 6 ++ .../index/mapper/MapperTestCase.java | 66 +++++++++++++++++++ .../index/mapper/NumberFieldMapperTests.java | 9 +++ .../mapper/HistogramFieldMapperTests.java | 5 ++ .../mapper/OffsetSourceFieldMapperTests.java | 5 ++ .../mapper/SemanticTextFieldMapperTests.java | 5 ++ .../PatternTextFieldMapperTests.java | 5 ++ ...AggregateMetricDoubleFieldMapperTests.java | 5 ++ .../ConstantKeywordFieldMapperTests.java | 5 ++ .../CountedKeywordFieldMapperTests.java | 5 ++ .../ExponentialHistogramFieldMapperTests.java | 5 ++ .../VersionStringFieldMapperTests.java | 5 ++ ...GeoShapeWithDocValuesFieldMapperTests.java | 5 ++ .../index/mapper/PointFieldMapperTests.java | 5 ++ .../index/mapper/ShapeFieldMapperTests.java | 5 ++ .../mapper/WildcardFieldMapperTests.java | 5 ++ 35 files changed, 263 insertions(+) diff --git a/modules/legacy-geo/src/test/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapperTests.java b/modules/legacy-geo/src/test/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapperTests.java index c97b0a28d22de..dcbf5bcb87e41 100644 --- a/modules/legacy-geo/src/test/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapperTests.java +++ b/modules/legacy-geo/src/test/java/org/elasticsearch/legacygeo/mapper/LegacyGeoShapeFieldMapperTests.java @@ -678,4 +678,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapperTests.java index ef72e234f8d6b..3a567490fc218 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapperTests.java @@ -385,4 +385,9 @@ public void testLoadSyntheticSourceFromStringOrBytesRef() throws IOException { } } } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapperTests.java index 917941b39e888..174bc44cbaecc 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeatureFieldMapperTests.java @@ -215,4 +215,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapperTests.java index 6818b7936d124..c229752917560 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/RankFeaturesFieldMapperTests.java @@ -209,4 +209,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean syntheticSource) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/SearchAsYouTypeFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/SearchAsYouTypeFieldMapperTests.java index 3e2bb422c2062..9965259e294da 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/SearchAsYouTypeFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/SearchAsYouTypeFieldMapperTests.java @@ -877,4 +877,9 @@ protected RandomIndexWriter indexWriterForSyntheticSource(Directory directory) t protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapperTests.java index 8105eee707cc3..b77ab875926e8 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/TokenCountFieldMapperTests.java @@ -264,4 +264,9 @@ public void testAggregationsDocValuesDisabled() throws IOException { })); assertAggregatableConsistency(mapperService.fieldType("field")); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/plugins/analysis-icu/src/test/java/org/elasticsearch/plugin/analysis/icu/ICUCollationKeywordFieldMapperTests.java b/plugins/analysis-icu/src/test/java/org/elasticsearch/plugin/analysis/icu/ICUCollationKeywordFieldMapperTests.java index 034a25e854298..275a70eb43f57 100644 --- a/plugins/analysis-icu/src/test/java/org/elasticsearch/plugin/analysis/icu/ICUCollationKeywordFieldMapperTests.java +++ b/plugins/analysis-icu/src/test/java/org/elasticsearch/plugin/analysis/icu/ICUCollationKeywordFieldMapperTests.java @@ -318,4 +318,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/plugins/mapper-annotated-text/src/test/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapperTests.java b/plugins/mapper-annotated-text/src/test/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapperTests.java index ae3d03c3a503f..b808cffd75c7a 100644 --- a/plugins/mapper-annotated-text/src/test/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapperTests.java +++ b/plugins/mapper-annotated-text/src/test/java/org/elasticsearch/index/mapper/annotatedtext/AnnotatedTextFieldMapperTests.java @@ -704,4 +704,9 @@ protected void validateRoundTripReader(String syntheticSource, DirectoryReader r protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java b/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java index d04f2067d8aed..2978ee458dda9 100644 --- a/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java +++ b/plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java @@ -148,4 +148,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java index 7f257172638c2..8c3800bdf6132 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/BinaryFieldMapperTests.java @@ -263,4 +263,9 @@ public int compareTo(BytesCompareUnsigned o) { protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java index 47161239a363d..76df9b6303109 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/BooleanFieldMapperTests.java @@ -409,4 +409,13 @@ public void execute() { } }; } + + @Override + protected List getSortShortcutSupport() { + return List.of( + // TODO: boolean field mapper uses a numeric comparator but is indexed with Terms + // so skipping doesn't work here. + new SortShortcutSupport(this::minimalMapping, this::writeField, false) + ); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java index 995127e2b3593..079521b26b666 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/CompletionFieldMapperTests.java @@ -985,4 +985,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java index 4d6368b712f98..f3e2633717a4b 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DateFieldMapperTests.java @@ -914,4 +914,24 @@ public void testSingletonLongBulkBlockReadingManyValues() throws Exception { } } } + + @Override + protected List getSortShortcutSupport() { + return List.of( + new SortShortcutSupport(b -> b.field("type", "date"), b -> b.field("field", "2025-10-30T00:00:00"), true), + new SortShortcutSupport(b -> b.field("type", "date_nanos"), b -> b.field("field", "2025-10-30T00:00:00"), true), + new SortShortcutSupport( + IndexVersion.fromId(5000099), + b -> b.field("type", "date"), + b -> b.field("field", "2025-10-30T00:00:00"), + false + ), + new SortShortcutSupport( + IndexVersion.fromId(5000099), + b -> b.field("type", "date_nanos"), + b -> b.field("field", "2025-10-30T00:00:00"), + false + ) + ); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java index 9ffe1ba394b0b..c560448f6bb33 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/GeoPointFieldMapperTests.java @@ -719,4 +719,9 @@ public void testSyntheticSourceKeepArrays() { protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java index 2ca2a7f8eb62d..e0308b5fd8bbf 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/IpFieldMapperTests.java @@ -438,4 +438,13 @@ public void execute() { protected String randomSyntheticSourceKeep() { return "all"; } + + @Override + protected List getSortShortcutSupport() { + return List.of( + // TODO - shortcuts are disabled here, can we enable them? + new SortShortcutSupport(this::minimalMapping, this::writeField, false), + new SortShortcutSupport(IndexVersion.fromId(5000099), this::minimalMapping, this::writeField, false) + ); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java index 520ec8a8c3400..641ddeb170f77 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/KeywordFieldMapperTests.java @@ -1219,4 +1219,9 @@ protected String randomSyntheticSourceKeep() { // Only option all keeps array source in ignored source. return randomFrom("all"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(new SortShortcutSupport(this::minimalMapping, this::writeField, true)); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldMapperTests.java index 7555d1cd7fb48..6dd85a3f8c5e6 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/RangeFieldMapperTests.java @@ -426,4 +426,9 @@ protected Object generateRandomInputValue(MappedFieldType ft) { assumeFalse("DocValuesFetcher doesn't work", true); return null; } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java index 970dd8886b93f..4947af5eeba11 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java @@ -1776,4 +1776,8 @@ public void testNormsEnabledWhenIndexModeIsTsdb_bwcCheck() throws IOException { assertThat(fieldType.omitNorms(), is(false)); } + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java index d9223a157b2ff..3939fcaa6e0e8 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/flattened/FlattenedFieldMapperTests.java @@ -1016,4 +1016,9 @@ public void assertStoredFieldsEquals(String info, IndexReader leftReader, IndexR assertFalse(info, rightIterator.hasNext()); } } + + @Override + protected List getSortShortcutSupport() { + return List.of(new SortShortcutSupport(this::minimalMapping, this::writeField, true)); + } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/vectors/SyntheticVectorsMapperTestCase.java b/server/src/test/java/org/elasticsearch/index/mapper/vectors/SyntheticVectorsMapperTestCase.java index f7a23383f4e92..dbf4bd9846165 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/vectors/SyntheticVectorsMapperTestCase.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/vectors/SyntheticVectorsMapperTestCase.java @@ -25,6 +25,7 @@ import org.elasticsearch.xcontent.XContentType; import java.io.IOException; +import java.util.List; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertToXContentEquivalent; @@ -262,4 +263,9 @@ private void assertSyntheticVectors(String mapping, BytesReference source, XCont } } } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java index 3ef66cebc1f14..f7ee3dcdbda43 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/MapperTestCase.java @@ -22,6 +22,7 @@ import org.apache.lucene.index.NoMergePolicy; import org.apache.lucene.search.FieldExistsQuery; import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Pruning; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; @@ -64,6 +65,7 @@ import org.elasticsearch.script.ScriptFactory; import org.elasticsearch.script.field.DocValuesScriptFieldFactory; import org.elasticsearch.search.DocValueFormat; +import org.elasticsearch.search.MultiValueMode; import org.elasticsearch.search.lookup.LeafStoredFieldsLookup; import org.elasticsearch.search.lookup.SearchLookup; import org.elasticsearch.search.lookup.Source; @@ -1697,4 +1699,68 @@ protected T compileOtherScript(Script script, ScriptContext context) { */ abstract ScriptFactory nonEmptyFieldScript(); } + + /** + * Return a list of scenarios where sorts on this field should or should not produce + * competitive iterators. Field types that do not support sorting should return an + * empty List. + */ + protected abstract List getSortShortcutSupport(); + + public record SortShortcutSupport( + IndexVersion indexVersion, + Settings settings, + CheckedConsumer mappings, + CheckedConsumer document, + boolean supportsShortcut + ) { + public SortShortcutSupport( + CheckedConsumer mappings, + CheckedConsumer document, + boolean supportsShortcut + ) { + this(IndexVersion.current(), SETTINGS, mappings, document, supportsShortcut); + } + + public SortShortcutSupport( + IndexVersion indexVersion, + CheckedConsumer mappings, + CheckedConsumer document, + boolean supportsShortcut + ) { + this(indexVersion, SETTINGS, mappings, document, supportsShortcut); + } + } + + public final void testSortShortcuts() throws IOException { + List tests = getSortShortcutSupport(); + assumeTrue("Sort shortcuts not supported", tests != null && tests.isEmpty() == false); + + for (SortShortcutSupport sortShortcutSupport : tests) { + MapperService mapperService = createMapperService(sortShortcutSupport.indexVersion(), sortShortcutSupport.settings, () -> true); + merge(mapperService, fieldMapping(sortShortcutSupport.mappings)); + withLuceneIndex(mapperService, iw -> { + iw.addDocument( + mapperService.documentParser() + .parseDocument(source(sortShortcutSupport.document()), mapperService.mappingLookup()) + .rootDoc() + ); + }, reader -> { + IndexSearcher searcher = newSearcher(reader); + MappedFieldType ft = mapperService.fieldType("field"); + SortField sortField = ft.fielddataBuilder(new FieldDataContext("", mapperService.getIndexSettings(), () -> { + throw new UnsupportedOperationException(); + }, Set::of, MappedFieldType.FielddataOperation.SEARCH)) + .build(null, null) + .sortField(getVersion(), null, MultiValueMode.MIN, null, false); + var comparator = sortField.getComparator(10, Pruning.GREATER_THAN_OR_EQUAL_TO); + var leafComparator = comparator.getLeafComparator(searcher.getLeafContexts().getFirst()); + if (sortShortcutSupport.supportsShortcut) { + assertNotNull(leafComparator.competitiveIterator()); + } else { + assertNull(leafComparator.competitiveIterator()); + } + }); + } + } } diff --git a/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java b/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java index 18e60c008db96..2f16534908b2e 100644 --- a/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java +++ b/test/framework/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapperTests.java @@ -16,6 +16,7 @@ import org.elasticsearch.core.Tuple; import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.IndexSettings; +import org.elasticsearch.index.IndexVersion; import org.elasticsearch.script.DoubleFieldScript; import org.elasticsearch.script.LongFieldScript; import org.elasticsearch.script.Script; @@ -496,4 +497,12 @@ public List invalidExample() throws IOException { return List.of(); } } + + @Override + protected List getSortShortcutSupport() { + return List.of( + new SortShortcutSupport(this::minimalMapping, this::writeField, true), + new SortShortcutSupport(IndexVersion.fromId(5000099), this::minimalMapping, this::writeField, false) + ); + } } diff --git a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java index ef096f344f352..b26b33cc01544 100644 --- a/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java +++ b/x-pack/plugin/analytics/src/test/java/org/elasticsearch/xpack/analytics/mapper/HistogramFieldMapperTests.java @@ -523,4 +523,9 @@ public List invalidExample() throws IOException { public void testSyntheticSourceKeepArrays() { // The mapper expects to parse an array of values by default, it's not compatible with array of arrays. } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapperTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapperTests.java index b3ee52c8dede5..384a321d524be 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapperTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/OffsetSourceFieldMapperTests.java @@ -214,4 +214,9 @@ public void testInvalidOffsets() throws IOException { }))); assertThat(exc.getCause().getCause().getCause().getMessage(), containsString("Illegal offsets")); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java index 273a202baa7d6..2c9c404fcb275 100644 --- a/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java +++ b/x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/mapper/SemanticTextFieldMapperTests.java @@ -2369,4 +2369,9 @@ private static void assertSparseFeatures(LuceneDocument doc, String fieldName, i private void givenModelSettings(String inferenceId, MinimalServiceSettings modelSettings) { when(globalModelRegistry.getMinimalServiceSettings(inferenceId)).thenReturn(modelSettings); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/logsdb/src/test/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapperTests.java b/x-pack/plugin/logsdb/src/test/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapperTests.java index 1b3ccb376febf..8a684122cb658 100644 --- a/x-pack/plugin/logsdb/src/test/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapperTests.java +++ b/x-pack/plugin/logsdb/src/test/java/org/elasticsearch/xpack/logsdb/patterntext/PatternTextFieldMapperTests.java @@ -470,4 +470,9 @@ public void testSyntheticSourceKeepArrays() { protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapperTests.java b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapperTests.java index 874ced5436f69..b1e31882fbf1a 100644 --- a/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapperTests.java +++ b/x-pack/plugin/mapper-aggregate-metric/src/test/java/org/elasticsearch/xpack/aggregatemetric/mapper/AggregateMetricDoubleFieldMapperTests.java @@ -618,4 +618,9 @@ public void testSyntheticSourceKeepArrays() { protected boolean supportsCopyTo() { return false; } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java b/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java index d5405018dd64c..cdbfc6c3b9582 100644 --- a/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java +++ b/x-pack/plugin/mapper-constant-keyword/src/test/java/org/elasticsearch/xpack/constantkeyword/mapper/ConstantKeywordFieldMapperTests.java @@ -346,4 +346,9 @@ protected boolean supportsEmptyInputArray() { protected boolean addsValueWhenNotSupplied() { return true; } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/mapper-counted-keyword/src/test/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapperTests.java b/x-pack/plugin/mapper-counted-keyword/src/test/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapperTests.java index d6b762ab4b79e..5c26222ff1618 100644 --- a/x-pack/plugin/mapper-counted-keyword/src/test/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapperTests.java +++ b/x-pack/plugin/mapper-counted-keyword/src/test/java/org/elasticsearch/xpack/countedkeyword/CountedKeywordFieldMapperTests.java @@ -219,4 +219,9 @@ public void testDisableIndex() throws IOException { assertEquals(IndexOptions.NONE, fields.get(0).fieldType().indexOptions()); assertEquals(DocValuesType.SORTED_SET, fields.get(0).fieldType().docValuesType()); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/mapper-exponential-histogram/src/test/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapperTests.java b/x-pack/plugin/mapper-exponential-histogram/src/test/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapperTests.java index 730d0b591ec7a..f782e7f30b7e3 100644 --- a/x-pack/plugin/mapper-exponential-histogram/src/test/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapperTests.java +++ b/x-pack/plugin/mapper-exponential-histogram/src/test/java/org/elasticsearch/xpack/exponentialhistogram/ExponentialHistogramFieldMapperTests.java @@ -605,4 +605,9 @@ public void testSyntheticSourceKeepArrays() { protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not yet implemented"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapperTests.java b/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapperTests.java index 710b6652ed05d..61d6021005f56 100644 --- a/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapperTests.java +++ b/x-pack/plugin/mapper-version/src/test/java/org/elasticsearch/xpack/versionfield/VersionStringFieldMapperTests.java @@ -198,4 +198,9 @@ public List invalidExample() throws IOException { return List.of(); } } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapperTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapperTests.java index 9482f45063b64..d656f407b3243 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapperTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/GeoShapeWithDocValuesFieldMapperTests.java @@ -553,4 +553,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapperTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapperTests.java index 70df2763e30c6..3cb9f531b23dc 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapperTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/PointFieldMapperTests.java @@ -553,4 +553,9 @@ protected Object[] getThreeEncodedSampleValues() { protected boolean supportsBulkLongBlockReading() { return true; } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapperTests.java b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapperTests.java index ee6f6bc8b70c0..9530f24a153a1 100644 --- a/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapperTests.java +++ b/x-pack/plugin/spatial/src/test/java/org/elasticsearch/xpack/spatial/index/mapper/ShapeFieldMapperTests.java @@ -372,4 +372,9 @@ protected SyntheticSourceSupport syntheticSourceSupport(boolean ignoreMalformed) protected IngestScriptSupport ingestScriptSupport() { throw new AssumptionViolatedException("not supported"); } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } diff --git a/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java b/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java index be216c55d49cf..0690d38fe79ce 100644 --- a/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java +++ b/x-pack/plugin/wildcard/src/test/java/org/elasticsearch/xpack/wildcard/mapper/WildcardFieldMapperTests.java @@ -1272,4 +1272,9 @@ public List invalidExample() throws IOException { return List.of(); } } + + @Override + protected List getSortShortcutSupport() { + return List.of(); + } } From 842d14cb6085b9ffcf39cab1745c0f16d12dbdcf Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 31 Oct 2025 13:56:38 +0000 Subject: [PATCH 2/3] iter --- .../index/mapper/extras/ScaledFloatFieldMapperTests.java | 8 ++++++++ .../xpack/unsignedlong/UnsignedLongFieldMapperTests.java | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java index dce105f339a52..7f988ebcb04f4 100644 --- a/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java +++ b/modules/mapper-extras/src/test/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapperTests.java @@ -649,4 +649,12 @@ private double encodeDecode(double value, double scalingFactor) { private static double randomValue() { return randomBoolean() ? randomDoubleBetween(-Double.MAX_VALUE, Double.MAX_VALUE, true) : randomFloat(); } + + @Override + protected List getSortShortcutSupport() { + return List.of( + // TODO doubles currently disable pruning, can we re-enable? + new SortShortcutSupport(this::minimalMapping, this::writeField, false) + ); + } } diff --git a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java index cb28a6168c561..f8aed69688e81 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java +++ b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java @@ -520,4 +520,11 @@ protected Object[] getThreeEncodedSampleValues() { protected boolean supportsBulkLongBlockReading() { return true; } + + @Override + protected List getSortShortcutSupport() { + return List.of( + new SortShortcutSupport(this::minimalMapping, this::writeField, true) + ); + } } From f772e493b48ee8b47623e3818a7fe632fdc56a6a Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Fri, 31 Oct 2025 14:03:37 +0000 Subject: [PATCH 3/3] [CI] Auto commit changes from spotless --- .../xpack/unsignedlong/UnsignedLongFieldMapperTests.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java index f8aed69688e81..ea3e4df43d615 100644 --- a/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java +++ b/x-pack/plugin/mapper-unsigned-long/src/test/java/org/elasticsearch/xpack/unsignedlong/UnsignedLongFieldMapperTests.java @@ -523,8 +523,6 @@ protected boolean supportsBulkLongBlockReading() { @Override protected List getSortShortcutSupport() { - return List.of( - new SortShortcutSupport(this::minimalMapping, this::writeField, true) - ); + return List.of(new SortShortcutSupport(this::minimalMapping, this::writeField, true)); } }