Merging complex objects / types (geo, objects) can cause failure to lookup field names (without type prefix), closes #1016.

This commit is contained in:
kimchy 2011-06-10 20:00:59 +03:00
parent 3e1e58e394
commit eca244054f
4 changed files with 30 additions and 18 deletions

View File

@ -28,7 +28,6 @@ import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.mapper.*;
import org.elasticsearch.index.mapper.core.AbstractFieldMapper;
import org.elasticsearch.index.mapper.internal.AllFieldMapper;
import org.elasticsearch.index.mapper.multifield.MultiFieldMapper;
@ -556,7 +555,7 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
}
}
@Override public void merge(Mapper mergeWith, MergeContext mergeContext) throws MergeMappingException {
@Override public void merge(final Mapper mergeWith, final MergeContext mergeContext) throws MergeMappingException {
if (!(mergeWith instanceof ObjectMapper)) {
mergeContext.addConflict("Can't merge a non object mapping [" + mergeWith.name() + "] with an object mapping [" + name() + "]");
return;
@ -572,9 +571,11 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
// no mapping, simply add it if not simulating
if (!mergeContext.mergeFlags().simulate()) {
putMapper(mergeWithMapper);
if (mergeWithMapper instanceof AbstractFieldMapper) {
mergeContext.docMapper().addFieldMapper((FieldMapper) mergeWithMapper);
}
mergeWithMapper.traverse(new FieldMapperListener() {
@Override public void fieldMapper(FieldMapper fieldMapper) {
mergeContext.docMapper().addFieldMapper(fieldMapper);
}
});
}
} else {
if ((mergeWithMapper instanceof MultiFieldMapper) && !(mergeIntoMapper instanceof MultiFieldMapper)) {
@ -584,9 +585,11 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
putMapper(mergeWithMultiField);
// now, raise events for all mappers
for (Mapper mapper : mergeWithMultiField.mappers().values()) {
if (mapper instanceof AbstractFieldMapper) {
mergeContext.docMapper().addFieldMapper((FieldMapper) mapper);
}
mapper.traverse(new FieldMapperListener() {
@Override public void fieldMapper(FieldMapper fieldMapper) {
mergeContext.docMapper().addFieldMapper(fieldMapper);
}
});
}
}
} else {

View File

@ -44,11 +44,13 @@ public class Test1MergeMapperTests {
assertThat(mergeResult.hasConflicts(), equalTo(false));
// since we are simulating, we should not have the age mapping
assertThat(stage1.mappers().smartName("age"), nullValue());
assertThat(stage1.mappers().smartName("obj1.prop1"), nullValue());
// now merge, don't simulate
mergeResult = stage1.merge(stage2, mergeFlags().simulate(false));
// there is still merge failures
assertThat(mergeResult.hasConflicts(), equalTo(false));
// but we have the age in
assertThat(stage1.mappers().smartName("age"), notNullValue());
assertThat(stage1.mappers().smartName("obj1.prop1"), notNullValue());
}
}

View File

@ -1,8 +1,8 @@
{
person : {
properties : {
name : {
type : "string"
"person" : {
"properties" : {
"name" : {
"type" : "string"
}
}
}

View File

@ -1,11 +1,18 @@
{
person : {
properties : {
name : {
type : "string"
"person" : {
"properties" : {
"name" : {
"type" : "string"
},
age : {
type : "integer"
"age" : {
"type" : "integer"
},
"obj1" : {
"properties" : {
"prop1" : {
"type" : "string"
}
}
}
}
}