diff options
Diffstat (limited to 'jstests/core/geo_center_sphere2.js')
-rw-r--r-- | jstests/core/geo_center_sphere2.js | 119 |
1 files changed, 65 insertions, 54 deletions
diff --git a/jstests/core/geo_center_sphere2.js b/jstests/core/geo_center_sphere2.js index a569c4d5c96..ac8f09cbe77 100644 --- a/jstests/core/geo_center_sphere2.js +++ b/jstests/core/geo_center_sphere2.js @@ -5,39 +5,42 @@ // multiple documents, and so requires simultaneous testing. // -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(y, maxDistDegrees) { - return maxDistDegrees / Math.min(Math.cos(deg2rad(Math.min(89.0, y + maxDistDegrees))), - Math.cos(deg2rad(Math.max(-89.0, y - maxDistDegrees)))); + return maxDistDegrees / + Math.min(Math.cos(deg2rad(Math.min(89.0, y + maxDistDegrees))), + Math.cos(deg2rad(Math.max(-89.0, y - maxDistDegrees)))); } function pointIsOK(startPoint, radius) { yscandist = rad2deg(radius) + 0.01; xscandist = computexscandist(startPoint[1], yscandist); - return (startPoint[0] + xscandist < 180) - && (startPoint[0] - xscandist > -180) - && (startPoint[1] + yscandist < 90) - && (startPoint[1] - yscandist > -90); + return (startPoint[0] + xscandist < 180) && (startPoint[0] - xscandist > -180) && + (startPoint[1] + yscandist < 90) && (startPoint[1] - yscandist > -90); } var numTests = 30; -for ( var test = 0; test < numTests; test++ ) { - Random.srand( 1337 + test ); +for (var test = 0; test < numTests; test++) { + Random.srand(1337 + test); - var radius = 5000 * Random.rand(); // km - radius = radius / 6378.1; // radians; earth radius from geoconstants.h - var numDocs = Math.floor( 400 * Random.rand() ); + var radius = 5000 * Random.rand(); // km + radius = radius / 6378.1; // radians; earth radius from geoconstants.h + var numDocs = Math.floor(400 * Random.rand()); // TODO: Wrapping uses the error value to figure out what would overlap... - var bits = Math.floor( 5 + Random.rand() * 28 ); + var bits = Math.floor(5 + Random.rand() * 28); var maxPointsPerDoc = 50; var t = db.sphere; var randomPoint = function() { - return [ Random.rand() * 360 - 180, Random.rand() * 180 - 90 ]; + return [Random.rand() * 360 - 180, Random.rand() * 180 - 90]; }; // Get a start point that doesn't require wrapping @@ -47,7 +50,7 @@ for ( var test = 0; test < numTests; test++ ) { do { t.drop(); startPoint = randomPoint(); - t.ensureIndex( { loc : "2d" }, { bits : bits } ); + t.ensureIndex({loc: "2d"}, {bits: bits}); } while (!pointIsOK(startPoint, radius)); var pointsIn = 0; @@ -57,19 +60,18 @@ for ( var test = 0; test < numTests; test++ ) { var totalPoints = 0; var bulk = t.initializeUnorderedBulkOp(); - for ( var i = 0; i < numDocs; i++ ) { - - var numPoints = Math.floor( Random.rand() * maxPointsPerDoc + 1 ); + for (var i = 0; i < numDocs; i++) { + var numPoints = Math.floor(Random.rand() * maxPointsPerDoc + 1); var docIn = false; var multiPoint = []; totalPoints += numPoints; - for ( var p = 0; p < numPoints; p++ ) { + for (var p = 0; p < numPoints; p++) { var point = randomPoint(); - multiPoint.push( point ); + multiPoint.push(point); - if ( Geo.sphereDistance( startPoint, point ) <= radius ) { + if (Geo.sphereDistance(startPoint, point) <= radius) { pointsIn++; docIn = true; } else { @@ -77,54 +79,64 @@ for ( var test = 0; test < numTests; test++ ) { } } - bulk.insert( { loc : multiPoint } ); + bulk.insert({loc: multiPoint}); - if ( docIn ) + if (docIn) docsIn++; else docsOut++; - } - printjson( { test: test, radius : radius, bits : bits, numDocs : numDocs, - pointsIn : pointsIn, docsIn : docsIn, pointsOut : pointsOut, - docsOut : docsOut } ); + printjson({ + test: test, + radius: radius, + bits: bits, + numDocs: numDocs, + pointsIn: pointsIn, + docsIn: docsIn, + pointsOut: pointsOut, + docsOut: docsOut + }); assert.writeOK(bulk.execute()); - assert.eq( docsIn + docsOut, numDocs ); - assert.eq( pointsIn + pointsOut, totalPoints ); + assert.eq(docsIn + docsOut, numDocs); + assert.eq(pointsIn + pointsOut, totalPoints); // $centerSphere - assert.eq( docsIn, t.find({ loc: { $within: - { $centerSphere: [ startPoint, radius ]}}} ).count() ); + assert.eq(docsIn, t.find({loc: {$within: {$centerSphere: [startPoint, radius]}}}).count()); // $nearSphere - var cursor = t.find({ loc: { $nearSphere: startPoint, $maxDistance: radius }}); - var results = cursor.limit( 2 * pointsIn ).toArray(); + var cursor = t.find({loc: {$nearSphere: startPoint, $maxDistance: radius}}); + var results = cursor.limit(2 * pointsIn).toArray(); - assert.eq( docsIn, results.length ); + assert.eq(docsIn, results.length); var distance = 0; - for ( var i = 0; i < results.length; i++ ) { + for (var i = 0; i < results.length; i++) { var minNewDistance = radius + 1; - for( var j = 0; j < results[i].loc.length; j++ ){ - var newDistance = Geo.sphereDistance( startPoint, results[i].loc[j] ); - if( newDistance < minNewDistance && newDistance >= distance ) { + for (var j = 0; j < results[i].loc.length; j++) { + var newDistance = Geo.sphereDistance(startPoint, results[i].loc[j]); + if (newDistance < minNewDistance && newDistance >= distance) { minNewDistance = newDistance; } } - //print( "Dist from : " + results[i].loc[j] + " to " + startPoint + " is " + // print( "Dist from : " + results[i].loc[j] + " to " + startPoint + " is " // + minNewDistance + " vs " + radius ) - assert.lte( minNewDistance, radius ); - assert.gte( minNewDistance, distance ); + assert.lte(minNewDistance, radius); + assert.gte(minNewDistance, distance); distance = minNewDistance; } // geoNear - results = db.runCommand({ geoNear: "sphere", near: startPoint, maxDistance: radius, - num : 2 * pointsIn, spherical : true } ).results; + results = db.runCommand({ + geoNear: "sphere", + near: startPoint, + maxDistance: radius, + num: 2 * pointsIn, + spherical: true + }).results; /* printjson( results ); @@ -135,26 +147,25 @@ for ( var test = 0; test < numTests; test++ ) { } */ - assert.eq( docsIn, results.length ); + assert.eq(docsIn, results.length); var distance = 0; - for ( var i = 0; i < results.length; i++ ) { + for (var i = 0; i < results.length; i++) { var retDistance = results[i].dis; // print( "Dist from : " + results[i].loc + " to " + startPoint + " is " // + retDistance + " vs " + radius ) var distInObj = false; - for ( var j = 0; j < results[i].obj.loc.length && distInObj == false; j++ ) { - var newDistance = Geo.sphereDistance( startPoint, results[i].obj.loc[j] ); - distInObj = ( newDistance >= retDistance - 0.0001 && - newDistance <= retDistance + 0.0001 ); + for (var j = 0; j < results[i].obj.loc.length && distInObj == false; j++) { + var newDistance = Geo.sphereDistance(startPoint, results[i].obj.loc[j]); + distInObj = + (newDistance >= retDistance - 0.0001 && newDistance <= retDistance + 0.0001); } - assert( distInObj ); - assert.lte( retDistance, radius ); - assert.gte( retDistance, distance ); + assert(distInObj); + assert.lte(retDistance, radius); + assert.gte(retDistance, distance); distance = retDistance; } } - |