mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 03:26:04 +01:00
optimize getPostSummaryByPids
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
"use strict";
|
||||
|
||||
var async = require('async');
|
||||
|
||||
module.exports = function(db, module) {
|
||||
var helpers = module.helpers.mongo;
|
||||
|
||||
@@ -119,6 +121,17 @@ module.exports = function(db, module) {
|
||||
});
|
||||
}
|
||||
|
||||
module.sortedSetsRanks = function(keys, values, callback) {
|
||||
var data = new Array(values.length);
|
||||
for (var i=0; i<values.length; ++i) {
|
||||
data[i] = {key: keys[i], value: values[i]};
|
||||
}
|
||||
|
||||
async.map(data, function(item, next) {
|
||||
getSortedSetRank(module.getSortedSetRange, item.key, item.value, next);
|
||||
}, callback);
|
||||
};
|
||||
|
||||
module.sortedSetScore = function(key, value, callback) {
|
||||
value = helpers.valueToString(value);
|
||||
db.collection('objects').findOne({_key:key, value: value}, {fields:{score:1}}, function(err, result) {
|
||||
|
||||
@@ -54,6 +54,14 @@ module.exports = function(redisClient, module) {
|
||||
redisClient.zrank(key, value, callback);
|
||||
};
|
||||
|
||||
module.sortedSetsRanks = function(keys, values, callback) {
|
||||
var multi = redisClient.multi();
|
||||
for(var i=0; i<values.length; ++i) {
|
||||
multi.zrank(keys[i], values[i]);
|
||||
}
|
||||
multi.exec(callback);
|
||||
};
|
||||
|
||||
module.sortedSetRevRank = function(key, value, callback) {
|
||||
redisClient.zrevrank(key, value, callback);
|
||||
};
|
||||
|
||||
164
src/posts.js
164
src/posts.js
@@ -265,64 +265,6 @@ var async = require('async'),
|
||||
options.stripTags = options.hasOwnProperty('stripTags') ? options.stripTags : false;
|
||||
options.parse = options.hasOwnProperty('parse') ? options.parse : true;
|
||||
|
||||
function getPostSummary(post, callback) {
|
||||
|
||||
post.relativeTime = utils.toISOString(post.timestamp);
|
||||
|
||||
async.parallel({
|
||||
user: function(next) {
|
||||
user.getUserFields(post.uid, ['username', 'userslug', 'picture'], next);
|
||||
},
|
||||
topicCategory: function(next) {
|
||||
topics.getTopicFields(post.tid, ['title', 'cid', 'slug', 'deleted'], function(err, topicData) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
} else if (parseInt(topicData.deleted, 10) === 1) {
|
||||
return callback();
|
||||
}
|
||||
|
||||
categories.getCategoryFields(topicData.cid, ['name', 'icon', 'slug'], function(err, categoryData) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
topicData.title = validator.escape(topicData.title);
|
||||
|
||||
next(null, {topic: topicData, category: categoryData});
|
||||
});
|
||||
});
|
||||
},
|
||||
content: function(next) {
|
||||
if (!post.content || !options.parse) {
|
||||
return next(null, post.content);
|
||||
}
|
||||
|
||||
postTools.parse(post.content, next);
|
||||
},
|
||||
index: function(next) {
|
||||
Posts.getPidIndex(post.pid, next);
|
||||
}
|
||||
}, function(err, results) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
post.user = results.user;
|
||||
post.topic = results.topicCategory.topic;
|
||||
post.category = results.topicCategory.category;
|
||||
post.index = results.index;
|
||||
|
||||
if (options.stripTags && results.content) {
|
||||
var s = S(results.content);
|
||||
post.content = s.stripTags.apply(s, utils.stripTags).s;
|
||||
} else {
|
||||
post.content = results.content;
|
||||
}
|
||||
|
||||
callback(null, post);
|
||||
});
|
||||
}
|
||||
|
||||
var keys = pids.map(function(pid) {
|
||||
return 'post:' + pid;
|
||||
});
|
||||
@@ -336,16 +278,112 @@ var async = require('async'),
|
||||
return !!p && parseInt(p.deleted, 10) !== 1;
|
||||
});
|
||||
|
||||
async.map(posts, getPostSummary, function(err, posts) {
|
||||
var uids = [], tids = [];
|
||||
for(var i=0; i<posts.length; ++i) {
|
||||
if (uids.indexOf(posts[i].uid) === -1) {
|
||||
uids.push(posts[i].uid);
|
||||
}
|
||||
if (tids.indexOf('topic:' + posts[i].tid) === -1) {
|
||||
tids.push('topic:' + posts[i].tid);
|
||||
}
|
||||
}
|
||||
|
||||
async.parallel({
|
||||
users: function(next) {
|
||||
user.getMultipleUserFields(uids, ['uid', 'username', 'userslug', 'picture'], next);
|
||||
},
|
||||
topicsAndCategories: function(next) {
|
||||
db.getObjectsFields(tids, ['tid', 'title', 'cid', 'slug', 'deleted'], function(err, topics) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
var cidKeys = topics.map(function(topic) {
|
||||
return 'category:' + topic.cid;
|
||||
}).filter(function(value, index, array) {
|
||||
return array.indexOf(value) === index;
|
||||
});
|
||||
|
||||
db.getObjectsFields(cidKeys, ['cid', 'name', 'icon', 'slug'], function(err, categories) {
|
||||
next(err, {topics: topics, categories: categories});
|
||||
});
|
||||
});
|
||||
},
|
||||
indices: function(next) {
|
||||
var pids = [], keys = [];
|
||||
for (var i=0; i<posts.length; ++i) {
|
||||
pids.push(posts[i].pid);
|
||||
keys.push('tid:' + posts[i].tid + ':posts');
|
||||
}
|
||||
|
||||
db.sortedSetsRanks(keys, pids, next);
|
||||
}
|
||||
}, function(err, results) {
|
||||
function toObject(key, data) {
|
||||
var obj = {};
|
||||
for(var i=0; i<data.length; ++i) {
|
||||
obj[data[i][key]] = data[i];
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
posts = posts.filter(function(post) {
|
||||
return !!post;
|
||||
});
|
||||
results.users = toObject('uid', results.users);
|
||||
results.topics = toObject('tid', results.topicsAndCategories.topics);
|
||||
results.categories = toObject('cid', results.topicsAndCategories.categories);
|
||||
|
||||
return callback(null, posts);
|
||||
for(var i=0; i<posts.length; ++i) {
|
||||
if (!utils.isNumber(results.indices[i])) {
|
||||
posts[i].index = 1;
|
||||
} else {
|
||||
posts[i].index = parseInt(results.indices[i], 10) + 2;
|
||||
}
|
||||
}
|
||||
|
||||
async.map(posts, function(post, next) {
|
||||
if (parseInt(results.topics[post.tid].deleted, 10) === 1) {
|
||||
return next();
|
||||
}
|
||||
|
||||
post.user = results.users[post.uid];
|
||||
post.topic = results.topics[post.tid];
|
||||
post.category = results.categories[post.topic.cid];
|
||||
|
||||
post.topic.title = validator.escape(post.topic.title);
|
||||
post.relativeTime = utils.toISOString(post.timestamp);
|
||||
|
||||
if (!post.content || !options.parse) {
|
||||
return next(null, post);
|
||||
}
|
||||
|
||||
postTools.parse(post.content, function(err, content) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if (options.stripTags && content) {
|
||||
var s = S(content);
|
||||
post.content = s.stripTags.apply(s, utils.stripTags).s;
|
||||
} else {
|
||||
post.content = content;
|
||||
}
|
||||
|
||||
next(null, post);
|
||||
});
|
||||
}, function(err, posts) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
posts = posts.filter(function(post) {
|
||||
return !!post;
|
||||
});
|
||||
|
||||
callback(null, posts);
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user