mirror of https://github.com/mongodb/mongo
65 lines
1.7 KiB
JavaScript
65 lines
1.7 KiB
JavaScript
// @tags: [
|
|
// # Haystack index is not available on embedded
|
|
// incompatible_with_embedded,
|
|
// ]
|
|
|
|
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 );
|
|
}
|