summaryrefslogtreecommitdiff
path: root/jstests/noPassthroughWithMongod/index_multi.js
blob: ec162821d4b9580beeb04f44979184dabb3c7683 (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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Attempt to build 63 indexes simultaneously

Random.setRandomSeed();

var coll = db.index_multi;
coll.drop();
db.results.drop();

var bulk = coll.initializeUnorderedBulkOp();
print("Populate the collection with random data");
for (var i = 0; i < 1e4; i++) {
    var doc = {"_id" : i};

    for (var j=0; j<100; j++) {
        // Skip some of the fields
        if (Random.rand() < .1) {
            continue;
        }
        // Make 0, 10, etc. multikey indexes
        else if (j % 10 == 0) {
            doc["field"+j] = [Random.rand(), Random.rand(), Random.rand()];
        }
        else {
            doc["field"+j] = Random.rand();
        }
    }

    bulk.insert(doc);
}
assert.writeOK(bulk.execute());

// Array of all index specs
var specs = [];
var multikey = [];

var setupDBStr =
        "var conn = null;" +
        "assert.soon(function() {" +
        "  try {" +
        "    conn = new Mongo(\"" + db.getMongo().host + "\");" +
        "    return conn;" +
        "  } catch (x) {" +
        "    return false;" +
        "  }" +
        "}, 'Timed out waiting for temporary connection to connect', 30000, 5000);" +
        "var db = conn.getDB('" + db.getName() + "');";

var indexJobs = [];
print("Create 3 triple indexes");
for (var i = 90; i < 93; i++) {
    var spec = {};
    spec["field"+i] = 1;
    spec["field"+(i+1)] = 1;
    spec["field"+(i+2)] = 1;
    indexJobs.push(startParallelShell(setupDBStr +
                                      "printjson(db.index_multi.createIndex(" + tojson(spec) + "," +
                                      "{ background: true }));" +
                                      "db.results.insert(Object.extend(" +
                                      "db.runCommand({ getlasterror: 1 }), " + tojson(spec) +
                                      ") );",
                                      null, // port
                                      true)); // noconnect
    specs.push(spec);
    multikey.push(i % 10 == 0 || (i+1) % 10 == 0 || (i+2) % 10 == 0);
}

print("Create 30 compound indexes");
for (var i = 30; i < 90; i += 2) {
    var spec = {};
    spec["field"+i] = 1;
    spec["field"+(i+1)] = 1;
    indexJobs.push(startParallelShell(setupDBStr +
                                      "printjson(db.index_multi.createIndex(" + tojson(spec) + ", " +
                                      "{ background: true }));" +
                                      "db.results.insert(Object.extend(" +
                                      "db.runCommand({ getlasterror: 1 }), " + tojson(spec) +
                                      ") );",
                                      null, // port
                                      true)); // noconnect
    specs.push(spec);
    multikey.push(i % 10 == 0 || (i+1) % 10 == 0);
}

print("Create 30 indexes");
for (var i = 0; i < 30; i++) {
    var spec = {};
    spec["field"+i] = 1;
    indexJobs.push(startParallelShell(setupDBStr +
                                      "printjson(db.index_multi.createIndex(" + tojson(spec) + ", " +
                                      "{ background: true }));" +
                                      "db.results.insert(Object.extend(" +
                                      "db.runCommand({ getlasterror: 1 }), " + tojson(spec) +
                                      ") );",
                                      null, // port
                                      true)); // noconnect
    specs.push(spec);
    multikey.push(i % 10 == 0);
}

print("Do some sets and unsets");
bulk = coll.initializeUnorderedBulkOp();
for (i = 0; i < 1e4; i++) {
    var criteria = {_id: Random.randInt(1e5)};
    var mod = {};
    if (Random.rand() < .5) {
        mod['$set'] = {};
        mod['$set']['field'+Random.randInt(100)] = Random.rand();
    }
    else {
        mod['$unset'] = {};
        mod['$unset']['field'+Random.randInt(100)] = true;
    }

    bulk.find(criteria).update(mod);
}
assert.writeOK(bulk.execute());

indexJobs.forEach(function(join) {
    join();
});

printjson(db.results.find().toArray());
//assert.eq(coll.getIndexes().length, 64, "didn't see 64 indexes");

print("Make sure we end up with 64 indexes");
for (var i in specs) {
    var explain = coll.find().hint(specs[i]).explain();
    assert("queryPlanner" in explain, tojson(explain));
}

print("SUCCESS!");