I didn't forget, precisely. I used git commit -a and it didn't pick up the file (for some reason as yet undetermined) and I didn't catch it. Fixed now (via explicit git add).
Karl On Mon, Sep 11, 2017 at 9:40 AM, Adrien Grand <[email protected]> wrote: > Karl, did you forget to git add RandomGeo3dShapeGenerator? > > Le lun. 11 sept. 2017 à 15:01, <[email protected]> a écrit : > >> Repository: lucene-solr >> Updated Branches: >> refs/heads/master 64d142858 -> cd425d609 >> >> >> LUCENE-7906: Add new shapes to testing paradigm. Committed on behalf of >> Ignacio Vera. >> >> >> Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo >> Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ >> cd425d60 >> Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/cd425d60 >> Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/cd425d60 >> >> Branch: refs/heads/master >> Commit: cd425d609cee8bcea6dbfeab8b3d42b1ce48eb40 >> Parents: 64d1428 >> Author: Karl Wright <[email protected]> >> Authored: Mon Sep 11 09:00:47 2017 -0400 >> Committer: Karl Wright <[email protected]> >> Committed: Mon Sep 11 09:00:47 2017 -0400 >> >> ---------------------------------------------------------------------- >> .../spatial3d/geom/RandomBinaryCodecTest.java | 10 +- >> .../spatial3d/geom/RandomGeoShapeGenerator.java | 944 >> ------------------- >> .../geom/RandomGeoShapeRelationshipTest.java | 65 +- >> 3 files changed, 53 insertions(+), 966 deletions(-) >> ---------------------------------------------------------------------- >> >> >> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ >> cd425d60/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/ >> RandomBinaryCodecTest.java >> ---------------------------------------------------------------------- >> diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/ >> geom/RandomBinaryCodecTest.java b/lucene/spatial3d/src/test/ >> org/apache/lucene/spatial3d/geom/RandomBinaryCodecTest.java >> index ba9ee6e..250b652 100644 >> --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/ >> geom/RandomBinaryCodecTest.java >> +++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/ >> geom/RandomBinaryCodecTest.java >> @@ -27,18 +27,18 @@ import org.junit.Test; >> /** >> * Test to check Serialization >> */ >> -public class RandomBinaryCodecTest extends RandomGeoShapeGenerator{ >> +public class RandomBinaryCodecTest extends RandomGeo3dShapeGenerator { >> >> @Test >> @Repeat(iterations = 10) >> public void testRandomPointCodec() throws IOException{ >> PlanetModel planetModel = randomPlanetModel(); >> - GeoPoint shape = randomGeoPoint(planetModel, getEmptyConstraint()); >> + GeoPoint shape = randomGeoPoint(planetModel); >> ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); >> SerializableObject.writeObject(outputStream, shape); >> ByteArrayInputStream inputStream = new ByteArrayInputStream( >> outputStream.toByteArray()); >> SerializableObject shapeCopy = >> SerializableObject.readObject(planetModel, >> inputStream); >> - assertEquals(shape, shapeCopy); >> + assertEquals(shape.toString(), shape, shapeCopy); >> } >> >> @Test >> @@ -51,7 +51,7 @@ public class RandomBinaryCodecTest extends >> RandomGeoShapeGenerator{ >> SerializableObject.writePlanetObject(outputStream, shape); >> ByteArrayInputStream inputStream = new ByteArrayInputStream( >> outputStream.toByteArray()); >> SerializableObject shapeCopy = SerializableObject. >> readPlanetObject(inputStream); >> - assertEquals(shape, shapeCopy); >> + assertEquals(shape.toString(), shape, shapeCopy); >> } >> >> @Test >> @@ -64,6 +64,6 @@ public class RandomBinaryCodecTest extends >> RandomGeoShapeGenerator{ >> SerializableObject.writeObject(outputStream, shape); >> ByteArrayInputStream inputStream = new ByteArrayInputStream( >> outputStream.toByteArray()); >> SerializableObject shapeCopy = >> SerializableObject.readObject(planetModel, >> inputStream); >> - assertEquals(shape, shapeCopy); >> + assertEquals(shape.toString(), shape, shapeCopy); >> } >> } >> >> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ >> cd425d60/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/ >> RandomGeoShapeGenerator.java >> ---------------------------------------------------------------------- >> diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/ >> geom/RandomGeoShapeGenerator.java b/lucene/spatial3d/src/test/ >> org/apache/lucene/spatial3d/geom/RandomGeoShapeGenerator.java >> deleted file mode 100644 >> index ca7aecd..0000000 >> --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/ >> geom/RandomGeoShapeGenerator.java >> +++ /dev/null >> @@ -1,944 +0,0 @@ >> -/* >> -* Licensed to the Apache Software Foundation (ASF) under one or more >> -* contributor license agreements. See the NOTICE file distributed with >> -* this work for additional information regarding copyright ownership. >> -* The ASF licenses this file to You under the Apache License, Version 2.0 >> -* (the "License"); you may not use this file except in compliance with >> -* the License. You may obtain a copy of the License at >> -* >> -* http://www.apache.org/licenses/LICENSE-2.0 >> -* >> -* Unless required by applicable law or agreed to in writing, software >> -* distributed under the License is distributed on an "AS IS" BASIS, >> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >> implied. >> -* See the License for the specific language governing permissions and >> -* limitations under the License. >> -*/ >> - >> -package org.apache.lucene.spatial3d.geom; >> - >> -import java.util.ArrayList; >> -import java.util.Collections; >> -import java.util.Comparator; >> -import java.util.HashMap; >> -import java.util.List; >> - >> -import org.apache.lucene.util.LuceneTestCase; >> - >> -import static com.carrotsearch.randomizedtesting. >> RandomizedTest.randomDouble; >> - >> -/** >> - * Class for generating random Geo3dShapes. They can be generated under >> - * given constraints which are expressed as a shape and a relationship. >> - * >> - * note that convexity for polygons is defined as polygons that contains >> - * antipodal points, otherwise they are convex. Internally they can be >> - * created using GeoConvexPolygons and GeoConcavePolygons. >> - * >> - */ >> -public class RandomGeoShapeGenerator extends LuceneTestCase { >> - >> - /* Max num of iterations to find right shape under given constrains */ >> - final private static int MAX_SHAPE_ITERATIONS = 50; >> - /* Max num of iterations to find right point under given constrains */ >> - final private static int MAX_POINT_ITERATIONS = 1000; >> - >> - /* Supported shapes */ >> - final protected static int CONVEX_POLYGON = 0; >> - final protected static int CONVEX_POLYGON_WITH_HOLES = 1; >> - final protected static int CONCAVE_POLYGON = 2; >> - final protected static int CONCAVE_POLYGON_WITH_HOLES = 3; >> - final protected static int COMPLEX_POLYGON = 4; >> - final protected static int CIRCLE = 5; >> - final protected static int RECTANGLE = 6; >> - final protected static int PATH = 7; >> - final protected static int COLLECTION = 8; >> - >> - /* Helper shapes for generating constraints whch are just three sided >> polygons */ >> - final protected static int CONVEX_SIMPLE_POLYGON = 500; >> - final protected static int CONCAVE_SIMPLE_POLYGON = 501; >> - >> - >> - /** >> - * Method that returns empty Constraints object.. >> - * >> - * @return an empty Constraints object >> - */ >> - public Constraints getEmptyConstraint(){ >> - return new Constraints(); >> - } >> - >> - /** >> - * Method that returns a random generated a random Shape code from all >> - * supported shapes. >> - * >> - * @return a random generated shape code >> - */ >> - public int randomShapeType(){ >> - return random().nextInt(9); >> - } >> - >> - /** >> - * Method that returns a random generated a random Shape code from all >> - * convex supported shapes. >> - * >> - * @return a random generated convex shape code >> - */ >> - public int randomConvexShapeType(){ >> - int shapeType = randomShapeType(); >> - while (isConcave(shapeType)){ >> - shapeType = randomShapeType(); >> - } >> - return shapeType; >> - } >> - >> - /** >> - * Method that returns a random generated a random Shape code from all >> - * concave supported shapes. >> - * >> - * @return a random generated concave shape code >> - */ >> - public int randomConcaveShapeType(){ >> - int shapeType = randomShapeType(); >> - while (!isConcave(shapeType)){ >> - shapeType = randomShapeType(); >> - } >> - return shapeType; >> - } >> - >> - /** >> - * Method that returns a random generated GeoAreaShape code from all >> - * supported GeoAreaShapes. >> - * >> - * We are removing Collections because it is difficult to create shapes >> - * with properties in some cases. >> - * >> - * @return a random generated polygon code >> - */ >> - public int randomGeoAreaShapeType(){ >> - return random().nextInt(8); >> - } >> - >> - /** >> - * Check if a shape code represents a concave shape >> - * >> - * @return true if the shape represented by the code is concave >> - */ >> - public boolean isConcave(int shapeType){ >> - return (shapeType == CONCAVE_POLYGON); >> - } >> - >> - /** >> - * Method that returns a random generated Planet model from the >> supported >> - * Planet models. currently SPHERE and WGS84 >> - * >> - * @return a random generated Planet model >> - */ >> - public PlanetModel randomPlanetModel() { >> - final int shapeType = random().nextInt(2); >> - switch (shapeType) { >> - case 0: { >> - return PlanetModel.SPHERE; >> - } >> - case 1: { >> - return PlanetModel.WGS84; >> - } >> - default: >> - throw new IllegalStateException("Unexpected planet model"); >> - } >> - } >> - >> - /** >> - * Method that returns a random generated GeoPoint under given >> constraints. Returns >> - * NULL if it cannot find a point under the given constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPoint. >> - */ >> - public GeoPoint randomGeoPoint(PlanetModel planetModel, Constraints >> constraints) { >> - int iterations = 0; >> - while (iterations < MAX_POINT_ITERATIONS) { >> - double lat = randomDouble(); >> - if (Math.PI/2 - Math.abs(lat) <0){ >> - continue; >> - } >> - double lon = randomDouble(); >> - if (Math.PI - Math.abs(lat) <0){ >> - continue; >> - } >> - iterations++; >> - GeoPoint point = new GeoPoint(planetModel, lat, lon); >> - if (constraints.isWithin(point)) { >> - return point; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated GeoAreaShape. >> - * >> - * @param shapeType The GeoAreaShape code. >> - * @param planetModel The planet model. >> - * @return The random generated GeoAreaShape. >> - */ >> - public GeoAreaShape randomGeoAreaShape(int shapeType, PlanetModel >> planetModel){ >> - GeoAreaShape geoAreaShape = null; >> - while (geoAreaShape == null){ >> - geoAreaShape = randomGeoAreaShape(shapeType,planetModel,new >> Constraints()); >> - } >> - return geoAreaShape; >> - } >> - >> - /** >> - * Method that returns a random generated GeoAreaShape under given >> constraints. Returns >> - * NULL if it cannot build the GeoAreaShape under the given >> constraints. >> - * >> - * @param shapeType The GeoAreaShape code. >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoAreaShape. >> - */ >> - public GeoAreaShape randomGeoAreaShape(int shapeType, PlanetModel >> planetModel, Constraints constraints){ >> - return (GeoAreaShape)randomGeoShape(shapeType, planetModel, >> constraints); >> - } >> - >> - /** >> - * Method that returns a random generated GeoShape. >> - * >> - * @param shapeType The shape code. >> - * @param planetModel The planet model. >> - * @return The random generated GeoShape. >> - */ >> - public GeoShape randomGeoShape(int shapeType, PlanetModel planetModel){ >> - GeoShape geoShape = null; >> - while (geoShape == null){ >> - geoShape = randomGeoShape(shapeType,planetModel,new >> Constraints()); >> - } >> - return geoShape; >> - } >> - >> - /** >> - * Method that returns a random generated GeoShape under given >> constraints. Returns >> - * NULL if it cannot build the GeoShape under the given constraints. >> - * >> - * @param shapeType The polygon code. >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoShape. >> - */ >> - public GeoShape randomGeoShape(int shapeType, PlanetModel planetModel, >> Constraints constraints){ >> - switch (shapeType) { >> - case CONVEX_POLYGON: { >> - return convexPolygon(planetModel, constraints); >> - } >> - case CONVEX_POLYGON_WITH_HOLES: { >> - return convexPolygonWithHoles(planetModel, constraints); >> - } >> - case CONCAVE_POLYGON: { >> - return concavePolygon(planetModel, constraints); >> - } >> - case CONCAVE_POLYGON_WITH_HOLES: { >> - return concavePolygonWithHoles(planetModel, constraints); >> - } >> - case COMPLEX_POLYGON: { >> - return complexPolygon(planetModel, constraints); >> - } >> - case CIRCLE: { >> - return circle(planetModel, constraints); >> - } >> - case RECTANGLE: { >> - return rectangle(planetModel, constraints); >> - } >> - case PATH: { >> - return path(planetModel, constraints); >> - } >> - case COLLECTION: { >> - return collection(planetModel, constraints); >> - } >> - case CONVEX_SIMPLE_POLYGON: { >> - return simpleConvexPolygon(planetModel, constraints); >> - } >> - case CONCAVE_SIMPLE_POLYGON: { >> - return concaveSimplePolygon(planetModel, constraints); >> - } >> - default: >> - throw new IllegalStateException("Unexpected shape type"); >> - } >> - } >> - >> - /** >> - * Method that returns a random generated a GeoCircle under given >> constraints. Returns >> - * NULL if it cannot build the GeoCircle under the given constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoCircle. >> - */ >> - private GeoCircle circle(PlanetModel planetModel , Constraints >> constraints) { >> - int iterations=0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - final GeoPoint center = randomGeoPoint(planetModel, constraints); >> - if (center == null){ >> - continue; >> - } >> - final double radius = randomCutoffAngle(); >> - try { >> - >> - GeoCircle circle = GeoCircleFactory.makeGeoCircle(planetModel, >> center.getLatitude(), center.getLongitude(), radius); >> - if (!constraints.valid(circle)) { >> - continue; >> - } >> - return circle; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a GeoBBox under given >> constraints. Returns >> - * NULL if it cannot build the GeoBBox under the given constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoBBox. >> - */ >> - private GeoBBox rectangle(PlanetModel planetModel, Constraints >> constraints) { >> - >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - final GeoPoint point1 = randomGeoPoint(planetModel, constraints); >> - if (point1 == null){ >> - continue; >> - } >> - final GeoPoint point2 = randomGeoPoint(planetModel, constraints); >> - if (point2 == null){ >> - continue; >> - } >> - >> - double minLat = Math.min(point1.getLatitude(), >> point2.getLatitude()); >> - double maxLat = Math.max(point1.getLatitude(), >> point2.getLatitude()); >> - double minLon = Math.min(point1.getLongitude(), >> point2.getLongitude()); >> - double maxLon = Math.max(point1.getLongitude(), >> point2.getLongitude()); >> - >> - try { >> - GeoBBox bbox = GeoBBoxFactory.makeGeoBBox(planetModel, maxLat, >> minLat, minLon, maxLon); >> - if (!constraints.valid(bbox)) { >> - continue; >> - } >> - return bbox; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a GeoPath under given >> constraints. Returns >> - * NULL if it cannot build the GeoPath under the given constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPath. >> - */ >> - private GeoPath path(PlanetModel planetModel, Constraints constraints) >> { >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - int vertexCount = random().nextInt(2) + 2; >> - List<GeoPoint> geoPoints = points(vertexCount, planetModel, >> constraints); >> - double width =randomCutoffAngle(); >> - try { >> - GeoPath path = GeoPathFactory.makeGeoPath(planetModel, width, >> geoPoints.toArray(new GeoPoint[geoPoints.size()])); >> - if (!constraints.valid(path)) { >> - continue; >> - } >> - return path; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a >> GeoCompositeMembershipShape under given constraints. Returns >> - * NULL if it cannot build the GGeoCompositeMembershipShape under the >> given constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoCompositeMembershipShape. >> - */ >> - private GeoCompositeAreaShape collection(PlanetModel planetModel, >> Constraints constraints) { >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - int numberShapes = random().nextInt(3) + 2; >> - GeoCompositeAreaShape collection = new GeoCompositeAreaShape( >> planetModel); >> - for(int i=0; i<numberShapes;i++){ >> - GeoPolygon member = convexPolygon(planetModel, constraints); >> - if (member != null){ >> - collection.addShape(member); >> - } >> - } >> - if (collection.shapes.size() ==0){ >> - continue; >> - } >> - return collection; >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a convex GeoPolygon under >> given constraints. Returns >> - * NULL if it cannot build the GePolygon under the given constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon convexPolygon(PlanetModel planetModel, Constraints >> constraints) { >> - int vertexCount = random().nextInt(4) + 3; >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >> constraints); >> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >> - try { >> - GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, >> orderedGeoPoints); >> - if (!constraints.valid(polygon) || isConcave(planetModel, >> polygon)) { >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a convex GeoPolygon with >> holes under given constraints. Returns >> - * NULL if it cannot build the GeoPolygon with holes under the given >> constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon convexPolygonWithHoles(PlanetModel planetModel, >> Constraints constraints) { >> - int vertexCount = random().nextInt(4) + 3; >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >> constraints); >> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >> - try { >> - GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, >> orderedGeoPoints); >> - //polygon should comply with all constraints except disjoint as >> we have holes >> - Constraints polygonConstraints = new Constraints(); >> - polygonConstraints.putAll(constraints.getContains()); >> - polygonConstraints.putAll(constraints.getWithin()); >> - polygonConstraints.putAll(constraints.getDisjoint()); >> - if (!polygonConstraints.valid(polygon) || >> isConcave(planetModel, polygon)){ >> - continue; >> - } >> - //hole must overlap with polygon and comply with any CONTAINS >> constraint. >> - Constraints holeConstraints = new Constraints(); >> - holeConstraints.putAll(constraints.getContains()); >> - holeConstraints.put(polygon,GeoArea.OVERLAPS); >> - //Points must be with in the polygon and must comply >> - // CONTAINS and DISJOINT constraints >> - Constraints pointsConstraints = new Constraints(); >> - pointsConstraints.put(polygon,GeoArea.WITHIN); >> - pointsConstraints.putAll(constraints.getContains()); >> - pointsConstraints.putAll(constraints.getDisjoint()); >> - List<GeoPolygon> holes = concavePolygonHoles(planetModel, >> holeConstraints, pointsConstraints); >> - //we should have at least one hole >> - if (holes.size() == 0){ >> - continue; >> - } >> - polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, >> orderedGeoPoints,holes); >> - if (!constraints.valid(polygon) || isConcave(planetModel, >> polygon)){ >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random list if concave GeoPolygons under >> given constraints. Method >> - * use to generate convex holes. Note that constraints for points and >> holes are different, >> - * >> - * @param planetModel The planet model. >> - * @param holeConstraints The given constraints that a hole must >> comply. >> - * @param pointConstraints The given constraints that a point must >> comply. >> - * @return The random generated GeoPolygon. >> - */ >> - private List<GeoPolygon> concavePolygonHoles(PlanetModel planetModel, >> - Constraints >> holeConstraints, >> - Constraints >> pointConstraints) { >> - int iterations =0; >> - int holesCount = random().nextInt(3) + 1; >> - List<GeoPolygon> holes = new ArrayList<>(); >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - int vertexCount = random().nextInt(3) + 3; >> - List<GeoPoint> geoPoints = points(vertexCount, planetModel, >> pointConstraints); >> - geoPoints = orderPoints(geoPoints); >> - Collections.reverse(geoPoints); >> - try { >> - GeoPolygon hole = GeoPolygonFactory.makeGeoPolygon(planetModel, >> geoPoints); >> - if (!holeConstraints.valid(hole) || isConvex(planetModel, hole)) >> { >> - continue; >> - } >> - holes.add(hole); >> - if (holes.size() == holesCount){ >> - return holes; >> - } >> - pointConstraints.put(hole, GeoArea.DISJOINT); >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return holes; >> - } >> - >> - /** >> - * Method that returns a random generated a concave GeoPolygon under >> given constraints. Returns >> - * NULL if it cannot build the concave GeoPolygon under the given >> constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon concavePolygon(PlanetModel planetModel, Constraints >> constraints) { >> - >> - int vertexCount = random().nextInt(4) + 3; >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >> constraints); >> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >> - Collections.reverse(orderedGeoPoints); >> - try { >> - GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, >> orderedGeoPoints); >> - if (!constraints.valid(polygon) || isConvex(planetModel, >> polygon)) { >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a concave GeoPolygon with >> holes under given constraints. Returns >> - * NULL if it cannot build the GeoPolygon under the given constraints. >> Note that the final GeoPolygon is >> - * convex as the hole wraps the convex GeoPolygon. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon concavePolygonWithHoles(PlanetModel planetModel, >> Constraints constraints) { >> - int vertexCount = random().nextInt(4) + 3; >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - //we first build the hole. We consider all constraints except >> - // disjoint as we have a hole >> - Constraints holeConstraints = new Constraints(); >> - holeConstraints.putAll(constraints.getContains()); >> - holeConstraints.putAll(constraints.getWithin()); >> - holeConstraints.putAll(constraints.getOverlaps()); >> - GeoPolygon hole = convexPolygon(planetModel, holeConstraints); >> - if (hole == null){ >> - continue; >> - } >> - // Now we get points for polygon. Must we with in the hole >> - // and we add contain constraints >> - Constraints pointConstraints = new Constraints(); >> - pointConstraints.put(hole, GeoArea.WITHIN); >> - pointConstraints.putAll(constraints.getContains()); >> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >> pointConstraints); >> - List<GeoPoint> orderedGeoPoints = orderPoints(geoPoints); >> - Collections.reverse(orderedGeoPoints); >> - try { >> - GeoPolygon polygon = GeoPolygonFactory.makeGeoPolygon(planetModel, >> orderedGeoPoints, Collections.singletonList(hole)); >> - //final polygon must be convex >> - if (!constraints.valid(polygon) || isConcave(planetModel,polygon)) >> { >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated complex GeoPolygon under >> given constraints. Returns >> - * NULL if it cannot build the complex GeoPolygon under the given >> constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon complexPolygon(PlanetModel planetModel, Constraints >> constraints) { >> - int polygonsCount =random().nextInt(2) + 1; >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - List<GeoPolygonFactory.PolygonDescription> polDescription = new >> ArrayList<>(); >> - while(polDescription.size() < polygonsCount){ >> - int vertexCount = random().nextInt(14) + 3; >> - List<GeoPoint> geoPoints = points(vertexCount,planetModel, >> constraints); >> - orderPoints(geoPoints); >> - polDescription.add(new GeoPolygonFactory. >> PolygonDescription(geoPoints)); >> - } >> - try { >> - GeoPolygon polygon = GeoPolygonFactory.makeLargeGeoPolygon( >> planetModel,polDescription); >> - if (!constraints.valid(polygon)) { >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a concave square GeoPolygon >> under given constraints. Returns >> - * NULL if it cannot build the concave GeoPolygon under the given >> constraints. This shape is an utility >> - * to build constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon simpleConvexPolygon(PlanetModel planetModel, >> Constraints constraints) { >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - List<GeoPoint> points = points(3,planetModel,constraints); >> - points = orderPoints(points); >> - try { >> - GeoPolygon polygon = >> GeoPolygonFactory.makeGeoConvexPolygon(planetModel, >> points); >> - if(!constraints.valid(polygon) || isConcave(planetModel,polygon) >> ){ >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random generated a convex square GeoPolygon >> under given constraints. Returns >> - * NULL if it cannot build the convex GeoPolygon under the given >> constraints. This shape is an utility >> - * to build constraints. >> - * >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated GeoPolygon. >> - */ >> - private GeoPolygon concaveSimplePolygon(PlanetModel planetModel, >> Constraints constraints) { >> - int iterations = 0; >> - while (iterations < MAX_SHAPE_ITERATIONS) { >> - iterations++; >> - List<GeoPoint> points = points(3, planetModel, constraints); >> - points = orderPoints(points); >> - Collections.reverse(points); >> - try { >> - GeoPolygon polygon = >> GeoPolygonFactory.makeGeoConcavePolygon(planetModel, >> points); >> - if(!constraints.valid(polygon) || isConvex(planetModel, >> polygon)){ >> - continue; >> - } >> - return polygon; >> - } catch (IllegalArgumentException e) { >> - continue; >> - } >> - } >> - return null; >> - } >> - >> - /** >> - * Method that returns a random list of generated GeoPoints under >> given constraints. If it cannot >> - * find a point it will add a point that might not comply with the >> constraints. >> - * >> - * @param count The number of points >> - * @param planetModel The planet model. >> - * @param constraints The given constraints. >> - * @return The random generated List of GeoPoints. >> - */ >> - private List<GeoPoint> points(int count, PlanetModel planetModel, >> Constraints constraints){ >> - List<GeoPoint> geoPoints = new ArrayList<>(count); >> - for(int i= 0; i< count; i++) { >> - GeoPoint point = randomGeoPoint(planetModel, constraints); >> - if (point == null){ >> - point = randomGeoPoint(planetModel, new Constraints()); >> - } >> - geoPoints.add(point); >> - } >> - return geoPoints; >> - } >> - >> - /** >> - * Check if a GeoPolygon is pure concave. Note that our definition for >> concavity is that the polygon >> - * contains antipodal points. >> - * >> - * @param planetModel The planet model. >> - * @param shape The polygon to check. >> - * @return True if the polygon contains antipodal points. >> - */ >> - private boolean isConcave(PlanetModel planetModel, GeoPolygon shape){ >> - return (shape.isWithin(planetModel.NORTH_POLE) && >> shape.isWithin(planetModel.SOUTH_POLE))|| >> - (shape.isWithin(planetModel.MAX_X_POLE) && >> shape.isWithin(planetModel.MIN_X_POLE)) || >> - (shape.isWithin(planetModel.MAX_Y_POLE) && >> shape.isWithin(planetModel.MIN_Y_POLE)); >> - } >> - >> - /** >> - * Check if a GeoPolygon is pure convex. Note that our definition for >> convexity is that the polygon >> - * does not contain antipodal points. >> - * >> - * @param planetModel The planet model. >> - * @param shape The polygon to check. >> - * @return True if the polygon dies not contains antipodal points. >> - */ >> - private boolean isConvex(PlanetModel planetModel, GeoPolygon shape){ >> - return !isConcave(planetModel,shape); >> - } >> - >> - /** >> - * Generates a random number between 0 and PI. >> - * >> - * @return the cutoff angle. >> - */ >> - private double randomCutoffAngle() { >> - while(true) { >> - double radius = randomDouble(); >> - if (radius <0 || radius > Math.PI){ >> - continue; >> - } >> - return radius; >> - } >> - } >> - >> - /** >> - * Method that orders a lit of points anti-clock-wise to prevent >> crossing edges. >> - * >> - * @param originalPoints The points to order. >> - * @return The list of ordered points anti-clockwise. >> - */ >> - private List<GeoPoint> orderPoints(List<GeoPoint> originalPoints){ >> - List<GeoPoint> points = new ArrayList<>(originalPoints.size()); >> - points.addAll(originalPoints); //make a copy >> - GeoPoint lPoint = getPointLefLon(points); >> - points.remove(lPoint); >> - GeoPoint rPoint = getPointRigthLon(points); >> - points.remove(rPoint); >> - List<GeoPoint> APoints = getPointsBelowAndSort(points, lPoint); >> - List<GeoPoint> BPoints = getPointsAboveAndsort(points, lPoint); >> - List<GeoPoint> result = new ArrayList<>(); >> - result.add(lPoint); >> - result.addAll(APoints); >> - result.add(rPoint); >> - result.addAll(BPoints); >> - return result; >> - } >> - >> - private List<GeoPoint> getPointsAboveAndsort(List<GeoPoint> >> points,GeoPoint lPoint) { >> - List<GeoPoint> BPoints = new ArrayList<>(); >> - for (GeoPoint point : points){ >> - if(point.getLatitude() > lPoint.getLatitude()){ >> - BPoints.add(point); >> - } >> - } >> - Collections.sort(BPoints, new Comparator<GeoPoint>() { >> - public int compare(GeoPoint idx1, GeoPoint idx2) { >> - return Double.compare(idx1.getLongitude(), idx2.getLongitude()); >> - } >> - }); >> - return BPoints; >> - } >> - >> - private List<GeoPoint> getPointsBelowAndSort(List<GeoPoint> >> points,GeoPoint lPoint) { >> - List<GeoPoint> APoints = new ArrayList<>(); >> - for (GeoPoint point : points){ >> - if(point.getLatitude() < lPoint.getLatitude()){ >> - APoints.add(point); >> - } >> - } >> - Collections.sort(APoints, new Comparator<GeoPoint>() { >> - public int compare(GeoPoint idx1, GeoPoint idx2) { >> - return Double.compare(idx1.getLongitude(), idx2.getLongitude()); >> - } >> - }); >> - return APoints; >> - } >> - >> - private GeoPoint getPointLefLon(List<GeoPoint> points) { >> - GeoPoint lPoint = null; >> - for (GeoPoint point : points){ >> - if(lPoint == null ){ >> - lPoint = point; >> - } >> - else{ >> - if (lPoint.getLongitude() > point.getLongitude()){ >> - lPoint = point; >> - } >> - } >> - } >> - return lPoint; >> - } >> - >> - private GeoPoint getPointRigthLon(List<GeoPoint> points) { >> - GeoPoint rPoint = null; >> - for (GeoPoint point : points){ >> - if(rPoint == null ){ >> - rPoint = point; >> - } >> - else{ >> - if (rPoint.getLongitude() < point.getLongitude()){ >> - rPoint = point; >> - } >> - } >> - } >> - return rPoint; >> - } >> - >> - /** >> - * Class that holds the constraints that are given to >> - * build shapes. It consists in a list of GeoAreaShapes >> - * and relationships the new shape needs to satisfy. >> - */ >> - class Constraints extends HashMap<GeoAreaShape, Integer>{ >> - >> - /** >> - * Check if the shape is valid under the constraints. >> - * >> - * @param shape The shape to check >> - * @return true if the shape satisfy the constraints, else false. >> - */ >> - public boolean valid(GeoShape shape) { >> - if (shape == null){ >> - return false; >> - } >> - for (GeoAreaShape constraint : keySet()) { >> - if (constraint.getRelationship(shape) != get(constraint)) { >> - return false; >> - } >> - } >> - return true; >> - } >> - >> - /** >> - * Check if a point is Within the constraints. >> - * >> - * @param point The point to check >> - * @return true if the point satisfy the constraints, else false. >> - */ >> - public boolean isWithin(GeoPoint point) { >> - for (GeoShape constraint : keySet()) { >> - if (!(validPoint(point, constraint, get(constraint)))) { >> - return false; >> - } >> - } >> - return true; >> - } >> - >> - /** >> - * Check if a point is Within one constraint given by a shape and a >> relationship. >> - * >> - * @param point The point to check >> - * @param shape The shape of the constraint >> - * @param relationship The relationship of the constraint. >> - * @return true if the point satisfy the constraint, else false. >> - */ >> - private boolean validPoint(GeoPoint point, GeoShape shape, int >> relationship) { >> - //For GeoCompositeMembershipShape we only consider the first shape >> to help >> - // converging >> - if (relationship == GeoArea.WITHIN && shape instanceof >> GeoCompositeMembershipShape) { >> - shape = (((GeoCompositeMembershipShape) shape).shapes.get(0)); >> - } >> - switch (relationship) { >> - case GeoArea.DISJOINT: >> - return !shape.isWithin(point); >> - case GeoArea.OVERLAPS: >> - return true; >> - case GeoArea.CONTAINS: >> - return !shape.isWithin(point); >> - case GeoArea.WITHIN: >> - return shape.isWithin(point); >> - default: >> - return true; >> - } >> - } >> - >> - /** >> - * Collect the CONTAINS constraints in the object >> - * >> - * @return the CONTAINS constraints. >> - */ >> - public Constraints getContains(){ >> - return getConstraintsOfType(GeoArea.CONTAINS); >> - } >> - >> - /** >> - * Collect the WITHIN constraints in the object >> - * >> - * @return the WITHIN constraints. >> - */ >> - public Constraints getWithin(){ >> - return getConstraintsOfType(GeoArea.WITHIN); >> - } >> - >> - /** >> - * Collect the OVERLAPS constraints in the object >> - * >> - * @return the OVERLAPS constraints. >> - */ >> - public Constraints getOverlaps(){ >> - return getConstraintsOfType(GeoArea.OVERLAPS); >> - } >> - >> - /** >> - * Collect the DISJOINT constraints in the object >> - * >> - * @return the DISJOINT constraints. >> - */ >> - public Constraints getDisjoint(){ >> - return getConstraintsOfType(GeoArea.DISJOINT); >> - } >> - >> - private Constraints getConstraintsOfType(int type){ >> - Constraints constraints = new Constraints(); >> - for (GeoAreaShape constraint : keySet()) { >> - if (type == get(constraint)) { >> - constraints.put(constraint, type); >> - } >> - } >> - return constraints; >> - } >> - } >> -} >> - >> - >> - >> >> http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ >> cd425d60/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/ >> RandomGeoShapeRelationshipTest.java >> ---------------------------------------------------------------------- >> diff --git a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/ >> RandomGeoShapeRelationshipTest.java b/lucene/spatial3d/src/test/ >> org/apache/lucene/spatial3d/geom/RandomGeoShapeRelationshipTest.java >> index 75a8c28..9c791b7 100644 >> --- a/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/ >> RandomGeoShapeRelationshipTest.java >> +++ b/lucene/spatial3d/src/test/org/apache/lucene/spatial3d/geom/ >> RandomGeoShapeRelationshipTest.java >> @@ -23,8 +23,7 @@ import org.junit.Test; >> /** >> * Random test to check relationship between GeoAreaShapes and GeoShapes. >> */ >> -public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> - >> +public class RandomGeoShapeRelationshipTest extends >> RandomGeo3dShapeGenerator { >> >> /** >> * Test for WITHIN points. We build a WITHIN shape with respect the >> geoAreaShape >> @@ -38,6 +37,9 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> int referenceShapeType = CONVEX_POLYGON; >> PlanetModel planetModel = randomPlanetModel(); >> int shapeType = randomShapeType(); >> + while (shapeType == POINT || shapeType == LINE) { >> + shapeType = randomShapeType(); >> + } >> GeoAreaShape shape = null; >> GeoPoint point = null; >> while (point == null) { >> @@ -51,7 +53,10 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> point = randomGeoPoint(planetModel, constraints); >> } >> } >> - assertTrue(shape.isWithin(point)); >> + StringBuilder b = new StringBuilder(); >> + b.append("shape: " + shape + "\n"); >> + b.append("point: " + point); >> + assertTrue(b.toString(), shape.isWithin(point)); >> } >> >> /** >> @@ -78,7 +83,10 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> point = randomGeoPoint(planetModel, constraints); >> } >> } >> - assertFalse(shape.isWithin(point)); >> + StringBuilder b = new StringBuilder(); >> + b.append("shape: " + shape + "\n"); >> + b.append("point: " + point); >> + assertFalse(b.toString(), shape.isWithin(point)); >> } >> >> /** >> @@ -94,7 +102,7 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> int referenceShapeType = CONVEX_SIMPLE_POLYGON; >> PlanetModel planetModel = randomPlanetModel(); >> int geoAreaShapeType = randomGeoAreaShapeType(); >> - int shapeType =randomConvexShapeType(); >> + int shapeType = randomConvexShapeType(); >> >> GeoShape shape = null; >> GeoAreaShape geoAreaShape = null; >> @@ -109,11 +117,14 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> shape = randomGeoShape(shapeType, planetModel, constraints); >> } >> } >> + StringBuilder b = new StringBuilder(); >> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >> + b.append("shape: " + shape); >> int rel = geoAreaShape.getRelationship(shape); >> - assertEquals(GeoArea.DISJOINT, rel); >> + assertEquals(b.toString(), GeoArea.DISJOINT, rel); >> if (shape instanceof GeoArea) { >> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >> - assertEquals(GeoArea.DISJOINT, rel); >> + assertEquals(b.toString(), GeoArea.DISJOINT, rel); >> } >> } >> >> @@ -129,7 +140,11 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> public void testRandomWithIn() { >> PlanetModel planetModel = randomPlanetModel(); >> int geoAreaShapeType = randomGeoAreaShapeType(); >> - int shapeType =randomShapeType(); >> + //shapes cannot be point or line -- no area! >> + while(geoAreaShapeType == POINT || geoAreaShapeType == LINE) { >> + geoAreaShapeType = randomGeoAreaShapeType(); >> + } >> + int shapeType = LINE;//randomShapeType(); >> int referenceShapeType = CONVEX_SIMPLE_POLYGON; >> if (!isConcave(geoAreaShapeType)){ >> shapeType =randomConvexShapeType(); >> @@ -150,11 +165,14 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> shape = randomGeoShape(shapeType, planetModel, constraints); >> } >> } >> + StringBuilder b = new StringBuilder(); >> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >> + b.append("shape: " + shape); >> int rel = geoAreaShape.getRelationship(shape); >> - assertEquals(GeoArea.WITHIN, rel); >> + assertEquals(b.toString(), GeoArea.WITHIN, rel); >> if (shape instanceof GeoArea) { >> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >> - assertEquals(GeoArea.CONTAINS, rel); >> + assertEquals(b.toString(), GeoArea.CONTAINS, rel); >> } >> } >> >> @@ -174,10 +192,13 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> int referenceShapeType = CONVEX_SIMPLE_POLYGON; >> PlanetModel planetModel = randomPlanetModel(); >> int geoAreaShapeType = randomGeoAreaShapeType(); >> - while (geoAreaShapeType == COLLECTION){ >> + while (geoAreaShapeType == COLLECTION ){ >> geoAreaShapeType = randomGeoAreaShapeType(); >> } >> int shapeType = randomShapeType(); >> + while (shapeType == POINT || shapeType == LINE) { >> + shapeType = randomShapeType(); >> + } >> if (isConcave(geoAreaShapeType)){ >> shapeType = randomConcaveShapeType(); >> } >> @@ -197,11 +218,14 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> shape = randomGeoShape(shapeType, planetModel, constraints); >> } >> } >> + StringBuilder b = new StringBuilder(); >> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >> + b.append("shape: " + shape); >> int rel = geoAreaShape.getRelationship(shape); >> - assertEquals(GeoArea.CONTAINS, rel); >> + assertEquals(b.toString(), GeoArea.CONTAINS, rel); >> if (shape instanceof GeoArea) { >> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >> - assertEquals(GeoArea.WITHIN, rel); >> + assertEquals(b.toString(), GeoArea.WITHIN, rel); >> } >> } >> >> @@ -216,8 +240,13 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> public void testRandomOverlaps() { >> PlanetModel planetModel = randomPlanetModel(); >> int geoAreaShapeType = randomGeoAreaShapeType(); >> + while (geoAreaShapeType == POINT || geoAreaShapeType == LINE) { >> + geoAreaShapeType = randomGeoAreaShapeType(); >> + } >> int shapeType = randomShapeType(); >> - >> + while (shapeType == POINT || shapeType == LINE) { >> + shapeType = randomShapeType(); >> + } >> GeoShape shape = null; >> GeoAreaShape geoAreaShape = null; >> while (shape == null) { >> @@ -246,12 +275,14 @@ public class RandomGeoShapeRelationshipTest extends >> RandomGeoShapeGenerator { >> shape = randomGeoShape(shapeType, planetModel, constraints); >> } >> } >> + StringBuilder b = new StringBuilder(); >> + b.append("geoAreaShape: " + geoAreaShape + "\n"); >> + b.append("shape: " + shape); >> int rel = geoAreaShape.getRelationship(shape); >> - assertEquals(GeoArea.OVERLAPS, rel); >> + assertEquals(b.toString(), GeoArea.OVERLAPS, rel); >> if (shape instanceof GeoArea) { >> rel = ((GeoArea)shape).getRelationship(geoAreaShape); >> - assertEquals(GeoArea.OVERLAPS, rel); >> + assertEquals(b.toString(), GeoArea.OVERLAPS, rel); >> } >> } >> } >> - >> >>
