summaryrefslogtreecommitdiff
path: root/jstests/stages_ixscan.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/stages_ixscan.js')
-rw-r--r--jstests/stages_ixscan.js76
1 files changed, 76 insertions, 0 deletions
diff --git a/jstests/stages_ixscan.js b/jstests/stages_ixscan.js
new file mode 100644
index 00000000000..a7cd6bedc3a
--- /dev/null
+++ b/jstests/stages_ixscan.js
@@ -0,0 +1,76 @@
+// Test basic query stage index scan functionality.
+t = db.stages_ixscan;
+t.drop();
+
+var N = 50;
+for (var i = 0; i < N; ++i) {
+ t.insert({foo: i, bar: N - i, baz: i});
+}
+
+t.ensureIndex({foo: 1})
+t.ensureIndex({foo: 1, baz: 1});
+
+// foo <= 20
+ixscan1 = {ixscan: {args:{name: "stages_ixscan", keyPattern:{foo: 1},
+ startKey: {"": 20},
+ endKey: {}, endKeyInclusive: true,
+ direction: -1}}};
+res = db.runCommand({stageDebug: ixscan1});
+assert(!db.getLastError());
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 21);
+
+// 20 <= foo < 30
+ixscan1 = {ixscan: {args:{name: "stages_ixscan", keyPattern:{foo: 1},
+ startKey: {"": 20},
+ endKey: {"" : 30}, endKeyInclusive: false,
+ direction: 1}}};
+res = db.runCommand({stageDebug: ixscan1});
+assert(!db.getLastError());
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 10);
+
+// 20 <= foo <= 30
+ixscan1 = {ixscan: {args:{name: "stages_ixscan", keyPattern:{foo: 1},
+ startKey: {"": 20},
+ endKey: {"" : 30}, endKeyInclusive: true,
+ direction: 1}}};
+res = db.runCommand({stageDebug: ixscan1});
+assert(!db.getLastError());
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 11);
+
+// 20 <= foo <= 30
+// foo == 25
+ixscan1 = {ixscan: {args:{name: "stages_ixscan", keyPattern:{foo: 1},
+ startKey: {"": 20},
+ endKey: {"" : 30}, endKeyInclusive: true,
+ direction: 1},
+ filter: {foo: 25}}};
+res = db.runCommand({stageDebug: ixscan1});
+assert(!db.getLastError());
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 1);
+
+// 20 <= foo <= 30
+// baz == 25 (in index so we can match against it.)
+ixscan1 = {ixscan: {args:{name: "stages_ixscan", keyPattern:{foo:1, baz: 1},
+ startKey: {"": 20, "":MinKey},
+ endKey: {"" : 30, "":MaxKey}, endKeyInclusive: true,
+ direction: 1},
+ filter: {baz: 25}}};
+res = db.runCommand({stageDebug: ixscan1});
+assert(!db.getLastError());
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 1);
+
+// 20 <= foo <= 30
+// bar == 25 (not covered, should error.)
+ixscan1 = {ixscan: {args:{name: "stages_ixscan", keyPattern:{foo:1, baz: 1},
+ startKey: {"": 20, "":MinKey},
+ endKey: {"" : 30, "":MaxKey}, endKeyInclusive: true,
+ direction: 1},
+ filter: {bar: 25}}};
+res = db.runCommand({stageDebug: ixscan1});
+assert(db.getLastError());
+assert.eq(res.ok, 0);