summaryrefslogtreecommitdiff
path: root/jstests/core/wildcard_index_collation.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/wildcard_index_collation.js')
-rw-r--r--jstests/core/wildcard_index_collation.js194
1 files changed, 97 insertions, 97 deletions
diff --git a/jstests/core/wildcard_index_collation.js b/jstests/core/wildcard_index_collation.js
index 5e71100c7c2..9ccbc0181dd 100644
--- a/jstests/core/wildcard_index_collation.js
+++ b/jstests/core/wildcard_index_collation.js
@@ -9,116 +9,116 @@
* requires_non_retryable_writes]
*/
(function() {
- "user strict";
+"user strict";
- load("jstests/aggregation/extras/utils.js"); // For arrayEq.
- load("jstests/libs/analyze_plan.js"); // For getPlanStages.
- load("jstests/libs/get_index_helpers.js"); // For GetIndexHelpers.
- load("jstests/libs/collection_drop_recreate.js"); // For assert[Drop|Create]Collection.
- load("jstests/libs/fixture_helpers.js"); // For isMongos.
+load("jstests/aggregation/extras/utils.js"); // For arrayEq.
+load("jstests/libs/analyze_plan.js"); // For getPlanStages.
+load("jstests/libs/get_index_helpers.js"); // For GetIndexHelpers.
+load("jstests/libs/collection_drop_recreate.js"); // For assert[Drop|Create]Collection.
+load("jstests/libs/fixture_helpers.js"); // For isMongos.
- const assertArrayEq = (l, r) => assert(arrayEq(l, r));
+const assertArrayEq = (l, r) => assert(arrayEq(l, r));
- // Create the collection and assign it a default case-insensitive collation.
- const coll = assertDropAndRecreateCollection(
- db, "wildcard_collation", {collation: {locale: "en_US", strength: 1}});
+// Create the collection and assign it a default case-insensitive collation.
+const coll = assertDropAndRecreateCollection(
+ db, "wildcard_collation", {collation: {locale: "en_US", strength: 1}});
- // Extracts the winning plan for the given query and projection from the explain output.
- const winningPlan = (query, proj) => FixtureHelpers.isMongos(db)
- ? coll.find(query, proj).explain().queryPlanner.winningPlan.shards[0].winningPlan
- : coll.find(query, proj).explain().queryPlanner.winningPlan;
+// Extracts the winning plan for the given query and projection from the explain output.
+const winningPlan = (query, proj) => FixtureHelpers.isMongos(db)
+ ? coll.find(query, proj).explain().queryPlanner.winningPlan.shards[0].winningPlan
+ : coll.find(query, proj).explain().queryPlanner.winningPlan;
- // Runs the given query and confirms that: (1) the $** was used to answer the query, (2) the
- // results produced by the $** index match the given 'expectedResults', and (3) the same output
- // is produced by a COLLSCAN with the same collation.
- function assertWildcardIndexAnswersQuery(query, expectedResults, projection) {
- // Verify that the $** index can answer this query.
- const ixScans = getPlanStages(winningPlan(query, (projection || {_id: 0})), "IXSCAN");
- assert.gt(ixScans.length, 0, tojson(coll.find(query).explain()));
- ixScans.forEach((ixScan) => assert(ixScan.keyPattern.$_path));
+// Runs the given query and confirms that: (1) the $** was used to answer the query, (2) the
+// results produced by the $** index match the given 'expectedResults', and (3) the same output
+// is produced by a COLLSCAN with the same collation.
+function assertWildcardIndexAnswersQuery(query, expectedResults, projection) {
+ // Verify that the $** index can answer this query.
+ const ixScans = getPlanStages(winningPlan(query, (projection || {_id: 0})), "IXSCAN");
+ assert.gt(ixScans.length, 0, tojson(coll.find(query).explain()));
+ ixScans.forEach((ixScan) => assert(ixScan.keyPattern.$_path));
- // Assert that the $** index produces the expected results, and that these are the same
- // as those produced by a COLLSCAN with the same collation.
- const wildcardResults = coll.find(query, (projection || {_id: 0})).toArray();
- assertArrayEq(wildcardResults, expectedResults);
- assertArrayEq(wildcardResults,
- coll.find(query, (projection || {_id: 0}))
- .collation({locale: "en_US", strength: 1})
- .hint({$natural: 1})
- .toArray());
- }
+ // Assert that the $** index produces the expected results, and that these are the same
+ // as those produced by a COLLSCAN with the same collation.
+ const wildcardResults = coll.find(query, (projection || {_id: 0})).toArray();
+ assertArrayEq(wildcardResults, expectedResults);
+ assertArrayEq(wildcardResults,
+ coll.find(query, (projection || {_id: 0}))
+ .collation({locale: "en_US", strength: 1})
+ .hint({$natural: 1})
+ .toArray());
+}
- // Confirms that the index matching the given keyPattern has the specified collation.
- function assertIndexHasCollation(keyPattern, collation) {
- var indexSpecs = coll.getIndexes();
- var found = GetIndexHelpers.findByKeyPattern(indexSpecs, keyPattern, collation);
- assert.neq(null,
- found,
- "Index with key pattern " + tojson(keyPattern) + " and collation " +
- tojson(collation) + " not found: " + tojson(indexSpecs));
- }
+// Confirms that the index matching the given keyPattern has the specified collation.
+function assertIndexHasCollation(keyPattern, collation) {
+ var indexSpecs = coll.getIndexes();
+ var found = GetIndexHelpers.findByKeyPattern(indexSpecs, keyPattern, collation);
+ assert.neq(null,
+ found,
+ "Index with key pattern " + tojson(keyPattern) + " and collation " +
+ tojson(collation) + " not found: " + tojson(indexSpecs));
+}
- // Confirm that the $** index inherits the collection's default collation.
- assert.commandWorked(coll.createIndex({"$**": 1}));
- assertIndexHasCollation({"$**": 1}, {
- locale: "en_US",
- caseLevel: false,
- caseFirst: "off",
- strength: 1,
- numericOrdering: false,
- alternate: "non-ignorable",
- maxVariable: "punct",
- normalization: false,
- backwards: false,
- version: "57.1",
- });
+// Confirm that the $** index inherits the collection's default collation.
+assert.commandWorked(coll.createIndex({"$**": 1}));
+assertIndexHasCollation({"$**": 1}, {
+ locale: "en_US",
+ caseLevel: false,
+ caseFirst: "off",
+ strength: 1,
+ numericOrdering: false,
+ alternate: "non-ignorable",
+ maxVariable: "punct",
+ normalization: false,
+ backwards: false,
+ version: "57.1",
+});
- // Insert a series of documents whose fieldnames and values differ only by case.
- assert.commandWorked(coll.insert({a: {b: "string", c: "STRING"}, d: "sTrInG", e: 5}));
- assert.commandWorked(coll.insert({a: {b: "STRING", c: "string"}, d: "StRiNg", e: 5}));
- assert.commandWorked(coll.insert({A: {B: "string", C: "STRING"}, d: "sTrInG", E: 5}));
- assert.commandWorked(coll.insert({A: {B: "STRING", C: "string"}, d: "StRiNg", E: 5}));
+// Insert a series of documents whose fieldnames and values differ only by case.
+assert.commandWorked(coll.insert({a: {b: "string", c: "STRING"}, d: "sTrInG", e: 5}));
+assert.commandWorked(coll.insert({a: {b: "STRING", c: "string"}, d: "StRiNg", e: 5}));
+assert.commandWorked(coll.insert({A: {B: "string", C: "STRING"}, d: "sTrInG", E: 5}));
+assert.commandWorked(coll.insert({A: {B: "STRING", C: "string"}, d: "StRiNg", E: 5}));
- // Confirm that only the document's values adhere to the case-insensitive collation. The field
- // paths, which are also present in the $** index keys, are evaluated using simple binary
- // comparison; so for instance, path "a.b" does *not* match path "A.B".
- assertWildcardIndexAnswersQuery({"a.b": "string"}, [
- {a: {b: "string", c: "STRING"}, d: "sTrInG", e: 5},
- {a: {b: "STRING", c: "string"}, d: "StRiNg", e: 5}
- ]);
- assertWildcardIndexAnswersQuery({"A.B": "string"}, [
- {A: {B: "string", C: "STRING"}, d: "sTrInG", E: 5},
- {A: {B: "STRING", C: "string"}, d: "StRiNg", E: 5}
- ]);
+// Confirm that only the document's values adhere to the case-insensitive collation. The field
+// paths, which are also present in the $** index keys, are evaluated using simple binary
+// comparison; so for instance, path "a.b" does *not* match path "A.B".
+assertWildcardIndexAnswersQuery({"a.b": "string"}, [
+ {a: {b: "string", c: "STRING"}, d: "sTrInG", e: 5},
+ {a: {b: "STRING", c: "string"}, d: "StRiNg", e: 5}
+]);
+assertWildcardIndexAnswersQuery({"A.B": "string"}, [
+ {A: {B: "string", C: "STRING"}, d: "sTrInG", E: 5},
+ {A: {B: "STRING", C: "string"}, d: "StRiNg", E: 5}
+]);
- // All documents in the collection are returned if we query over both upper- and lower-case
- // fieldnames, or when the fieldname has a consistent case across all documents.
- const allDocs = coll.find({}, {_id: 0}).toArray();
- assertWildcardIndexAnswersQuery({$or: [{"a.c": "string"}, {"A.C": "string"}]}, allDocs);
- assertWildcardIndexAnswersQuery({d: "string"}, allDocs);
+// All documents in the collection are returned if we query over both upper- and lower-case
+// fieldnames, or when the fieldname has a consistent case across all documents.
+const allDocs = coll.find({}, {_id: 0}).toArray();
+assertWildcardIndexAnswersQuery({$or: [{"a.c": "string"}, {"A.C": "string"}]}, allDocs);
+assertWildcardIndexAnswersQuery({d: "string"}, allDocs);
- // Confirm that the $** index also differentiates between upper and lower fieldname case when
- // querying fields which do not contain string values.
- assertWildcardIndexAnswersQuery({e: 5}, [
- {a: {b: "string", c: "STRING"}, d: "sTrInG", e: 5},
- {a: {b: "STRING", c: "string"}, d: "StRiNg", e: 5}
- ]);
- assertWildcardIndexAnswersQuery({E: 5}, [
- {A: {B: "string", C: "STRING"}, d: "sTrInG", E: 5},
- {A: {B: "STRING", C: "string"}, d: "StRiNg", E: 5}
- ]);
+// Confirm that the $** index also differentiates between upper and lower fieldname case when
+// querying fields which do not contain string values.
+assertWildcardIndexAnswersQuery({e: 5}, [
+ {a: {b: "string", c: "STRING"}, d: "sTrInG", e: 5},
+ {a: {b: "STRING", c: "string"}, d: "StRiNg", e: 5}
+]);
+assertWildcardIndexAnswersQuery({E: 5}, [
+ {A: {B: "string", C: "STRING"}, d: "sTrInG", E: 5},
+ {A: {B: "STRING", C: "string"}, d: "StRiNg", E: 5}
+]);
- // Confirm that the $** index produces a covered plan for a query on non-string, non-object,
- // non-array values.
- assert(isIndexOnly(coll.getDB(), winningPlan({e: 5}, {_id: 0, e: 1})));
- assert(isIndexOnly(coll.getDB(), winningPlan({E: 5}, {_id: 0, E: 1})));
+// Confirm that the $** index produces a covered plan for a query on non-string, non-object,
+// non-array values.
+assert(isIndexOnly(coll.getDB(), winningPlan({e: 5}, {_id: 0, e: 1})));
+assert(isIndexOnly(coll.getDB(), winningPlan({E: 5}, {_id: 0, E: 1})));
- // Confirm that the $** index differentiates fieldname case when attempting to cover.
- assert(!isIndexOnly(coll.getDB(), winningPlan({e: 5}, {_id: 0, E: 1})));
- assert(!isIndexOnly(coll.getDB(), winningPlan({E: 5}, {_id: 0, e: 1})));
+// Confirm that the $** index differentiates fieldname case when attempting to cover.
+assert(!isIndexOnly(coll.getDB(), winningPlan({e: 5}, {_id: 0, E: 1})));
+assert(!isIndexOnly(coll.getDB(), winningPlan({E: 5}, {_id: 0, e: 1})));
- // Confirm that attempting to project the virtual $_path field which is present in $** index
- // keys produces a non-covered solution, which nonetheless returns the correct results.
- assert(!isIndexOnly(coll.getDB(), winningPlan({e: 5}, {_id: 0, e: 1, $_path: 1})));
- assertWildcardIndexAnswersQuery({e: 5}, [{e: 5}, {e: 5}], {_id: 0, e: 1, $_path: 1});
+// Confirm that attempting to project the virtual $_path field which is present in $** index
+// keys produces a non-covered solution, which nonetheless returns the correct results.
+assert(!isIndexOnly(coll.getDB(), winningPlan({e: 5}, {_id: 0, e: 1, $_path: 1})));
+assertWildcardIndexAnswersQuery({e: 5}, [{e: 5}, {e: 5}], {_id: 0, e: 1, $_path: 1});
})(); \ No newline at end of file