summaryrefslogtreecommitdiff
path: root/jstests/explainb.js
diff options
context:
space:
mode:
authorAntonin Kral <a.kral@bobek.cz>2012-08-29 20:54:51 +0200
committerAntonin Kral <a.kral@bobek.cz>2012-08-29 20:54:51 +0200
commit83957b73f9177f6e38bd5375bd93ca1f6a47188c (patch)
treef20b7d6ac9a9c64ff5bb6b5910a24abbb356b1d5 /jstests/explainb.js
parent5071d203970edd4c995493d810abe20987e76fe9 (diff)
Imported Upstream version 2.2.0upstream/2.2.0
Diffstat (limited to 'jstests/explainb.js')
-rw-r--r--jstests/explainb.js74
1 files changed, 74 insertions, 0 deletions
diff --git a/jstests/explainb.js b/jstests/explainb.js
new file mode 100644
index 00000000000..ec56c69023d
--- /dev/null
+++ b/jstests/explainb.js
@@ -0,0 +1,74 @@
+// nscanned and nscannedObjects report results for the winning plan; nscannedAllPlans and
+// nscannedObjectsAllPlans report results for all plans. SERVER-6268
+
+t = db.jstests_explainb;
+t.drop();
+
+t.ensureIndex( { a:1, b:1 } );
+t.ensureIndex( { b:1, a:1 } );
+
+t.save( { a:0, b:1 } );
+t.save( { a:1, b:0 } );
+
+explain = t.find( { a:{ $gte:0 }, b:{ $gte:0 } } ).explain( true );
+
+// The a:1,b:1 plan finishes scanning first.
+assert.eq( 'BtreeCursor a_1_b_1', explain.cursor );
+assert.eq( 2, explain.n );
+// nscanned and nscannedObjects are reported for the a:1,b:1 plan.
+assert.eq( 2, explain.nscanned );
+assert.eq( 2, explain.nscannedObjects );
+// nscannedAllPlans and nscannedObjectsAllPlans report the combined total of all plans.
+assert.eq( 6, explain.nscannedAllPlans );
+assert.eq( 6, explain.nscannedObjectsAllPlans );
+
+// A limit of 2.
+explain = t.find( { a:{ $gte:0 }, b:{ $gte:0 } } ).limit( -2 ).explain( true );
+
+assert.eq( 'BtreeCursor a_1_b_1', explain.cursor );
+assert.eq( 2, explain.n );
+assert.eq( 1, explain.nscanned );
+assert.eq( 1, explain.nscannedObjects );
+// The first result was identified for each plan.
+assert.eq( 3, explain.nscannedAllPlans );
+// One result was retrieved from each of the two indexed plans.
+assert.eq( 2, explain.nscannedObjectsAllPlans );
+
+// A $or query.
+explain = t.find( { $or:[ { a:{ $gte:0 }, b:{ $gte:1 } },
+ { a:{ $gte:1 }, b:{ $gte:0 } } ] } ).explain( true );
+assert.eq( 1, explain.clauses[ 0 ].n );
+assert.eq( 1, explain.clauses[ 0 ].nscannedObjects );
+assert.eq( 2, explain.clauses[ 0 ].nscanned );
+assert.eq( 3, explain.clauses[ 0 ].nscannedObjectsAllPlans );
+assert.eq( 4, explain.clauses[ 0 ].nscannedAllPlans );
+assert.eq( 1, explain.clauses[ 1 ].n );
+assert.eq( 1, explain.clauses[ 1 ].nscannedObjects );
+assert.eq( 1, explain.clauses[ 1 ].nscanned );
+assert.eq( 3, explain.clauses[ 1 ].nscannedObjectsAllPlans );
+assert.eq( 3, explain.clauses[ 1 ].nscannedAllPlans );
+assert.eq( 2, explain.n );
+
+// These are computed by summing the values for each clause.
+assert.eq( 2, explain.n );
+assert.eq( 2, explain.nscannedObjects );
+assert.eq( 3, explain.nscanned );
+assert.eq( 6, explain.nscannedObjectsAllPlans );
+assert.eq( 7, explain.nscannedAllPlans );
+
+// A non $or case where nscanned != nscannedObjects.
+t.remove();
+
+t.save( { a:'0', b:'1' } );
+t.save( { a:'1', b:'0' } );
+
+explain = t.find( { a:/0/, b:/1/ } ).explain( true );
+
+assert.eq( 'BtreeCursor a_1_b_1 multi', explain.cursor );
+assert.eq( 1, explain.n );
+assert.eq( 2, explain.nscanned );
+assert.eq( 1, explain.nscannedObjects );
+// Two results were scanned for each plan.
+assert.eq( 6, explain.nscannedAllPlans );
+// The indexed plans each loaded one matching object, the unindexed plan loaded two.
+assert.eq( 4, explain.nscannedObjectsAllPlans );