mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-30 02:25:55 +01:00
optimize getPostIndices
only use 1 set when its in a topic
This commit is contained in:
@@ -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.getListRange(key, 0, -1, function(err, list) {
|
||||
for (var i = list.length - 1, ii=0; i > ii; i--) {
|
||||
|
||||
@@ -264,6 +264,21 @@ module.exports = function(db, module) {
|
||||
}, 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) {
|
||||
if (!key) {
|
||||
return callback();
|
||||
|
||||
@@ -129,6 +129,14 @@ module.exports = function(redisClient, module) {
|
||||
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) {
|
||||
redisClient.zrevrank(key, value, callback);
|
||||
};
|
||||
|
||||
18
src/posts.js
18
src/posts.js
@@ -4,6 +4,7 @@ var async = require('async'),
|
||||
path = require('path'),
|
||||
fs = require('fs'),
|
||||
nconf = require('nconf'),
|
||||
_ = require('underscore'),
|
||||
validator = require('validator'),
|
||||
winston = require('winston'),
|
||||
gravatar = require('gravatar'),
|
||||
@@ -534,24 +535,29 @@ var async = require('async'),
|
||||
if (!Array.isArray(posts) || !posts.length) {
|
||||
return callback(null, []);
|
||||
}
|
||||
|
||||
user.getSettings(uid, function(err, settings) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var byVotes = settings.topicPostSort === 'most_votes';
|
||||
var sets = posts.map(function(post) {
|
||||
if (byVotes) {
|
||||
return 'tid:' + post.tid + ':posts:votes';
|
||||
} else {
|
||||
return 'tid:' + post.tid + ':posts';
|
||||
}
|
||||
return byVotes ? 'tid:' + post.tid + ':posts:votes' : '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) {
|
||||
return post.pid;
|
||||
});
|
||||
|
||||
db.sortedSetsRanks(sets, pids, function(err, indices) {
|
||||
db[method](sets, pids, function(err, indices) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user