From 4a3255d4fd8e68a89455b6c960f8a50611577fa8 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 21 Jan 2015 17:41:43 -0500 Subject: [PATCH 1/2] search sorting --- public/src/client/groups/list.js | 6 ++++-- src/groups.js | 23 ++++++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/public/src/client/groups/list.js b/public/src/client/groups/list.js index 06ce88ade9..45c5ce5a97 100644 --- a/public/src/client/groups/list.js +++ b/public/src/client/groups/list.js @@ -39,12 +39,14 @@ define('forum/groups/list', function() { Groups.search = function() { var groupsEl = $('#groups-list'), - queryEl = $('#search-text'); + queryEl = $('#search-text'), + sortEl = $('#search-sort'); socket.emit('groups.search', { query: queryEl.val(), options: { - expand: true + expand: true, + sort: sortEl.val() } }, function(err, groups) { templates.parse('partials/groups/list', { diff --git a/src/groups.js b/src/groups.js index f62fda1f43..2c510fc119 100644 --- a/src/groups.js +++ b/src/groups.js @@ -892,8 +892,29 @@ var async = require('async'), async.mapLimit(groupNames, 5, function(groupName, next) { Groups.get(groupName, options || {}, next); }, next); - } + }, + async.apply(Groups.sort, options.sort) ], callback); }; + Groups.sort = function(strategy, groups, next) { + switch(strategy) { + case 'count': + groups = groups.sort(function(a, b) { + return a.slug > b.slug; + }).sort(function(a, b) { + return a.memberCount < b.memberCount; + }); + break; + + case 'alpha': // intentional fall-through + default: + groups = groups.sort(function(a, b) { + return a.slug > b.slug; + }); + } + + next(null, groups); + }; + }(module.exports)); From c379753341a9b937fa06a95f844e95d1d61b3862 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 21 Jan 2015 22:48:22 -0500 Subject: [PATCH 2/2] upgrade scripts upgrade groups to sorted set(groups:createtime) upgrade upgrade groups::members to sorted set new database methods tests --- src/database/mongo/sorted.js | 44 ++++++++++++++++++++++ src/database/redis/sorted.js | 26 +++++++++++++ src/groups.js | 71 +++++++++++++++++++++--------------- src/upgrade.js | 51 +++++++++++++++++++++++++- tests/database/sorted.js | 26 +++++++++++++ 5 files changed, 188 insertions(+), 30 deletions(-) diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js index 74da932a18..565189dd8f 100644 --- a/src/database/mongo/sorted.js +++ b/src/database/mongo/sorted.js @@ -400,6 +400,50 @@ module.exports = function(db, module) { }); }; + module.isMemberOfSortedSets = function(keys, value, callback) { + if (!Array.isArray(keys)) { + return callback(); + } + value = helpers.valueToString(value); + db.collection('objects').find({_key: {$in: keys}, value: value}, {fields: {_id: 0, _key: 1, value: 1}}).toArray(function(err, results) { + if (err) { + return callback(err); + } + + results = results.map(function(item) { + return item._key; + }); + + results = keys.map(function(key) { + return results.indexOf(key) !== -1; + }); + callback(null, results); + }); + }; + + module.getSortedSetsMembers = function(keys, callback) { + if (!Array.isArray(keys) || !keys.length) { + return callback(null, []); + } + db.collection('objects').find({_key: {$in: keys}}, {_id: 0, _key: 1, value: 1}).toArray(function(err, data) { + if (err) { + return callback(err); + } + + var sets = {}; + data.forEach(function(set) { + sets[set._key] = sets[set._key] || []; + sets[set._key].push(set.value); + }); + + var returnData = new Array(keys.length); + for(var i=0; i