summaryrefslogtreecommitdiff
path: root/jstests/noPassthroughWithMongod/wildcard_index_nonblocking_sort.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthroughWithMongod/wildcard_index_nonblocking_sort.js')
-rw-r--r--jstests/noPassthroughWithMongod/wildcard_index_nonblocking_sort.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/jstests/noPassthroughWithMongod/wildcard_index_nonblocking_sort.js b/jstests/noPassthroughWithMongod/wildcard_index_nonblocking_sort.js
new file mode 100644
index 00000000000..b9c7edb3921
--- /dev/null
+++ b/jstests/noPassthroughWithMongod/wildcard_index_nonblocking_sort.js
@@ -0,0 +1,67 @@
+(function() {
+ "use strict";
+
+ load("jstests/aggregation/extras/utils.js"); // For arrayEq().
+ load("jstests/libs/analyze_plan.js"); // For getPlanStages().
+
+ const coll = db.wildcard_nonblocking_sort;
+
+ // Required in order to build $** indexes.
+ assert.commandWorked(
+ db.adminCommand({setParameter: 1, internalQueryAllowAllPathsIndexes: true}));
+
+ assert.commandWorked(coll.createIndex({"$**": 1}, {wildcardProjection: {"excludedField": 0}}));
+
+ for (let i = 0; i < 50; i++) {
+ assert.commandWorked(coll.insert({a: i, b: -i, x: [123], excludedField: i}));
+ }
+
+ function checkQueryHasSameResultsWhenUsingIdIndex(query, sort) {
+ const l = coll.find(query).sort(sort).toArray();
+ const r = coll.find(query).sort(sort).hint({$natural: 1}).toArray();
+ assert(arrayEq(l, r));
+ }
+
+ function checkQueryUsesSortType(query, sort, isBlocking) {
+ const explain = assert.commandWorked(coll.find(query).sort(sort).explain());
+ const plan = explain.queryPlanner.winningPlan;
+
+ const ixScans = getPlanStages(plan, "IXSCAN");
+ const sorts = getPlanStages(plan, "SORT");
+
+ if (isBlocking) {
+ assert.eq(sorts.length, 1);
+ assert.eq(sorts[0].sortPattern, sort);
+
+ // A blocking sort may or may not use the index, so we don't check the length of
+ // 'ixScans'.
+ } else {
+ assert.eq(sorts.length, 0);
+ assert.eq(ixScans.length, 1);
+
+ const sortKey = Object.keys(sort)[0];
+ assert.docEq(ixScans[0].keyPattern, {$_path: 1, [sortKey]: 1});
+ }
+ }
+
+ function checkQueryUsesNonBlockingSortAndGetsCorrectResults(query, sort) {
+ checkQueryUsesSortType(query, sort, false);
+ checkQueryHasSameResultsWhenUsingIdIndex(query, sort);
+ }
+
+ function checkQueryUsesBlockingSortAndGetsCorrectResults(query, sort) {
+ checkQueryUsesSortType(query, sort, true);
+ checkQueryHasSameResultsWhenUsingIdIndex(query, sort);
+ }
+
+ checkQueryUsesNonBlockingSortAndGetsCorrectResults({a: {$gte: 0}}, {a: 1});
+ checkQueryUsesNonBlockingSortAndGetsCorrectResults({a: {$gte: 0}, x: 123}, {a: 1});
+
+ checkQueryUsesBlockingSortAndGetsCorrectResults({x: {$elemMatch: {$eq: 123}}}, {x: 1});
+ checkQueryUsesBlockingSortAndGetsCorrectResults({x: {$elemMatch: {$eq: 123}}}, {a: 1});
+ checkQueryUsesBlockingSortAndGetsCorrectResults({a: {$gte: 0}}, {a: 1, b: 1});
+ checkQueryUsesBlockingSortAndGetsCorrectResults({a: {$exists: true}}, {a: 1});
+ checkQueryUsesBlockingSortAndGetsCorrectResults({}, {a: 1});
+ checkQueryUsesBlockingSortAndGetsCorrectResults({x: 123}, {a: 1});
+ checkQueryUsesBlockingSortAndGetsCorrectResults({excludedField: {$gte: 0}}, {excludedField: 1});
+})();