mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-06-23 05:52:05 +02:00
perf: dont load all followed tids on unread/recent?filter=watched
This commit is contained in:
@@ -49,7 +49,7 @@ module.exports = function (Topics) {
|
|||||||
tids = await Topics.filterWatchedTids(tids, params.uid);
|
tids = await Topics.filterWatchedTids(tids, params.uid);
|
||||||
}
|
}
|
||||||
} else if (params.filter === 'watched') {
|
} else if (params.filter === 'watched') {
|
||||||
tids = await db.getSortedSetRevRange(`uid:${params.uid}:followed_tids`, 0, -1);
|
tids = await getWatchedTopics(params);
|
||||||
} else if (params.cids) {
|
} else if (params.cids) {
|
||||||
tids = await getCidTids(params);
|
tids = await getCidTids(params);
|
||||||
} else if (params.tags.length) {
|
} else if (params.tags.length) {
|
||||||
@@ -63,6 +63,17 @@ module.exports = function (Topics) {
|
|||||||
return tids;
|
return tids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getWatchedTopics(params) {
|
||||||
|
const sortSet = ['recent', 'old'].includes(params.sort) ? 'topics:recent' : `topics:${params.sort}`;
|
||||||
|
const method = params.sort === 'old' ? 'getSortedSetIntersect' : 'getSortedSetRevIntersect';
|
||||||
|
return await db[method]({
|
||||||
|
sets: [sortSet, `uid:${params.uid}:followed_tids`],
|
||||||
|
weights: [1, 0],
|
||||||
|
start: 0,
|
||||||
|
stop: meta.config.recentMaxTopics - 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function getTagTids(params) {
|
async function getTagTids(params) {
|
||||||
const sets = [
|
const sets = [
|
||||||
params.sort === 'old' ?
|
params.sort === 'old' ?
|
||||||
|
|||||||
@@ -210,15 +210,13 @@ module.exports = function (Topics) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function getFollowedTids(params) {
|
async function getFollowedTids(params) {
|
||||||
let tids = await db.getSortedSetMembers(`uid:${params.uid}:followed_tids`);
|
const keys = params.cid ?
|
||||||
const filterCids = params.cid && params.cid.map(cid => parseInt(cid, 10));
|
params.cid.map(cid => `cid:${cid}:tids:lastposttime`) :
|
||||||
if (filterCids) {
|
'topics:recent';
|
||||||
const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid']);
|
|
||||||
tids = topicData.filter(t => filterCids.includes(t.cid)).map(t => t.tid);
|
const recentTopicData = await db.getSortedSetRevRangeByScoreWithScores(keys, 0, -1, '+inf', params.cutoff);
|
||||||
}
|
const isFollowed = await db.isSortedSetMembers(`uid:${params.uid}:followed_tids`, recentTopicData.map(t => t.tid));
|
||||||
const scores = await db.sortedSetScores('topics:recent', tids);
|
return recentTopicData.filter((t, i) => isFollowed[i]);
|
||||||
const data = tids.map((tid, index) => ({ value: String(tid), score: scores[index] }));
|
|
||||||
return data.filter(item => item.score > params.cutoff);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function filterTidsThatHaveBlockedPosts(params) {
|
async function filterTidsThatHaveBlockedPosts(params) {
|
||||||
|
|||||||
Reference in New Issue
Block a user