summaryrefslogtreecommitdiff
path: root/jstests/core/geo_haystack2.js
blob: b9946ef3cd837171ecc1973f81098189a7959503 (plain)
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
61
62
63
64
// @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 );
}