From d40037c91e9487f1b8ccd7f2957c4b489b8f43cf Mon Sep 17 00:00:00 2001 From: Mayya Sharipova Date: Wed, 12 Dec 2018 21:21:53 -0500 Subject: [PATCH] Deprecate uses of _type as a field name in queries (#36503) --- .../documentation/CRUDDocumentationIT.java | 7 +++--- .../high-level/document/reindex.asciidoc | 7 +++--- .../upgrades/FullClusterRestartIT.java | 4 +++- .../index/mapper/TypeFieldMapper.java | 10 ++++---- .../index/query/TypeQueryBuilder.java | 3 ++- .../index/mapper/TypeFieldTypeTests.java | 23 +++++++++++++++++++ .../index/query/TypeQueryBuilderTests.java | 4 ++-- 7 files changed, 42 insertions(+), 16 deletions(-) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java index ca15b20b163e4..2495cec7ce871 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/CRUDDocumentationIT.java @@ -823,10 +823,9 @@ public void testReindex() throws Exception { // tag::reindex-request-conflicts request.setConflicts("proceed"); // <1> // end::reindex-request-conflicts - // tag::reindex-request-typeOrQuery - request.setSourceDocTypes("_doc"); // <1> - request.setSourceQuery(new TermQueryBuilder("user", "kimchy")); // <2> - // end::reindex-request-typeOrQuery + // tag::reindex-request-query + request.setSourceQuery(new TermQueryBuilder("user", "kimchy")); // <1> + // end::reindex-request-query // tag::reindex-request-size request.setSize(10); // <1> // end::reindex-request-size diff --git a/docs/java-rest/high-level/document/reindex.asciidoc b/docs/java-rest/high-level/document/reindex.asciidoc index 7d8876aa1269a..d78851f3d6a86 100644 --- a/docs/java-rest/high-level/document/reindex.asciidoc +++ b/docs/java-rest/high-level/document/reindex.asciidoc @@ -57,14 +57,13 @@ include-tagged::{doc-tests-file}[{api}-request-conflicts] -------------------------------------------------- <1> Set `proceed` on version conflict -You can limit the documents by adding a type to the source or by adding a query. +You can limit the documents by adding a query. ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests-file}[{api}-request-typeOrQuery] +include-tagged::{doc-tests-file}[{api}-request-query] -------------------------------------------------- -<1> Only copy `doc` type -<2> Only copy documents which have field `user` set to `kimchy` +<1> Only copy documents which have field `user` set to `kimchy` It’s also possible to limit the number of processed documents by setting size. diff --git a/qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/FullClusterRestartIT.java b/qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/FullClusterRestartIT.java index 6d226531d7538..955cf35afac97 100644 --- a/qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/FullClusterRestartIT.java +++ b/qa/full-cluster-restart/src/test/java/org/elasticsearch/upgrades/FullClusterRestartIT.java @@ -25,6 +25,7 @@ import org.elasticsearch.client.Response; import org.elasticsearch.client.ResponseException; import org.elasticsearch.client.RestClient; +import org.elasticsearch.index.mapper.TypeFieldMapper; import org.elasticsearch.rest.action.document.RestGetAction; import org.elasticsearch.rest.action.search.RestExplainAction; import org.elasticsearch.cluster.metadata.IndexMetaData; @@ -572,7 +573,8 @@ void assertAllSearchWorks(int count) throws IOException { Request explainRequest = new Request("GET", "/" + index + "/" + type + "/" + id + "/_explain"); explainRequest.setJsonEntity("{ \"query\": { \"match_all\" : {} }}"); - explainRequest.setOptions(expectWarnings(RestExplainAction.TYPES_DEPRECATION_MESSAGE)); + explainRequest.setOptions( + expectWarnings(RestExplainAction.TYPES_DEPRECATION_MESSAGE, TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE)); String explanation = toStr(client().performRequest(explainRequest)); assertFalse("Could not find payload boost in explanation\n" + explanation, explanation.contains("payloadBoost")); diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TypeFieldMapper.java b/server/src/main/java/org/elasticsearch/index/mapper/TypeFieldMapper.java index 03bd9f64ca4a1..442a816be5c6b 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TypeFieldMapper.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TypeFieldMapper.java @@ -90,9 +90,11 @@ public MetadataFieldMapper getDefault(MappedFieldType fieldType, ParserContext c } } - static final class TypeFieldType extends StringFieldType { + public static final class TypeFieldType extends StringFieldType { private static final DeprecationLogger deprecationLogger = new DeprecationLogger(LogManager.getLogger(TypeFieldType.class)); + public static final String TYPES_DEPRECATION_MESSAGE = + "[types removal] Referring to types within search queries is deprecated, filter on a field instead."; TypeFieldType() { } @@ -124,6 +126,7 @@ public boolean isSearchable() { @Override public Query existsQuery(QueryShardContext context) { + deprecationLogger.deprecatedAndMaybeLog("exists_query_with_type_field", TYPES_DEPRECATION_MESSAGE); return new MatchAllDocsQuery(); } @@ -134,6 +137,7 @@ public Query termQuery(Object value, QueryShardContext context) { @Override public Query termsQuery(List values, QueryShardContext context) { + deprecationLogger.deprecatedAndMaybeLog("term_query_with_type_field", TYPES_DEPRECATION_MESSAGE); DocumentMapper mapper = context.getMapperService().documentMapper(); if (mapper == null) { return new MatchNoDocsQuery("No types"); @@ -155,9 +159,7 @@ public Query termsQuery(List values, QueryShardContext context) { @Override public Query rangeQuery(Object lowerTerm, Object upperTerm, boolean includeLower, boolean includeUpper, QueryShardContext context) { - deprecationLogger.deprecatedAndMaybeLog("range_single_type", - "Running [range] query on [_type] field for an index with a single type." - + " As types are deprecated, this functionality will be removed in future releases."); + deprecationLogger.deprecatedAndMaybeLog("range_query_with_type_field", TYPES_DEPRECATION_MESSAGE); Query result = new MatchAllDocsQuery(); String type = context.getMapperService().documentMapper().type(); if (type != null) { diff --git a/server/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java b/server/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java index 92556782d4eee..260c47a334b30 100644 --- a/server/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java @@ -32,6 +32,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.mapper.DocumentMapper; +import org.elasticsearch.index.mapper.TypeFieldMapper; import java.io.IOException; import java.util.Objects; @@ -127,7 +128,7 @@ public String getWriteableName() { @Override protected Query doToQuery(QueryShardContext context) throws IOException { - deprecationLogger.deprecated("The [type] query is deprecated, filter on a field instead."); + deprecationLogger.deprecatedAndMaybeLog("type_query", TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE); //LUCENE 4 UPGRADE document mapper should use bytesref as well? DocumentMapper documentMapper = context.getMapperService().documentMapper(type); if (documentMapper == null) { diff --git a/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldTypeTests.java b/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldTypeTests.java index 2ff106f855806..d8840b275419b 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldTypeTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldTypeTests.java @@ -81,6 +81,29 @@ public void testTermsQuery() throws Exception { Mockito.when(mapperService.documentMapper()).thenReturn(mapper); query = ft.termQuery("my_type", context); assertEquals(new MatchNoDocsQuery(), query); + assertWarnings(TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE); + } + + public void testExistsQuery() { + QueryShardContext context = Mockito.mock(QueryShardContext.class); + TypeFieldMapper.TypeFieldType ft = new TypeFieldMapper.TypeFieldType(); + ft.setName(TypeFieldMapper.NAME); + ft.existsQuery(context); + assertWarnings(TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE); + } + + public void testRangeQuery() { + QueryShardContext context = Mockito.mock(QueryShardContext.class); + MapperService mapperService = Mockito.mock(MapperService.class); + DocumentMapper mapper = Mockito.mock(DocumentMapper.class); + Mockito.when(context.getMapperService()).thenReturn(mapperService); + Mockito.when(mapperService.documentMapper()).thenReturn(mapper); + Mockito.when(mapper.type()).thenReturn("my_type"); + + TypeFieldMapper.TypeFieldType ft = new TypeFieldMapper.TypeFieldType(); + ft.setName(TypeFieldMapper.NAME); + ft.rangeQuery("type1", "type2", true, true, context); + assertWarnings(TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE); } static DirectoryReader openReaderWithNewType(String type, IndexWriter writer) throws IOException { diff --git a/server/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java index b75319b15c3e6..17c49df366261 100644 --- a/server/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java @@ -75,12 +75,12 @@ public void testFromJson() throws IOException { @Override public void testToQuery() throws IOException { super.testToQuery(); - assertWarnings("The [type] query is deprecated, filter on a field instead."); + assertWarnings(TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE); } @Override public void testMustRewrite() throws IOException { super.testMustRewrite(); - assertWarnings("The [type] query is deprecated, filter on a field instead."); + assertWarnings(TypeFieldMapper.TypeFieldType.TYPES_DEPRECATION_MESSAGE); } }