From a514a12d0cb34d40dd3a1561a6b92c83907b9bec Mon Sep 17 00:00:00 2001 From: Karl Wright Date: Fri, 24 Nov 2017 10:37:21 -0500 Subject: [PATCH] LUCENE-8065: Some exact circles near 90 degrees are still concave because of planet model, so throw an exception when we construct one of those. --- .../lucene/spatial3d/geom/GeoExactCircle.java | 6 +++++- .../lucene/spatial3d/geom/GeoCircleTest.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoExactCircle.java b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoExactCircle.java index 8bba244c0af..1c79474cb19 100644 --- a/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoExactCircle.java +++ b/lucene/spatial3d/src/java/org/apache/lucene/spatial3d/geom/GeoExactCircle.java @@ -221,7 +221,11 @@ class GeoExactCircle extends GeoBaseCircle { this.backBounds = backPlanes; } - this.edgePoints = new GeoPoint[]{edgePoint}; + this.edgePoints = new GeoPoint[]{edgePoint}; + + if (!isWithin(northPoint) || !isWithin(southPoint) || !isWithin(eastPoint) || !isWithin(westPoint)) { + throw new IllegalArgumentException("Exact circle cannot be constructed this large given the planet model provided"); + } //System.out.println("Is edgepoint within? "+isWithin(edgePoint)); } diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoCircleTest.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoCircleTest.java index 3f35ef305cf..a272d3df3cb 100755 --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoCircleTest.java +++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoCircleTest.java @@ -551,4 +551,19 @@ public class GeoCircleTest extends LuceneTestCase { assertEquals(westPoint.getLongitude(), bounds.getLeftLongitude(), 1e-2); assertEquals(eastPoint.getLongitude(), bounds.getRightLongitude(), 1e-2); } + + @Test + public void testLUCENE8065(){ + boolean isIllegal = false; + try { + GeoCircle circle1 = GeoCircleFactory.makeExactGeoCircle(PlanetModel.WGS84, 0.03186456479560385, -2.2254294002683617, 1.5702573535090856, 8.184299676008562E-6); + } catch (IllegalArgumentException e) { + isIllegal = true; + } + assertTrue(isIllegal); + /* + GeoCircle circle2 = GeoCircleFactory.makeExactGeoCircle(PlanetModel.WGS84, 0.03186456479560385, -2.2254294002683617 , 1.5698163157923914, 1.0E-5); + assertTrue(circle1.getRelationship(circle2) != GeoArea.DISJOINT); + */ + } }