optimize getPostIndices

only use 1 set when its in a topic
v1.18.x
barisusakli 11 years ago
parent 998ed24589
commit c5c97c784a

@ -151,6 +151,14 @@ module.exports = function(db, module) {
}); });
}; };
module.sortedSetsRanks = function(keys, values, callback) {
throw new Error('not implemented');
};
module.sortedSetRanks = function(key, values, callback) {
throw new Error('not implemented');
};
module.sortedSetRevRank = function(key, value, callback) { module.sortedSetRevRank = function(key, value, callback) {
module.getListRange(key, 0, -1, function(err, list) { module.getListRange(key, 0, -1, function(err, list) {
for (var i = list.length - 1, ii=0; i > ii; i--) { for (var i = list.length - 1, ii=0; i > ii; i--) {

@ -264,6 +264,21 @@ module.exports = function(db, module) {
}, callback); }, callback);
}; };
module.sortedSetRanks = function(key, values, callback) {
module.getSortedSetRange(key, 0, -1, function(err, sortedSet) {
if (err) {
return callback(err);
}
var result = values.map(function(value) {
var index = sortedSet.indexOf(value.toString());
return index !== -1 ? index : null;
});
callback(null, result);
});
};
module.sortedSetScore = function(key, value, callback) { module.sortedSetScore = function(key, value, callback) {
if (!key) { if (!key) {
return callback(); return callback();

@ -129,6 +129,14 @@ module.exports = function(redisClient, module) {
multi.exec(callback); multi.exec(callback);
}; };
module.sortedSetRanks = function(key, values, callback) {
var multi = redisClient.multi();
for(var i=0; i<values.length; ++i) {
multi.zrank(key, values[i]);
}
multi.exec(callback);
};
module.sortedSetRevRank = function(key, value, callback) { module.sortedSetRevRank = function(key, value, callback) {
redisClient.zrevrank(key, value, callback); redisClient.zrevrank(key, value, callback);
}; };

@ -4,6 +4,7 @@ var async = require('async'),
path = require('path'), path = require('path'),
fs = require('fs'), fs = require('fs'),
nconf = require('nconf'), nconf = require('nconf'),
_ = require('underscore'),
validator = require('validator'), validator = require('validator'),
winston = require('winston'), winston = require('winston'),
gravatar = require('gravatar'), gravatar = require('gravatar'),
@ -534,24 +535,29 @@ var async = require('async'),
if (!Array.isArray(posts) || !posts.length) { if (!Array.isArray(posts) || !posts.length) {
return callback(null, []); return callback(null, []);
} }
user.getSettings(uid, function(err, settings) { user.getSettings(uid, function(err, settings) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
var byVotes = settings.topicPostSort === 'most_votes'; var byVotes = settings.topicPostSort === 'most_votes';
var sets = posts.map(function(post) { var sets = posts.map(function(post) {
if (byVotes) { return byVotes ? 'tid:' + post.tid + ':posts:votes' : 'tid:' + post.tid + ':posts';
return 'tid:' + post.tid + ':posts:votes';
} else {
return 'tid:' + post.tid + ':posts';
}
}); });
var uniqueSets = _.uniq(sets);
var method = 'sortedSetsRanks';
if (uniqueSets.length === 1) {
method = 'sortedSetRanks';
sets = uniqueSets[0];
}
var pids = posts.map(function(post) { var pids = posts.map(function(post) {
return post.pid; return post.pid;
}); });
db.sortedSetsRanks(sets, pids, function(err, indices) { db[method](sets, pids, function(err, indices) {
if (err) { if (err) {
return callback(err); return callback(err);
} }

Loading…
Cancel
Save