Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Reverse when the initial btree scan finds no geo points. SERVER-1283

  • Loading branch information...
commit 27e684c097f332be6252f4375dd7c9659aead0e4 1 parent 6aff5cd
@kreuter kreuter authored
Showing with 33 additions and 1 deletion.
  1. +1 −1  db/geo/2d.cpp
  2. +32 −0 jstests/geoe.js
View
2  db/geo/2d.cpp
@@ -766,7 +766,7 @@ namespace mongo {
min.checkCur( found , hopper );
max = min;
- if ( min.bucket.isNull() ){
+ if ( min.bucket.isNull() || ( !(hopper->found()) ) ){
min.bucket = id.head.btree()->locate( id , id.head , start.wrap() ,
ordering , min.pos , min.found , minDiskLoc , -1 );
min.checkCur( found , hopper );
View
32 jstests/geoe.js
@@ -0,0 +1,32 @@
+// Was reported as SERVER-1283.
+// The problem seems to be that sometimes the index btrees are such that
+// the first search for a matching point in the geo code could run to
+// the end of the btree and not reverse direction (leaving the rest of
+// the search always looking at some random non-matching point).
+
+t=db.geo_box;
+t.drop();
+
+t.insert({"_id": 1, "geo" : [ 33, -11.1 ] });
+t.insert({"_id": 2, "geo" : [ -122, 33.3 ] });
+t.insert({"_id": 3, "geo" : [ -122, 33.4 ] });
+t.insert({"_id": 4, "geo" : [ -122.28, 37.67 ] });
+t.insert({"_id": 5, "geo" : [ -122.29, 37.68 ] });
+t.insert({"_id": 6, "geo" : [ -122.29, 37.67 ] });
+t.insert({"_id": 7, "geo" : [ -122.29, 37.67 ] });
+t.insert({"_id": 8, "geo" : [ -122.29, 37.68 ] });
+t.insert({"_id": 9, "geo" : [ -122.29, 37.68 ] });
+t.insert({"_id": 10, "geo" : [ -122.3, 37.67 ] });
+t.insert({"_id": 11, "geo" : [ -122.31, 37.67 ] });
+t.insert({"_id": 12, "geo" : [ -122.3, 37.66 ] });
+t.insert({"_id": 13, "geo" : [ -122.2435, 37.637072 ] });
+t.insert({"_id": 14, "geo" : [ -122.289505, 37.695774 ] });
+
+
+t.ensureIndex({ geo : "2d" });
+
+c=t.find({geo: {"$within": {"$box": [[-125.078461,36.494473], [-120.320648,38.905199]]} } });
+assert.eq(11, c.count(), "A1");
+
+c=t.find({geo: {"$within": {"$box": [[-124.078461,36.494473], [-120.320648,38.905199]]} } });
+assert.eq(11, c.count(), "B1");
Please sign in to comment.
Something went wrong with that request. Please try again.