1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
t = db.geo_haystack2
t.drop()
function distance( a , b ){
var x = a[0] - b[0];
var y = a[1] - b[1];
return Math.sqrt( ( x * x ) + ( y * y ) );
}
function distanceTotal( a , arr , f ){
var total = 0;
for ( var i=0; i<arr.length; i++ ){
total += distance( a , arr[i][f] );
}
return total;
}
queries = [
{ near : [ 7 , 8 ] , maxDistance : 3 , search : { z : 3 } } ,
]
answers = queries.map( function(){ return { totalDistance : 0 , results : [] }; } )
n = 0;
for ( x=0; x<20; x++ ){
for ( y=0; y<20; y++ ){
t.insert( { _id : n , loc : [ x , y ] , z : [ n % 10 , ( n + 5 ) % 10 ] } );
for ( i=0; i<queries.length; i++ ){
var d = distance( queries[i].near , [ x , y ] )
if ( d > queries[i].maxDistance )
continue;
if ( queries[i].search.z != n % 10 &&
queries[i].search.z != ( n + 5 ) % 10 )
continue;
answers[i].results.push( { _id : n , loc : [ x , y ] } )
answers[i].totalDistance += d;
}
n++;
}
}
t.ensureIndex( { loc : "geoHaystack" , z : 1 } , { bucketSize : .7 } );
for ( i=0; i<queries.length; i++ ){
print( "---------" );
printjson( queries[i] );
res = t.runCommand( "geoSearch" , queries[i] )
print( "\t" + tojson( res.stats ) );
print( "\tshould have: " + answers[i].results.length + "\t actually got: " + res.stats.n );
assert.eq( answers[i].results.length , res.stats.n, "num:"+ i + " number matches" )
assert.eq( answers[i].totalDistance , distanceTotal( queries[i].near , res.results , "loc" ), "num:"+ i + " totalDistance" )
//printjson( res );
//printjson( answers[i].length );
}
|