summaryrefslogtreecommitdiff
path: root/jstests/aggregation/expressions/in.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/aggregation/expressions/in.js')
-rw-r--r--jstests/aggregation/expressions/in.js389
1 files changed, 194 insertions, 195 deletions
diff --git a/jstests/aggregation/expressions/in.js b/jstests/aggregation/expressions/in.js
index 7c91313e081..63ba02f1b4e 100644
--- a/jstests/aggregation/expressions/in.js
+++ b/jstests/aggregation/expressions/in.js
@@ -4,205 +4,204 @@
load("jstests/aggregation/extras/utils.js"); // For assertErrorCode.
(function() {
- "use strict";
+"use strict";
- const caseInsensitive = {locale: "en_US", strength: 2};
- var coll = db.in ;
- coll.drop();
-
- function testExpression(options) {
- coll.drop();
- testExpressionInternal(options);
- }
+const caseInsensitive = {
+ locale: "en_US",
+ strength: 2
+};
+var coll = db.in;
+coll.drop();
- function testExpressionHashIndex(options) {
- coll.drop();
- assert.commandWorked(coll.createIndex({elementField: "hashed"}));
- testExpressionInternal(options);
- }
+function testExpression(options) {
+ coll.drop();
+ testExpressionInternal(options);
+}
- function testExpressionCollectionCollation(options, collationSpec) {
- coll.drop();
- assert.commandWorked(db.createCollection(coll.getName(), {collation: collationSpec}));
- testExpressionInternal(options);
- }
+function testExpressionHashIndex(options) {
+ coll.drop();
+ assert.commandWorked(coll.createIndex({elementField: "hashed"}));
+ testExpressionInternal(options);
+}
- function testExpressionInternal(options) {
- var pipeline = {$project: {included: {$in: ["$elementField", {$literal: options.array}]}}};
- assert.writeOK(coll.insert({elementField: options.element}));
- var res = coll.aggregate(pipeline).toArray();
- assert.eq(res.length, 1);
- assert.eq(res[0].included, options.elementIsIncluded);
-
- if (options.queryFormShouldBeEquivalent) {
- var query = {elementField: {$in: options.array}};
- res = coll.find(query).toArray();
-
- if (options.elementIsIncluded) {
- assert.eq(res.length, 1);
- } else {
- assert.eq(res.length, 0);
- }
+function testExpressionCollectionCollation(options, collationSpec) {
+ coll.drop();
+ assert.commandWorked(db.createCollection(coll.getName(), {collation: collationSpec}));
+ testExpressionInternal(options);
+}
+
+function testExpressionInternal(options) {
+ var pipeline = {$project: {included: {$in: ["$elementField", {$literal: options.array}]}}};
+ assert.writeOK(coll.insert({elementField: options.element}));
+ var res = coll.aggregate(pipeline).toArray();
+ assert.eq(res.length, 1);
+ assert.eq(res[0].included, options.elementIsIncluded);
+
+ if (options.queryFormShouldBeEquivalent) {
+ var query = {elementField: {$in: options.array}};
+ res = coll.find(query).toArray();
+
+ if (options.elementIsIncluded) {
+ assert.eq(res.length, 1);
+ } else {
+ assert.eq(res.length, 0);
}
}
-
- testExpression(
- {element: 1, array: [1, 2, 3], elementIsIncluded: true, queryFormShouldBeEquivalent: true});
-
- testExpression({
- element: "A",
- array: ["a", "A", "a"],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- testExpression({
- element: {a: 1},
- array: [{b: 1}, 2],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: true
- });
-
- testExpression({
- element: {a: 1},
- array: [{a: 1}],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- testExpression({
- element: [1, 2],
- array: [[2, 1]],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: true
- });
-
- testExpression({
- element: [1, 2],
- array: [[1, 2]],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- // Test $in with duplicated target element.
- testExpression({
- element: 7,
- array: [3, 5, 7, 7, 9],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- // Test $in with other element within array duplicated.
- testExpression({
- element: 7,
- array: [3, 5, 7, 9, 9],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- // Test $in on unsorted array.
- testExpression({
- element: 7,
- array: [3, 10, 5, 7, 8, 9],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- // Test matching $in on unsorted array with duplicates.
- testExpression({
- element: 7,
- array: [7, 10, 7, 10, 2, 5, 3, 7],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- // Test non-matching $in on unsorted array with duplicates.
- testExpression({
- element: 8,
- array: [10, 7, 2, 5, 3],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: true
- });
-
- // Test $in with success due to collation on source collection.
- testExpressionCollectionCollation({
- element: "abcd",
- array: ["aBcD", "ABCD"],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- },
- caseInsensitive);
-
- // Test $in with a source collection that has a hash index on the relevant field.
- testExpressionHashIndex({
- element: 5,
- array: [10, 7, 2, 5, 3],
- elementIsIncluded: true,
- queryFormShouldBeEquivalent: true
- });
-
- testExpression(
- {element: 1, array: [], elementIsIncluded: false, queryFormShouldBeEquivalent: true});
-
- // Aggregation's $in has parity with query's $in except with regexes matching string values and
- // equality semantics with array values.
-
- testExpression({
- element: "abc",
- array: [/a/, /b/, /c/],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: false
- });
-
- testExpression({
- element: /a/,
- array: ["a", "b", "c"],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: false
- });
-
- testExpression({
- element: [],
- array: [1, 2, 3],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: false
- });
-
- testExpression({
- element: [1],
- array: [1, 2, 3],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: false
- });
-
- testExpression({
- element: [1, 2],
- array: [1, 2, 3],
- elementIsIncluded: false,
- queryFormShouldBeEquivalent: false
- });
-
- coll.drop();
- coll.insert({});
-
- var pipeline = {$project: {included: {$in: [[1, 2], 1]}}};
- assertErrorCode(coll, pipeline, 40081, "$in requires an array as a second argument");
-
- pipeline = {$project: {included: {$in: [1, null]}}};
- assertErrorCode(coll, pipeline, 40081, "$in requires an array as a second argument");
-
- pipeline = {$project: {included: {$in: [1, "$notAField"]}}};
- assertErrorCode(coll, pipeline, 40081, "$in requires an array as a second argument");
-
- pipeline = {$project: {included: {$in: null}}};
- assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
-
- pipeline = {$project: {included: {$in: [1]}}};
- assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
-
- pipeline = {$project: {included: {$in: []}}};
- assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
-
- pipeline = {$project: {included: {$in: [1, 2, 3]}}};
- assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
+}
+
+testExpression(
+ {element: 1, array: [1, 2, 3], elementIsIncluded: true, queryFormShouldBeEquivalent: true});
+
+testExpression({
+ element: "A",
+ array: ["a", "A", "a"],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+});
+
+testExpression({
+ element: {a: 1},
+ array: [{b: 1}, 2],
+ elementIsIncluded: false,
+ queryFormShouldBeEquivalent: true
+});
+
+testExpression(
+ {element: {a: 1}, array: [{a: 1}], elementIsIncluded: true, queryFormShouldBeEquivalent: true});
+
+testExpression({
+ element: [1, 2],
+ array: [[2, 1]],
+ elementIsIncluded: false,
+ queryFormShouldBeEquivalent: true
+});
+
+testExpression(
+ {element: [1, 2], array: [[1, 2]], elementIsIncluded: true, queryFormShouldBeEquivalent: true});
+
+// Test $in with duplicated target element.
+testExpression({
+ element: 7,
+ array: [3, 5, 7, 7, 9],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+});
+
+// Test $in with other element within array duplicated.
+testExpression({
+ element: 7,
+ array: [3, 5, 7, 9, 9],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+});
+
+// Test $in on unsorted array.
+testExpression({
+ element: 7,
+ array: [3, 10, 5, 7, 8, 9],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+});
+
+// Test matching $in on unsorted array with duplicates.
+testExpression({
+ element: 7,
+ array: [7, 10, 7, 10, 2, 5, 3, 7],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+});
+
+// Test non-matching $in on unsorted array with duplicates.
+testExpression({
+ element: 8,
+ array: [10, 7, 2, 5, 3],
+ elementIsIncluded: false,
+ queryFormShouldBeEquivalent: true
+});
+
+// Test $in with success due to collation on source collection.
+testExpressionCollectionCollation({
+ element: "abcd",
+ array: ["aBcD", "ABCD"],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+},
+ caseInsensitive);
+
+// Test $in with a source collection that has a hash index on the relevant field.
+testExpressionHashIndex({
+ element: 5,
+ array: [10, 7, 2, 5, 3],
+ elementIsIncluded: true,
+ queryFormShouldBeEquivalent: true
+});
+
+testExpression(
+ {element: 1, array: [], elementIsIncluded: false, queryFormShouldBeEquivalent: true});
+
+// Aggregation's $in has parity with query's $in except with regexes matching string values and
+// equality semantics with array values.
+
+testExpression({
+ element: "abc",
+ array: [/a/, /b/, /c/],
+ elementIsIncluded: false,
+ queryFormShouldBeEquivalent: false
+});
+
+testExpression({
+ element: /a/,
+ array: ["a", "b", "c"],
+ elementIsIncluded: false,
+ queryFormShouldBeEquivalent: false
+});
+
+testExpression(
+ {element: [], array: [1, 2, 3], elementIsIncluded: false, queryFormShouldBeEquivalent: false});
+
+testExpression(
+ {element: [1], array: [1, 2, 3], elementIsIncluded: false, queryFormShouldBeEquivalent: false});
+
+testExpression({
+ element: [1, 2],
+ array: [1, 2, 3],
+ elementIsIncluded: false,
+ queryFormShouldBeEquivalent: false
+});
+
+coll.drop();
+coll.insert({});
+
+var pipeline = {$project: {included: {$in: [[1, 2], 1]}}};
+assertErrorCode(coll, pipeline, 40081, "$in requires an array as a second argument");
+
+pipeline = {
+ $project: {included: {$in: [1, null]}}
+};
+assertErrorCode(coll, pipeline, 40081, "$in requires an array as a second argument");
+
+pipeline = {
+ $project: {included: {$in: [1, "$notAField"]}}
+};
+assertErrorCode(coll, pipeline, 40081, "$in requires an array as a second argument");
+
+pipeline = {
+ $project: {included: {$in: null}}
+};
+assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
+
+pipeline = {
+ $project: {included: {$in: [1]}}
+};
+assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
+
+pipeline = {
+ $project: {included: {$in: []}}
+};
+assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
+
+pipeline = {
+ $project: {included: {$in: [1, 2, 3]}}
+};
+assertErrorCode(coll, pipeline, 16020, "$in requires two arguments");
}());