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;
}