Skip to content

Commit f09a2b9

Browse files
authored
Remove DocumentMapper#merge method (elastic#69005)
DocumentMapper exposes a merge method that simply calls merge on the inner Mapping object. We have started to migrate away from building the entire document mapper only for merging, as the inner Mapping object is enough to do so. This will allow us to further simplify and isolate our merging code so that it may not even require a MapperService instance. With this commit, we remove the DocumentMapper#merge method in favour of calling Mapping#merge instead.
1 parent f22adc4 commit f09a2b9

File tree

4 files changed

+28
-32
lines changed

4 files changed

+28
-32
lines changed

server/src/main/java/org/elasticsearch/cluster/metadata/MetadataMappingService.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.index.mapper.DocumentMapper;
3131
import org.elasticsearch.index.mapper.MapperService;
3232
import org.elasticsearch.index.mapper.MapperService.MergeReason;
33+
import org.elasticsearch.index.mapper.Mapping;
3334
import org.elasticsearch.indices.IndicesService;
3435

3536
import java.io.IOException;
@@ -103,12 +104,9 @@ private ClusterState applyRequest(ClusterState currentState, PutMappingClusterSt
103104
// we used for the validation, it makes this mechanism little less scary (a little)
104105
updateList.add(indexMetadata);
105106
// try and parse it (no need to add it here) so we can bail early in case of parsing exception
106-
DocumentMapper existingMapper = mapperService.documentMapper();
107-
DocumentMapper newMapper = mapperService.parse(MapperService.SINGLE_MAPPING_NAME, mappingUpdateSource);
108-
if (existingMapper != null) {
109-
// first, simulate: just call merge and ignore the result
110-
existingMapper.merge(newMapper.mapping(), MergeReason.MAPPING_UPDATE);
111-
}
107+
// first, simulate: just call merge and ignore the result
108+
Mapping mapping = mapperService.parseMapping(MapperService.SINGLE_MAPPING_NAME, mappingUpdateSource);
109+
MapperService.mergeMappings(mapperService.documentMapper(), mapping, MergeReason.MAPPING_UPDATE);
112110
}
113111
Metadata.Builder builder = Metadata.builder(metadata);
114112
boolean updated = false;

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.elasticsearch.common.xcontent.XContentType;
1818
import org.elasticsearch.index.IndexSettings;
1919
import org.elasticsearch.index.analysis.IndexAnalyzers;
20-
import org.elasticsearch.index.mapper.MapperService.MergeReason;
2120

2221
import java.util.Arrays;
2322
import java.util.Collection;
@@ -132,11 +131,6 @@ public ParsedDocument createNoopTombstoneDoc(String index, String reason) throws
132131
return parsedDoc;
133132
}
134133

135-
public DocumentMapper merge(Mapping mapping, MergeReason reason) {
136-
Mapping merged = this.mapping().merge(mapping, reason);
137-
return new DocumentMapper(mappingLookup.getIndexSettings(), mappingLookup.getIndexAnalyzers(), documentParser, merged);
138-
}
139-
140134
public void validate(IndexSettings settings, boolean checkLimits) {
141135
this.mapping().validate(this.mappingLookup);
142136
if (settings.getIndexMetadata().isRoutingPartitionedIndex()) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public void updateMapping(final IndexMetadata currentIndexMetadata, final IndexM
182182
if (newMappingMetadata != null) {
183183
String type = newMappingMetadata.type();
184184
CompressedXContent incomingMappingSource = newMappingMetadata.source();
185-
Mapping incomingMapping = parseMappings(type, incomingMappingSource);
185+
Mapping incomingMapping = parseMapping(type, incomingMappingSource);
186186
DocumentMapper previousMapper;
187187
synchronized (this) {
188188
previousMapper = this.mapper;
@@ -277,7 +277,7 @@ public DocumentMapper merge(String type, CompressedXContent mappingSource, Merge
277277
}
278278

279279
private synchronized DocumentMapper mergeAndApplyMappings(String mappingType, CompressedXContent mappingSource, MergeReason reason) {
280-
Mapping incomingMapping = parseMappings(mappingType, mappingSource);
280+
Mapping incomingMapping = parseMapping(mappingType, mappingSource);
281281
Mapping mapping = mergeMappings(this.mapper, incomingMapping, reason);
282282
DocumentMapper newMapper = newDocumentMapper(mapping, reason);
283283
if (reason == MergeReason.MAPPING_UPDATE_PREFLIGHT) {
@@ -295,15 +295,15 @@ private DocumentMapper newDocumentMapper(Mapping mapping, MergeReason reason) {
295295
return newMapper;
296296
}
297297

298-
private Mapping parseMappings(String mappingType, CompressedXContent mappingSource) {
298+
public Mapping parseMapping(String mappingType, CompressedXContent mappingSource) {
299299
try {
300300
return mappingParser.parse(mappingType, mappingSource);
301301
} catch (Exception e) {
302302
throw new MapperParsingException("Failed to parse mapping: {}", e, e.getMessage());
303303
}
304304
}
305305

306-
private static Mapping mergeMappings(DocumentMapper currentMapper, Mapping incomingMapping, MergeReason reason) {
306+
public static Mapping mergeMappings(DocumentMapper currentMapper, Mapping incomingMapping, MergeReason reason) {
307307
Mapping newMapping;
308308
if (currentMapper == null) {
309309
newMapping = incomingMapping;

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

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import org.apache.lucene.analysis.core.KeywordAnalyzer;
1313
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
1414
import org.apache.lucene.analysis.standard.StandardAnalyzer;
15+
import org.elasticsearch.Version;
1516
import org.elasticsearch.common.compress.CompressedXContent;
17+
import org.elasticsearch.common.settings.Settings;
1618
import org.elasticsearch.index.IndexSettings;
1719
import org.elasticsearch.index.analysis.AnalyzerScope;
1820
import org.elasticsearch.index.analysis.IndexAnalyzers;
@@ -49,15 +51,17 @@ public void testAddFields() throws Exception {
4951
}));
5052

5153
MergeReason reason = randomFrom(MergeReason.MAPPING_UPDATE, MergeReason.INDEX_TEMPLATE);
52-
DocumentMapper merged = stage1.merge(stage2.mapping(), reason);
53-
54+
Mapping merged = MapperService.mergeMappings(stage1, stage2.mapping(), reason);
5455
// stage1 mapping should not have been modified
5556
assertThat(stage1.mappers().getMapper("age"), nullValue());
5657
assertThat(stage1.mappers().getMapper("obj1.prop1"), nullValue());
5758
// but merged should
58-
assertThat(merged.mappers().getMapper("age"), notNullValue());
59-
assertThat(merged.mappers().getMapper("obj1.prop1"), notNullValue());
60-
}
59+
IndexSettings indexSettings = createIndexSettings(Version.CURRENT, Settings.EMPTY);
60+
IndexAnalyzers indexAnalyzers = createIndexAnalyzers(indexSettings);
61+
DocumentMapper mergedMapper = new DocumentMapper(indexSettings, indexAnalyzers, null, merged);
62+
assertThat(mergedMapper.mappers().getMapper("age"), notNullValue());
63+
assertThat(mergedMapper.mappers().getMapper("obj1.prop1"), notNullValue());
64+
}
6165

6266
public void testMergeObjectDynamic() throws Exception {
6367
DocumentMapper mapper = createDocumentMapper(mapping(b -> { }));
@@ -66,7 +70,7 @@ public void testMergeObjectDynamic() throws Exception {
6670
DocumentMapper withDynamicMapper = createDocumentMapper(topMapping(b -> b.field("dynamic", "false")));
6771
assertThat(withDynamicMapper.root().dynamic(), equalTo(ObjectMapper.Dynamic.FALSE));
6872

69-
DocumentMapper merged = mapper.merge(withDynamicMapper.mapping(), MergeReason.MAPPING_UPDATE);
73+
Mapping merged = MapperService.mergeMappings(mapper, withDynamicMapper.mapping(), MergeReason.MAPPING_UPDATE);
7074
assertThat(merged.root().dynamic(), equalTo(ObjectMapper.Dynamic.FALSE));
7175
}
7276

@@ -77,12 +81,12 @@ public void testMergeObjectAndNested() throws Exception {
7781

7882
{
7983
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
80-
() -> objectMapper.merge(nestedMapper.mapping(), reason));
84+
() -> MapperService.mergeMappings(objectMapper, nestedMapper.mapping(), reason));
8185
assertThat(e.getMessage(), containsString("cannot change object mapping from non-nested to nested"));
8286
}
8387
{
8488
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
85-
() -> nestedMapper.merge(objectMapper.mapping(), reason));
89+
() -> MapperService.mergeMappings(nestedMapper, objectMapper.mapping(), reason));
8690
assertThat(e.getMessage(), containsString("cannot change object mapping from nested to non-nested"));
8791
}
8892
}
@@ -220,13 +224,13 @@ public void testMergeMeta() throws IOException {
220224

221225
DocumentMapper updatedMapper = createDocumentMapper(fieldMapping(b -> b.field("type", "text")));
222226

223-
DocumentMapper mergedMapper = initMapper.merge(updatedMapper.mapping(), MergeReason.MAPPING_UPDATE);
224-
assertThat(mergedMapper.meta().get("foo"), equalTo("bar"));
227+
Mapping merged = MapperService.mergeMappings(initMapper, updatedMapper.mapping(), MergeReason.MAPPING_UPDATE);
228+
assertThat(merged.meta.get("foo"), equalTo("bar"));
225229

226230
updatedMapper
227231
= createDocumentMapper(topMapping(b -> b.startObject("_meta").field("foo", "new_bar").endObject()));
228-
mergedMapper = initMapper.merge(updatedMapper.mapping(), MergeReason.MAPPING_UPDATE);
229-
assertThat(mergedMapper.meta().get("foo"), equalTo("new_bar"));
232+
merged = MapperService.mergeMappings(initMapper, updatedMapper.mapping(), MergeReason.MAPPING_UPDATE);
233+
assertThat(merged.meta.get("foo"), equalTo("new_bar"));
230234
}
231235

232236
public void testMergeMetaForIndexTemplate() throws IOException {
@@ -249,8 +253,8 @@ public void testMergeMetaForIndexTemplate() throws IOException {
249253
assertThat(initMapper.meta(), equalTo(expected));
250254

251255
DocumentMapper updatedMapper = createDocumentMapper(fieldMapping(b -> b.field("type", "text")));
252-
DocumentMapper mergedMapper = initMapper.merge(updatedMapper.mapping(), MergeReason.INDEX_TEMPLATE);
253-
assertThat(mergedMapper.meta(), equalTo(expected));
256+
Mapping merged = MapperService.mergeMappings(initMapper, updatedMapper.mapping(), MergeReason.INDEX_TEMPLATE);
257+
assertThat(merged.meta, equalTo(expected));
254258

255259
updatedMapper = createDocumentMapper(topMapping(b -> {
256260
b.startObject("_meta");
@@ -265,10 +269,10 @@ public void testMergeMetaForIndexTemplate() throws IOException {
265269
}
266270
b.endObject();
267271
}));
268-
mergedMapper = mergedMapper.merge(updatedMapper.mapping(), MergeReason.INDEX_TEMPLATE);
272+
merged = merged.merge(updatedMapper.mapping(), MergeReason.INDEX_TEMPLATE);
269273

270274
expected = Map.of("field", "value",
271275
"object", Map.of("field1", "value1", "field2", "new_value", "field3", "value3"));
272-
assertThat(mergedMapper.meta(), equalTo(expected));
276+
assertThat(merged.meta, equalTo(expected));
273277
}
274278
}

0 commit comments

Comments
 (0)