summaryrefslogtreecommitdiff
path: root/jstests/core/query/explain/explain_winning_plan.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/query/explain/explain_winning_plan.js')
-rw-r--r--jstests/core/query/explain/explain_winning_plan.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/jstests/core/query/explain/explain_winning_plan.js b/jstests/core/query/explain/explain_winning_plan.js
new file mode 100644
index 00000000000..cd0c62f9e43
--- /dev/null
+++ b/jstests/core/query/explain/explain_winning_plan.js
@@ -0,0 +1,67 @@
+// Tests that the winning plan statistics are correctly reported in Explain output at
+// "allPlansExecution" verbosity mode.
+//
+// This test is not prepared to handle explain output for sharded collections or when executed
+// against a mongos.
+// @tags: [
+// assumes_unsharded_collection,
+// assumes_against_mongod_not_mongos,
+// ]
+
+(function() {
+"use strict";
+
+const coll = db.explain_winning_plan;
+coll.drop();
+
+// Create two indexes to ensure that the best plan will be picked by the multi-planner.
+assert.commandWorked(coll.createIndex({a: 1}));
+assert.commandWorked(coll.createIndex({a: 1, b: 1}));
+
+// Load the server parameter which instructs the planner to stop when a candidate plan returns that
+// many documents.
+const res = db.adminCommand({getParameter: 1, internalQueryPlanEvaluationMaxResults: 1});
+assert.commandWorked(res);
+assert(res.hasOwnProperty("internalQueryPlanEvaluationMaxResults"));
+const maxResults = res["internalQueryPlanEvaluationMaxResults"];
+assert.gt(maxResults, 0);
+
+// Insert 'maxResults' plus some extra documents into the collection. We expect each candidate plan
+// to return 'maxResults' during the trial period, which should be reported in "allPlansExecution"
+// section of explain output, and 'numDocs' documents (the entire collection) in the
+// "executionStats" section of the winning plan.
+const numDocs = maxResults + 20;
+assert.commandWorked(coll.insert(Array.from({length: numDocs}, (_, i) => {
+ return {_id: i, a: i};
+})));
+
+const explain = coll.find({a: {$gte: 0}}).explain("allPlansExecution");
+
+// Make sure the "executionStats" section of the explain output correctly reports the number of
+// returned documents for the winning plan after it was executed until EOF.
+assert(explain.hasOwnProperty("executionStats"), explain);
+assert.eq(explain.executionStats.nReturned, numDocs);
+
+// Make sure the "allPlansExecution" section contains an array with exactly two elements
+// representing two candidate plans evaluated by the multi-planner.
+assert(explain.executionStats.hasOwnProperty("allPlansExecution"), explain);
+assert(Array.isArray(explain.executionStats.allPlansExecution), explain);
+assert.eq(explain.executionStats.allPlansExecution.length, 2, explain);
+
+// Each candidate plan should have returned exactly 'maxResults' number of documents during the
+// trial period.
+for (const planStats of explain.executionStats.allPlansExecution) {
+ assert(planStats.hasOwnProperty("nReturned"));
+ assert.eq(planStats.nReturned, maxResults, explain);
+}
+
+// If there was a single plan, allPlansExecution array should be present but empty.
+const explainSinglePlan = coll.find().explain("allPlansExecution");
+assert(explainSinglePlan.hasOwnProperty("executionStats"), explainSinglePlan);
+assert.eq(explainSinglePlan.executionStats.nReturned, numDocs);
+assert(explainSinglePlan.executionStats.hasOwnProperty("allPlansExecution"), explainSinglePlan);
+assert(Array.isArray(explainSinglePlan.executionStats.allPlansExecution), explainSinglePlan);
+assert.eq(explainSinglePlan.executionStats.allPlansExecution.length, 0, explainSinglePlan);
+
+assert(coll.drop());
+}());