summaryrefslogtreecommitdiff
path: root/jstests/core/stages_or.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/stages_or.js')
-rw-r--r--jstests/core/stages_or.js33
1 files changed, 33 insertions, 0 deletions
diff --git a/jstests/core/stages_or.js b/jstests/core/stages_or.js
new file mode 100644
index 00000000000..bb0e02b11d4
--- /dev/null
+++ b/jstests/core/stages_or.js
@@ -0,0 +1,33 @@
+// Test basic OR functionality
+t = db.stages_or;
+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({bar: 1})
+t.ensureIndex({baz: 1})
+
+// baz >= 40
+ixscan1 = {ixscan: {args:{name: "stages_or", keyPattern:{baz: 1},
+ startKey: {"": 40}, endKey: {},
+ endKeyInclusive: true, direction: 1}}};
+// foo >= 40
+ixscan2 = {ixscan: {args:{name: "stages_or", keyPattern:{foo: 1},
+ startKey: {"": 40}, endKey: {},
+ endKeyInclusive: true, direction: 1}}};
+
+// OR of baz and foo. Baz == foo and we dedup.
+orix1ix2 = {or: {args: {nodes: [ixscan1, ixscan2], dedup:true}}};
+res = db.runCommand({stageDebug: orix1ix2});
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 10);
+
+// No deduping, 2x the results.
+orix1ix2nodd = {or: {args: {nodes: [ixscan1, ixscan2], dedup:false}}};
+res = db.runCommand({stageDebug: orix1ix2nodd});
+assert.eq(res.ok, 1);
+assert.eq(res.results.length, 20);