fixed issue2371 (incorrect behavior of path_match)

This commit is contained in:
Aaron Dixon 2012-10-30 10:38:26 -05:00 committed by Shay Banon
parent 768b8b4d2b
commit bd9a5bfa0c
4 changed files with 25 additions and 4 deletions

View File

@ -520,16 +520,16 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
objectMapper = mappers.get(currentFieldName); objectMapper = mappers.get(currentFieldName);
if (objectMapper == null) { if (objectMapper == null) {
newMapper = true; newMapper = true;
// remove the current field name from path, since template search and the object builder add it as well...
context.path().remove();
Mapper.Builder builder = context.root().findTemplateBuilder(context, currentFieldName, "object"); Mapper.Builder builder = context.root().findTemplateBuilder(context, currentFieldName, "object");
if (builder == null) { if (builder == null) {
builder = MapperBuilders.object(currentFieldName).enabled(true).dynamic(dynamic).pathType(pathType); builder = MapperBuilders.object(currentFieldName).enabled(true).dynamic(dynamic).pathType(pathType);
} }
// remove the current field name from path, since the object builder adds it as well...
context.path().remove();
BuilderContext builderContext = new BuilderContext(context.indexSettings(), context.path()); BuilderContext builderContext = new BuilderContext(context.indexSettings(), context.path());
objectMapper = builder.build(builderContext); objectMapper = builder.build(builderContext);
putMapper(objectMapper); putMapper(objectMapper);
// now re add it // ...now re add it
context.path().add(currentFieldName); context.path().add(currentFieldName);
context.setMappingsModified(); context.setMappingsModified();
} }

View File

@ -22,6 +22,7 @@ package org.elasticsearch.test.unit.index.mapper.dynamictemplate.pathmatch;
import org.apache.lucene.document.Document; import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable; import org.apache.lucene.document.Fieldable;
import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.index.field.data.strings.StringFieldDataType;
import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.DocumentMapper;
import org.elasticsearch.index.mapper.FieldMappers; import org.elasticsearch.index.mapper.FieldMappers;
import org.elasticsearch.test.unit.index.mapper.MapperTests; import org.elasticsearch.test.unit.index.mapper.MapperTests;
@ -31,11 +32,12 @@ import static org.elasticsearch.common.io.Streams.copyToBytesFromClasspath;
import static org.elasticsearch.common.io.Streams.copyToStringFromClasspath; import static org.elasticsearch.common.io.Streams.copyToStringFromClasspath;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.instanceOf;
/** /**
* *
*/ */
public class PathMatchDynamicTempalteTests { public class PathMatchDynamicTemplateTests {
@Test @Test
public void testSimple() throws Exception { public void testSimple() throws Exception {
@ -68,5 +70,11 @@ public class PathMatchDynamicTempalteTests {
fieldMappers = docMapper.mappers().fullName("obj1.obj2.name"); fieldMappers = docMapper.mappers().fullName("obj1.obj2.name");
assertThat(fieldMappers.mappers().size(), equalTo(1)); assertThat(fieldMappers.mappers().size(), equalTo(1));
assertThat(fieldMappers.mapper().stored(), equalTo(false)); assertThat(fieldMappers.mapper().stored(), equalTo(false));
// verify more complex path_match expressions
fieldMappers = docMapper.mappers().fullName("obj3.obj4.prop1");
assertThat(fieldMappers.mappers().size(), equalTo(1));
assertThat(fieldMappers.mapper().fieldDataType(), instanceOf(StringFieldDataType.class));
} }
} }

View File

@ -6,5 +6,10 @@
"obj2":{ "obj2":{
"name":"obj2_level" "name":"obj2_level"
} }
},
"obj3":{
"obj4":{
"prop1":"prop1_value"
}
} }
} }

View File

@ -16,6 +16,14 @@
"store":"yes" "store":"yes"
} }
} }
},
{
"template_3":{
"path_match":"*.obj4.*",
"mapping":{
"type":"string"
}
}
} }
] ]
} }