summaryrefslogtreecommitdiff
path: root/jstests/views/views_sharded.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/views/views_sharded.js')
-rw-r--r--jstests/views/views_sharded.js78
1 files changed, 78 insertions, 0 deletions
diff --git a/jstests/views/views_sharded.js b/jstests/views/views_sharded.js
new file mode 100644
index 00000000000..07113d34dad
--- /dev/null
+++ b/jstests/views/views_sharded.js
@@ -0,0 +1,78 @@
+// Confirms proper behavior when reading from a view that is based on a sharded collection.
+// TODO SERVER-24762: Add tests that confirm appropriate error when performing view query:
+// a) directly against non-primary shard
+// b) directly against primary shard primary
+// c) directly against primary shard secondary
+// TODO SERVER-24762: Add explain shell helper tests.
+
+(function() {
+ "use strict";
+
+ let st = new ShardingTest({
+ name: "views_sharded",
+ shards: 2,
+ other: {shardOptions: {setParameter: "enableViews=1"}, enableBalancer: false}
+ });
+
+ let mongos = st.s;
+ let config = mongos.getDB("config");
+ let db = mongos.getDB(jsTestName());
+ db.dropDatabase();
+
+ let coll = db.getCollection("coll");
+
+ assert.commandWorked(config.adminCommand({enableSharding: db.getName()}));
+ st.ensurePrimaryShard(db.getName(), "shard0000");
+ assert.commandWorked(config.adminCommand({shardCollection: coll.getFullName(), key: {a: 1}}));
+
+ assert.commandWorked(mongos.adminCommand({split: coll.getFullName(), middle: {a: 6}}));
+ assert.commandWorked(
+ db.adminCommand({moveChunk: coll.getFullName(), find: {a: 25}, to: "shard0001"}));
+
+ for (let i = 0; i < 10; ++i) {
+ assert.writeOK(coll.insert({a: i}));
+ }
+
+ assert.commandWorked(db.createView("view", coll.getName(), [{$match: {a: {$gte: 4}}}]));
+ let view = db.getCollection("view");
+
+ //
+ // find
+ //
+ assert.eq(5, view.find({a: {$lte: 8}}).itcount());
+
+ let result = db.runCommand({explain: {find: "view", filter: {a: {$lte: 7}}}});
+ assert.commandWorked(result);
+ assert(result.hasOwnProperty("shards"), tojson(result));
+
+ //
+ // aggregate
+ //
+ assert.eq(5, view.aggregate([{$match: {a: {$lte: 8}}}]).itcount());
+
+ result =
+ db.runCommand({aggregate: "view", pipeline: [{$match: {a: {$lte: 8}}}], explain: true});
+ assert.commandWorked(result);
+ assert(result.hasOwnProperty("shards"), tojson(result));
+
+ //
+ // count
+ //
+ assert.eq(5, view.count({a: {$lte: 8}}));
+
+ result = db.runCommand({explain: {count: "view", query: {a: {$lte: 8}}}});
+ assert.commandWorked(result);
+ assert(result.hasOwnProperty("shards"), tojson(result));
+
+ //
+ // distinct
+ //
+ result = db.runCommand({distinct: "view", key: "a", query: {a: {$lte: 8}}});
+ assert.commandWorked(result);
+ assert.eq([4, 5, 6, 7, 8], result.values.sort());
+
+ result = db.runCommand({explain: {distinct: "view", key: "a", query: {a: {$lte: 8}}}});
+ assert.commandWorked(result);
+ assert(result.hasOwnProperty("shards"), tojson(result));
+
+})();