Skip to content

Commit c98a57a

Browse files
authored
Refactor SourceProvider creation to consistently use MappingLookup (elastic#128213) (elastic#128312)
This change updates the code to always create SourceProvider instances via MappingLookup, avoiding direct exposure to the underlying source format (synthetic or stored). It also aligns source filtering behaviour between SourceProvider and SourceLoader, ensuring consistent application of filters. This change is needed to enable source filtering to occur earlier in the fetch phase, for example, when constructing a synthetic source.
1 parent 174e9ae commit c98a57a

File tree

42 files changed

+205
-202
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+205
-202
lines changed

benchmarks/src/main/java/org/elasticsearch/benchmark/script/ScriptScoreBenchmark.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030
import org.elasticsearch.index.fielddata.IndexFieldDataCache;
3131
import org.elasticsearch.index.fielddata.IndexNumericFieldData;
3232
import org.elasticsearch.index.mapper.MappedFieldType;
33+
import org.elasticsearch.index.mapper.MappingLookup;
3334
import org.elasticsearch.index.mapper.NumberFieldMapper.NumberFieldType;
3435
import org.elasticsearch.index.mapper.NumberFieldMapper.NumberType;
36+
import org.elasticsearch.index.mapper.SourceFieldMetrics;
3537
import org.elasticsearch.indices.breaker.CircuitBreakerService;
3638
import org.elasticsearch.indices.breaker.NoneCircuitBreakerService;
3739
import org.elasticsearch.plugins.PluginsLoader;
@@ -90,7 +92,7 @@ public class ScriptScoreBenchmark {
9092
private final SearchLookup lookup = new SearchLookup(
9193
fieldTypes::get,
9294
(mft, lookup, fdo) -> mft.fielddataBuilder(FieldDataContext.noRuntimeFields("benchmark")).build(fieldDataCache, breakerService),
93-
SourceProvider.fromStoredFields()
95+
SourceProvider.fromLookup(MappingLookup.EMPTY, null, SourceFieldMetrics.NOOP)
9496
);
9597

9698
@Param({ "expression", "metal", "painless_cast", "painless_def" })

docs/changelog/128213.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 128213
2+
summary: Refactor `SourceProvider` creation to consistently use `MappingLookup`
3+
area: Mapping
4+
type: enhancement
5+
issues: []

plugins/mapper-murmur3/src/test/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapperTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ protected void assertFetch(MapperService mapperService, String field, Object val
107107
ValueFetcher nativeFetcher = ft.valueFetcher(searchExecutionContext, format);
108108
ParsedDocument doc = mapperService.documentMapper().parse(source);
109109
withLuceneIndex(mapperService, iw -> iw.addDocuments(doc.docs()), ir -> {
110-
Source s = SourceProvider.fromStoredFields().getSource(ir.leaves().get(0), 0);
110+
Source s = SourceProvider.fromLookup(mapperService.mappingLookup(), null, mapperService.getMapperMetrics().sourceFieldMetrics())
111+
.getSource(ir.leaves().get(0), 0);
111112
docValueFetcher.setNextReader(ir.leaves().get(0));
112113
nativeFetcher.setNextReader(ir.leaves().get(0));
113114
List<Object> fromDocValues = docValueFetcher.fetchValues(s, 0, new ArrayList<>());

server/src/main/java/org/elasticsearch/index/fieldvisitor/StoredFieldLoader.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ public static StoredFieldLoader create(boolean loadSource, Set<String> fields) {
6666
* otherwise, uses the heuristic defined in {@link StoredFieldLoader#reader(LeafReaderContext, int[])}.
6767
*/
6868
public static StoredFieldLoader create(boolean loadSource, Set<String> fields, boolean forceSequentialReader) {
69+
if (loadSource == false && fields.isEmpty()) {
70+
return StoredFieldLoader.empty();
71+
}
6972
List<String> fieldsToLoad = fieldsToLoad(loadSource, fields);
7073
return new StoredFieldLoader() {
7174
@Override

server/src/main/java/org/elasticsearch/index/query/FilteredSearchExecutionContext.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.elasticsearch.action.ActionListener;
2020
import org.elasticsearch.client.internal.Client;
2121
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
22+
import org.elasticsearch.core.Nullable;
2223
import org.elasticsearch.index.Index;
2324
import org.elasticsearch.index.IndexSettings;
2425
import org.elasticsearch.index.IndexVersion;
@@ -39,6 +40,7 @@
3940
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
4041
import org.elasticsearch.search.lookup.LeafFieldLookupProvider;
4142
import org.elasticsearch.search.lookup.SearchLookup;
43+
import org.elasticsearch.search.lookup.SourceFilter;
4244
import org.elasticsearch.search.lookup.SourceProvider;
4345
import org.elasticsearch.xcontent.XContentParserConfiguration;
4446

@@ -162,8 +164,8 @@ public boolean isSourceSynthetic() {
162164
}
163165

164166
@Override
165-
public SourceLoader newSourceLoader(boolean forceSyntheticSource) {
166-
return in.newSourceLoader(forceSyntheticSource);
167+
public SourceLoader newSourceLoader(@Nullable SourceFilter filter, boolean forceSyntheticSource) {
168+
return in.newSourceLoader(filter, forceSyntheticSource);
167169
}
168170

169171
@Override

server/src/main/java/org/elasticsearch/index/query/SearchExecutionContext.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.common.ParsingException;
2626
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2727
import org.elasticsearch.common.lucene.search.Queries;
28+
import org.elasticsearch.core.Nullable;
2829
import org.elasticsearch.index.Index;
2930
import org.elasticsearch.index.IndexSettings;
3031
import org.elasticsearch.index.IndexSortConfig;
@@ -57,6 +58,7 @@
5758
import org.elasticsearch.search.aggregations.support.ValuesSourceRegistry;
5859
import org.elasticsearch.search.lookup.LeafFieldLookupProvider;
5960
import org.elasticsearch.search.lookup.SearchLookup;
61+
import org.elasticsearch.search.lookup.SourceFilter;
6062
import org.elasticsearch.search.lookup.SourceProvider;
6163
import org.elasticsearch.transport.RemoteClusterAware;
6264
import org.elasticsearch.xcontent.XContentParserConfiguration;
@@ -439,15 +441,15 @@ public boolean isSourceSynthetic() {
439441
/**
440442
* Build something to load source {@code _source}.
441443
*/
442-
public SourceLoader newSourceLoader(boolean forceSyntheticSource) {
444+
public SourceLoader newSourceLoader(@Nullable SourceFilter filter, boolean forceSyntheticSource) {
443445
if (forceSyntheticSource) {
444446
return new SourceLoader.Synthetic(
445-
null,
447+
filter,
446448
() -> mappingLookup.getMapping().syntheticFieldLoader(null),
447449
mapperMetrics.sourceFieldMetrics()
448450
);
449451
}
450-
return mappingLookup.newSourceLoader(null, mapperMetrics.sourceFieldMetrics());
452+
return mappingLookup.newSourceLoader(filter, mapperMetrics.sourceFieldMetrics());
451453
}
452454

453455
/**
@@ -506,9 +508,7 @@ public SearchLookup lookup() {
506508
}
507509

508510
public SourceProvider createSourceProvider() {
509-
return isSourceSynthetic()
510-
? SourceProvider.fromSyntheticSource(mappingLookup.getMapping(), null, mapperMetrics.sourceFieldMetrics())
511-
: SourceProvider.fromStoredFields();
511+
return SourceProvider.fromLookup(mappingLookup, null, mapperMetrics.sourceFieldMetrics());
512512
}
513513

514514
/**

server/src/main/java/org/elasticsearch/search/DefaultSearchContext.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import org.elasticsearch.search.internal.SearchContext;
6868
import org.elasticsearch.search.internal.ShardSearchContextId;
6969
import org.elasticsearch.search.internal.ShardSearchRequest;
70+
import org.elasticsearch.search.lookup.SourceFilter;
7071
import org.elasticsearch.search.profile.Profilers;
7172
import org.elasticsearch.search.query.QuerySearchResult;
7273
import org.elasticsearch.search.rank.context.QueryPhaseRankShardContext;
@@ -961,8 +962,8 @@ public ReaderContext readerContext() {
961962
}
962963

963964
@Override
964-
public SourceLoader newSourceLoader() {
965-
return searchExecutionContext.newSourceLoader(request.isForceSyntheticSource());
965+
public SourceLoader newSourceLoader(@Nullable SourceFilter filter) {
966+
return searchExecutionContext.newSourceLoader(filter, request.isForceSyntheticSource());
966967
}
967968

968969
@Override

server/src/main/java/org/elasticsearch/search/fetch/FetchContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ public class FetchContext {
4646
/**
4747
* Create a FetchContext based on a SearchContext
4848
*/
49-
public FetchContext(SearchContext searchContext) {
49+
public FetchContext(SearchContext searchContext, SourceLoader sourceLoader) {
5050
this.searchContext = searchContext;
51-
this.sourceLoader = searchContext.newSourceLoader();
51+
this.sourceLoader = sourceLoader;
5252
this.storedFieldsContext = buildStoredFieldsContext(searchContext);
5353
this.fetchSourceContext = buildFetchSourceContext(searchContext);
5454
}

server/src/main/java/org/elasticsearch/search/fetch/FetchPhase.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,8 @@ public Source getSource(LeafReaderContext ctx, int doc) {
110110
}
111111

112112
private SearchHits buildSearchHits(SearchContext context, int[] docIdsToLoad, Profiler profiler, RankDocShardInfo rankDocs) {
113-
114-
FetchContext fetchContext = new FetchContext(context);
115-
SourceLoader sourceLoader = context.newSourceLoader();
113+
SourceLoader sourceLoader = context.newSourceLoader(null);
114+
FetchContext fetchContext = new FetchContext(context, sourceLoader);
116115

117116
PreloadedSourceProvider sourceProvider = new PreloadedSourceProvider();
118117
PreloadedFieldLookupProvider fieldLookupProvider = new PreloadedFieldLookupProvider();

server/src/main/java/org/elasticsearch/search/internal/FilteredSearchContext.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.apache.lucene.search.Query;
1414
import org.apache.lucene.search.TotalHits;
1515
import org.elasticsearch.action.search.SearchType;
16+
import org.elasticsearch.core.Nullable;
1617
import org.elasticsearch.core.TimeValue;
1718
import org.elasticsearch.index.cache.bitset.BitsetFilterCache;
1819
import org.elasticsearch.index.mapper.IdLoader;
@@ -32,6 +33,7 @@
3233
import org.elasticsearch.search.fetch.subphase.InnerHitsContext;
3334
import org.elasticsearch.search.fetch.subphase.ScriptFieldsContext;
3435
import org.elasticsearch.search.fetch.subphase.highlight.SearchHighlightContext;
36+
import org.elasticsearch.search.lookup.SourceFilter;
3537
import org.elasticsearch.search.profile.Profilers;
3638
import org.elasticsearch.search.query.QuerySearchResult;
3739
import org.elasticsearch.search.rank.context.QueryPhaseRankShardContext;
@@ -452,8 +454,8 @@ public ReaderContext readerContext() {
452454
}
453455

454456
@Override
455-
public SourceLoader newSourceLoader() {
456-
return in.newSourceLoader();
457+
public SourceLoader newSourceLoader(@Nullable SourceFilter filter) {
458+
return in.newSourceLoader(filter);
457459
}
458460

459461
@Override

0 commit comments

Comments
 (0)