Skip to content

Commit cfbc24a

Browse files
authored
Small simplifications to mapping validation. (#39777)
These simplifications to `MapperMergeValidator` are possible now that there is always a single mapping definition. * Remove the type argument in `validateMapperStructure`. * Remove unnecessary checks against existing mappers.
1 parent 623170c commit cfbc24a

File tree

6 files changed

+14
-63
lines changed

6 files changed

+14
-63
lines changed

modules/parent-join/src/test/java/org/elasticsearch/join/mapper/ParentJoinFieldMapperTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ public void testMultipleJoinFields() throws Exception {
400400
.endObject());
401401
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> indexService.mapperService().merge("type",
402402
new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE));
403-
assertThat(exc.getMessage(), containsString("Field [_parent_join] is defined twice in [type]"));
403+
assertThat(exc.getMessage(), containsString("Field [_parent_join] is defined twice."));
404404
}
405405

406406
{
@@ -426,7 +426,7 @@ public void testMultipleJoinFields() throws Exception {
426426
.endObject());
427427
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> indexService.mapperService().merge("type",
428428
new CompressedXContent(updateMapping), MapperService.MergeReason.MAPPING_UPDATE));
429-
assertThat(exc.getMessage(), containsString("Field [_parent_join] is defined twice in [type]"));
429+
assertThat(exc.getMessage(), containsString("Field [_parent_join] is defined twice."));
430430
}
431431
}
432432

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

Lines changed: 5 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -37,37 +37,18 @@ class MapperMergeValidator {
3737
* duplicate fields are present, and if the provided fields have already been
3838
* defined with a different data type.
3939
*
40-
* @param type The mapping type, for use in error messages.
4140
* @param objectMappers The newly added object mappers.
4241
* @param fieldMappers The newly added field mappers.
4342
* @param fieldAliasMappers The newly added field alias mappers.
44-
* @param fullPathObjectMappers All object mappers, indexed by their full path.
45-
* @param fieldTypes All field and field alias mappers, collected into a lookup structure.
4643
*/
47-
public static void validateMapperStructure(String type,
48-
Collection<ObjectMapper> objectMappers,
44+
public static void validateMapperStructure(Collection<ObjectMapper> objectMappers,
4945
Collection<FieldMapper> fieldMappers,
50-
Collection<FieldAliasMapper> fieldAliasMappers,
51-
Map<String, ObjectMapper> fullPathObjectMappers,
52-
FieldTypeLookup fieldTypes) {
53-
checkFieldUniqueness(type, objectMappers, fieldMappers,
54-
fieldAliasMappers, fullPathObjectMappers, fieldTypes);
55-
checkObjectsCompatibility(objectMappers, fullPathObjectMappers);
56-
}
57-
58-
private static void checkFieldUniqueness(String type,
59-
Collection<ObjectMapper> objectMappers,
60-
Collection<FieldMapper> fieldMappers,
61-
Collection<FieldAliasMapper> fieldAliasMappers,
62-
Map<String, ObjectMapper> fullPathObjectMappers,
63-
FieldTypeLookup fieldTypes) {
64-
65-
// first check within mapping
46+
Collection<FieldAliasMapper> fieldAliasMappers) {
6647
Set<String> objectFullNames = new HashSet<>();
6748
for (ObjectMapper objectMapper : objectMappers) {
6849
String fullPath = objectMapper.fullPath();
6950
if (objectFullNames.add(fullPath) == false) {
70-
throw new IllegalArgumentException("Object mapper [" + fullPath + "] is defined twice in mapping for type [" + type + "]");
51+
throw new IllegalArgumentException("Object mapper [" + fullPath + "] is defined twice.");
7152
}
7253
}
7354

@@ -76,38 +57,11 @@ private static void checkFieldUniqueness(String type,
7657
.forEach(mapper -> {
7758
String name = mapper.name();
7859
if (objectFullNames.contains(name)) {
79-
throw new IllegalArgumentException("Field [" + name + "] is defined both as an object and a field in [" + type + "]");
60+
throw new IllegalArgumentException("Field [" + name + "] is defined both as an object and a field.");
8061
} else if (fieldNames.add(name) == false) {
81-
throw new IllegalArgumentException("Field [" + name + "] is defined twice in [" + type + "]");
62+
throw new IllegalArgumentException("Field [" + name + "] is defined twice.");
8263
}
8364
});
84-
85-
// then check other types
86-
for (String fieldName : fieldNames) {
87-
if (fullPathObjectMappers.containsKey(fieldName)) {
88-
throw new IllegalArgumentException("[" + fieldName + "] is defined as a field in mapping [" + type
89-
+ "] but this name is already used for an object in other types");
90-
}
91-
}
92-
93-
for (String objectPath : objectFullNames) {
94-
if (fieldTypes.get(objectPath) != null) {
95-
throw new IllegalArgumentException("[" + objectPath + "] is defined as an object in mapping [" + type
96-
+ "] but this name is already used for a field in other types");
97-
}
98-
}
99-
}
100-
101-
private static void checkObjectsCompatibility(Collection<ObjectMapper> objectMappers,
102-
Map<String, ObjectMapper> fullPathObjectMappers) {
103-
for (ObjectMapper newObjectMapper : objectMappers) {
104-
ObjectMapper existingObjectMapper = fullPathObjectMappers.get(newObjectMapper.fullPath());
105-
if (existingObjectMapper != null) {
106-
// simulate a merge and ignore the result, we are just interested
107-
// in exceptions here
108-
existingObjectMapper.merge(newObjectMapper);
109-
}
110-
}
11165
}
11266

11367
/**

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,8 +471,7 @@ private synchronized Map<String, DocumentMapper> internalMerge(@Nullable Documen
471471
Collections.addAll(fieldMappers, metadataMappers);
472472
MapperUtils.collect(newMapper.mapping().root(), objectMappers, fieldMappers, fieldAliasMappers);
473473

474-
MapperMergeValidator.validateMapperStructure(newMapper.type(), objectMappers, fieldMappers,
475-
fieldAliasMappers, fullPathObjectMappers, fieldTypes);
474+
MapperMergeValidator.validateMapperStructure(objectMappers, fieldMappers, fieldAliasMappers);
476475
checkPartitionedIndexConstraints(newMapper);
477476

478477
// update lookup data-structures

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,11 @@ public void testDuplicateFieldAliasAndObject() {
3636
FieldAliasMapper aliasMapper = new FieldAliasMapper("path", "some.path", "field");
3737

3838
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () ->
39-
MapperMergeValidator.validateMapperStructure("type",
39+
MapperMergeValidator.validateMapperStructure(
4040
singletonList(objectMapper),
4141
emptyList(),
42-
singletonList(aliasMapper),
43-
emptyMap(),
44-
new FieldTypeLookup()));
45-
assertEquals("Field [some.path] is defined both as an object and a field in [type]", e.getMessage());
42+
singletonList(aliasMapper)));
43+
assertEquals("Field [some.path] is defined both as an object and a field.", e.getMessage());
4644
}
4745

4846
public void testFieldAliasWithNestedScope() {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ public void testIndexPrefixMapping() throws IOException {
880880

881881
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () ->
882882
indexService.mapperService().merge("type", new CompressedXContent(illegalMapping), MergeReason.MAPPING_UPDATE));
883-
assertThat(e.getMessage(), containsString("Field [field._index_prefix] is defined twice in [type]"));
883+
assertThat(e.getMessage(), containsString("Field [field._index_prefix] is defined twice."));
884884

885885
}
886886

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,14 @@ public void testReuseMetaField() throws IOException {
151151
mapperService.merge("type", new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE);
152152
fail();
153153
} catch (IllegalArgumentException e) {
154-
assertTrue(e.getMessage().contains("Field [_id] is defined twice in [type]"));
154+
assertTrue(e.getMessage().contains("Field [_id] is defined twice."));
155155
}
156156

157157
try {
158158
mapperService.merge("type", new CompressedXContent(Strings.toString(mapping)), MapperService.MergeReason.MAPPING_UPDATE);
159159
fail();
160160
} catch (IllegalArgumentException e) {
161-
assertTrue(e.getMessage().contains("Field [_id] is defined twice in [type]"));
161+
assertTrue(e.getMessage().contains("Field [_id] is defined twice."));
162162
}
163163
}
164164

0 commit comments

Comments
 (0)