Skip to content

Commit 2ac3568

Browse files
authored
DocumentMapperParser to no longer depend directly on MapperService (elastic#63850)
This change was mainly triggered by the need for `MapperService` to pass `this` during its constructor when creating `DocumentMapperParser`. Also, `MapperService` is carried around in some places where only a subset of it is needed. With this change we rather carry around the components that are strictly needed, in a couple of cases functions that `MapperService` provides, which helps clarifying the dependency between `DocumentMapperParser`, `DocumentMapper` and `MapperService`, as well as removing the need for MapperService to pass `this` to `DocumentMapperParser`
1 parent 70b5d1c commit 2ac3568

16 files changed

+128
-158
lines changed

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
import org.apache.lucene.store.Directory;
7979
import org.apache.lucene.util.BytesRef;
8080
import org.elasticsearch.Version;
81-
import org.elasticsearch.cluster.metadata.IndexMetadata;
8281
import org.elasticsearch.common.CheckedFunction;
8382
import org.elasticsearch.common.Strings;
8483
import org.elasticsearch.common.bytes.BytesArray;
@@ -89,7 +88,6 @@
8988
import org.elasticsearch.common.settings.Settings;
9089
import org.elasticsearch.common.xcontent.XContentFactory;
9190
import org.elasticsearch.index.IndexService;
92-
import org.elasticsearch.index.IndexSettings;
9391
import org.elasticsearch.index.mapper.DocumentMapper;
9492
import org.elasticsearch.index.mapper.MappedFieldType;
9593
import org.elasticsearch.index.mapper.MapperService;
@@ -1121,11 +1119,7 @@ private void duelRun(PercolateQuery.QueryStore queryStore, MemoryIndex memoryInd
11211119
}
11221120

11231121
private void addQuery(Query query, List<ParseContext.Document> docs) {
1124-
IndexMetadata build = IndexMetadata.builder("")
1125-
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT))
1126-
.numberOfShards(1).numberOfReplicas(0).build();
1127-
IndexSettings settings = new IndexSettings(build, Settings.EMPTY);
1128-
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
1122+
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
11291123
fieldMapper.processQuery(query, parseContext);
11301124
ParseContext.Document queryDocument = parseContext.doc();
11311125
// Add to string representation of the query to make debugging easier:

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

+6-24
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.apache.lucene.util.BytesRef;
4343
import org.elasticsearch.Version;
4444
import org.elasticsearch.action.support.PlainActionFuture;
45-
import org.elasticsearch.cluster.metadata.IndexMetadata;
4645
import org.elasticsearch.common.Strings;
4746
import org.elasticsearch.common.bytes.BytesArray;
4847
import org.elasticsearch.common.bytes.BytesReference;
@@ -59,7 +58,6 @@
5958
import org.elasticsearch.common.xcontent.XContentFactory;
6059
import org.elasticsearch.common.xcontent.XContentType;
6160
import org.elasticsearch.index.IndexService;
62-
import org.elasticsearch.index.IndexSettings;
6361
import org.elasticsearch.index.mapper.DocumentMapper;
6462
import org.elasticsearch.index.mapper.DocumentMapperParser;
6563
import org.elasticsearch.index.mapper.MapperParsingException;
@@ -183,11 +181,7 @@ public void testExtractTerms() throws Exception {
183181

184182
DocumentMapper documentMapper = mapperService.documentMapper("doc");
185183
PercolatorFieldMapper fieldMapper = (PercolatorFieldMapper) documentMapper.mappers().getMapper(fieldName);
186-
IndexMetadata build = IndexMetadata.builder("")
187-
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT))
188-
.numberOfShards(1).numberOfReplicas(0).build();
189-
IndexSettings settings = new IndexSettings(build, Settings.EMPTY);
190-
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
184+
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
191185
fieldMapper.processQuery(bq.build(), parseContext);
192186
ParseContext.Document document = parseContext.doc();
193187

@@ -208,7 +202,7 @@ public void testExtractTerms() throws Exception {
208202
bq.add(termQuery1, Occur.MUST);
209203
bq.add(termQuery2, Occur.MUST);
210204

211-
parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
205+
parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
212206
fieldMapper.processQuery(bq.build(), parseContext);
213207
document = parseContext.doc();
214208

@@ -236,12 +230,8 @@ public void testExtractRanges() throws Exception {
236230
bq.add(rangeQuery2, Occur.MUST);
237231

238232
DocumentMapper documentMapper = mapperService.documentMapper("doc");
239-
IndexMetadata build = IndexMetadata.builder("")
240-
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT))
241-
.numberOfShards(1).numberOfReplicas(0).build();
242-
IndexSettings settings = new IndexSettings(build, Settings.EMPTY);
243233
PercolatorFieldMapper fieldMapper = (PercolatorFieldMapper) documentMapper.mappers().getMapper(fieldName);
244-
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
234+
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
245235
fieldMapper.processQuery(bq.build(), parseContext);
246236
ParseContext.Document document = parseContext.doc();
247237

@@ -266,7 +256,7 @@ public void testExtractRanges() throws Exception {
266256
.rangeQuery(15, 20, true, true, null, null, null, context);
267257
bq.add(rangeQuery2, Occur.MUST);
268258

269-
parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
259+
parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
270260
fieldMapper.processQuery(bq.build(), parseContext);
271261
document = parseContext.doc();
272262

@@ -289,11 +279,7 @@ public void testExtractTermsAndRanges_failed() throws Exception {
289279
TermRangeQuery query = new TermRangeQuery("field1", new BytesRef("a"), new BytesRef("z"), true, true);
290280
DocumentMapper documentMapper = mapperService.documentMapper("doc");
291281
PercolatorFieldMapper fieldMapper = (PercolatorFieldMapper) documentMapper.mappers().getMapper(fieldName);
292-
IndexMetadata build = IndexMetadata.builder("")
293-
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT))
294-
.numberOfShards(1).numberOfReplicas(0).build();
295-
IndexSettings settings = new IndexSettings(build, Settings.EMPTY);
296-
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
282+
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
297283
fieldMapper.processQuery(query, parseContext);
298284
ParseContext.Document document = parseContext.doc();
299285

@@ -307,11 +293,7 @@ public void testExtractTermsAndRanges_partial() throws Exception {
307293
PhraseQuery phraseQuery = new PhraseQuery("field", "term");
308294
DocumentMapper documentMapper = mapperService.documentMapper("doc");
309295
PercolatorFieldMapper fieldMapper = (PercolatorFieldMapper) documentMapper.mappers().getMapper(fieldName);
310-
IndexMetadata build = IndexMetadata.builder("")
311-
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT))
312-
.numberOfShards(1).numberOfReplicas(0).build();
313-
IndexSettings settings = new IndexSettings(build, Settings.EMPTY);
314-
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null);
296+
ParseContext.InternalParseContext parseContext = new ParseContext.InternalParseContext(documentMapper, null, null, null);
315297
fieldMapper.processQuery(phraseQuery, parseContext);
316298
ParseContext.Document document = parseContext.doc();
317299

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

+17-37
Original file line numberDiff line numberDiff line change
@@ -37,58 +37,45 @@
3737
import org.elasticsearch.index.IndexSettings;
3838
import org.elasticsearch.index.analysis.IndexAnalyzers;
3939
import org.elasticsearch.index.mapper.MapperService.MergeReason;
40-
import org.elasticsearch.index.mapper.MetadataFieldMapper.TypeParser;
4140
import org.elasticsearch.search.internal.SearchContext;
4241

4342
import java.io.IOException;
4443
import java.util.Arrays;
4544
import java.util.Collection;
46-
import java.util.LinkedHashMap;
4745
import java.util.Map;
4846
import java.util.Objects;
47+
import java.util.function.Function;
4948
import java.util.stream.Stream;
5049

5150

5251
public class DocumentMapper implements ToXContentFragment {
5352

5453
public static class Builder {
55-
56-
private final Map<Class<? extends MetadataFieldMapper>, MetadataFieldMapper> metadataMappers = new LinkedHashMap<>();
54+
private final Map<Class<? extends MetadataFieldMapper>, MetadataFieldMapper> metadataMappers;
5755
private final RootObjectMapper rootObjectMapper;
5856
private final Mapper.BuilderContext builderContext;
5957
private final IndexSettings indexSettings;
6058
private final IndexAnalyzers indexAnalyzers;
61-
private final DocumentMapperParser documentMapperParser;
6259
private final DocumentParser documentParser;
6360

6461
private Map<String, Object> meta;
6562

6663
public Builder(RootObjectMapper.Builder builder, MapperService mapperService) {
67-
this.indexSettings = mapperService.getIndexSettings();
68-
this.indexAnalyzers = mapperService.getIndexAnalyzers();
69-
this.documentMapperParser = mapperService.documentMapperParser();
70-
this.documentParser = mapperService.documentParser();
64+
this(builder, mapperService.getIndexSettings(), mapperService.getIndexAnalyzers(), mapperService.documentParser(),
65+
mapperService::getMetadataMappers);
66+
}
67+
68+
Builder(RootObjectMapper.Builder builder,
69+
IndexSettings indexSettings,
70+
IndexAnalyzers indexAnalyzers,
71+
DocumentParser documentParser,
72+
Function<String, Map<Class<? extends MetadataFieldMapper>, MetadataFieldMapper>> metadataMappersFunction) {
73+
this.indexSettings = indexSettings;
74+
this.indexAnalyzers = indexAnalyzers;
75+
this.documentParser = documentParser;
7176
this.builderContext = new Mapper.BuilderContext(indexSettings.getSettings(), new ContentPath(1));
7277
this.rootObjectMapper = builder.build(builderContext);
73-
final String type = rootObjectMapper.name();
74-
final DocumentMapper existingMapper = mapperService.documentMapper(type);
75-
final Map<String, TypeParser> metadataMapperParsers =
76-
mapperService.mapperRegistry.getMetadataMapperParsers(indexSettings.getIndexVersionCreated());
77-
for (Map.Entry<String, MetadataFieldMapper.TypeParser> entry : metadataMapperParsers.entrySet()) {
78-
final String name = entry.getKey();
79-
final MetadataFieldMapper existingMetadataMapper = existingMapper == null
80-
? null
81-
: (MetadataFieldMapper) existingMapper.mappers().getMapper(name);
82-
final MetadataFieldMapper metadataMapper;
83-
if (existingMetadataMapper == null) {
84-
final TypeParser parser = entry.getValue();
85-
metadataMapper = parser.getDefault(mapperService.fieldType(name),
86-
mapperService.documentMapperParser().parserContext());
87-
} else {
88-
metadataMapper = existingMetadataMapper;
89-
}
90-
metadataMappers.put(metadataMapper.getClass(), metadataMapper);
91-
}
78+
this.metadataMappers = metadataMappersFunction.apply(rootObjectMapper.name());
9279
}
9380

9481
public Builder meta(Map<String, Object> meta) {
@@ -109,7 +96,7 @@ public DocumentMapper build() {
10996
rootObjectMapper,
11097
metadataMappers.values().toArray(new MetadataFieldMapper[0]),
11198
meta);
112-
return new DocumentMapper(indexSettings, documentMapperParser, indexAnalyzers, documentParser, mapping);
99+
return new DocumentMapper(indexSettings, indexAnalyzers, documentParser, mapping);
113100
}
114101
}
115102

@@ -121,19 +108,16 @@ public DocumentMapper build() {
121108
private final MappingLookup fieldMappers;
122109
private final IndexSettings indexSettings;
123110
private final IndexAnalyzers indexAnalyzers;
124-
private final DocumentMapperParser documentMapperParser;
125111
private final MetadataFieldMapper[] deleteTombstoneMetadataFieldMappers;
126112
private final MetadataFieldMapper[] noopTombstoneMetadataFieldMappers;
127113

128114
private DocumentMapper(IndexSettings indexSettings,
129-
DocumentMapperParser documentMapperParser,
130115
IndexAnalyzers indexAnalyzers,
131116
DocumentParser documentParser,
132117
Mapping mapping) {
133118
this.type = mapping.root().name();
134119
this.typeText = new Text(this.type);
135120
this.mapping = mapping;
136-
this.documentMapperParser = documentMapperParser;
137121
this.documentParser = documentParser;
138122
this.indexSettings = indexSettings;
139123
this.indexAnalyzers = indexAnalyzers;
@@ -159,10 +143,6 @@ IndexSettings indexSettings() {
159143
return indexSettings;
160144
}
161145

162-
DocumentMapperParser documentMapperParser() {
163-
return documentMapperParser;
164-
}
165-
166146
IndexAnalyzers indexAnalyzers() {
167147
return indexAnalyzers;
168148
}
@@ -291,7 +271,7 @@ public ObjectMapper findNestedObjectMapper(int nestedDocId, SearchContext sc, Le
291271

292272
public DocumentMapper merge(Mapping mapping, MergeReason reason) {
293273
Mapping merged = this.mapping.merge(mapping, reason);
294-
return new DocumentMapper(this.indexSettings, this.documentMapperParser, this.indexAnalyzers, this.documentParser, merged);
274+
return new DocumentMapper(this.indexSettings, this.indexAnalyzers, this.documentParser, merged);
295275
}
296276

297277
public void validate(IndexSettings settings, boolean checkLimits) {

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

+30-45
Original file line numberDiff line numberDiff line change
@@ -23,64 +23,49 @@
2323
import org.elasticsearch.common.Nullable;
2424
import org.elasticsearch.common.collect.Tuple;
2525
import org.elasticsearch.common.compress.CompressedXContent;
26-
import org.elasticsearch.common.time.DateFormatter;
2726
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
2827
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
2928
import org.elasticsearch.common.xcontent.XContentHelper;
3029
import org.elasticsearch.common.xcontent.XContentParser;
3130
import org.elasticsearch.common.xcontent.XContentType;
3231
import org.elasticsearch.index.IndexSettings;
33-
import org.elasticsearch.index.query.QueryShardContext;
34-
import org.elasticsearch.index.similarity.SimilarityService;
35-
import org.elasticsearch.indices.mapper.MapperRegistry;
36-
import org.elasticsearch.script.ScriptService;
32+
import org.elasticsearch.index.analysis.IndexAnalyzers;
3733

3834
import java.util.HashMap;
3935
import java.util.Iterator;
4036
import java.util.Map;
37+
import java.util.function.Function;
4138
import java.util.function.Supplier;
4239

4340
import static java.util.Collections.unmodifiableMap;
4441

4542
public class DocumentMapperParser {
46-
47-
final MapperService mapperService;
48-
private final NamedXContentRegistry xContentRegistry;
49-
private final SimilarityService similarityService;
50-
private final Supplier<QueryShardContext> queryShardContextSupplier;
43+
private final IndexSettings indexSettings;
44+
private final IndexAnalyzers indexAnalyzers;
45+
private final Function<String, String> documentTypeResolver;
46+
private final DocumentParser documentParser;
47+
private final Function<String, Map<Class<? extends MetadataFieldMapper>, MetadataFieldMapper>> metadataMappersFunction;
48+
private final Supplier<Mapper.TypeParser.ParserContext> parserContextSupplier;
5149
private final RootObjectMapper.TypeParser rootObjectTypeParser = new RootObjectMapper.TypeParser();
52-
private final Version indexVersionCreated;
53-
private final Map<String, Mapper.TypeParser> typeParsers;
5450
private final Map<String, MetadataFieldMapper.TypeParser> rootTypeParsers;
55-
private final ScriptService scriptService;
56-
57-
public DocumentMapperParser(IndexSettings indexSettings,
58-
MapperService mapperService,
59-
NamedXContentRegistry xContentRegistry,
60-
SimilarityService similarityService,
61-
MapperRegistry mapperRegistry,
62-
Supplier<QueryShardContext> queryShardContextSupplier,
63-
ScriptService scriptService) {
64-
this.mapperService = mapperService;
65-
this.xContentRegistry = xContentRegistry;
66-
this.similarityService = similarityService;
67-
this.queryShardContextSupplier = queryShardContextSupplier;
68-
this.scriptService = scriptService;
69-
this.typeParsers = mapperRegistry.getMapperParsers();
70-
this.indexVersionCreated = indexSettings.getIndexVersionCreated();
71-
this.rootTypeParsers = mapperRegistry.getMetadataMapperParsers(indexVersionCreated);
72-
}
73-
74-
public Mapper.TypeParser.ParserContext parserContext() {
75-
return new Mapper.TypeParser.ParserContext(similarityService::getSimilarity, typeParsers::get, indexVersionCreated,
76-
queryShardContextSupplier, null, scriptService, mapperService.getIndexAnalyzers(), mapperService.getIndexSettings(),
77-
mapperService::isIdFieldDataEnabled);
78-
}
51+
private final NamedXContentRegistry xContentRegistry;
7952

80-
public Mapper.TypeParser.ParserContext parserContext(DateFormatter dateFormatter) {
81-
return new Mapper.TypeParser.ParserContext(similarityService::getSimilarity, typeParsers::get, indexVersionCreated,
82-
queryShardContextSupplier, dateFormatter, scriptService, mapperService.getIndexAnalyzers(), mapperService.getIndexSettings(),
83-
mapperService::isIdFieldDataEnabled);
53+
DocumentMapperParser(IndexSettings indexSettings,
54+
IndexAnalyzers indexAnalyzers,
55+
Function<String, String> documentTypeResolver,
56+
DocumentParser documentParser,
57+
Function<String, Map<Class<? extends MetadataFieldMapper>, MetadataFieldMapper>> metadataMappersFunction,
58+
Supplier<Mapper.TypeParser.ParserContext> parserContextSupplier,
59+
Map<String, MetadataFieldMapper.TypeParser> metadataMapperParsers,
60+
NamedXContentRegistry xContentRegistry) {
61+
this.indexSettings = indexSettings;
62+
this.indexAnalyzers = indexAnalyzers;
63+
this.documentTypeResolver = documentTypeResolver;
64+
this.documentParser = documentParser;
65+
this.metadataMappersFunction = metadataMappersFunction;
66+
this.parserContextSupplier = parserContextSupplier;
67+
this.rootTypeParsers = metadataMapperParsers;
68+
this.xContentRegistry = xContentRegistry;
8469
}
8570

8671
public DocumentMapper parse(@Nullable String type, CompressedXContent source) throws MapperParsingException {
@@ -114,11 +99,11 @@ private DocumentMapper parse(String type, Map<String, Object> mapping, String de
11499
}
115100
}
116101

117-
118-
Mapper.TypeParser.ParserContext parserContext = parserContext();
102+
Mapper.TypeParser.ParserContext parserContext = parserContextSupplier.get();
119103
// parse RootObjectMapper
120-
DocumentMapper.Builder docBuilder = new DocumentMapper.Builder(
121-
(RootObjectMapper.Builder) rootObjectTypeParser.parse(type, mapping, parserContext), mapperService);
104+
RootObjectMapper.Builder root = (RootObjectMapper.Builder) rootObjectTypeParser.parse(type, mapping, parserContext);
105+
DocumentMapper.Builder docBuilder = new DocumentMapper.Builder(root, indexSettings, indexAnalyzers, documentParser,
106+
metadataMappersFunction);
122107
Iterator<Map.Entry<String, Object>> iterator = mapping.entrySet().iterator();
123108
// parse DocumentMapper
124109
while(iterator.hasNext()) {
@@ -206,7 +191,7 @@ private Tuple<String, Map<String, Object>> extractMapping(String type, Map<Strin
206191

207192
String rootName = root.keySet().iterator().next();
208193
Tuple<String, Map<String, Object>> mapping;
209-
if (type == null || type.equals(rootName) || mapperService.resolveDocumentType(type).equals(rootName)) {
194+
if (type == null || type.equals(rootName) || documentTypeResolver.apply(type).equals(rootName)) {
210195
mapping = new Tuple<>(rootName, (Map<String, Object>) root.get(rootName));
211196
} else {
212197
mapping = new Tuple<>(type, root);

0 commit comments

Comments
 (0)