You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kw...@apache.org on 2018/04/10 10:57:59 UTC
[1/2] lucene-solr:master: LUCENE-8245: Add more tests that
demonstrate problems with GeoComplexPolygon.
Repository: lucene-solr
Updated Branches:
refs/heads/master d45211d53 -> b65229c90
LUCENE-8245: Add more tests that demonstrate problems with GeoComplexPolygon.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/661fdf3a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/661fdf3a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/661fdf3a
Branch: refs/heads/master
Commit: 661fdf3a43e6d7a8b8b28254f69387209bafcd75
Parents: 1cd8597
Author: Karl Wright <Da...@gmail.com>
Authored: Tue Apr 10 06:57:13 2018 -0400
Committer: Karl Wright <Da...@gmail.com>
Committed: Tue Apr 10 06:57:13 2018 -0400
----------------------------------------------------------------------
.../lucene/spatial3d/geom/GeoPolygonTest.java | 57 +++++++-
.../geom/RandomGeo3dShapeGenerator.java | 2 +-
.../spatial3d/geom/RandomGeoPolygonTest.java | 141 +++++++++++++++++++
3 files changed, 198 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
index ee2217d..46750d4 100755
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
@@ -21,12 +21,14 @@ import java.util.List;
import java.util.BitSet;
import java.util.Collections;
+import org.apache.lucene.util.LuceneTestCase;
+
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-public class GeoPolygonTest {
+public class GeoPolygonTest extends LuceneTestCase {
@Test
public void testPolygonPointFiltering() {
@@ -1518,5 +1520,58 @@ shape:
final GeoPoint point = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(12.282452091883385), Geo3DUtil.fromDegrees(-1.91633079336513E-11));
assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
}
+
+ @Test
+ @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
+ public void testLUCENE8245_case2() {
+ //POLYGON((5.512285089810178 -26.833721534785912,12.13983320542565 -16.085163683089583,4.868755337835201 -9.167423203860656,0.0 -5.261747514529465,-15.696549288211289 -21.362181191487718,5.512285089810178 -26.833721534785912))
+ final List<GeoPoint> points = new ArrayList<>();
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-26.833721534785912), Geo3DUtil.fromDegrees(5.512285089810178)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-16.085163683089583), Geo3DUtil.fromDegrees(12.13983320542565)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-9.167423203860656), Geo3DUtil.fromDegrees(4.868755337835201)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.261747514529465), Geo3DUtil.fromDegrees(0.0)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-21.362181191487718), Geo3DUtil.fromDegrees(-15.696549288211289)));
+ final GeoPolygonFactory.PolygonDescription description = new GeoPolygonFactory.PolygonDescription(points);
+ final GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, description);
+ final GeoPolygon largePolygon = GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(description));
+ //POINT(-6.994273817216168E-11 -1.6915596606526662E-292)
+ final GeoPoint point = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-1.6915596606526662E-292), Geo3DUtil.fromDegrees(-6.994273817216168E-11));
+ assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
+ }
+
+ @Test
+ @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
+ public void testLUCENE8245_case3() {
+ //POLYGON((144.76249846857021 8.828705232593283,166.00162989841027 -8.5E-322,157.03429484830787 64.92565566857392,108.64696979831984 39.10241638996957,102.54234512410089 20.471658760034586,144.76249846857021 8.828705232593283))
+ final List<GeoPoint> points = new ArrayList<>();
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(8.828705232593283), Geo3DUtil.fromDegrees(144.76249846857021)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-8.5E-322), Geo3DUtil.fromDegrees(166.00162989841027)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(64.92565566857392), Geo3DUtil.fromDegrees(157.03429484830787)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(39.10241638996957), Geo3DUtil.fromDegrees(108.64696979831984)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(20.471658760034586), Geo3DUtil.fromDegrees(102.54234512410089)));
+ final GeoPolygonFactory.PolygonDescription description = new GeoPolygonFactory.PolygonDescription(points);
+ final GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, description);
+ final GeoPolygon largePolygon = GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(description));
+ //POINT(179.9999999999998 7.627654408067997E-11)
+ final GeoPoint point = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(7.627654408067997E-11), Geo3DUtil.fromDegrees(179.9999999999998));
+ assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
+ }
+
+ @Test
+ public void testLUCENE8245_case4() {
+ //POLYGON((-3.728795716978514 -10.354090605548162,-137.97868338527985 0.05602723926521642,-113.87317441507611 -76.2471400450585,-162.64032677742279 -89.9999999991684,179.9999999999998 -89.99999999999997,-3.728795716978514 -10.354090605548162))
+ final List<GeoPoint> points = new ArrayList<>();
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-10.354090605548162), Geo3DUtil.fromDegrees(-3.728795716978514)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(0.05602723926521642), Geo3DUtil.fromDegrees(-137.97868338527985)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-76.2471400450585), Geo3DUtil.fromDegrees(-113.87317441507611)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-89.9999999991684), Geo3DUtil.fromDegrees(-162.64032677742279)));
+ points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-89.99999999999997), Geo3DUtil.fromDegrees(179.9999999999998)));
+ final GeoPolygonFactory.PolygonDescription description = new GeoPolygonFactory.PolygonDescription(points);
+ final GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, description);
+ final GeoPolygon largePolygon = GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(description));
+ //POINT(-1.2862855990004445E-10 -39.178517830976105)
+ final GeoPoint point = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-39.178517830976105), Geo3DUtil.fromDegrees(-1.2862855990004445E-10));
+ assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
+ }
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
index cf3713c..ca0c829 100644
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
@@ -897,7 +897,7 @@ public class RandomGeo3dShapeGenerator extends LuceneTestCase {
* @param points The points to order.
* @return The list of ordered points anti-clockwise.
*/
- private List<GeoPoint> orderPoints(List<GeoPoint> points) {
+ protected List<GeoPoint> orderPoints(List<GeoPoint> points) {
double x = 0;
double y = 0;
double z = 0;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
index beac8c7..fc7e2ad 100644
--- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
@@ -17,11 +17,15 @@
package org.apache.lucene.spatial3d.geom;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import com.carrotsearch.randomizedtesting.annotations.Repeat;
+import com.carrotsearch.randomizedtesting.generators.BiasedNumbers;
import org.junit.Test;
+import static com.carrotsearch.randomizedtesting.RandomizedTest.randomDouble;
+
/**
* Random test for polygons.
*/
@@ -84,4 +88,141 @@ public class RandomGeoPolygonTest extends RandomGeo3dShapeGenerator {
GeoCompositePolygon polygon = (GeoCompositePolygon)GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, points);
assertTrue(polygon.size() == 3);
}
+
+ /**
+ * Test comparing different polygon technologies using random
+ * biased doubles.
+ */
+ @Test
+ @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
+ @Repeat(iterations = 10)
+ public void testComparePolygons() {
+ final PlanetModel planetModel = randomPlanetModel();
+ //Create polygon points using a reference point and a maximum distance to the point
+ final GeoPoint referencePoint = getBiasedPoint(planetModel);
+ final int n = random().nextInt(4) + 4;
+ final List<GeoPoint> points = new ArrayList<>(n);
+ final double maxDistance = random().nextDouble() * Math.PI;
+ for (int i = 0; i < n; i++) {
+ while(true) {
+ final double distance = BiasedNumbers.randomDoubleBetween(random(), 0, maxDistance);// random().nextDouble() * maxDistance;
+ final double bearing = random().nextDouble() * 2 * Math.PI;
+ GeoPoint p = planetModel.surfacePointOnBearing(referencePoint, distance, bearing);
+ if (!contains(p, points)) {
+ if (points.size() > 1 && Plane.arePointsCoplanar(points.get(points.size() -1), points.get(points.size() - 2), p)) {
+ continue;
+ }
+ points.add(p);
+ break;
+ }
+ }
+ }
+ //order points so we don't get crossing edges
+ final List<GeoPoint> orderedPoints = orderPoints(points);
+ //Comment out below to get clock-wise polygons
+ if (random().nextBoolean() && random().nextBoolean()) {
+ Collections.reverse(orderedPoints);
+ }
+ GeoPolygonFactory.PolygonDescription polygonDescription = new GeoPolygonFactory.PolygonDescription(orderedPoints);
+ GeoPolygon polygon = null;
+ try {
+ polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, polygonDescription);
+ } catch(Exception e) {
+ StringBuilder buffer = new StringBuilder("Polygon failed to build with an exception:\n");
+ buffer.append(points.toString()+ "\n");
+ buffer.append("WKT:" + getWKT(orderedPoints));
+ buffer.append(e.toString());
+ fail(buffer.toString());
+ }
+ if (polygon == null) {
+ StringBuilder buffer = new StringBuilder("Polygon failed to build:\n");
+ buffer.append(points.toString()+ "\n");
+ buffer.append("WKT:" + getWKT(orderedPoints));
+ fail(buffer.toString());
+ }
+ GeoPolygon largePolygon = null;
+ try {
+ largePolygon = GeoPolygonFactory.makeLargeGeoPolygon(planetModel, Collections.singletonList(polygonDescription));
+ } catch(Exception e) {
+ StringBuilder buffer = new StringBuilder("Large polygon failed to build with an exception:\n");
+ buffer.append(points.toString()+ "\n");
+ buffer.append("WKT:" + getWKT(orderedPoints));
+ buffer.append(e.toString());
+ fail(buffer.toString());
+ }
+ if (largePolygon == null) {
+ StringBuilder buffer = new StringBuilder("Large polygon failed to build:\n");
+ buffer.append(points.toString()+ "\n");
+ buffer.append("WKT:" + getWKT(orderedPoints));
+ fail(buffer.toString());
+ }
+
+ for(int i=0;i<100000;i++) {
+ GeoPoint point = getBiasedPoint(planetModel);
+ boolean withIn1 = polygon.isWithin(point);
+ boolean withIn2 = largePolygon.isWithin(point);
+ StringBuilder buffer = new StringBuilder();
+ if (withIn1 != withIn2) {
+ //NOTE: Sometimes we get errors when check point is near a polygon point.
+ // For the time being, we filter this errors.
+ double d1 = polygon.computeOutsideDistance(DistanceStyle.ARC, point);
+ double d2 = largePolygon.computeOutsideDistance(DistanceStyle.ARC, point);
+ if (d1 == 0 && d2 == 0) {
+ continue;
+ }
+ buffer = buffer.append("\nStandard polygon: " + polygon.toString() +"\n");
+ buffer = buffer.append("\nLarge polygon: " + largePolygon.toString() +"\n");
+ buffer = buffer.append("\nPoint: " + point.toString() +"\n");
+ buffer.append("\nWKT: " + getWKT(orderedPoints));
+ buffer.append("\nWKT: POINT(" + Math.toDegrees(point.getLongitude()) + " " + Math.toDegrees(point.getLatitude()) + ")\n");
+ buffer.append("normal polygon: " +withIn1 + "\n");
+ buffer.append("large polygon: " + withIn2 + "\n");
+ }
+ assertTrue(buffer.toString(), withIn1 == withIn2);
+ }
+ //Not yet tested
+// for(int i=0;i<100;i++) {
+// GeoShape shape = randomGeoShape(randomShapeType(), planetModel);
+// int rel1 = polygon.getRelationship(shape);
+// int rel2 = largePolygon.getRelationship(shape);
+// StringBuilder buffer = new StringBuilder();
+// if (rel1 != rel2) {
+// buffer = buffer.append(polygon.toString() +"\n" + shape.toString() + "\n");
+// buffer.append("WKT: " + getWKT(orderedPoints) + "\n");
+// buffer.append("normal polygon: " + rel1 + "\n");
+// buffer.append("large polygon: " + rel2 + "\n");
+// }
+// assertTrue(buffer.toString(), rel1 == rel2);
+// }
+ }
+
+ private GeoPoint getBiasedPoint(PlanetModel planetModel) {
+ double lat = BiasedNumbers.randomDoubleBetween(random(), 0, Math.PI / 2);
+ if (random().nextBoolean()) {
+ lat = (-1) * lat;
+ }
+ double lon = BiasedNumbers.randomDoubleBetween(random(), 0, Math.PI);
+ if (random().nextBoolean()) {
+ lon = (-1) * lon;
+ }
+ return new GeoPoint(planetModel, lat, lon);
+ }
+
+ private String getWKT(List<GeoPoint> points) {
+ StringBuffer buffer = new StringBuffer("POLYGON((");
+ for (GeoPoint point : points) {
+ buffer.append(Math.toDegrees(point.getLongitude()) + " " + Math.toDegrees(point.getLatitude()) + ",");
+ }
+ buffer.append(Math.toDegrees(points.get(0).getLongitude()) + " " + Math.toDegrees(points.get(0).getLatitude()) + "))\n");
+ return buffer.toString();
+ }
+
+ private boolean contains(GeoPoint p, List<GeoPoint> points) {
+ for (GeoPoint point : points) {
+ if (point.isNumericallyIdentical(p)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
Re: [1/2] lucene-solr:master: LUCENE-8245: Add more tests that
demonstrate problems with GeoComplexPolygon.
Posted by Karl Wright <da...@gmail.com>.
Should be resolved now.
Sorry for the noise!
Karl
On Tue, Apr 10, 2018 at 9:03 AM, Adrien Grand <jp...@gmail.com> wrote:
> Hey Karl,
>
> The calls to Math.toDegrees seem to have made precommit angry.
>
> Le mar. 10 avr. 2018 à 12:57, <kw...@apache.org> a écrit :
>
>> Repository: lucene-solr
>> Updated Branches:
>> refs/heads/master d45211d53 -> b65229c90
>>
>>
>> LUCENE-8245: Add more tests that demonstrate problems with
>> GeoComplexPolygon.
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/
>> 661fdf3a
>> Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/661fdf3a
>> Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/661fdf3a
>>
>> Branch: refs/heads/master
>> Commit: 661fdf3a43e6d7a8b8b28254f69387209bafcd75
>> Parents: 1cd8597
>> Author: Karl Wright <Da...@gmail.com>
>> Authored: Tue Apr 10 06:57:13 2018 -0400
>> Committer: Karl Wright <Da...@gmail.com>
>> Committed: Tue Apr 10 06:57:13 2018 -0400
>>
>> ----------------------------------------------------------------------
>> .../lucene/spatial3d/geom/GeoPolygonTest.java | 57 +++++++-
>> .../geom/RandomGeo3dShapeGenerator.java | 2 +-
>> .../spatial3d/geom/RandomGeoPolygonTest.java | 141
>> +++++++++++++++++++
>> 3 files changed, 198 insertions(+), 2 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
>> 661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/
>> spatial3d/geom/GeoPolygonTest.java
>> ----------------------------------------------------------------------
>> diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/
>> geom/GeoPolygonTest.java
>> index ee2217d..46750d4 100755
>> --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/
>> geom/GeoPolygonTest.java
>> +++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/
>> geom/GeoPolygonTest.java
>> @@ -21,12 +21,14 @@ import java.util.List;
>> import java.util.BitSet;
>> import java.util.Collections;
>>
>> +import org.apache.lucene.util.LuceneTestCase;
>> +
>> import org.junit.Test;
>> import static org.junit.Assert.assertEquals;
>> import static org.junit.Assert.assertFalse;
>> import static org.junit.Assert.assertTrue;
>>
>> -public class GeoPolygonTest {
>> +public class GeoPolygonTest extends LuceneTestCase {
>>
>> @Test
>> public void testPolygonPointFiltering() {
>> @@ -1518,5 +1520,58 @@ shape:
>> final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(12.282452091883385), Geo3DUtil.fromDegrees(-1.
>> 91633079336513E-11));
>> assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
>> }
>> +
>> + @Test
>> + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
>> + public void testLUCENE8245_case2() {
>> + //POLYGON((5.512285089810178 -26.833721534785912,12.13983320542565
>> -16.085163683089583,4.868755337835201 -9.167423203860656,0.0
>> -5.261747514529465,-15.696549288211289 -21.362181191487718,5.512285089810178
>> -26.833721534785912))
>> + final List<GeoPoint> points = new ArrayList<>();
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-26.833721534785912), Geo3DUtil.fromDegrees(5.
>> 512285089810178)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-16.085163683089583), Geo3DUtil.fromDegrees(12.
>> 13983320542565)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-9.167423203860656),
>> Geo3DUtil.fromDegrees(4.868755337835201)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.261747514529465),
>> Geo3DUtil.fromDegrees(0.0)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-21.362181191487718), Geo3DUtil.fromDegrees(-15.
>> 696549288211289)));
>> + final GeoPolygonFactory.PolygonDescription description = new
>> GeoPolygonFactory.PolygonDescription(points);
>> + final GeoPolygon polygon = GeoPolygonFactory.
>> makeGeoPolygon(PlanetModel.SPHERE, description);
>> + final GeoPolygon largePolygon = GeoPolygonFactory.
>> makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(
>> description));
>> + //POINT(-6.994273817216168E-11 -1.6915596606526662E-292)
>> + final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-1.6915596606526662E-292),
>> Geo3DUtil.fromDegrees(-6.994273817216168E-11));
>> + assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
>> + }
>> +
>> + @Test
>> + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
>> + public void testLUCENE8245_case3() {
>> + //POLYGON((144.76249846857021 8.828705232593283,166.00162989841027
>> -8.5E-322,157.03429484830787 64.92565566857392,108.64696979831984
>> 39.10241638996957,102.54234512410089 20.471658760034586,144.76249846857021
>> 8.828705232593283))
>> + final List<GeoPoint> points = new ArrayList<>();
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(8.828705232593283),
>> Geo3DUtil.fromDegrees(144.76249846857021)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-8.5E-322), Geo3DUtil.fromDegrees(166.
>> 00162989841027)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(64.92565566857392),
>> Geo3DUtil.fromDegrees(157.03429484830787)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(39.10241638996957),
>> Geo3DUtil.fromDegrees(108.64696979831984)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(20.471658760034586),
>> Geo3DUtil.fromDegrees(102.54234512410089)));
>> + final GeoPolygonFactory.PolygonDescription description = new
>> GeoPolygonFactory.PolygonDescription(points);
>> + final GeoPolygon polygon = GeoPolygonFactory.
>> makeGeoPolygon(PlanetModel.SPHERE, description);
>> + final GeoPolygon largePolygon = GeoPolygonFactory.
>> makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(
>> description));
>> + //POINT(179.9999999999998 7.627654408067997E-11)
>> + final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(7.627654408067997E-11), Geo3DUtil.fromDegrees(179.
>> 9999999999998));
>> + assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
>> + }
>> +
>> + @Test
>> + public void testLUCENE8245_case4() {
>> + //POLYGON((-3.728795716978514 -10.354090605548162,-137.97868338527985
>> 0.05602723926521642,-113.87317441507611 -76.2471400450585,-162.64032677742279
>> -89.9999999991684,179.9999999999998 -89.99999999999997,-3.728795716978514
>> -10.354090605548162))
>> + final List<GeoPoint> points = new ArrayList<>();
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-10.354090605548162), Geo3DUtil.fromDegrees(-3.
>> 728795716978514)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(0.05602723926521642),
>> Geo3DUtil.fromDegrees(-137.97868338527985)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-76.2471400450585), Geo3DUtil.fromDegrees(-113.
>> 87317441507611)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-89.9999999991684), Geo3DUtil.fromDegrees(-162.
>> 64032677742279)));
>> + points.add(new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-89.99999999999997), Geo3DUtil.fromDegrees(179.
>> 9999999999998)));
>> + final GeoPolygonFactory.PolygonDescription description = new
>> GeoPolygonFactory.PolygonDescription(points);
>> + final GeoPolygon polygon = GeoPolygonFactory.
>> makeGeoPolygon(PlanetModel.SPHERE, description);
>> + final GeoPolygon largePolygon = GeoPolygonFactory.
>> makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(
>> description));
>> + //POINT(-1.2862855990004445E-10 -39.178517830976105)
>> + final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
>> Geo3DUtil.fromDegrees(-39.178517830976105), Geo3DUtil.fromDegrees(-1.
>> 2862855990004445E-10));
>> + assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
>> + }
>>
>> }
>>
>> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
>> 661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/
>> RandomGeo3dShapeGenerator.java
>> ----------------------------------------------------------------------
>> diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/
>> RandomGeo3dShapeGenerator.java
>> index cf3713c..ca0c829 100644
>> --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/
>> RandomGeo3dShapeGenerator.java
>> +++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/
>> RandomGeo3dShapeGenerator.java
>> @@ -897,7 +897,7 @@ public class RandomGeo3dShapeGenerator extends
>> LuceneTestCase {
>> * @param points The points to order.
>> * @return The list of ordered points anti-clockwise.
>> */
>> - private List<GeoPoint> orderPoints(List<GeoPoint> points) {
>> + protected List<GeoPoint> orderPoints(List<GeoPoint> points) {
>> double x = 0;
>> double y = 0;
>> double z = 0;
>>
>> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/
>> 661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/
>> RandomGeoPolygonTest.java
>> ----------------------------------------------------------------------
>> diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
>> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/
>> geom/RandomGeoPolygonTest.java
>> index beac8c7..fc7e2ad 100644
>> --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/
>> geom/RandomGeoPolygonTest.java
>> +++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/
>> geom/RandomGeoPolygonTest.java
>> @@ -17,11 +17,15 @@
>> package org.apache.lucene.spatial3d.geom;
>>
>> import java.util.ArrayList;
>> +import java.util.Collections;
>> import java.util.List;
>>
>> import com.carrotsearch.randomizedtesting.annotations.Repeat;
>> +import com.carrotsearch.randomizedtesting.generators.BiasedNumbers;
>> import org.junit.Test;
>>
>> +import static com.carrotsearch.randomizedtesting.
>> RandomizedTest.randomDouble;
>> +
>> /**
>> * Random test for polygons.
>> */
>> @@ -84,4 +88,141 @@ public class RandomGeoPolygonTest extends
>> RandomGeo3dShapeGenerator {
>> GeoCompositePolygon polygon = (GeoCompositePolygon)
>> GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, points);
>> assertTrue(polygon.size() == 3);
>> }
>> +
>> + /**
>> + * Test comparing different polygon technologies using random
>> + * biased doubles.
>> + */
>> + @Test
>> + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
>> + @Repeat(iterations = 10)
>> + public void testComparePolygons() {
>> + final PlanetModel planetModel = randomPlanetModel();
>> + //Create polygon points using a reference point and a maximum
>> distance to the point
>> + final GeoPoint referencePoint = getBiasedPoint(planetModel);
>> + final int n = random().nextInt(4) + 4;
>> + final List<GeoPoint> points = new ArrayList<>(n);
>> + final double maxDistance = random().nextDouble() * Math.PI;
>> + for (int i = 0; i < n; i++) {
>> + while(true) {
>> + final double distance = BiasedNumbers.randomDoubleBetween(random(),
>> 0, maxDistance);// random().nextDouble() * maxDistance;
>> + final double bearing = random().nextDouble() * 2 * Math.PI;
>> + GeoPoint p = planetModel.surfacePointOnBearing(referencePoint,
>> distance, bearing);
>> + if (!contains(p, points)) {
>> + if (points.size() > 1 && Plane.arePointsCoplanar(points.get(points.size()
>> -1), points.get(points.size() - 2), p)) {
>> + continue;
>> + }
>> + points.add(p);
>> + break;
>> + }
>> + }
>> + }
>> + //order points so we don't get crossing edges
>> + final List<GeoPoint> orderedPoints = orderPoints(points);
>> + //Comment out below to get clock-wise polygons
>> + if (random().nextBoolean() && random().nextBoolean()) {
>> + Collections.reverse(orderedPoints);
>> + }
>> + GeoPolygonFactory.PolygonDescription polygonDescription = new
>> GeoPolygonFactory.PolygonDescription(orderedPoints);
>> + GeoPolygon polygon = null;
>> + try {
>> + polygon = GeoPolygonFactory.makeGeoPolygon(planetModel,
>> polygonDescription);
>> + } catch(Exception e) {
>> + StringBuilder buffer = new StringBuilder("Polygon failed to build
>> with an exception:\n");
>> + buffer.append(points.toString()+ "\n");
>> + buffer.append("WKT:" + getWKT(orderedPoints));
>> + buffer.append(e.toString());
>> + fail(buffer.toString());
>> + }
>> + if (polygon == null) {
>> + StringBuilder buffer = new StringBuilder("Polygon failed to
>> build:\n");
>> + buffer.append(points.toString()+ "\n");
>> + buffer.append("WKT:" + getWKT(orderedPoints));
>> + fail(buffer.toString());
>> + }
>> + GeoPolygon largePolygon = null;
>> + try {
>> + largePolygon = GeoPolygonFactory.makeLargeGeoPolygon(planetModel,
>> Collections.singletonList(polygonDescription));
>> + } catch(Exception e) {
>> + StringBuilder buffer = new StringBuilder("Large polygon failed to
>> build with an exception:\n");
>> + buffer.append(points.toString()+ "\n");
>> + buffer.append("WKT:" + getWKT(orderedPoints));
>> + buffer.append(e.toString());
>> + fail(buffer.toString());
>> + }
>> + if (largePolygon == null) {
>> + StringBuilder buffer = new StringBuilder("Large polygon failed to
>> build:\n");
>> + buffer.append(points.toString()+ "\n");
>> + buffer.append("WKT:" + getWKT(orderedPoints));
>> + fail(buffer.toString());
>> + }
>> +
>> + for(int i=0;i<100000;i++) {
>> + GeoPoint point = getBiasedPoint(planetModel);
>> + boolean withIn1 = polygon.isWithin(point);
>> + boolean withIn2 = largePolygon.isWithin(point);
>> + StringBuilder buffer = new StringBuilder();
>> + if (withIn1 != withIn2) {
>> + //NOTE: Sometimes we get errors when check point is near a
>> polygon point.
>> + // For the time being, we filter this errors.
>> + double d1 = polygon.computeOutsideDistance(DistanceStyle.ARC,
>> point);
>> + double d2 = largePolygon.computeOutsideDistance(DistanceStyle.ARC,
>> point);
>> + if (d1 == 0 && d2 == 0) {
>> + continue;
>> + }
>> + buffer = buffer.append("\nStandard polygon: " +
>> polygon.toString() +"\n");
>> + buffer = buffer.append("\nLarge polygon: " +
>> largePolygon.toString() +"\n");
>> + buffer = buffer.append("\nPoint: " + point.toString() +"\n");
>> + buffer.append("\nWKT: " + getWKT(orderedPoints));
>> + buffer.append("\nWKT: POINT(" + Math.toDegrees(point.getLongitude())
>> + " " + Math.toDegrees(point.getLatitude()) + ")\n");
>> + buffer.append("normal polygon: " +withIn1 + "\n");
>> + buffer.append("large polygon: " + withIn2 + "\n");
>> + }
>> + assertTrue(buffer.toString(), withIn1 == withIn2);
>> + }
>> + //Not yet tested
>> +// for(int i=0;i<100;i++) {
>> +// GeoShape shape = randomGeoShape(randomShapeType(), planetModel);
>> +// int rel1 = polygon.getRelationship(shape);
>> +// int rel2 = largePolygon.getRelationship(shape);
>> +// StringBuilder buffer = new StringBuilder();
>> +// if (rel1 != rel2) {
>> +// buffer = buffer.append(polygon.toString() +"\n" +
>> shape.toString() + "\n");
>> +// buffer.append("WKT: " + getWKT(orderedPoints) + "\n");
>> +// buffer.append("normal polygon: " + rel1 + "\n");
>> +// buffer.append("large polygon: " + rel2 + "\n");
>> +// }
>> +// assertTrue(buffer.toString(), rel1 == rel2);
>> +// }
>> + }
>> +
>> + private GeoPoint getBiasedPoint(PlanetModel planetModel) {
>> + double lat = BiasedNumbers.randomDoubleBetween(random(), 0, Math.PI
>> / 2);
>> + if (random().nextBoolean()) {
>> + lat = (-1) * lat;
>> + }
>> + double lon = BiasedNumbers.randomDoubleBetween(random(), 0,
>> Math.PI);
>> + if (random().nextBoolean()) {
>> + lon = (-1) * lon;
>> + }
>> + return new GeoPoint(planetModel, lat, lon);
>> + }
>> +
>> + private String getWKT(List<GeoPoint> points) {
>> + StringBuffer buffer = new StringBuffer("POLYGON((");
>> + for (GeoPoint point : points) {
>> + buffer.append(Math.toDegrees(point.getLongitude()) + " " +
>> Math.toDegrees(point.getLatitude()) + ",");
>> + }
>> + buffer.append(Math.toDegrees(points.get(0).getLongitude()) + " " +
>> Math.toDegrees(points.get(0).getLatitude()) + "))\n");
>> + return buffer.toString();
>> + }
>> +
>> + private boolean contains(GeoPoint p, List<GeoPoint> points) {
>> + for (GeoPoint point : points) {
>> + if (point.isNumericallyIdentical(p)) {
>> + return true;
>> + }
>> + }
>> + return false;
>> + }
>> }
>>
>>
Re: [1/2] lucene-solr:master: LUCENE-8245: Add more tests that
demonstrate problems with GeoComplexPolygon.
Posted by Adrien Grand <jp...@gmail.com>.
Hey Karl,
The calls to Math.toDegrees seem to have made precommit angry.
Le mar. 10 avr. 2018 à 12:57, <kw...@apache.org> a écrit :
> Repository: lucene-solr
> Updated Branches:
> refs/heads/master d45211d53 -> b65229c90
>
>
> LUCENE-8245: Add more tests that demonstrate problems with
> GeoComplexPolygon.
>
>
> Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
> Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/661fdf3a
> Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/661fdf3a
> Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/661fdf3a
>
> Branch: refs/heads/master
> Commit: 661fdf3a43e6d7a8b8b28254f69387209bafcd75
> Parents: 1cd8597
> Author: Karl Wright <Da...@gmail.com>
> Authored: Tue Apr 10 06:57:13 2018 -0400
> Committer: Karl Wright <Da...@gmail.com>
> Committed: Tue Apr 10 06:57:13 2018 -0400
>
> ----------------------------------------------------------------------
> .../lucene/spatial3d/geom/GeoPolygonTest.java | 57 +++++++-
> .../geom/RandomGeo3dShapeGenerator.java | 2 +-
> .../spatial3d/geom/RandomGeoPolygonTest.java | 141 +++++++++++++++++++
> 3 files changed, 198 insertions(+), 2 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
> ----------------------------------------------------------------------
> diff --git
> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
> index ee2217d..46750d4 100755
> ---
> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
> +++
> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/GeoPolygonTest.java
> @@ -21,12 +21,14 @@ import java.util.List;
> import java.util.BitSet;
> import java.util.Collections;
>
> +import org.apache.lucene.util.LuceneTestCase;
> +
> import org.junit.Test;
> import static org.junit.Assert.assertEquals;
> import static org.junit.Assert.assertFalse;
> import static org.junit.Assert.assertTrue;
>
> -public class GeoPolygonTest {
> +public class GeoPolygonTest extends LuceneTestCase {
>
> @Test
> public void testPolygonPointFiltering() {
> @@ -1518,5 +1520,58 @@ shape:
> final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(12.282452091883385),
> Geo3DUtil.fromDegrees(-1.91633079336513E-11));
> assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
> }
> +
> + @Test
> + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
> + public void testLUCENE8245_case2() {
> + //POLYGON((5.512285089810178 -26.833721534785912,12.13983320542565
> -16.085163683089583,4.868755337835201 -9.167423203860656,0.0
> -5.261747514529465,-15.696549288211289
> -21.362181191487718,5.512285089810178 -26.833721534785912))
> + final List<GeoPoint> points = new ArrayList<>();
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-26.833721534785912),
> Geo3DUtil.fromDegrees(5.512285089810178)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-16.085163683089583),
> Geo3DUtil.fromDegrees(12.13983320542565)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-9.167423203860656),
> Geo3DUtil.fromDegrees(4.868755337835201)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-5.261747514529465), Geo3DUtil.fromDegrees(0.0)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-21.362181191487718),
> Geo3DUtil.fromDegrees(-15.696549288211289)));
> + final GeoPolygonFactory.PolygonDescription description = new
> GeoPolygonFactory.PolygonDescription(points);
> + final GeoPolygon polygon =
> GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, description);
> + final GeoPolygon largePolygon =
> GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE,
> Collections.singletonList(description));
> + //POINT(-6.994273817216168E-11 -1.6915596606526662E-292)
> + final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-1.6915596606526662E-292),
> Geo3DUtil.fromDegrees(-6.994273817216168E-11));
> + assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
> + }
> +
> + @Test
> + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
> + public void testLUCENE8245_case3() {
> + //POLYGON((144.76249846857021 8.828705232593283,166.00162989841027
> -8.5E-322,157.03429484830787 64.92565566857392,108.64696979831984
> 39.10241638996957,102.54234512410089 20.471658760034586,144.76249846857021
> 8.828705232593283))
> + final List<GeoPoint> points = new ArrayList<>();
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(8.828705232593283),
> Geo3DUtil.fromDegrees(144.76249846857021)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-8.5E-322),
> Geo3DUtil.fromDegrees(166.00162989841027)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(64.92565566857392),
> Geo3DUtil.fromDegrees(157.03429484830787)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(39.10241638996957),
> Geo3DUtil.fromDegrees(108.64696979831984)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(20.471658760034586),
> Geo3DUtil.fromDegrees(102.54234512410089)));
> + final GeoPolygonFactory.PolygonDescription description = new
> GeoPolygonFactory.PolygonDescription(points);
> + final GeoPolygon polygon =
> GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, description);
> + final GeoPolygon largePolygon =
> GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE,
> Collections.singletonList(description));
> + //POINT(179.9999999999998 7.627654408067997E-11)
> + final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(7.627654408067997E-11),
> Geo3DUtil.fromDegrees(179.9999999999998));
> + assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
> + }
> +
> + @Test
> + public void testLUCENE8245_case4() {
> + //POLYGON((-3.728795716978514 -10.354090605548162,-137.97868338527985
> 0.05602723926521642,-113.87317441507611
> -76.2471400450585,-162.64032677742279 -89.9999999991684,179.9999999999998
> -89.99999999999997,-3.728795716978514 -10.354090605548162))
> + final List<GeoPoint> points = new ArrayList<>();
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-10.354090605548162),
> Geo3DUtil.fromDegrees(-3.728795716978514)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(0.05602723926521642),
> Geo3DUtil.fromDegrees(-137.97868338527985)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-76.2471400450585),
> Geo3DUtil.fromDegrees(-113.87317441507611)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-89.9999999991684),
> Geo3DUtil.fromDegrees(-162.64032677742279)));
> + points.add(new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-89.99999999999997),
> Geo3DUtil.fromDegrees(179.9999999999998)));
> + final GeoPolygonFactory.PolygonDescription description = new
> GeoPolygonFactory.PolygonDescription(points);
> + final GeoPolygon polygon =
> GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, description);
> + final GeoPolygon largePolygon =
> GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE,
> Collections.singletonList(description));
> + //POINT(-1.2862855990004445E-10 -39.178517830976105)
> + final GeoPoint point = new GeoPoint(PlanetModel.SPHERE,
> Geo3DUtil.fromDegrees(-39.178517830976105),
> Geo3DUtil.fromDegrees(-1.2862855990004445E-10));
> + assertTrue(polygon.isWithin(point) == largePolygon.isWithin(point));
> + }
>
> }
>
>
> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
> ----------------------------------------------------------------------
> diff --git
> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
> index cf3713c..ca0c829 100644
> ---
> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
> +++
> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeo3dShapeGenerator.java
> @@ -897,7 +897,7 @@ public class RandomGeo3dShapeGenerator extends
> LuceneTestCase {
> * @param points The points to order.
> * @return The list of ordered points anti-clockwise.
> */
> - private List<GeoPoint> orderPoints(List<GeoPoint> points) {
> + protected List<GeoPoint> orderPoints(List<GeoPoint> points) {
> double x = 0;
> double y = 0;
> double z = 0;
>
>
> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/661fdf3a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
> ----------------------------------------------------------------------
> diff --git
> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
> index beac8c7..fc7e2ad 100644
> ---
> a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
> +++
> b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/RandomGeoPolygonTest.java
> @@ -17,11 +17,15 @@
> package org.apache.lucene.spatial3d.geom;
>
> import java.util.ArrayList;
> +import java.util.Collections;
> import java.util.List;
>
> import com.carrotsearch.randomizedtesting.annotations.Repeat;
> +import com.carrotsearch.randomizedtesting.generators.BiasedNumbers;
> import org.junit.Test;
>
> +import static
> com.carrotsearch.randomizedtesting.RandomizedTest.randomDouble;
> +
> /**
> * Random test for polygons.
> */
> @@ -84,4 +88,141 @@ public class RandomGeoPolygonTest extends
> RandomGeo3dShapeGenerator {
> GeoCompositePolygon polygon =
> (GeoCompositePolygon)GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE,
> points);
> assertTrue(polygon.size() == 3);
> }
> +
> + /**
> + * Test comparing different polygon technologies using random
> + * biased doubles.
> + */
> + @Test
> + @AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/LUCENE-8245")
> + @Repeat(iterations = 10)
> + public void testComparePolygons() {
> + final PlanetModel planetModel = randomPlanetModel();
> + //Create polygon points using a reference point and a maximum
> distance to the point
> + final GeoPoint referencePoint = getBiasedPoint(planetModel);
> + final int n = random().nextInt(4) + 4;
> + final List<GeoPoint> points = new ArrayList<>(n);
> + final double maxDistance = random().nextDouble() * Math.PI;
> + for (int i = 0; i < n; i++) {
> + while(true) {
> + final double distance =
> BiasedNumbers.randomDoubleBetween(random(), 0, maxDistance);//
> random().nextDouble() * maxDistance;
> + final double bearing = random().nextDouble() * 2 * Math.PI;
> + GeoPoint p = planetModel.surfacePointOnBearing(referencePoint,
> distance, bearing);
> + if (!contains(p, points)) {
> + if (points.size() > 1 &&
> Plane.arePointsCoplanar(points.get(points.size() -1),
> points.get(points.size() - 2), p)) {
> + continue;
> + }
> + points.add(p);
> + break;
> + }
> + }
> + }
> + //order points so we don't get crossing edges
> + final List<GeoPoint> orderedPoints = orderPoints(points);
> + //Comment out below to get clock-wise polygons
> + if (random().nextBoolean() && random().nextBoolean()) {
> + Collections.reverse(orderedPoints);
> + }
> + GeoPolygonFactory.PolygonDescription polygonDescription = new
> GeoPolygonFactory.PolygonDescription(orderedPoints);
> + GeoPolygon polygon = null;
> + try {
> + polygon = GeoPolygonFactory.makeGeoPolygon(planetModel,
> polygonDescription);
> + } catch(Exception e) {
> + StringBuilder buffer = new StringBuilder("Polygon failed to build
> with an exception:\n");
> + buffer.append(points.toString()+ "\n");
> + buffer.append("WKT:" + getWKT(orderedPoints));
> + buffer.append(e.toString());
> + fail(buffer.toString());
> + }
> + if (polygon == null) {
> + StringBuilder buffer = new StringBuilder("Polygon failed to
> build:\n");
> + buffer.append(points.toString()+ "\n");
> + buffer.append("WKT:" + getWKT(orderedPoints));
> + fail(buffer.toString());
> + }
> + GeoPolygon largePolygon = null;
> + try {
> + largePolygon = GeoPolygonFactory.makeLargeGeoPolygon(planetModel,
> Collections.singletonList(polygonDescription));
> + } catch(Exception e) {
> + StringBuilder buffer = new StringBuilder("Large polygon failed to
> build with an exception:\n");
> + buffer.append(points.toString()+ "\n");
> + buffer.append("WKT:" + getWKT(orderedPoints));
> + buffer.append(e.toString());
> + fail(buffer.toString());
> + }
> + if (largePolygon == null) {
> + StringBuilder buffer = new StringBuilder("Large polygon failed to
> build:\n");
> + buffer.append(points.toString()+ "\n");
> + buffer.append("WKT:" + getWKT(orderedPoints));
> + fail(buffer.toString());
> + }
> +
> + for(int i=0;i<100000;i++) {
> + GeoPoint point = getBiasedPoint(planetModel);
> + boolean withIn1 = polygon.isWithin(point);
> + boolean withIn2 = largePolygon.isWithin(point);
> + StringBuilder buffer = new StringBuilder();
> + if (withIn1 != withIn2) {
> + //NOTE: Sometimes we get errors when check point is near a
> polygon point.
> + // For the time being, we filter this errors.
> + double d1 = polygon.computeOutsideDistance(DistanceStyle.ARC,
> point);
> + double d2 =
> largePolygon.computeOutsideDistance(DistanceStyle.ARC, point);
> + if (d1 == 0 && d2 == 0) {
> + continue;
> + }
> + buffer = buffer.append("\nStandard polygon: " +
> polygon.toString() +"\n");
> + buffer = buffer.append("\nLarge polygon: " +
> largePolygon.toString() +"\n");
> + buffer = buffer.append("\nPoint: " + point.toString() +"\n");
> + buffer.append("\nWKT: " + getWKT(orderedPoints));
> + buffer.append("\nWKT: POINT(" +
> Math.toDegrees(point.getLongitude()) + " " +
> Math.toDegrees(point.getLatitude()) + ")\n");
> + buffer.append("normal polygon: " +withIn1 + "\n");
> + buffer.append("large polygon: " + withIn2 + "\n");
> + }
> + assertTrue(buffer.toString(), withIn1 == withIn2);
> + }
> + //Not yet tested
> +// for(int i=0;i<100;i++) {
> +// GeoShape shape = randomGeoShape(randomShapeType(), planetModel);
> +// int rel1 = polygon.getRelationship(shape);
> +// int rel2 = largePolygon.getRelationship(shape);
> +// StringBuilder buffer = new StringBuilder();
> +// if (rel1 != rel2) {
> +// buffer = buffer.append(polygon.toString() +"\n" +
> shape.toString() + "\n");
> +// buffer.append("WKT: " + getWKT(orderedPoints) + "\n");
> +// buffer.append("normal polygon: " + rel1 + "\n");
> +// buffer.append("large polygon: " + rel2 + "\n");
> +// }
> +// assertTrue(buffer.toString(), rel1 == rel2);
> +// }
> + }
> +
> + private GeoPoint getBiasedPoint(PlanetModel planetModel) {
> + double lat = BiasedNumbers.randomDoubleBetween(random(), 0, Math.PI /
> 2);
> + if (random().nextBoolean()) {
> + lat = (-1) * lat;
> + }
> + double lon = BiasedNumbers.randomDoubleBetween(random(), 0, Math.PI);
> + if (random().nextBoolean()) {
> + lon = (-1) * lon;
> + }
> + return new GeoPoint(planetModel, lat, lon);
> + }
> +
> + private String getWKT(List<GeoPoint> points) {
> + StringBuffer buffer = new StringBuffer("POLYGON((");
> + for (GeoPoint point : points) {
> + buffer.append(Math.toDegrees(point.getLongitude()) + " " +
> Math.toDegrees(point.getLatitude()) + ",");
> + }
> + buffer.append(Math.toDegrees(points.get(0).getLongitude()) + " " +
> Math.toDegrees(points.get(0).getLatitude()) + "))\n");
> + return buffer.toString();
> + }
> +
> + private boolean contains(GeoPoint p, List<GeoPoint> points) {
> + for (GeoPoint point : points) {
> + if (point.isNumericallyIdentical(p)) {
> + return true;
> + }
> + }
> + return false;
> + }
> }
>
>
[2/2] lucene-solr:master: Merge branch 'master' of
https://git-wip-us.apache.org/repos/asf/lucene-solr
Posted by kw...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/lucene-solr
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b65229c9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b65229c9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b65229c9
Branch: refs/heads/master
Commit: b65229c90479cf3b798759a02dee6120564c28c7
Parents: 661fdf3 d45211d
Author: Karl Wright <Da...@gmail.com>
Authored: Tue Apr 10 06:57:34 2018 -0400
Committer: Karl Wright <Da...@gmail.com>
Committed: Tue Apr 10 06:57:34 2018 -0400
----------------------------------------------------------------------
.../Geo3dShapeWGS84ModelRectRelationTest.java | 2 +-
solr/CHANGES.txt | 3 +
solr/bin/solr | 6 +
solr/bin/solr.cmd | 17 +-
solr/bin/solr.in.cmd | 11 ++
solr/bin/solr.in.sh | 11 ++
.../util/configuration/SSLConfigurations.java | 94 ++++++---
.../configuration/SSLConfigurationsFactory.java | 2 +-
.../configuration/SSLCredentialProvider.java | 36 ++++
.../SSLCredentialProviderFactory.java | 93 +++++++++
.../AbstractSSLCredentialProvider.java | 56 ++++++
.../providers/EnvSSLCredentialProvider.java | 72 +++++++
.../providers/HadoopSSLCredentialProvider.java | 66 +++++++
.../providers/SysPropSSLCredentialProvider.java | 38 ++++
.../configuration/providers/package-info.java | 23 +++
.../TestSubQueryTransformerDistrib.java | 1 +
.../configuration/SSLConfigurationsTest.java | 195 ++++++++++++++++---
.../SSLCredentialProviderFactoryTest.java | 90 +++++++++
.../providers/EnvSSLCredentialProviderTest.java | 61 ++++++
.../HadoopSSLCredentialProviderTest.java | 74 +++++++
.../SysPropSSLCredentialProviderTest.java | 66 +++++++
solr/server/etc/jetty-ssl.xml | 8 +-
.../solrj/io/eval/CorrelationEvaluator.java | 2 +-
.../client/solrj/io/eval/DistanceEvaluator.java | 7 +-
.../client/solrj/io/eval/EBEAddEvaluator.java | 9 +-
.../solrj/io/eval/EBESubtractEvaluator.java | 9 +-
.../solrj/io/eval/MatrixMultiplyEvaluator.java | 16 +-
.../solrj/io/eval/SumColumnsEvaluator.java | 15 +-
.../solrj/io/eval/TransposeEvaluator.java | 4 +-
29 files changed, 994 insertions(+), 93 deletions(-)
----------------------------------------------------------------------