summaryrefslogtreecommitdiff
path: root/jstests/aggregation/explain_limit.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/aggregation/explain_limit.js')
-rw-r--r--jstests/aggregation/explain_limit.js123
1 files changed, 61 insertions, 62 deletions
diff --git a/jstests/aggregation/explain_limit.js b/jstests/aggregation/explain_limit.js
index e3451dc0c7c..a0dabdc1b02 100644
--- a/jstests/aggregation/explain_limit.js
+++ b/jstests/aggregation/explain_limit.js
@@ -1,80 +1,79 @@
// Tests the behavior of explain() when used with the aggregation pipeline and limits.
// @tags: [do_not_wrap_aggregations_in_facets]
(function() {
- "use strict";
-
- load("jstests/libs/analyze_plan.js"); // For getAggPlanStages().
-
- let coll = db.explain_limit;
-
- const kMultipleSolutionLimit = 101;
- const kCollSize = kMultipleSolutionLimit + 5;
- const kLimit = 10;
-
- // Return whether or explain() was successful and contained the appropriate fields given the
- // requested verbosity. Checks that the number of documents examined is correct based on
- // 'multipleSolutions', which indicates there was more than one plan available.
- function checkResults({results, verbosity, multipleSolutions}) {
- let cursorSubdocs = getAggPlanStages(results, "$cursor");
- assert.gt(cursorSubdocs.length, 0);
- for (let stageResult of cursorSubdocs) {
- assert(stageResult.hasOwnProperty("$cursor"));
- let result = stageResult.$cursor;
-
- assert.eq(result.limit, NumberLong(kLimit), tojson(results));
-
- if (verbosity === "queryPlanner") {
- assert(!result.hasOwnProperty("executionStats"), tojson(results));
+"use strict";
+
+load("jstests/libs/analyze_plan.js"); // For getAggPlanStages().
+
+let coll = db.explain_limit;
+
+const kMultipleSolutionLimit = 101;
+const kCollSize = kMultipleSolutionLimit + 5;
+const kLimit = 10;
+
+// Return whether or explain() was successful and contained the appropriate fields given the
+// requested verbosity. Checks that the number of documents examined is correct based on
+// 'multipleSolutions', which indicates there was more than one plan available.
+function checkResults({results, verbosity, multipleSolutions}) {
+ let cursorSubdocs = getAggPlanStages(results, "$cursor");
+ assert.gt(cursorSubdocs.length, 0);
+ for (let stageResult of cursorSubdocs) {
+ assert(stageResult.hasOwnProperty("$cursor"));
+ let result = stageResult.$cursor;
+
+ assert.eq(result.limit, NumberLong(kLimit), tojson(results));
+
+ if (verbosity === "queryPlanner") {
+ assert(!result.hasOwnProperty("executionStats"), tojson(results));
+ } else {
+ // If it's "executionStats" or "allPlansExecution".
+ if (multipleSolutions) {
+ // If there's more than one plan available, we may run several of them against
+ // each other to see which is fastest. During this, our limit may be ignored
+ // and so explain may return that it examined more documents than we asked it
+ // to.
+ assert.lte(
+ result.executionStats.nReturned, kMultipleSolutionLimit, tojson(results));
+ assert.lte(result.executionStats.totalDocsExamined,
+ kMultipleSolutionLimit,
+ tojson(results));
} else {
- // If it's "executionStats" or "allPlansExecution".
- if (multipleSolutions) {
- // If there's more than one plan available, we may run several of them against
- // each other to see which is fastest. During this, our limit may be ignored
- // and so explain may return that it examined more documents than we asked it
- // to.
- assert.lte(
- result.executionStats.nReturned, kMultipleSolutionLimit, tojson(results));
- assert.lte(result.executionStats.totalDocsExamined,
- kMultipleSolutionLimit,
- tojson(results));
- } else {
- assert.eq(result.executionStats.nReturned, kLimit, tojson(results));
- assert.eq(result.executionStats.totalDocsExamined, kLimit, tojson(results));
- }
+ assert.eq(result.executionStats.nReturned, kLimit, tojson(results));
+ assert.eq(result.executionStats.totalDocsExamined, kLimit, tojson(results));
}
}
}
+}
- // explain() should respect limit.
- coll.drop();
- assert.commandWorked(coll.createIndex({a: 1}));
+// explain() should respect limit.
+coll.drop();
+assert.commandWorked(coll.createIndex({a: 1}));
- for (let i = 0; i < kCollSize; i++) {
- assert.writeOK(coll.insert({a: 1}));
- }
+for (let i = 0; i < kCollSize; i++) {
+ assert.writeOK(coll.insert({a: 1}));
+}
- const pipeline = [{$match: {a: 1}}, {$limit: kLimit}];
+const pipeline = [{$match: {a: 1}}, {$limit: kLimit}];
- let plannerLevel = coll.explain("queryPlanner").aggregate(pipeline);
- checkResults({results: plannerLevel, verbosity: "queryPlanner"});
+let plannerLevel = coll.explain("queryPlanner").aggregate(pipeline);
+checkResults({results: plannerLevel, verbosity: "queryPlanner"});
- let execLevel = coll.explain("executionStats").aggregate(pipeline);
- checkResults({results: execLevel, verbosity: "executionStats", multipleSolutions: false});
+let execLevel = coll.explain("executionStats").aggregate(pipeline);
+checkResults({results: execLevel, verbosity: "executionStats", multipleSolutions: false});
- let allPlansExecLevel = coll.explain("allPlansExecution").aggregate(pipeline);
- checkResults(
- {results: allPlansExecLevel, verbosity: "allPlansExecution", multipleSolutions: false});
+let allPlansExecLevel = coll.explain("allPlansExecution").aggregate(pipeline);
+checkResults(
+ {results: allPlansExecLevel, verbosity: "allPlansExecution", multipleSolutions: false});
- // Create a second index so that more than one plan is available.
- assert.commandWorked(coll.createIndex({a: 1, b: 1}));
+// Create a second index so that more than one plan is available.
+assert.commandWorked(coll.createIndex({a: 1, b: 1}));
- plannerLevel = coll.explain("queryPlanner").aggregate(pipeline);
- checkResults({results: plannerLevel, verbosity: "queryPlanner"});
+plannerLevel = coll.explain("queryPlanner").aggregate(pipeline);
+checkResults({results: plannerLevel, verbosity: "queryPlanner"});
- execLevel = coll.explain("executionStats").aggregate(pipeline);
- checkResults({results: execLevel, verbosity: "executionStats", multipleSolutions: true});
+execLevel = coll.explain("executionStats").aggregate(pipeline);
+checkResults({results: execLevel, verbosity: "executionStats", multipleSolutions: true});
- allPlansExecLevel = coll.explain("allPlansExecution").aggregate(pipeline);
- checkResults(
- {results: allPlansExecLevel, verbosity: "allPlansExecution", multipleSolutions: true});
+allPlansExecLevel = coll.explain("allPlansExecution").aggregate(pipeline);
+checkResults({results: allPlansExecLevel, verbosity: "allPlansExecution", multipleSolutions: true});
})();