summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/geo_full.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthrough/geo_full.js')
-rw-r--r--jstests/noPassthrough/geo_full.js639
1 files changed, 353 insertions, 286 deletions
diff --git a/jstests/noPassthrough/geo_full.js b/jstests/noPassthrough/geo_full.js
index 2fe9d8d7438..505a0efab33 100644
--- a/jstests/noPassthrough/geo_full.js
+++ b/jstests/noPassthrough/geo_full.js
@@ -2,84 +2,89 @@
// Integration test of the geo code
//
// Basically, this tests adds a random number of docs with a random number of points,
-// given a 2d environment of random precision which is either randomly earth-like or of
+// given a 2d environment of random precision which is either randomly earth-like or of
// random bounds, and indexes these points after a random amount of points have been added
// with a random number of additional fields which correspond to whether the documents are
-// in randomly generated circular, spherical, box, and box-polygon shapes (and exact),
-// queried randomly from a set of query types. Each point is randomly either and object
+// in randomly generated circular, spherical, box, and box-polygon shapes (and exact),
+// queried randomly from a set of query types. Each point is randomly either and object
// or array, and all points and document data fields are nested randomly in arrays (or not).
//
// We approximate the user here as a random function :-)
//
-// These random point fields can then be tested against all types of geo queries using these random shapes.
-//
+// These random point fields can then be tested against all types of geo queries using these random
+// shapes.
+//
// Tests can be easily reproduced by getting the test number from the output directly before a
// test fails, and hard-wiring that as the test number.
//
-load( "jstests/libs/slow_weekly_util.js" );
-testServer = new SlowWeeklyMongod( "geo_full" );
-db = testServer.getDB( "test" );
+load("jstests/libs/slow_weekly_util.js");
+testServer = new SlowWeeklyMongod("geo_full");
+db = testServer.getDB("test");
-var randEnvironment = function(){
+var randEnvironment = function() {
// Normal earth environment
- if( Random.rand() < 0.5 ){
- return { max : 180,
- min : -180,
- bits : Math.floor( Random.rand() * 32 ) + 1,
- earth : true,
- bucketSize : 360 / ( 4 * 1024 * 1024 * 1024 ) };
+ if (Random.rand() < 0.5) {
+ return {
+ max: 180,
+ min: -180,
+ bits: Math.floor(Random.rand() * 32) + 1,
+ earth: true,
+ bucketSize: 360 / (4 * 1024 * 1024 * 1024)
+ };
}
- var scales = [ 0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000 ];
- var scale = scales[ Math.floor( Random.rand() * scales.length ) ];
+ var scales = [0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000];
+ var scale = scales[Math.floor(Random.rand() * scales.length)];
var offset = Random.rand() * scale;
var max = Random.rand() * scale + offset;
- var min = - Random.rand() * scale + offset;
- var bits = Math.floor( Random.rand() * 32 ) + 1;
- var bits = Math.floor( Random.rand() * 32 ) + 1;
+ var min = -Random.rand() * scale + offset;
+ var bits = Math.floor(Random.rand() * 32) + 1;
+ var bits = Math.floor(Random.rand() * 32) + 1;
var range = max - min;
- var bucketSize = range / ( 4 * 1024 * 1024 * 1024 );
-
- return { max : max,
- min : min,
- bits : bits,
- earth : false,
- bucketSize : bucketSize };
+ var bucketSize = range / (4 * 1024 * 1024 * 1024);
+
+ return {
+ max: max,
+ min: min,
+ bits: bits,
+ earth: false,
+ bucketSize: bucketSize
+ };
};
-var randPoint = function( env, query ) {
+var randPoint = function(env, query) {
- if( query && Random.rand() > 0.5 )
+ if (query && Random.rand() > 0.5)
return query.exact;
- if( env.earth )
- return [ Random.rand() * 360 - 180, Random.rand() * 180 - 90 ];
+ if (env.earth)
+ return [Random.rand() * 360 - 180, Random.rand() * 180 - 90];
var range = env.max - env.min;
- return [ Random.rand() * range + env.min, Random.rand() * range + env.min ];
+ return [Random.rand() * range + env.min, Random.rand() * range + env.min];
};
-var randLocType = function( loc, wrapIn ){
- return randLocTypes( [ loc ], wrapIn )[0];
+var randLocType = function(loc, wrapIn) {
+ return randLocTypes([loc], wrapIn)[0];
};
-var randLocTypes = function( locs, wrapIn ) {
+var randLocTypes = function(locs, wrapIn) {
var rLocs = [];
- for( var i = 0; i < locs.length; i++ ){
- rLocs.push( locs[i] );
+ for (var i = 0; i < locs.length; i++) {
+ rLocs.push(locs[i]);
}
- if( wrapIn ){
+ if (wrapIn) {
var wrappedLocs = [];
- for( var i = 0; i < rLocs.length; i++ ){
+ for (var i = 0; i < rLocs.length; i++) {
var wrapper = {};
wrapper[wrapIn] = rLocs[i];
- wrappedLocs.push( wrapper );
+ wrappedLocs.push(wrapper);
}
return wrappedLocs;
@@ -90,24 +95,30 @@ var randLocTypes = function( locs, wrapIn ) {
var randDataType = function() {
- var scales = [ 1, 10, 100, 1000, 10000 ];
- var docScale = scales[ Math.floor( Random.rand() * scales.length ) ];
- var locScale = scales[ Math.floor( Random.rand() * scales.length ) ];
+ var scales = [1, 10, 100, 1000, 10000];
+ var docScale = scales[Math.floor(Random.rand() * scales.length)];
+ var locScale = scales[Math.floor(Random.rand() * scales.length)];
var numDocs = 40000;
var maxLocs = 40000;
// Make sure we don't blow past our test resources
- while( numDocs * maxLocs > 40000 ){
- numDocs = Math.floor( Random.rand() * docScale ) + 1;
- maxLocs = Math.floor( Random.rand() * locScale ) + 1;
+ while (numDocs * maxLocs > 40000) {
+ numDocs = Math.floor(Random.rand() * docScale) + 1;
+ maxLocs = Math.floor(Random.rand() * locScale) + 1;
}
- return { numDocs : numDocs,
- maxLocs : maxLocs };
+ return {
+ numDocs: numDocs,
+ maxLocs: maxLocs
+ };
};
-function deg2rad(arg) { return arg * Math.PI / 180.0; }
-function rad2deg(arg) { return arg * 180.0 / Math.PI; }
+function deg2rad(arg) {
+ return arg * Math.PI / 180.0;
+}
+function rad2deg(arg) {
+ return arg * 180.0 / Math.PI;
+}
function computexscandist(latDegrees, maxDistDegrees) {
// See s2cap.cc
@@ -151,200 +162,220 @@ function pointIsOK(startPoint, radius, env) {
return (startPoint[0] + xscandist < 180) && (startPoint[0] - xscandist > -180);
}
-var randQuery = function( env ) {
- var center = randPoint( env );
+var randQuery = function(env) {
+ var center = randPoint(env);
var sphereRadius = -1;
var sphereCenter = null;
- if( env.earth ){
+ if (env.earth) {
// Get a start point that doesn't require wrapping
// TODO: Are we a bit too aggressive with wrapping issues?
var i;
- for( i = 0; i < 5; i++ ){
+ for (i = 0; i < 5; i++) {
sphereRadius = Random.rand() * 45 * Math.PI / 180;
- sphereCenter = randPoint( env );
- if (pointIsOK(sphereCenter, sphereRadius, env)) { break; }
+ sphereCenter = randPoint(env);
+ if (pointIsOK(sphereCenter, sphereRadius, env)) {
+ break;
+ }
}
- if( i == 5 ) sphereRadius = -1;
-
+ if (i == 5)
+ sphereRadius = -1;
}
- var box = [ randPoint( env ), randPoint( env ) ];
+ var box = [randPoint(env), randPoint(env)];
- var boxPoly = [[ box[0][0], box[0][1] ],
- [ box[0][0], box[1][1] ],
- [ box[1][0], box[1][1] ],
- [ box[1][0], box[0][1] ] ];
+ var boxPoly = [
+ [box[0][0], box[0][1]],
+ [box[0][0], box[1][1]],
+ [box[1][0], box[1][1]],
+ [box[1][0], box[0][1]]
+ ];
- if( box[0][0] > box[1][0] ){
+ if (box[0][0] > box[1][0]) {
var swap = box[0][0];
box[0][0] = box[1][0];
box[1][0] = swap;
}
- if( box[0][1] > box[1][1] ){
+ if (box[0][1] > box[1][1]) {
var swap = box[0][1];
box[0][1] = box[1][1];
box[1][1] = swap;
}
- return { center : center,
- radius : box[1][0] - box[0][0],
- exact : randPoint( env ),
- sphereCenter : sphereCenter,
- sphereRadius : sphereRadius,
- box : box,
- boxPoly : boxPoly };
+ return {
+ center: center,
+ radius: box[1][0] - box[0][0],
+ exact: randPoint(env),
+ sphereCenter: sphereCenter,
+ sphereRadius: sphereRadius,
+ box: box,
+ boxPoly: boxPoly
+ };
};
var resultTypes = {
-"exact" : function( loc ){
- return query.exact[0] == loc[0] && query.exact[1] == loc[1];
-},
-"center" : function( loc ){
- return Geo.distance( query.center, loc ) <= query.radius;
-},
-"box" : function( loc ){
- return loc[0] >= query.box[0][0] && loc[0] <= query.box[1][0] &&
- loc[1] >= query.box[0][1] && loc[1] <= query.box[1][1];
-
-},
-"sphere" : function( loc ){
- return ( query.sphereRadius >= 0 ?
- ( Geo.sphereDistance( query.sphereCenter, loc ) <= query.sphereRadius ) : false );
-},
-"poly" : function( loc ){
- return loc[0] >= query.box[0][0] && loc[0] <= query.box[1][0] &&
- loc[1] >= query.box[0][1] && loc[1] <= query.box[1][1];
-}};
-
-var queryResults = function( locs, query, results ){
-
- if( ! results["center"] ){
- for( var type in resultTypes ){
+ "exact": function(loc) {
+ return query.exact[0] == loc[0] && query.exact[1] == loc[1];
+ },
+ "center": function(loc) {
+ return Geo.distance(query.center, loc) <= query.radius;
+ },
+ "box": function(loc) {
+ return loc[0] >= query.box[0][0] && loc[0] <= query.box[1][0] &&
+ loc[1] >= query.box[0][1] && loc[1] <= query.box[1][1];
+
+ },
+ "sphere": function(loc) {
+ return (query.sphereRadius >= 0
+ ? (Geo.sphereDistance(query.sphereCenter, loc) <= query.sphereRadius)
+ : false);
+ },
+ "poly": function(loc) {
+ return loc[0] >= query.box[0][0] && loc[0] <= query.box[1][0] &&
+ loc[1] >= query.box[0][1] && loc[1] <= query.box[1][1];
+ }
+};
+
+var queryResults = function(locs, query, results) {
+
+ if (!results["center"]) {
+ for (var type in resultTypes) {
results[type] = {
- docsIn : 0,
- docsOut : 0,
- locsIn : 0,
- locsOut : 0
+ docsIn: 0,
+ docsOut: 0,
+ locsIn: 0,
+ locsOut: 0
};
}
}
var indResults = {};
- for( var type in resultTypes ){
+ for (var type in resultTypes) {
indResults[type] = {
- docIn : false,
- locsIn : 0,
- locsOut : 0
+ docIn: false,
+ locsIn: 0,
+ locsOut: 0
};
}
- for( var type in resultTypes ){
-
+ for (var type in resultTypes) {
var docIn = false;
- for( var i = 0; i < locs.length; i++ ){
- if( resultTypes[type]( locs[i] ) ){
+ for (var i = 0; i < locs.length; i++) {
+ if (resultTypes[type](locs[i])) {
results[type].locsIn++;
indResults[type].locsIn++;
indResults[type].docIn = true;
- }
- else{
+ } else {
results[type].locsOut++;
indResults[type].locsOut++;
}
}
- if( indResults[type].docIn ) results[type].docsIn++;
- else results[type].docsOut++;
-
+ if (indResults[type].docIn)
+ results[type].docsIn++;
+ else
+ results[type].docsOut++;
}
return indResults;
};
-var randQueryAdditions = function( doc, indResults ){
+var randQueryAdditions = function(doc, indResults) {
- for( var type in resultTypes ){
+ for (var type in resultTypes) {
var choice = Random.rand();
- if( Random.rand() < 0.25 )
- doc[type] = ( indResults[type].docIn ? { docIn : "yes" } : { docIn : "no" } );
- else if( Random.rand() < 0.5 )
- doc[type] = ( indResults[type].docIn ? { docIn : [ "yes" ] } : { docIn : [ "no" ] } );
- else if( Random.rand() < 0.75 )
- doc[type] = ( indResults[type].docIn ? [ { docIn : "yes" } ] : [ { docIn : "no" } ] );
+ if (Random.rand() < 0.25)
+ doc[type] = (indResults[type].docIn ? {docIn: "yes"} : {docIn: "no"});
+ else if (Random.rand() < 0.5)
+ doc[type] = (indResults[type].docIn ? {docIn: ["yes"]} : {docIn: ["no"]});
+ else if (Random.rand() < 0.75)
+ doc[type] = (indResults[type].docIn ? [{docIn: "yes"}] : [{docIn: "no"}]);
else
- doc[type] = ( indResults[type].docIn ? [{ docIn: [ "yes" ] }] : [{ docIn: [ "no" ] }]);
+ doc[type] = (indResults[type].docIn ? [{docIn: ["yes"]}] : [{docIn: ["no"]}]);
}
};
-var randIndexAdditions = function( indexDoc ){
-
- for( var type in resultTypes ){
+var randIndexAdditions = function(indexDoc) {
- if( Random.rand() < 0.5 ) continue;
+ for (var type in resultTypes) {
+ if (Random.rand() < 0.5)
+ continue;
var choice = Random.rand();
- if( Random.rand() < 0.5 )
+ if (Random.rand() < 0.5)
indexDoc[type] = 1;
else
indexDoc[type + ".docIn"] = 1;
}
};
-var randYesQuery = function(){
+var randYesQuery = function() {
- var choice = Math.floor( Random.rand() * 7 );
- if( choice == 0 )
- return { $ne : "no" };
- else if( choice == 1 )
+ var choice = Math.floor(Random.rand() * 7);
+ if (choice == 0)
+ return {
+ $ne: "no"
+ };
+ else if (choice == 1)
return "yes";
- else if( choice == 2 )
+ else if (choice == 2)
return /^yes/;
- else if( choice == 3 )
- return { $in : [ "good", "yes", "ok" ] };
- else if( choice == 4 )
- return { $exists : true };
- else if( choice == 5 )
- return { $nin : [ "bad", "no", "not ok" ] };
- else if( choice == 6 )
- return { $not : /^no/ };
+ else if (choice == 3)
+ return {
+ $in: ["good", "yes", "ok"]
+ };
+ else if (choice == 4)
+ return {
+ $exists: true
+ };
+ else if (choice == 5)
+ return {
+ $nin: ["bad", "no", "not ok"]
+ };
+ else if (choice == 6)
+ return {
+ $not: /^no/
+ };
};
-var locArray = function( loc ){
- if( loc.x ) return [ loc.x, loc.y ];
- if( ! loc.length ) return [ loc[0], loc[1] ];
+var locArray = function(loc) {
+ if (loc.x)
+ return [loc.x, loc.y];
+ if (!loc.length)
+ return [loc[0], loc[1]];
return loc;
};
-var locsArray = function( locs ){
- if( locs.loc ){
+var locsArray = function(locs) {
+ if (locs.loc) {
arr = [];
- for( var i = 0; i < locs.loc.length; i++ ) arr.push( locArray( locs.loc[i] ) );
+ for (var i = 0; i < locs.loc.length; i++)
+ arr.push(locArray(locs.loc[i]));
return arr;
- }
- else{
+ } else {
arr = [];
- for( var i = 0; i < locs.length; i++ ) arr.push( locArray( locs[i].loc ) );
+ for (var i = 0; i < locs.length; i++)
+ arr.push(locArray(locs[i].loc));
return arr;
}
};
-var minBoxSize = function( env, box ){
- return env.bucketSize * Math.pow( 2, minBucketScale( env, box ) );
+var minBoxSize = function(env, box) {
+ return env.bucketSize * Math.pow(2, minBucketScale(env, box));
};
-var minBucketScale = function( env, box ){
+var minBucketScale = function(env, box) {
- if( box.length && box[0].length )
- box = [ box[0][0] - box[1][0], box[0][1] - box[1][1] ];
+ if (box.length && box[0].length)
+ box = [box[0][0] - box[1][0], box[0][1] - box[1][1]];
- if( box.length )
- box = Math.max( box[0], box[1] );
+ if (box.length)
+ box = Math.max(box[0], box[1]);
- print( box );
- print( env.bucketSize );
+ print(box);
+ print(env.bucketSize);
- return Math.ceil( Math.log( box / env.bucketSize ) / Math.log( 2 ) );
+ return Math.ceil(Math.log(box / env.bucketSize) / Math.log(2));
};
@@ -355,196 +386,232 @@ var numTests = 100;
// each individual test will be reproducible given
// that seed and test number
var seed = new Date().getTime();
-//seed = 175 + 288 + 12
+// seed = 175 + 288 + 12
-for ( var test = 0; test < numTests; test++ ) {
-
- Random.srand( seed + test );
- //Random.srand( 42240 )
- //Random.srand( 7344 )
+for (var test = 0; test < numTests; test++) {
+ Random.srand(seed + test);
+ // Random.srand( 42240 )
+ // Random.srand( 7344 )
var t = db.testAllGeo;
t.drop();
- print( "Generating test environment #" + test );
+ print("Generating test environment #" + test);
var env = randEnvironment();
- //env.bits = 11
- var query = randQuery( env );
+ // env.bits = 11
+ var query = randQuery(env);
var data = randDataType();
- //data.numDocs = 5; data.maxLocs = 1;
- var paddingSize = Math.floor( Random.rand() * 10 + 1 );
+ // data.numDocs = 5; data.maxLocs = 1;
+ var paddingSize = Math.floor(Random.rand() * 10 + 1);
var results = {};
var totalPoints = 0;
- print( "Calculating target results for " + data.numDocs + " docs with max " + data.maxLocs + " locs " );
+ print("Calculating target results for " + data.numDocs + " docs with max " + data.maxLocs +
+ " locs ");
var bulk = t.initializeUnorderedBulkOp();
- for ( var i = 0; i < data.numDocs; i++ ) {
- var numLocs = Math.floor( Random.rand() * data.maxLocs + 1 );
+ for (var i = 0; i < data.numDocs; i++) {
+ var numLocs = Math.floor(Random.rand() * data.maxLocs + 1);
totalPoints += numLocs;
var multiPoint = [];
- for ( var p = 0; p < numLocs; p++ ) {
- var point = randPoint( env, query );
- multiPoint.push( point );
+ for (var p = 0; p < numLocs; p++) {
+ var point = randPoint(env, query);
+ multiPoint.push(point);
}
- var indResults = queryResults( multiPoint, query, results );
+ var indResults = queryResults(multiPoint, query, results);
var doc;
// Nest the keys differently
- if( Random.rand() < 0.5 )
- doc = { locs : { loc : randLocTypes( multiPoint ) } };
+ if (Random.rand() < 0.5)
+ doc = {
+ locs: {loc: randLocTypes(multiPoint)}
+ };
else
- doc = { locs : randLocTypes( multiPoint, "loc" ) };
+ doc = {
+ locs: randLocTypes(multiPoint, "loc")
+ };
- randQueryAdditions( doc, indResults );
+ randQueryAdditions(doc, indResults);
doc._id = i;
- bulk.insert( doc );
+ bulk.insert(doc);
}
assert.writeOK(bulk.execute());
- var indexDoc = { "locs.loc" : "2d" };
- randIndexAdditions( indexDoc );
- t.ensureIndex( indexDoc, env );
- assert.isnull( db.getLastError() );
+ var indexDoc = {
+ "locs.loc": "2d"
+ };
+ randIndexAdditions(indexDoc);
+ t.ensureIndex(indexDoc, env);
+ assert.isnull(db.getLastError());
var padding = "x";
- for( var i = 0; i < paddingSize; i++ ) padding = padding + padding;
+ for (var i = 0; i < paddingSize; i++)
+ padding = padding + padding;
- print( padding );
+ print(padding);
- printjson( { seed : seed,
- test: test,
- env : env,
- query : query,
- data : data,
- results : results,
- paddingSize : paddingSize } );
+ printjson({
+ seed: seed,
+ test: test,
+ env: env,
+ query: query,
+ data: data,
+ results: results,
+ paddingSize: paddingSize
+ });
// exact
- print( "Exact query..." );
- assert.eq( results.exact.docsIn, t.find( { "locs.loc" : randLocType( query.exact ), "exact.docIn" : randYesQuery() } ).count() );
+ print("Exact query...");
+ assert.eq(
+ results.exact.docsIn,
+ t.find({"locs.loc": randLocType(query.exact), "exact.docIn": randYesQuery()}).count());
// $center
- print( "Center query..." );
- print( "Min box : " + minBoxSize( env, query.radius ) );
- assert.eq( results.center.docsIn, t.find( { "locs.loc" : { $within : { $center : [ query.center, query.radius ], $uniqueDocs : 1 } }, "center.docIn" : randYesQuery() } ).count() );
-
- print( "Center query update..." );
- var res = t.update({ "locs.loc": { $within: { $center: [ query.center, query.radius ],
- $uniqueDocs: true }},
- "center.docIn": randYesQuery() },
- { $set: { centerPaddingA: padding }}, false, true);
- assert.eq( results.center.docsIn, res.nModified );
-
- if( query.sphereRadius >= 0 ){
-
- print( "Center sphere query...");
+ print("Center query...");
+ print("Min box : " + minBoxSize(env, query.radius));
+ assert.eq(results.center.docsIn,
+ t.find({
+ "locs.loc": {$within: {$center: [query.center, query.radius], $uniqueDocs: 1}},
+ "center.docIn": randYesQuery()
+ }).count());
+
+ print("Center query update...");
+ var res = t.update(
+ {
+ "locs.loc": {$within: {$center: [query.center, query.radius], $uniqueDocs: true}},
+ "center.docIn": randYesQuery()
+ },
+ {$set: {centerPaddingA: padding}},
+ false,
+ true);
+ assert.eq(results.center.docsIn, res.nModified);
+
+ if (query.sphereRadius >= 0) {
+ print("Center sphere query...");
// $centerSphere
- assert.eq( results.sphere.docsIn, t.find( { "locs.loc" : { $within : { $centerSphere : [ query.sphereCenter, query.sphereRadius ] } }, "sphere.docIn" : randYesQuery() } ).count() );
-
- print( "Center sphere query update..." );
- res = t.update({ "locs.loc": { $within: {
- $centerSphere: [ query.sphereCenter, query.sphereRadius ],
- $uniqueDocs: true } },
- "sphere.docIn" : randYesQuery() },
- { $set: { spherePaddingA: padding } }, false, true);
- assert.eq( results.sphere.docsIn, res.nModified );
+ assert.eq(
+ results.sphere.docsIn,
+ t.find({
+ "locs.loc": {$within: {$centerSphere: [query.sphereCenter, query.sphereRadius]}},
+ "sphere.docIn": randYesQuery()
+ }).count());
+
+ print("Center sphere query update...");
+ res = t.update(
+ {
+ "locs.loc": {
+ $within: {
+ $centerSphere: [query.sphereCenter, query.sphereRadius],
+ $uniqueDocs: true
+ }
+ },
+ "sphere.docIn": randYesQuery()
+ },
+ {$set: {spherePaddingA: padding}},
+ false,
+ true);
+ assert.eq(results.sphere.docsIn, res.nModified);
}
// $box
- print( "Box query..." );
- assert.eq( results.box.docsIn, t.find( { "locs.loc" : { $within : { $box : query.box, $uniqueDocs : true } }, "box.docIn" : randYesQuery() } ).count() );
+ print("Box query...");
+ assert.eq(results.box.docsIn,
+ t.find({
+ "locs.loc": {$within: {$box: query.box, $uniqueDocs: true}},
+ "box.docIn": randYesQuery()
+ }).count());
// $polygon
- print( "Polygon query..." );
- assert.eq( results.poly.docsIn, t.find( { "locs.loc" : { $within : { $polygon : query.boxPoly } }, "poly.docIn" : randYesQuery() } ).count() );
+ print("Polygon query...");
+ assert.eq(
+ results.poly.docsIn,
+ t.find({"locs.loc": {$within: {$polygon: query.boxPoly}}, "poly.docIn": randYesQuery()})
+ .count());
var defaultDocLimit = 100;
// $near
- print( "Near query..." );
- assert.eq( results.center.docsIn,
- t.find( { "locs.loc" : { $near : query.center,
- $maxDistance : query.radius } } ).count( true ),
- "Near query: center: " + query.center +
- "; radius: " + query.radius +
- "; docs: " + results.center.docsIn +
- "; locs: " + results.center.locsIn );
-
- if( query.sphereRadius >= 0 ){
- print( "Near sphere query...");
+ print("Near query...");
+ assert.eq(results.center.docsIn,
+ t.find({"locs.loc": {$near: query.center, $maxDistance: query.radius}}).count(true),
+ "Near query: center: " + query.center + "; radius: " + query.radius + "; docs: " +
+ results.center.docsIn + "; locs: " + results.center.locsIn);
+
+ if (query.sphereRadius >= 0) {
+ print("Near sphere query...");
// $centerSphere
- assert.eq( results.sphere.docsIn,
- t.find( { "locs.loc" : { $nearSphere : query.sphereCenter,
- $maxDistance : query.sphereRadius } } ).count( true ),
- "Near sphere query: sphere center: " + query.sphereCenter +
- "; radius: " + query.sphereRadius +
- "; docs: " + results.sphere.docsIn + "; locs: " + results.sphere.locsIn );
+ assert.eq(
+ results.sphere.docsIn,
+ t.find({
+ "locs.loc": {$nearSphere: query.sphereCenter, $maxDistance: query.sphereRadius}
+ }).count(true),
+ "Near sphere query: sphere center: " + query.sphereCenter + "; radius: " +
+ query.sphereRadius + "; docs: " + results.sphere.docsIn + "; locs: " +
+ results.sphere.locsIn);
}
// geoNear
// results limited by size of objects
- if( data.maxLocs < defaultDocLimit ){
-
+ if (data.maxLocs < defaultDocLimit) {
// GeoNear query
- print( "GeoNear query..." );
+ print("GeoNear query...");
// GeoNear command has a default doc limit 100.
- assert.eq( Math.min( defaultDocLimit, results.center.docsIn ),
- t.getDB().runCommand( { geoNear : "testAllGeo", near : query.center,
- maxDistance : query.radius } ).results.length,
- "GeoNear query: center: " + query.center +
- "; radius: " + query.radius +
- "; docs: " + results.center.docsIn + "; locs: " + results.center.locsIn );
-
-
- var num = Math.min( 2* defaultDocLimit, 2 * results.center.docsIn);
-
- var output = db.runCommand( {
- geoNear : "testAllGeo",
- near : query.center,
- maxDistance : query.radius ,
- includeLocs : true,
- num : num } ).results;
-
- assert.eq( Math.min( num, results.center.docsIn ),
- output.length,
- "GeoNear query with limit of " + num +
- ": center: " + query.center +
- "; radius: " + query.radius +
- "; docs: " + results.center.docsIn + "; locs: " + results.center.locsIn );
+ assert.eq(
+ Math.min(defaultDocLimit, results.center.docsIn),
+ t.getDB()
+ .runCommand({geoNear: "testAllGeo", near: query.center, maxDistance: query.radius})
+ .results.length,
+ "GeoNear query: center: " + query.center + "; radius: " + query.radius + "; docs: " +
+ results.center.docsIn + "; locs: " + results.center.locsIn);
+
+ var num = Math.min(2 * defaultDocLimit, 2 * results.center.docsIn);
+
+ var output = db.runCommand({
+ geoNear: "testAllGeo",
+ near: query.center,
+ maxDistance: query.radius,
+ includeLocs: true,
+ num: num
+ }).results;
+
+ assert.eq(Math.min(num, results.center.docsIn),
+ output.length,
+ "GeoNear query with limit of " + num + ": center: " + query.center +
+ "; radius: " + query.radius + "; docs: " + results.center.docsIn +
+ "; locs: " + results.center.locsIn);
var distance = 0;
- for ( var i = 0; i < output.length; i++ ) {
+ for (var i = 0; i < output.length; i++) {
var retDistance = output[i].dis;
- var retLoc = locArray( output[i].loc );
+ var retLoc = locArray(output[i].loc);
- var arrLocs = locsArray( output[i].obj.locs );
+ var arrLocs = locsArray(output[i].obj.locs);
- assert.contains( retLoc, arrLocs );
+ assert.contains(retLoc, arrLocs);
var distInObj = false;
- for ( var j = 0; j < arrLocs.length && distInObj == false; j++ ) {
- var newDistance = Geo.distance( locArray( query.center ) , arrLocs[j] );
- distInObj = ( newDistance >= retDistance - 0.0001 && newDistance <= retDistance + 0.0001 );
+ for (var j = 0; j < arrLocs.length && distInObj == false; j++) {
+ var newDistance = Geo.distance(locArray(query.center), arrLocs[j]);
+ distInObj =
+ (newDistance >= retDistance - 0.0001 && newDistance <= retDistance + 0.0001);
}
- assert( distInObj );
- assert.between( retDistance - 0.0001 , Geo.distance( locArray( query.center ), retLoc ), retDistance + 0.0001 );
- assert.lte( retDistance, query.radius );
- assert.gte( retDistance, distance );
+ assert(distInObj);
+ assert.between(retDistance - 0.0001,
+ Geo.distance(locArray(query.center), retLoc),
+ retDistance + 0.0001);
+ assert.lte(retDistance, query.radius);
+ assert.gte(retDistance, distance);
distance = retDistance;
}
-
}
// $polygon
- print( "Polygon remove..." );
- res = t.remove({ "locs.loc": { $within: { $polygon: query.boxPoly }},
- "poly.docIn": randYesQuery() });
- assert.eq( results.poly.docsIn, res.nRemoved );
-
+ print("Polygon remove...");
+ res =
+ t.remove({"locs.loc": {$within: {$polygon: query.boxPoly}}, "poly.docIn": randYesQuery()});
+ assert.eq(results.poly.docsIn, res.nRemoved);
}
-
testServer.stop();