summaryrefslogtreecommitdiff
path: root/jstests/sharding/fts_score_sort_sharded.js
diff options
context:
space:
mode:
authorJason Rassi <rassi@10gen.com>2013-12-17 16:35:56 -0500
committerJason Rassi <rassi@10gen.com>2013-12-17 16:46:33 -0500
commitb44edc42e42524d2f8bf66d389eeb6d973fbf40e (patch)
tree507b0766c6905e2460072c247966ef1b64a6d753 /jstests/sharding/fts_score_sort_sharded.js
parent3050f432fe144a16516f7de0a346c0586f650ac6 (diff)
downloadmongo-b44edc42e42524d2f8bf66d389eeb6d973fbf40e.tar.gz
SERVER-9063 Correctly sort on text metadata for sharded queries
Diffstat (limited to 'jstests/sharding/fts_score_sort_sharded.js')
-rw-r--r--jstests/sharding/fts_score_sort_sharded.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/jstests/sharding/fts_score_sort_sharded.js b/jstests/sharding/fts_score_sort_sharded.js
new file mode 100644
index 00000000000..3136401be1c
--- /dev/null
+++ b/jstests/sharding/fts_score_sort_sharded.js
@@ -0,0 +1,68 @@
+// Test that queries with a sort on text metadata return results in the correct order in a sharded
+// collection.
+
+var st = new ShardingTest({shards: 2});
+st.stopBalancer();
+var mongos = st.s0;
+var shards = [st.shard0, st.shard1];
+var coll = mongos.getCollection("foo.bar");
+var admin = mongos.getDB("admin");
+var cursor;
+
+//
+// Pre-split collection: shard 0 takes {_id: {$lt: 0}}, shard 1 takes {_id: {$gte: 0}}.
+//
+assert.commandWorked(admin.runCommand({enableSharding: coll.getDB().getName()}));
+assert.commandWorked(admin.runCommand({movePrimary: coll.getDB().getName(),
+ to: "shard0000"}));
+assert.commandWorked(admin.runCommand({shardCollection: coll.getFullName(),
+ key: {_id: 1}}));
+assert.commandWorked(admin.runCommand({split: coll.getFullName(), middle: {_id: 0}}));
+assert.commandWorked(admin.runCommand({moveChunk: coll.getFullName(),
+ find: {_id: 0},
+ to: "shard0001"}));
+
+//
+// Insert documents into collection and create text index.
+//
+coll.insert({_id: 1, a: "pizza"});
+coll.insert({_id: -1, a: "pizza pizza"});
+coll.insert({_id: 2, a: "pizza pizza pizza"});
+coll.insert({_id: -2, a: "pizza pizza pizza pizza"});
+assert.gleSuccess(coll.getDB());
+coll.ensureIndex({a: "text"});
+assert.gleSuccess(coll.getDB());
+
+//
+// Execute query with sort on document score, verify results are in correct order.
+//
+var results = coll.find({$text: {$search: "pizza"}},
+ {s: {$meta: "textScore"}}).sort({s: {$meta: "textScore"}}).toArray();
+assert.eq(results.length, 4);
+assert.eq(results[0]._id, -2);
+assert.eq(results[1]._id, 2);
+assert.eq(results[2]._id, -1);
+assert.eq(results[3]._id, 1);
+
+//
+// Verify that mongos requires the text metadata sort to be specified in the projection.
+//
+
+// Projection not specified at all.
+cursor = coll.find({$text: {$search: "pizza"}}).sort({s: {$meta: "textScore"}});
+assert.throws(function() { cursor.next(); });
+
+// Projection specified with incorrect field name.
+cursor = coll.find({$text: {$search: "pizza"}},
+ {t: {$meta: "textScore"}}).sort({s: {$meta: "textScore"}});
+assert.throws(function() { cursor.next(); });
+
+// Projection specified on correct field but with wrong sort.
+cursor = coll.find({$text: {$search: "pizza"}}, {s: 1}).sort({s: {$meta: "textScore"}});
+assert.throws(function() { cursor.next(); });
+cursor = coll.find({$text: {$search: "pizza"}}, {s: -1}).sort({s: {$meta: "textScore"}});
+assert.throws(function() { cursor.next(); });
+
+// TODO Test sort on compound key.
+
+st.stop();