mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-06 15:42:52 +01:00
add reverse support to db.processSortedSet (#11826)
This commit is contained in:
committed by
GitHub
parent
8ab9c72c6b
commit
9b1cc57604
@@ -23,6 +23,7 @@ exports.processSortedSet = async function (setKey, process, options) {
|
||||
}
|
||||
|
||||
options.batch = options.batch || DEFAULT_BATCH_SIZE;
|
||||
options.reverse = options.reverse || false;
|
||||
|
||||
// use the fast path if possible
|
||||
if (db.processSortedSet && typeof options.doneIf !== 'function' && !utils.isNumber(options.alwaysStartAt)) {
|
||||
@@ -38,10 +39,10 @@ exports.processSortedSet = async function (setKey, process, options) {
|
||||
if (process && process.constructor && process.constructor.name !== 'AsyncFunction') {
|
||||
process = util.promisify(process);
|
||||
}
|
||||
|
||||
const method = options.reverse ? 'getSortedSetRevRange' : 'getSortedSetRange';
|
||||
while (true) {
|
||||
/* eslint-disable no-await-in-loop */
|
||||
const ids = await db[`getSortedSetRange${options.withScores ? 'WithScores' : ''}`](setKey, start, stop);
|
||||
const ids = await db[`${method}${options.withScores ? 'WithScores' : ''}`](setKey, start, stop);
|
||||
if (!ids.length || options.doneIf(start, stop, ids)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -563,12 +563,12 @@ module.exports = function (module) {
|
||||
let done = false;
|
||||
const ids = [];
|
||||
const project = { _id: 0, _key: 0 };
|
||||
|
||||
const sort = options.reverse ? -1 : 1;
|
||||
if (!options.withScores) {
|
||||
project.score = 0;
|
||||
}
|
||||
const cursor = await module.client.collection('objects').find({ _key: setKey }, { projection: project })
|
||||
.sort({ score: 1 })
|
||||
.sort({ score: sort })
|
||||
.batchSize(options.batch);
|
||||
|
||||
if (processFn && processFn.constructor && processFn.constructor.name !== 'AsyncFunction') {
|
||||
|
||||
@@ -664,6 +664,7 @@ SELECT z."value",
|
||||
module.processSortedSet = async function (setKey, process, options) {
|
||||
const client = await module.pool.connect();
|
||||
const batchSize = (options || {}).batch || 100;
|
||||
const sort = options.reverse ? 'DESC' : 'ASC';
|
||||
const cursor = client.query(new Cursor(`
|
||||
SELECT z."value", z."score"
|
||||
FROM "legacy_object_live" o
|
||||
@@ -671,7 +672,7 @@ SELECT z."value", z."score"
|
||||
ON o."_key" = z."_key"
|
||||
AND o."type" = z."type"
|
||||
WHERE o."_key" = $1::TEXT
|
||||
ORDER BY z."score" ASC, z."value" ASC`, [setKey]));
|
||||
ORDER BY z."score" ${sort}, z."value" ${sort}`, [setKey]));
|
||||
|
||||
if (process && process.constructor && process.constructor.name !== 'AsyncFunction') {
|
||||
process = util.promisify(process);
|
||||
|
||||
@@ -83,6 +83,7 @@ module.exports = function (Messaging) {
|
||||
|
||||
notifications.push(notification, uids);
|
||||
}, {
|
||||
reverse: true,
|
||||
batch: 500,
|
||||
interval: 1000,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user