diff --git a/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java b/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java index cfd5df6e28fb3..86df6f572445f 100644 --- a/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java +++ b/src/main/java/org/elasticsearch/index/mapper/internal/AllFieldMapper.java @@ -74,7 +74,7 @@ public interface IncludeInAll extends Mapper { public static class Defaults extends AbstractFieldMapper.Defaults { public static final String NAME = AllFieldMapper.NAME; public static final String INDEX_NAME = AllFieldMapper.NAME; - public static final boolean ENABLED = true; + public static final EnabledAttributeMapper ENABLED = EnabledAttributeMapper.UNSET_ENABLED; public static final FieldType FIELD_TYPE = new FieldType(); @@ -87,7 +87,7 @@ public static class Defaults extends AbstractFieldMapper.Defaults { public static class Builder extends AbstractFieldMapper.Builder { - private boolean enabled = Defaults.ENABLED; + private EnabledAttributeMapper enabled = Defaults.ENABLED; // an internal flag, automatically set if we encounter boosting boolean autoBoost = false; @@ -98,7 +98,7 @@ public Builder() { indexName = Defaults.INDEX_NAME; } - public Builder enabled(boolean enabled) { + public Builder enabled(EnabledAttributeMapper enabled) { this.enabled = enabled; return this; } @@ -125,7 +125,7 @@ public Mapper.Builder parse(String name, Map node, ParserContext String fieldName = Strings.toUnderscoreCase(entry.getKey()); Object fieldNode = entry.getValue(); if (fieldName.equals("enabled")) { - builder.enabled(nodeBooleanValue(fieldNode)); + builder.enabled(nodeBooleanValue(fieldNode) ? EnabledAttributeMapper.ENABLED : EnabledAttributeMapper.DISABLED); } else if (fieldName.equals("auto_boost")) { builder.autoBoost = nodeBooleanValue(fieldNode); } @@ -135,7 +135,7 @@ public Mapper.Builder parse(String name, Map node, ParserContext } - private boolean enabled; + private EnabledAttributeMapper enabledState; // The autoBoost flag is automatically set based on indexed docs on the mappings // if a doc is indexed with a specific boost value and part of _all, it is automatically // set to true. This allows to optimize (automatically, which we like) for the common case @@ -148,7 +148,7 @@ public AllFieldMapper() { } protected AllFieldMapper(String name, FieldType fieldType, NamedAnalyzer indexAnalyzer, NamedAnalyzer searchAnalyzer, - boolean enabled, boolean autoBoost, PostingsFormatProvider postingsProvider, + EnabledAttributeMapper enabled, boolean autoBoost, PostingsFormatProvider postingsProvider, DocValuesFormatProvider docValuesProvider, SimilarityProvider similarity, Loading normsLoading, @Nullable Settings fieldDataSettings, Settings indexSettings) { super(new Names(name, name, name, name), 1.0f, fieldType, null, indexAnalyzer, searchAnalyzer, postingsProvider, docValuesProvider, @@ -156,13 +156,13 @@ protected AllFieldMapper(String name, FieldType fieldType, NamedAnalyzer indexAn if (hasDocValues()) { throw new MapperParsingException("Field [" + names.fullName() + "] is always tokenized and cannot have doc values"); } - this.enabled = enabled; + this.enabledState = enabled; this.autoBoost = autoBoost; } public boolean enabled() { - return this.enabled; + return this.enabledState.enabled; } @Override @@ -212,7 +212,7 @@ public boolean includeInObject() { @Override protected void parseCreateField(ParseContext context, List fields) throws IOException { - if (!enabled) { + if (!enabledState.enabled) { return; } // reset the entries @@ -279,8 +279,8 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws } private void innerToXContent(XContentBuilder builder, boolean includeDefaults) throws IOException { - if (includeDefaults || enabled != Defaults.ENABLED) { - builder.field("enabled", enabled); + if (includeDefaults || enabledState != Defaults.ENABLED) { + builder.field("enabled", enabledState.enabled); } if (includeDefaults || autoBoost != false) { builder.field("auto_boost", autoBoost); @@ -349,7 +349,7 @@ private void innerToXContent(XContentBuilder builder, boolean includeDefaults) t @Override public void merge(Mapper mergeWith, MergeContext mergeContext) throws MergeMappingException { - if (((AllFieldMapper)mergeWith).enabled() != this.enabled()) { + if (((AllFieldMapper)mergeWith).enabled() != this.enabled() && ((AllFieldMapper)mergeWith).enabledState != Defaults.ENABLED) { mergeContext.addConflict("mapper [" + names.fullName() + "] enabled is " + this.enabled() + " now encountering "+ ((AllFieldMapper)mergeWith).enabled()); } super.merge(mergeWith, mergeContext); diff --git a/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingOnClusterTests.java b/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingOnClusterTests.java index f9364f39b059c..1ac22f2e0efb2 100644 --- a/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingOnClusterTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingOnClusterTests.java @@ -30,6 +30,7 @@ import org.junit.Test; import java.io.IOException; +import java.util.HashMap; import java.util.LinkedHashMap; import static org.elasticsearch.common.io.Streams.copyToStringFromClasspath; @@ -70,6 +71,54 @@ public void test_all_conflicts() throws Exception { testConflict(mapping, mappingUpdate, errorMessage); } + + @Test + public void test_all_with_default() throws Exception { + String defaultMapping = jsonBuilder().startObject().startObject("_default_") + .startObject("_all") + .field("enabled", false) + .endObject() + .endObject().endObject().string(); + client().admin().indices().prepareCreate("index").addMapping("_default_", defaultMapping).get(); + String docMapping = jsonBuilder().startObject() + .startObject("doc") + .endObject() + .endObject().string(); + PutMappingResponse response = client().admin().indices().preparePutMapping("index").setType("doc").setSource(docMapping).get(); + assertTrue(response.isAcknowledged()); + String docMappingUpdate = jsonBuilder().startObject().startObject("doc") + .startObject("properties") + .startObject("text") + .field("type", "string") + .endObject() + .endObject() + .endObject() + .endObject().string(); + response = client().admin().indices().preparePutMapping("index").setType("doc").setSource(docMappingUpdate).get(); + assertTrue(response.isAcknowledged()); + String docMappingAllExplicitEnabled = jsonBuilder().startObject() + .startObject("doc_all_enabled") + .startObject("_all") + .field("enabled", true) + .endObject() + .endObject() + .endObject().string(); + response = client().admin().indices().preparePutMapping("index").setType("doc_all_enabled").setSource(docMappingAllExplicitEnabled).get(); + assertTrue(response.isAcknowledged()); + + GetMappingsResponse mapping = client().admin().indices().prepareGetMappings("index").get(); + HashMap props = (HashMap)mapping.getMappings().get("index").get("doc").getSourceAsMap().get("_all"); + assertThat((Boolean)props.get("enabled"), equalTo(false)); + props = (HashMap)mapping.getMappings().get("index").get("doc").getSourceAsMap().get("properties"); + assertNotNull(props); + assertNotNull(props.get("text")); + props = (HashMap)mapping.getMappings().get("index").get("doc_all_enabled").getSourceAsMap().get("_all"); + assertThat((Boolean)props.get("enabled"), equalTo(true)); + props = (HashMap)mapping.getMappings().get("index").get("_default_").getSourceAsMap().get("_all"); + assertThat((Boolean)props.get("enabled"), equalTo(false)); + + } + @Test public void test_doc_valuesInvalidMapping() throws Exception { String mapping = jsonBuilder().startObject().startObject("mappings").startObject(TYPE).startObject("_all").startObject("fielddata").field("format", "doc_values").endObject().endObject().endObject().endObject().endObject().string(); diff --git a/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingTests.java b/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingTests.java index e3a6c210ea403..33a6fdb60a36c 100644 --- a/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingTests.java +++ b/src/test/java/org/elasticsearch/index/mapper/update/UpdateMappingTests.java @@ -64,7 +64,7 @@ public void test_all_disabled_after_default_enabled() throws Exception { public void test_all_enabled_after_enabled() throws Exception { XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("_all").field("enabled", true).endObject().endObject(); XContentBuilder mappingUpdate = XContentFactory.jsonBuilder().startObject().startObject("_all").field("enabled", true).endObject().startObject("properties").startObject("text").field("type", "string").endObject().endObject().endObject(); - XContentBuilder expectedMapping = XContentFactory.jsonBuilder().startObject().startObject("type").startObject("properties").startObject("text").field("type", "string").endObject().endObject().endObject().endObject(); + XContentBuilder expectedMapping = XContentFactory.jsonBuilder().startObject().startObject("type").startObject("_all").field("enabled", true).endObject().startObject("properties").startObject("text").field("type", "string").endObject().endObject().endObject().endObject(); testNoConflictWhileMergingAndMappingChanged(mapping, mappingUpdate, expectedMapping); }