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

lucene-solr:branch_6x: LUCENE-7185: fix edge case bugs in LatLonPoint bounding box query

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x cebac848a -> 6d537d2ba


LUCENE-7185: fix edge case bugs in LatLonPoint bounding box query


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

Branch: refs/heads/branch_6x
Commit: 6d537d2bad64a27927aa7c67c600dee97f79aa2b
Parents: cebac84
Author: Robert Muir <rm...@apache.org>
Authored: Thu Apr 7 00:09:56 2016 -0400
Committer: Robert Muir <rm...@apache.org>
Committed: Thu Apr 7 00:10:42 2016 -0400

----------------------------------------------------------------------
 .../org/apache/lucene/document/LatLonPoint.java     | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6d537d2b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPoint.java
----------------------------------------------------------------------
diff --git a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPoint.java b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPoint.java
index b2c39c2..0b96936 100644
--- a/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPoint.java
+++ b/lucene/sandbox/src/java/org/apache/lucene/document/LatLonPoint.java
@@ -26,6 +26,7 @@ import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.ConstantScoreQuery;
 import org.apache.lucene.search.FieldDoc;
+import org.apache.lucene.search.MatchNoDocsQuery;
 import org.apache.lucene.search.PointRangeQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.SortField;
@@ -285,6 +286,21 @@ public class LatLonPoint extends Field {
    * @throws IllegalArgumentException if {@code field} is null, or the box has invalid coordinates.
    */
   public static Query newBoxQuery(String field, double minLatitude, double maxLatitude, double minLongitude, double maxLongitude) {
+    // exact double values of lat=90.0D and lon=180.0D must be treated special as they are not represented in the encoding
+    // and should not drag in extra bogus junk! TODO: should encodeCeil just throw ArithmeticException to be less trappy here?
+    if (minLatitude == 90.0) {
+      // range cannot match as 90.0 can never exist
+      return new MatchNoDocsQuery();
+    }
+    if (minLongitude == 180.0) {
+      if (maxLongitude == 180.0) {
+        // range cannot match as 180.0 can never exist
+        return new MatchNoDocsQuery();
+      } else if (maxLongitude < minLongitude) {
+        // encodeCeil() with dateline wrapping!
+        minLongitude = -180.0;
+      }
+    }
     byte[] lower = encodeCeil(minLatitude, minLongitude);
     byte[] upper = encode(maxLatitude, maxLongitude);
     // Crosses date line: we just rewrite into OR of two bboxes, with longitude as an open range: