You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2016/03/07 11:22:25 UTC

lucene-solr git commit: LUCENE-7072: always use WGS84 planet model in Geo3DPoint

Repository: lucene-solr
Updated Branches:
  refs/heads/master 6ce6c0131 -> b79067a45


LUCENE-7072: always use WGS84 planet model in Geo3DPoint


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b79067a4
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b79067a4
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b79067a4

Branch: refs/heads/master
Commit: b79067a45687e7e41e7db9980643c00c889c2adc
Parents: 6ce6c01
Author: Mike McCandless <mi...@apache.org>
Authored: Mon Mar 7 05:22:40 2016 -0500
Committer: Mike McCandless <mi...@apache.org>
Committed: Mon Mar 7 05:23:04 2016 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 ++
 .../apache/lucene/geo3d/BasePlanetObject.java   |  5 +++
 .../org/apache/lucene/geo3d/Geo3DPoint.java     | 43 +++++++++-----------
 .../lucene/geo3d/PointInGeo3DShapeQuery.java    | 30 +++++++-------
 .../org/apache/lucene/geo3d/TestGeo3DPoint.java | 25 +++++-------
 5 files changed, 52 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b79067a4/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 909d3ed..16550c6 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -125,6 +125,9 @@ API Changes
 * LUCENE-7064: MultiPhraseQuery is now immutable and should be constructed
   with MultiPhraseQuery.Builder. (Luc Vanlerberghe via Adrien Grand)
 
+* LUCENE-7072: Geo3DPoint always uses WGS84 planet model.
+  (Robert Muir, Mike McCandless)
+
 Optimizations
 
 * LUCENE-6891: Use prefix coding when writing points in 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b79067a4/lucene/spatial3d/src/java/org/apache/lucene/geo3d/BasePlanetObject.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/java/org/apache/lucene/geo3d/BasePlanetObject.java b/lucene/spatial3d/src/java/org/apache/lucene/geo3d/BasePlanetObject.java
index b5e3d28..c64b974 100644
--- a/lucene/spatial3d/src/java/org/apache/lucene/geo3d/BasePlanetObject.java
+++ b/lucene/spatial3d/src/java/org/apache/lucene/geo3d/BasePlanetObject.java
@@ -34,6 +34,11 @@ public abstract class BasePlanetObject {
   public BasePlanetObject(final PlanetModel planetModel) {
     this.planetModel = planetModel;
   }
+
+  /** Returns the {@link PlanetModel} provided when this shape was created. */
+  public PlanetModel getPlanetModel() {
+    return planetModel;
+  }
   
   @Override
   public int hashCode() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b79067a4/lucene/spatial3d/src/java/org/apache/lucene/geo3d/Geo3DPoint.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/java/org/apache/lucene/geo3d/Geo3DPoint.java b/lucene/spatial3d/src/java/org/apache/lucene/geo3d/Geo3DPoint.java
index fbdb00d..cde87f3 100644
--- a/lucene/spatial3d/src/java/org/apache/lucene/geo3d/Geo3DPoint.java
+++ b/lucene/spatial3d/src/java/org/apache/lucene/geo3d/Geo3DPoint.java
@@ -36,8 +36,6 @@ import org.apache.lucene.util.RamUsageEstimator;
  *  @lucene.experimental */
 public final class Geo3DPoint extends Field {
 
-  private final PlanetModel planetModel;
-
   /** Indexing {@link FieldType}. */
   public static final FieldType TYPE = new FieldType();
   static {
@@ -46,16 +44,15 @@ public final class Geo3DPoint extends Field {
   }
 
   /** 
-   * Creates a new Geo3DPoint field with the specified lat, lon (in radians), given a planet model.
+   * Creates a new Geo3DPoint field with the specified lat, lon (in radians).
    *
    * @throws IllegalArgumentException if the field name is null or lat or lon are out of bounds
    */
-  public Geo3DPoint(String name, PlanetModel planetModel, double lat, double lon) {
+  public Geo3DPoint(String name, double lat, double lon) {
     super(name, TYPE);
-    this.planetModel = planetModel;
     // Translate lat/lon to x,y,z:
-    final GeoPoint point = new GeoPoint(planetModel, lat, lon);
-    fillFieldsData(planetModel, point.x, point.y, point.z);
+    final GeoPoint point = new GeoPoint(PlanetModel.WGS84, lat, lon);
+    fillFieldsData(point.x, point.y, point.z);
   }
 
   /** 
@@ -63,40 +60,38 @@ public final class Geo3DPoint extends Field {
    *
    * @throws IllegalArgumentException if the field name is null or lat or lon are out of bounds
    */
-  public Geo3DPoint(String name, PlanetModel planetModel, double x, double y, double z) {
+  public Geo3DPoint(String name, double x, double y, double z) {
     super(name, TYPE);
-    this.planetModel = planetModel;
-    fillFieldsData(planetModel, x, y, z);
+    fillFieldsData(x, y, z);
   }
 
-  private void fillFieldsData(PlanetModel planetModel, double x, double y, double z) {
+  private void fillFieldsData(double x, double y, double z) {
     byte[] bytes = new byte[12];
-    encodeDimension(planetModel, x, bytes, 0);
-    encodeDimension(planetModel, y, bytes, Integer.BYTES);
-    encodeDimension(planetModel, z, bytes, 2*Integer.BYTES);
+    encodeDimension(x, bytes, 0);
+    encodeDimension(y, bytes, Integer.BYTES);
+    encodeDimension(z, bytes, 2*Integer.BYTES);
     fieldsData = new BytesRef(bytes);
   }
 
   // public helper methods (e.g. for queries)
   
   /** Encode single dimension */
-  public static void encodeDimension(PlanetModel planetModel, double value, byte bytes[], int offset) {
-    NumericUtils.intToSortableBytes(Geo3DUtil.encodeValue(planetModel.getMaximumMagnitude(), value), bytes, offset);
+  public static void encodeDimension(double value, byte bytes[], int offset) {
+    NumericUtils.intToSortableBytes(Geo3DUtil.encodeValue(PlanetModel.WGS84.getMaximumMagnitude(), value), bytes, offset);
   }
   
   /** Decode single dimension */
-  public static double decodeDimension(PlanetModel planetModel, byte value[], int offset) {
-    return Geo3DUtil.decodeValueCenter(planetModel.getMaximumMagnitude(), NumericUtils.sortableBytesToInt(value, offset));
+  public static double decodeDimension(byte value[], int offset) {
+    return Geo3DUtil.decodeValueCenter(PlanetModel.WGS84.getMaximumMagnitude(), NumericUtils.sortableBytesToInt(value, offset));
   }
 
   /** Returns a query matching all points inside the provided shape.
    * 
-   * @param planetModel The {@link PlanetModel} to use, which must match what was used during indexing
    * @param field field name. must not be {@code null}.
    * @param shape Which {@link GeoShape} to match
    */
-  public static Query newShapeQuery(PlanetModel planetModel, String field, GeoShape shape) {
-    return new PointInGeo3DShapeQuery(planetModel, field, shape);
+  public static Query newShapeQuery(String field, GeoShape shape) {
+    return new PointInGeo3DShapeQuery(field, shape);
   }
 
   @Override
@@ -108,9 +103,9 @@ public final class Geo3DPoint extends Field {
     result.append(':');
 
     BytesRef bytes = (BytesRef) fieldsData;
-    result.append(" x=" + decodeDimension(planetModel, bytes.bytes, bytes.offset));
-    result.append(" y=" + decodeDimension(planetModel, bytes.bytes, bytes.offset + Integer.BYTES));
-    result.append(" z=" + decodeDimension(planetModel, bytes.bytes, bytes.offset + 2*Integer.BYTES));
+    result.append(" x=" + decodeDimension(bytes.bytes, bytes.offset));
+    result.append(" y=" + decodeDimension(bytes.bytes, bytes.offset + Integer.BYTES));
+    result.append(" z=" + decodeDimension(bytes.bytes, bytes.offset + 2*Integer.BYTES));
     result.append('>');
     return result.toString();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b79067a4/lucene/spatial3d/src/java/org/apache/lucene/geo3d/PointInGeo3DShapeQuery.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/java/org/apache/lucene/geo3d/PointInGeo3DShapeQuery.java b/lucene/spatial3d/src/java/org/apache/lucene/geo3d/PointInGeo3DShapeQuery.java
index 4d81696..9e2132d 100644
--- a/lucene/spatial3d/src/java/org/apache/lucene/geo3d/PointInGeo3DShapeQuery.java
+++ b/lucene/spatial3d/src/java/org/apache/lucene/geo3d/PointInGeo3DShapeQuery.java
@@ -40,14 +40,19 @@ import org.apache.lucene.util.NumericUtils;
 
 class PointInGeo3DShapeQuery extends Query {
   final String field;
-  final PlanetModel planetModel;
   final GeoShape shape;
 
   /** The lats/lons must be clockwise or counter-clockwise. */
-  public PointInGeo3DShapeQuery(PlanetModel planetModel, String field, GeoShape shape) {
+  public PointInGeo3DShapeQuery(String field, GeoShape shape) {
     this.field = field;
-    this.planetModel = planetModel;
     this.shape = shape;
+
+    if (shape instanceof BasePlanetObject) {
+      BasePlanetObject planetObject = (BasePlanetObject) shape;
+      if (planetObject.getPlanetModel().equals(PlanetModel.WGS84) == false) {
+        throw new IllegalArgumentException("this qurey requires PlanetModel.WGS84, but got: " + planetObject.getPlanetModel());
+      }
+    }
   }
 
   @Override
@@ -88,7 +93,7 @@ class PointInGeo3DShapeQuery extends Query {
         assert xyzSolid.getRelationship(shape) == GeoArea.WITHIN || xyzSolid.getRelationship(shape) == GeoArea.OVERLAPS: "expected WITHIN (1) or OVERLAPS (2) but got " + xyzSolid.getRelationship(shape) + "; shape="+shape+"; XYZSolid="+xyzSolid;
         */
 
-        double planetMax = planetModel.getMaximumMagnitude();
+        double planetMax = PlanetModel.WGS84.getMaximumMagnitude();
 
         DocIdSetBuilder result = new DocIdSetBuilder(reader.maxDoc());
 
@@ -103,9 +108,9 @@ class PointInGeo3DShapeQuery extends Query {
                            @Override
                            public void visit(int docID, byte[] packedValue) {
                              assert packedValue.length == 12;
-                             double x = Geo3DPoint.decodeDimension(planetModel, packedValue, 0);
-                             double y = Geo3DPoint.decodeDimension(planetModel, packedValue, Integer.BYTES);
-                             double z = Geo3DPoint.decodeDimension(planetModel, packedValue, 2 * Integer.BYTES);
+                             double x = Geo3DPoint.decodeDimension(packedValue, 0);
+                             double y = Geo3DPoint.decodeDimension(packedValue, Integer.BYTES);
+                             double z = Geo3DPoint.decodeDimension(packedValue, 2 * Integer.BYTES);
                              if (shape.isWithin(x, y, z)) {
                                result.add(docID);
                              }
@@ -129,7 +134,7 @@ class PointInGeo3DShapeQuery extends Query {
                              assert yMin <= yMax;
                              assert zMin <= zMax;
 
-                             GeoArea xyzSolid = GeoAreaFactory.makeGeoArea(planetModel, xMin, xMax, yMin, yMax, zMin, zMax);
+                             GeoArea xyzSolid = GeoAreaFactory.makeGeoArea(PlanetModel.WGS84, xMin, xMax, yMin, yMax, zMin, zMax);
 
                              switch(xyzSolid.getRelationship(shape)) {
                              case GeoArea.CONTAINS:
@@ -165,10 +170,6 @@ class PointInGeo3DShapeQuery extends Query {
     return field;
   }
 
-  public PlanetModel getPlanetModel() {
-    return planetModel;
-  }
-
   public GeoShape getShape() {
     return shape;
   }
@@ -182,13 +183,12 @@ class PointInGeo3DShapeQuery extends Query {
 
     PointInGeo3DShapeQuery that = (PointInGeo3DShapeQuery) o;
 
-    return planetModel.equals(that.planetModel) && shape.equals(that.shape);
+    return shape.equals(that.shape);
   }
 
   @Override
   public final int hashCode() {
     int result = super.hashCode();
-    result = 31 * result + planetModel.hashCode();
     result = 31 * result + shape.hashCode();
     return result;
   }
@@ -203,8 +203,6 @@ class PointInGeo3DShapeQuery extends Query {
       sb.append(this.field);
       sb.append(':');
     }
-    sb.append(" PlanetModel: ");
-    sb.append(planetModel);
     sb.append(" Shape: ");
     sb.append(shape);
     return sb.toString();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b79067a4/lucene/spatial3d/src/test/org/apache/lucene/geo3d/TestGeo3DPoint.java
----------------------------------------------------------------------
diff --git a/lucene/spatial3d/src/test/org/apache/lucene/geo3d/TestGeo3DPoint.java b/lucene/spatial3d/src/test/org/apache/lucene/geo3d/TestGeo3DPoint.java
index 9d00d3e..17a4075 100644
--- a/lucene/spatial3d/src/test/org/apache/lucene/geo3d/TestGeo3DPoint.java
+++ b/lucene/spatial3d/src/test/org/apache/lucene/geo3d/TestGeo3DPoint.java
@@ -106,13 +106,12 @@ public class TestGeo3DPoint extends LuceneTestCase {
     iwc.setCodec(getCodec());
     IndexWriter w = new IndexWriter(dir, iwc);
     Document doc = new Document();
-    doc.add(new Geo3DPoint("field", PlanetModel.WGS84, toRadians(50.7345267), toRadians(-97.5303555)));
+    doc.add(new Geo3DPoint("field", toRadians(50.7345267), toRadians(-97.5303555)));
     w.addDocument(doc);
     IndexReader r = DirectoryReader.open(w);
     // We can't wrap with "exotic" readers because the query must see the BKD3DDVFormat:
     IndexSearcher s = newSearcher(r, false);
-    assertEquals(1, s.search(Geo3DPoint.newShapeQuery(PlanetModel.WGS84,
-                                                      "field",
+    assertEquals(1, s.search(Geo3DPoint.newShapeQuery("field",
                                                       GeoCircleFactory.makeGeoCircle(PlanetModel.WGS84, toRadians(50), toRadians(-97), Math.PI/180.)), 1).totalHits);
     w.close();
     r.close();
@@ -640,8 +639,6 @@ public class TestGeo3DPoint extends LuceneTestCase {
   private static void verify(double[] lats, double[] lons) throws Exception {
     IndexWriterConfig iwc = newIndexWriterConfig();
 
-    PlanetModel planetModel = getPlanetModel();
-
     // Else we can get O(N^2) merging:
     int mbd = iwc.getMaxBufferedDocs();
     if (mbd != -1 && mbd < lats.length/100) {
@@ -662,7 +659,7 @@ public class TestGeo3DPoint extends LuceneTestCase {
       doc.add(newStringField("id", ""+id, Field.Store.NO));
       doc.add(new NumericDocValuesField("id", id));
       if (Double.isNaN(lats[id]) == false) {
-        doc.add(new Geo3DPoint("point", planetModel, lats[id], lons[id]));
+        doc.add(new Geo3DPoint("point", lats[id], lons[id]));
       }
       w.addDocument(doc);
       if (id > 0 && random().nextInt(100) == 42) {
@@ -710,13 +707,13 @@ public class TestGeo3DPoint extends LuceneTestCase {
 
             for (int iter=0;iter<iters && failed.get() == false;iter++) {
 
-              GeoShape shape = randomShape(planetModel);
+              GeoShape shape = randomShape(PlanetModel.WGS84);
 
               if (VERBOSE) {
                 System.err.println("\n" + Thread.currentThread() + ": TEST: iter=" + iter + " shape="+shape);
               }
               
-              Query query = Geo3DPoint.newShapeQuery(planetModel, "point", shape);
+              Query query = Geo3DPoint.newShapeQuery("point", shape);
 
               if (VERBOSE) {
                 System.err.println("  using query: " + query);
@@ -753,10 +750,10 @@ public class TestGeo3DPoint extends LuceneTestCase {
                 if (Double.isNaN(lats[id]) == false) {
 
                   // Accurate point:
-                  GeoPoint point1 = new GeoPoint(planetModel, lats[id], lons[id]);
+                  GeoPoint point1 = new GeoPoint(PlanetModel.WGS84, lats[id], lons[id]);
 
                   // Quantized point (32 bits per dim):
-                  GeoPoint point2 = quantize(planetModel.getMaximumMagnitude(), point1);
+                  GeoPoint point2 = quantize(PlanetModel.WGS84.getMaximumMagnitude(), point1);
 
                   if (shape.isWithin(point1) != shape.isWithin(point2)) {
                     if (VERBOSE) {
@@ -789,13 +786,13 @@ public class TestGeo3DPoint extends LuceneTestCase {
   }
 
   public void testToString() {
-    Geo3DPoint point = new Geo3DPoint("point", PlanetModel.SPHERE, toRadians(44.244272), toRadians(7.769736));
-    assertEquals("Geo3DPoint <point: x=0.9242545719837093 y=0.06276412683667808 z=0.37658219569203544>", point.toString());
+    Geo3DPoint point = new Geo3DPoint("point", toRadians(44.244272), toRadians(7.769736));
+    assertEquals("Geo3DPoint <point: x=0.9248467864160119 y=0.06280434265368656 z=0.37682349005486243>", point.toString());
   }
 
   public void testShapeQueryToString() {
-    assertEquals("PointInGeo3DShapeQuery: field=point: PlanetModel: PlanetModel.SPHERE Shape: GeoStandardCircle: {planetmodel=PlanetModel.SPHERE, center=[lat=0.3861041107739683, lon=0.06780373760536706], radius=0.1(5.729577951308232)}",
-                 Geo3DPoint.newShapeQuery(PlanetModel.SPHERE, "point", GeoCircleFactory.makeGeoCircle(PlanetModel.SPHERE, toRadians(44.244272), toRadians(7.769736), 0.1)).toString());
+    assertEquals("PointInGeo3DShapeQuery: field=point: Shape: GeoStandardCircle: {planetmodel=PlanetModel.WGS84, center=[lat=0.3861041107739683, lon=0.06780373760536706], radius=0.1(5.729577951308232)}",
+                 Geo3DPoint.newShapeQuery("point", GeoCircleFactory.makeGeoCircle(PlanetModel.WGS84, toRadians(44.244272), toRadians(7.769736), 0.1)).toString());
   }
 
   private static Directory getDirectory() {