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 2015/09/18 11:36:18 UTC

svn commit: r1703791 - /lucene/dev/branches/lucene6780/lucene/sandbox/src/java/org/apache/lucene/bkdtree/BKDDistanceQuery.java

Author: mikemccand
Date: Fri Sep 18 09:36:18 2015
New Revision: 1703791

URL: http://svn.apache.org/viewvc?rev=1703791&view=rev
Log:
LUCENE-6780: BKDDistanceQuery must take min/maxLon/Lat into account in hashCode and equals else we get illegal collisions in caching

Modified:
    lucene/dev/branches/lucene6780/lucene/sandbox/src/java/org/apache/lucene/bkdtree/BKDDistanceQuery.java

Modified: lucene/dev/branches/lucene6780/lucene/sandbox/src/java/org/apache/lucene/bkdtree/BKDDistanceQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene6780/lucene/sandbox/src/java/org/apache/lucene/bkdtree/BKDDistanceQuery.java?rev=1703791&r1=1703790&r2=1703791&view=diff
==============================================================================
--- lucene/dev/branches/lucene6780/lucene/sandbox/src/java/org/apache/lucene/bkdtree/BKDDistanceQuery.java (original)
+++ lucene/dev/branches/lucene6780/lucene/sandbox/src/java/org/apache/lucene/bkdtree/BKDDistanceQuery.java Fri Sep 18 09:36:18 2015
@@ -80,7 +80,7 @@ public class BKDDistanceQuery extends Qu
     maxLon = bbox.maxLon;
     maxLat = bbox.maxLat;
 
-    //System.out.println("distance query bbox: lon=" + minLon + " TO " + maxLon + "; lat=" + minLat + " TO " + maxLat);
+    System.out.println("distance query bbox: lon=" + minLon + " TO " + maxLon + "; lat=" + minLat + " TO " + maxLat);
     assert minLat <= maxLat: "minLat=" + minLat + " maxLat=" + maxLat;
   }
 
@@ -99,6 +99,7 @@ public class BKDDistanceQuery extends Qu
     this.maxLat = maxLat;
     this.minLon = minLon;
     this.maxLon = maxLon;
+    //System.out.println("  rewrite bbox: lat=" + minLat + " TO " + maxLat + " lon=" + minLon + " TO " + maxLon);
   }    
 
   @Override
@@ -137,16 +138,28 @@ public class BKDDistanceQuery extends Qu
 
                                            @Override
                                            public BKDTreeReader.Relation compare(double cellLatMin, double cellLatMax, double cellLonMin, double cellLonMax) {
-                                             //System.out.println("compare lat=" + cellLatMin + " TO " + cellLatMax + "; lon=" + cellLonMin + " TO " + cellLonMax);
+                                             System.out.println("compare lat=" + cellLatMin + " TO " + cellLatMax + "; lon=" + cellLonMin + " TO " + cellLonMax);
                                              if (GeoUtils.rectWithinCircle(cellLonMin, cellLatMin, cellLonMax, cellLatMax, centerLon, centerLat, radiusMeters)) {
-                                               //System.out.println("  CELL_INSIDE_SHAPE");
-                                               return BKDTreeReader.Relation.CELL_INSIDE_SHAPE;
+                                               // nocommit hacky workaround:
+                                               if (cellLonMax - cellLonMin < 100 && cellLatMax - cellLatMin < 50) {
+                                                 System.out.println("  CELL_INSIDE_SHAPE");
+                                                 return BKDTreeReader.Relation.CELL_INSIDE_SHAPE;
+                                               } else {
+                                                 System.out.println("  HACK: SHAPE_CROSSES_CELL");
+                                                 return BKDTreeReader.Relation.SHAPE_CROSSES_CELL;
+                                               }
                                              } else if (GeoUtils.rectCrossesCircle(cellLonMin, cellLatMin, cellLonMax, cellLatMax, centerLon, centerLat, radiusMeters)) {
-                                               //System.out.println("  SHAPE_CROSSES_CELL");
+                                               System.out.println("  SHAPE_CROSSES_CELL");
                                                return BKDTreeReader.Relation.SHAPE_CROSSES_CELL;
                                              } else {
-                                               //System.out.println("  SHAPE_OUTSIDE_CELL");
-                                               return BKDTreeReader.Relation.SHAPE_OUTSIDE_CELL;
+                                               // nocommit hacky workaround:
+                                               if (cellLonMax - cellLonMin < 100 && cellLatMax - cellLatMin < 50) {
+                                                 System.out.println("  SHAPE_OUTSIDE_CELL");
+                                                 return BKDTreeReader.Relation.SHAPE_OUTSIDE_CELL;
+                                               } else {
+                                                 System.out.println("  HACK: SHAPE_CROSSES_CELL");
+                                                 return BKDTreeReader.Relation.SHAPE_CROSSES_CELL;
+                                               }
                                              }
                                            }
                                          }, treeDV.delegate);
@@ -164,6 +177,7 @@ public class BKDDistanceQuery extends Qu
     }
 
     if (maxLon < minLon) {
+      System.out.println("BKD crosses dateline");
       // Crosses date line: we just rewrite into OR of two bboxes:
 
       // Disable coord here because a multi-valued doc could match both circles and get unfairly boosted:
@@ -171,10 +185,10 @@ public class BKDDistanceQuery extends Qu
       q.setDisableCoord(true);
 
       // E.g.: maxLon = -179, minLon = 179
-      BKDDistanceQuery left = new BKDDistanceQuery(field, centerLat, centerLon, radiusMeters, minLat, maxLat, BKDTreeWriter.MIN_LON_INCL, maxLon);
-      q.add(new BooleanClause(left, BooleanClause.Occur.SHOULD));
-      BKDDistanceQuery right = new BKDDistanceQuery(field, centerLat, centerLon, radiusMeters, minLat, maxLat, minLon, BKDTreeWriter.MAX_LON_INCL);
-      q.add(new BooleanClause(right, BooleanClause.Occur.SHOULD));
+      q.add(new BooleanClause(new BKDDistanceQuery(field, centerLat, centerLon, radiusMeters, minLat, maxLat, BKDTreeWriter.MIN_LON_INCL, maxLon),
+                              BooleanClause.Occur.SHOULD));
+      q.add(new BooleanClause(new BKDDistanceQuery(field, centerLat, centerLon, radiusMeters, minLat, maxLat, minLon, BKDTreeWriter.MAX_LON_INCL),
+                              BooleanClause.Occur.SHOULD));
       return q.build();
     } else {
       return this;
@@ -192,6 +206,10 @@ public class BKDDistanceQuery extends Qu
     if (Double.compare(that.centerLat, centerLat) != 0) return false;
     if (Double.compare(that.centerLon, centerLon) != 0) return false;
     if (Double.compare(that.radiusMeters, radiusMeters) != 0) return false;
+    if (Double.compare(that.minLon, minLon) != 0) return false;
+    if (Double.compare(that.maxLon, maxLon) != 0) return false;
+    if (Double.compare(that.minLat, minLat) != 0) return false;
+    if (Double.compare(that.maxLat, maxLat) != 0) return false;
 
     return true;
   }
@@ -206,6 +224,14 @@ public class BKDDistanceQuery extends Qu
     result = 31 * result + (int) (temp ^ (temp >>> 32));
     temp = Double.doubleToLongBits(radiusMeters);
     result = 31 * result + (int) (temp ^ (temp >>> 32));
+    temp = Double.doubleToLongBits(minLon);
+    result = 31 * result + (int) (temp ^ (temp >>> 32));
+    temp = Double.doubleToLongBits(maxLon);
+    result = 31 * result + (int) (temp ^ (temp >>> 32));
+    temp = Double.doubleToLongBits(minLat);
+    result = 31 * result + (int) (temp ^ (temp >>> 32));
+    temp = Double.doubleToLongBits(maxLat);
+    result = 31 * result + (int) (temp ^ (temp >>> 32));
     return result;
   }