Skip to content

Commit

Permalink
Mapping: Allow to update/merge the dynamic flag
Browse files Browse the repository at this point in the history
Allow to update / merge in the dynamic flag on object or the root object mapper, meaning that it can be changed dynamically using the update mapping API.
closes elastic#3384
  • Loading branch information
kimchy committed Jul 24, 2013
1 parent bf7ff3b commit c53a66e
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 17 deletions.
Expand Up @@ -61,7 +61,7 @@ public class ObjectMapper implements Mapper, AllFieldMapper.IncludeInAll {
public static class Defaults {
public static final boolean ENABLED = true;
public static final Nested NESTED = Nested.NO;
public static final Dynamic DYNAMIC = null; // not set, inherited from father
public static final Dynamic DYNAMIC = null; // not set, inherited from root
public static final ContentPath.Type PATH_TYPE = ContentPath.Type.FULL;
}

Expand Down Expand Up @@ -286,7 +286,7 @@ protected void processField(Builder builder, String fieldName, Object fieldNode)

private final Filter nestedTypeFilter;

private final Dynamic dynamic;
private volatile Dynamic dynamic;

private final ContentPath.Type pathType;

Expand Down Expand Up @@ -389,7 +389,7 @@ public String nestedTypePathAsString() {
}

public final Dynamic dynamic() {
return this.dynamic;
return this.dynamic == null ? Dynamic.TRUE : this.dynamic;
}

protected boolean allowValue() {
Expand Down Expand Up @@ -800,6 +800,12 @@ public void merge(final Mapper mergeWith, final MergeContext mergeContext) throw
}
}

if (!mergeContext.mergeFlags().simulate()) {
if (mergeWithObject.dynamic != null) {
this.dynamic = mergeWithObject.dynamic;
}
}

doMerge(mergeWithObject, mergeContext);

List<Mapper> mappersToTraverse = new ArrayList<Mapper>();
Expand Down Expand Up @@ -866,16 +872,8 @@ public void toXContent(XContentBuilder builder, Params params, ToXContent custom
} else if (mappers.isEmpty()) { // only write the object content type if there are no properties, otherwise, it is automatically detected
builder.field("type", CONTENT_TYPE);
}
// grr, ugly! on root, dynamic defaults to TRUE, on children, it defaults to null to
// inherit the root behavior
if (this instanceof RootObjectMapper) {
if (dynamic != Dynamic.TRUE) {
builder.field("dynamic", dynamic.name().toLowerCase(Locale.ROOT));
}
} else {
if (dynamic != Defaults.DYNAMIC) {
builder.field("dynamic", dynamic.name().toLowerCase(Locale.ROOT));
}
if (dynamic != null) {
builder.field("dynamic", dynamic.name().toLowerCase(Locale.ROOT));
}
if (enabled != Defaults.ENABLED) {
builder.field("enabled", enabled);
Expand Down
Expand Up @@ -109,10 +109,6 @@ protected ObjectMapper createMapper(String name, String fullPath, boolean enable
} else {
dates = dynamicDateTimeFormatters.toArray(new FormatDateTimeFormatter[dynamicDateTimeFormatters.size()]);
}
// root dynamic must not be null, since its the default
if (dynamic == null) {
dynamic = Dynamic.TRUE;
}
return new RootObjectMapper(name, enabled, dynamic, pathType, mappers,
dates,
dynamicTemplates.toArray(new DynamicTemplate[dynamicTemplates.size()]),
Expand Down
Expand Up @@ -22,6 +22,7 @@
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.mapper.DocumentMapper;
import org.elasticsearch.index.mapper.object.ObjectMapper;
import org.elasticsearch.test.unit.index.mapper.MapperTestUtils;
import org.junit.Test;

Expand Down Expand Up @@ -62,6 +63,20 @@ public void test1Merge() throws Exception {
assertThat(stage1.mappers().smartName("obj1.prop1"), notNullValue());
}

@Test
public void testMergeObjectDynamic() throws Exception {
String objectMapping = XContentFactory.jsonBuilder().startObject().startObject("type1").endObject().endObject().string();
DocumentMapper mapper = MapperTestUtils.newParser().parse(objectMapping);
assertThat(mapper.root().dynamic(), equalTo(ObjectMapper.Dynamic.TRUE));

String withDynamicMapping = XContentFactory.jsonBuilder().startObject().startObject("type1").field("dynamic", "false").endObject().endObject().string();
DocumentMapper withDynamicMapper = MapperTestUtils.newParser().parse(withDynamicMapping);
assertThat(withDynamicMapper.root().dynamic(), equalTo(ObjectMapper.Dynamic.FALSE));

DocumentMapper.MergeResult mergeResult = mapper.merge(withDynamicMapper, mergeFlags().simulate(false));
assertThat(mergeResult.hasConflicts(), equalTo(false));
assertThat(mapper.root().dynamic(), equalTo(ObjectMapper.Dynamic.FALSE));
}

@Test
public void testMergeObjectAndNested() throws Exception {
Expand Down

0 comments on commit c53a66e

Please sign in to comment.