diff --git a/rest-api-spec/build.gradle b/rest-api-spec/build.gradle index 53d74f8264b3a..bdc0830c54bfd 100644 --- a/rest-api-spec/build.gradle +++ b/rest-api-spec/build.gradle @@ -104,7 +104,6 @@ tasks.named("yamlRestCompatTest").configure { 'mtermvectors/11_basic_with_types/Basic tests for multi termvector get', 'mtermvectors/21_deprecated_with_types/Deprecated camel case and _ parameters should fail in Term Vectors query', 'mtermvectors/30_mix_typeless_typeful/mtermvectors without types on an index that has types', - 'search/10_source_filtering/docvalue_fields with default format', //use_field_mapping change 'search/150_rewrite_on_coordinator/Ensure that we fetch the document only once', //terms_lookup 'search/171_terms_query_with_types/Terms Query with No.of terms exceeding index.max_terms_count should FAIL', //bulk 'search/260_parameter_validation/test size=-1 is deprecated', //size=-1 change diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/FieldAndFormat.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/FieldAndFormat.java index d9f2489ef7815..6f5550c010096 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/FieldAndFormat.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/FieldAndFormat.java @@ -9,25 +9,35 @@ package org.elasticsearch.search.fetch.subphase; import org.elasticsearch.Version; -import org.elasticsearch.core.Nullable; -import org.elasticsearch.common.xcontent.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.common.logging.DeprecationLogger; import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ParseField; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.core.CheckedFunction; +import org.elasticsearch.core.Nullable; +import org.elasticsearch.core.RestApiVersion; import java.io.IOException; import java.util.Objects; +import static org.elasticsearch.core.RestApiVersion.equalTo; +import static org.elasticsearch.core.RestApiVersion.onOrAfter; + /** * Wrapper around a field name and the format that should be used to * display values of this field. */ public final class FieldAndFormat implements Writeable, ToXContentObject { + private static final String USE_DEFAULT_FORMAT = "use_field_mapping"; + private static final DeprecationLogger DEPRECATION_LOGGER = DeprecationLogger.getLogger(FetchDocValuesPhase.class); + private static final ParseField FIELD_FIELD = new ParseField("field"); private static final ParseField FORMAT_FIELD = new ParseField("format"); private static final ParseField INCLUDE_UNMAPPED_FIELD = new ParseField("include_unmapped"); @@ -38,10 +48,33 @@ public final class FieldAndFormat implements Writeable, ToXContentObject { static { PARSER.declareString(ConstructingObjectParser.constructorArg(), FIELD_FIELD); - PARSER.declareStringOrNull(ConstructingObjectParser.optionalConstructorArg(), FORMAT_FIELD); + PARSER.declareStringOrNull(ConstructingObjectParser.optionalConstructorArg(), + FORMAT_FIELD.forRestApiVersion(onOrAfter(RestApiVersion.V_8))); + PARSER.declareField(ConstructingObjectParser.optionalConstructorArg(), + ignoreUseFieldMappingStringParser(), + FORMAT_FIELD.forRestApiVersion(equalTo(RestApiVersion.V_7)), + ObjectParser.ValueType.STRING_OR_NULL); PARSER.declareBoolean(ConstructingObjectParser.optionalConstructorArg(), INCLUDE_UNMAPPED_FIELD); } + private static CheckedFunction ignoreUseFieldMappingStringParser() { + return (p) -> { + if (p.currentToken() == XContentParser.Token.VALUE_NULL) { + return null; + } else { + String text = p.text(); + if (text.equals(USE_DEFAULT_FORMAT)) { + DEPRECATION_LOGGER.compatibleApiWarning("explicit_default_format", + "[" + USE_DEFAULT_FORMAT + "] is a special format that was only used to " + + "ease the transition to 7.x. It has become the default and shouldn't be set explicitly anymore."); + return null; + } else { + return text; + } + } + }; + } + /** * Parse a {@link FieldAndFormat} from some {@link XContent}. */