diff --git a/docs/reference/query-dsl/geo-polygon-query.asciidoc b/docs/reference/query-dsl/geo-polygon-query.asciidoc index c35881332113a..88761f59b0bbc 100644 --- a/docs/reference/query-dsl/geo-polygon-query.asciidoc +++ b/docs/reference/query-dsl/geo-polygon-query.asciidoc @@ -4,6 +4,9 @@ Geo-polygon ++++ +deprecated[7.12.0,"Use <> instead, +where polygons are defined in geojson or wkt."] + A query returning hits that only fall within a polygon of points. Here is an example: @@ -31,6 +34,7 @@ GET /_search } } -------------------------------------------------- +// TEST[warning:Deprecated field [geo_polygon] used, replaced by [[geo_shape] query where polygons are defined in geojson or wkt]] [discrete] ==== Query Options @@ -80,6 +84,7 @@ GET /_search } } -------------------------------------------------- +// TEST[warning:Deprecated field [geo_polygon] used, replaced by [[geo_shape] query where polygons are defined in geojson or wkt]] [discrete] ===== Lat Lon as String @@ -110,6 +115,7 @@ GET /_search } } -------------------------------------------------- +// TEST[warning:Deprecated field [geo_polygon] used, replaced by [[geo_shape] query where polygons are defined in geojson or wkt]] [discrete] ===== Geohash @@ -138,6 +144,7 @@ GET /_search } } -------------------------------------------------- +// TEST[warning:Deprecated field [geo_polygon] used, replaced by [[geo_shape] query where polygons are defined in geojson or wkt]] [discrete] ==== geo_point Type diff --git a/server/src/main/java/org/elasticsearch/index/query/GeoPolygonQueryBuilder.java b/server/src/main/java/org/elasticsearch/index/query/GeoPolygonQueryBuilder.java index 55277854fb88b..1a2f970cfb6ab 100644 --- a/server/src/main/java/org/elasticsearch/index/query/GeoPolygonQueryBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/query/GeoPolygonQueryBuilder.java @@ -32,9 +32,16 @@ import java.util.List; import java.util.Objects; +/** + * @deprecated use {@link GeoShapeQueryBuilder} + */ +@Deprecated public class GeoPolygonQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "geo_polygon"; + public static final String GEO_POLYGON_DEPRECATION_MSG = "[" + GeoShapeQueryBuilder.NAME + "] query " + + "where polygons are defined in geojson or wkt"; + /** * The default value for ignore_unmapped. */ @@ -51,6 +58,7 @@ public class GeoPolygonQueryBuilder extends AbstractQueryBuilder points) { if (Strings.isEmpty(fieldName)) { throw new IllegalArgumentException("fieldName must not be null"); diff --git a/server/src/main/java/org/elasticsearch/index/query/QueryBuilders.java b/server/src/main/java/org/elasticsearch/index/query/QueryBuilders.java index 4e4aec4282a4a..59bbb7910838e 100644 --- a/server/src/main/java/org/elasticsearch/index/query/QueryBuilders.java +++ b/server/src/main/java/org/elasticsearch/index/query/QueryBuilders.java @@ -613,7 +613,9 @@ public static GeoBoundingBoxQueryBuilder geoBoundingBoxQuery(String name) { * A filter to filter based on a polygon defined by a set of locations / points. * * @param name The location field name. + * @deprecated use {@link #geoIntersectionQuery(String, Geometry)} instead */ + @Deprecated public static GeoPolygonQueryBuilder geoPolygonQuery(String name, List points) { return new GeoPolygonQueryBuilder(name, points); } diff --git a/server/src/main/java/org/elasticsearch/search/SearchModule.java b/server/src/main/java/org/elasticsearch/search/SearchModule.java index 5c48676eb18fa..06b229009f0f4 100644 --- a/server/src/main/java/org/elasticsearch/search/SearchModule.java +++ b/server/src/main/java/org/elasticsearch/search/SearchModule.java @@ -807,7 +807,9 @@ private void registerQueryParsers(List plugins) { registerQuery(new QuerySpec<>(GeoDistanceQueryBuilder.NAME, GeoDistanceQueryBuilder::new, GeoDistanceQueryBuilder::fromXContent)); registerQuery(new QuerySpec<>(GeoBoundingBoxQueryBuilder.NAME, GeoBoundingBoxQueryBuilder::new, GeoBoundingBoxQueryBuilder::fromXContent)); - registerQuery(new QuerySpec<>(GeoPolygonQueryBuilder.NAME, GeoPolygonQueryBuilder::new, GeoPolygonQueryBuilder::fromXContent)); + registerQuery(new QuerySpec<>( + (new ParseField(GeoPolygonQueryBuilder.NAME).withAllDeprecated(GeoPolygonQueryBuilder.GEO_POLYGON_DEPRECATION_MSG)), + GeoPolygonQueryBuilder::new, GeoPolygonQueryBuilder::fromXContent)); registerQuery(new QuerySpec<>(ExistsQueryBuilder.NAME, ExistsQueryBuilder::new, ExistsQueryBuilder::fromXContent)); registerQuery(new QuerySpec<>(MatchNoneQueryBuilder.NAME, MatchNoneQueryBuilder::new, MatchNoneQueryBuilder::fromXContent)); registerQuery(new QuerySpec<>(TermsSetQueryBuilder.NAME, TermsSetQueryBuilder::new, TermsSetQueryBuilder::fromXContent)); diff --git a/server/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java index 0268e21a1e8e1..d696157f00bd5 100644 --- a/server/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java @@ -62,7 +62,7 @@ protected void doAssertLuceneQuery(GeoPolygonQueryBuilder queryBuilder, Query qu List points = queryBuilder.points(); double[] lats = new double[points.size()]; double[] lons = new double[points.size()]; - for (int i =0; i < points.size(); i++) { + for (int i = 0; i < points.size(); i++) { lats[i] = points.get(i).getLat(); lons[i] = points.get(i).getLon(); } @@ -73,6 +73,34 @@ protected void doAssertLuceneQuery(GeoPolygonQueryBuilder queryBuilder, Query qu } } + @Override + public void testUnknownField() throws IOException { + super.testUnknownField(); + assertDeprecationWarning(); + } + + @Override + public void testUnknownObjectException() throws IOException { + super.testUnknownObjectException(); + assertDeprecationWarning(); + } + + @Override + public void testFromXContent() throws IOException { + super.testFromXContent(); + assertDeprecationWarning(); + } + + @Override + public void testValidOutput() throws IOException { + super.testValidOutput(); + assertDeprecationWarning(); + } + + private void assertDeprecationWarning() { + assertWarnings("Deprecated field [geo_polygon] used, replaced by [[geo_shape] query where polygons are defined in geojson or wkt]"); + } + private static List randomPolygon() { ShapeBuilder shapeBuilder = null; // This is a temporary fix because sometimes the RandomShapeGenerator @@ -97,7 +125,7 @@ public void testNullFieldName() { public void testEmptyPolygon() { IllegalArgumentException e = expectThrows(IllegalArgumentException.class, - () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, Collections.emptyList())); + () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, Collections.emptyList())); assertEquals("polygon must not be null or empty", e.getMessage()); e = expectThrows(IllegalArgumentException.class, () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, null)); @@ -110,7 +138,7 @@ public void testInvalidClosedPolygon() { points.add(new GeoPoint(90, 90)); points.add(new GeoPoint(0, 90)); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, - () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points)); + () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points)); assertEquals("too few points defined for geo_polygon query", e.getMessage()); } @@ -119,91 +147,96 @@ public void testInvalidOpenPolygon() { points.add(new GeoPoint(0, 90)); points.add(new GeoPoint(90, 90)); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, - () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points)); + () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points)); assertEquals("too few points defined for geo_polygon query", e.getMessage()); } public void testParsingAndToQueryParsingExceptions() throws IOException { String[] brokenFiles = new String[]{ - "/org/elasticsearch/index/query/geo_polygon_exception_1.json", - "/org/elasticsearch/index/query/geo_polygon_exception_2.json", - "/org/elasticsearch/index/query/geo_polygon_exception_3.json", - "/org/elasticsearch/index/query/geo_polygon_exception_4.json", - "/org/elasticsearch/index/query/geo_polygon_exception_5.json" + "/org/elasticsearch/index/query/geo_polygon_exception_1.json", + "/org/elasticsearch/index/query/geo_polygon_exception_2.json", + "/org/elasticsearch/index/query/geo_polygon_exception_3.json", + "/org/elasticsearch/index/query/geo_polygon_exception_4.json", + "/org/elasticsearch/index/query/geo_polygon_exception_5.json" }; for (String brokenFile : brokenFiles) { String query = copyToStringFromClasspath(brokenFile); expectThrows(ParsingException.class, () -> parseQuery(query)); } + assertDeprecationWarning(); } public void testParsingAndToQuery1() throws IOException { String query = "{\n" + - " \"geo_polygon\":{\n" + - " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + - " \"points\":[\n" + - " [-70, 40],\n" + - " [-80, 30],\n" + - " [-90, 20]\n" + - " ]\n" + - " }\n" + - " }\n" + - "}\n"; + " \"geo_polygon\":{\n" + + " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + + " \"points\":[\n" + + " [-70, 40],\n" + + " [-80, 30],\n" + + " [-90, 20]\n" + + " ]\n" + + " }\n" + + " }\n" + + "}\n"; assertGeoPolygonQuery(query); + assertDeprecationWarning(); } public void testParsingAndToQuery2() throws IOException { String query = "{\n" + - " \"geo_polygon\":{\n" + - " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + - " \"points\":[\n" + - " {\n" + - " \"lat\":40,\n" + - " \"lon\":-70\n" + - " },\n" + - " {\n" + - " \"lat\":30,\n" + - " \"lon\":-80\n" + - " },\n" + - " {\n" + - " \"lat\":20,\n" + - " \"lon\":-90\n" + - " }\n" + - " ]\n" + - " }\n" + - " }\n" + - "}\n"; + " \"geo_polygon\":{\n" + + " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + + " \"points\":[\n" + + " {\n" + + " \"lat\":40,\n" + + " \"lon\":-70\n" + + " },\n" + + " {\n" + + " \"lat\":30,\n" + + " \"lon\":-80\n" + + " },\n" + + " {\n" + + " \"lat\":20,\n" + + " \"lon\":-90\n" + + " }\n" + + " ]\n" + + " }\n" + + " }\n" + + "}\n"; assertGeoPolygonQuery(query); + assertDeprecationWarning(); } public void testParsingAndToQuery3() throws IOException { String query = "{\n" + - " \"geo_polygon\":{\n" + - " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + - " \"points\":[\n" + - " \"40, -70\",\n" + - " \"30, -80\",\n" + - " \"20, -90\"\n" + - " ]\n" + - " }\n" + - " }\n" + - "}\n"; + " \"geo_polygon\":{\n" + + " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + + " \"points\":[\n" + + " \"40, -70\",\n" + + " \"30, -80\",\n" + + " \"20, -90\"\n" + + " ]\n" + + " }\n" + + " }\n" + + "}\n"; assertGeoPolygonQuery(query); + assertDeprecationWarning(); } public void testParsingAndToQuery4() throws IOException { String query = "{\n" + - " \"geo_polygon\":{\n" + - " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + - " \"points\":[\n" + - " \"drn5x1g8cu2y\",\n" + - " \"30, -80\",\n" + - " \"20, -90\"\n" + - " ]\n" + - " }\n" + - " }\n" + - "}\n"; + " \"geo_polygon\":{\n" + + " \"" + GEO_POINT_FIELD_NAME + "\":{\n" + + " \"points\":[\n" + + " \"drn5x1g8cu2y\",\n" + + " \"30, -80\",\n" + + " \"20, -90\"\n" + + " ]\n" + + " }\n" + + " }\n" + + "}\n"; assertGeoPolygonQuery(query); + assertDeprecationWarning(); } private void assertGeoPolygonQuery(String query) throws IOException { @@ -214,7 +247,7 @@ private void assertGeoPolygonQuery(String query) throws IOException { public void testFromJson() throws IOException { String json = - "{\n" + + "{\n" + " \"geo_polygon\" : {\n" + " \"person.location\" : {\n" + " \"points\" : [ [ -70.0, 40.0 ], [ -80.0, 30.0 ], [ -90.0, 20.0 ], [ -70.0, 40.0 ] ]\n" + @@ -227,6 +260,7 @@ public void testFromJson() throws IOException { GeoPolygonQueryBuilder parsed = (GeoPolygonQueryBuilder) parseQuery(json); checkGeneratedJson(json, parsed); assertEquals(json, 4, parsed.points().size()); + assertDeprecationWarning(); } public void testIgnoreUnmapped() throws IOException { @@ -274,5 +308,6 @@ public void testPointValidation() throws IOException { QueryShardException e2 = expectThrows(QueryShardException.class, () -> parseQuery(queryInvalidLon).toQuery(context)); assertThat(e2.getMessage(), containsString("illegal longitude value [-190.0] for [geo_polygon]")); + assertDeprecationWarning(); } } diff --git a/server/src/test/java/org/elasticsearch/search/SearchModuleTests.java b/server/src/test/java/org/elasticsearch/search/SearchModuleTests.java index 064b604fe8f0b..fc3dd9b3a87af 100644 --- a/server/src/test/java/org/elasticsearch/search/SearchModuleTests.java +++ b/server/src/test/java/org/elasticsearch/search/SearchModuleTests.java @@ -307,7 +307,6 @@ public List> getRescorers() { "fuzzy", "geo_bounding_box", "geo_distance", - "geo_polygon", "geo_shape", "ids", "intervals", @@ -345,7 +344,7 @@ public List> getRescorers() { }; //add here deprecated queries to make sure we log a deprecation warnings when they are used - private static final String[] DEPRECATED_QUERIES = new String[] {}; + private static final String[] DEPRECATED_QUERIES = new String[] {"geo_polygon"}; /** * Dummy test {@link AggregationBuilder} used to test registering aggregation builders.