diff --git a/server/src/main/java/org/elasticsearch/common/geo/GeoPolygonDecomposer.java b/server/src/main/java/org/elasticsearch/common/geo/GeoPolygonDecomposer.java index 8f577d82de0aa..44fe5ab1d099e 100644 --- a/server/src/main/java/org/elasticsearch/common/geo/GeoPolygonDecomposer.java +++ b/server/src/main/java/org/elasticsearch/common/geo/GeoPolygonDecomposer.java @@ -528,6 +528,7 @@ private static int component(final Edge edge, final int id, final ArrayList 0 && current.next != edge) { throw new InvalidShapeException("Shape contains more than one shared point"); } @@ -576,7 +577,7 @@ private static Point[] coordinates(Edge component, Point[] coordinates, double[] } // First and last coordinates must be equal if (coordinates[0].equals(coordinates[coordinates.length - 1]) == false) { - if (partitionPoint[2] == Double.NaN) { + if (Double.isNaN(partitionPoint[2])) { throw new InvalidShapeException("Self-intersection at or near point [" + partitionPoint[0] + "," + partitionPoint[1] + "]"); } else { diff --git a/server/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java b/server/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java index b4cfe2aec70fb..14a2b5e575672 100644 --- a/server/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java +++ b/server/src/main/java/org/elasticsearch/common/geo/builders/PolygonBuilder.java @@ -436,7 +436,7 @@ private static Coordinate[] coordinates(Edge component, Coordinate[] coordinates } // First and last coordinates must be equal if (coordinates[0].equals(coordinates[coordinates.length - 1]) == false) { - if (partitionPoint[2] == Double.NaN) { + if (Double.isNaN(partitionPoint[2])) { throw new InvalidShapeException("Self-intersection at or near point [" + partitionPoint[0] + "," + partitionPoint[1] + "]"); } else { diff --git a/server/src/test/java/org/elasticsearch/common/geo/GeometryIndexerTests.java b/server/src/test/java/org/elasticsearch/common/geo/GeometryIndexerTests.java index ddee41639cd3c..ba4191c0570e8 100644 --- a/server/src/test/java/org/elasticsearch/common/geo/GeometryIndexerTests.java +++ b/server/src/test/java/org/elasticsearch/common/geo/GeometryIndexerTests.java @@ -19,6 +19,17 @@ package org.elasticsearch.common.geo; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.not; + +import java.io.IOException; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + import org.apache.lucene.index.IndexableField; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -37,14 +48,7 @@ import org.elasticsearch.geometry.Rectangle; import org.elasticsearch.index.mapper.GeoShapeIndexer; import org.elasticsearch.test.ESTestCase; -import java.io.IOException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import static org.hamcrest.Matchers.instanceOf; +import org.locationtech.spatial4j.exception.InvalidShapeException; public class GeometryIndexerTests extends ESTestCase { @@ -357,6 +361,15 @@ public void testPolygonOrientation() throws IOException, ParseException { actual(polygon(randomBoolean() ? null : randomBoolean(), 20, 0, 20, 10, -20, 10, -20, 0, 20, 0), randomBoolean())); } + public void testInvalidSelfCrossingPolygon() { + Polygon polygon = new Polygon(new LinearRing( + new double[]{0, 0, 1, 0.5, 1.5, 1, 2, 2, 0}, new double[]{0, 2, 1.9, 1.8, 1.8, 1.9, 2, 0, 0} + )); + Exception e = expectThrows(InvalidShapeException.class, () -> indexer.prepareForIndexing(polygon)); + assertThat(e.getMessage(), containsString("Self-intersection at or near point [")); + assertThat(e.getMessage(), not(containsString("NaN"))); + } + private XContentBuilder polygon(Boolean orientation, double... val) throws IOException { XContentBuilder pointGeoJson = XContentFactory.jsonBuilder().startObject(); { diff --git a/server/src/test/java/org/elasticsearch/common/geo/ShapeBuilderTests.java b/server/src/test/java/org/elasticsearch/common/geo/ShapeBuilderTests.java index 7570a44592c2e..192d3473b38fd 100644 --- a/server/src/test/java/org/elasticsearch/common/geo/ShapeBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/common/geo/ShapeBuilderTests.java @@ -43,6 +43,8 @@ import static org.elasticsearch.test.hamcrest.ElasticsearchGeoAssertions.assertMultiPolygon; import static org.elasticsearch.test.hamcrest.ElasticsearchGeoAssertions.assertPolygon; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + /** * Tests for {@link ShapeBuilder} */ @@ -775,8 +777,10 @@ public void testInvalidSelfCrossingPolygon() { ); Exception e = expectThrows(InvalidShapeException.class, () -> builder.close().buildS4J()); assertThat(e.getMessage(), containsString("Self-intersection at or near point [")); + assertThat(e.getMessage(), not(containsString("NaN"))); e = expectThrows(InvalidShapeException.class, () -> buildGeometry(builder.close())); assertThat(e.getMessage(), containsString("Self-intersection at or near point [")); + assertThat(e.getMessage(), not(containsString("NaN"))); } public Object buildGeometry(ShapeBuilder builder) {