mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-27 17:16:14 +01:00
feat: allow multiple scores in sortedSetsAdd
This commit is contained in:
@@ -50,20 +50,26 @@ module.exports = function (db, module) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.sortedSetsAdd = function (keys, score, value, callback) {
|
module.sortedSetsAdd = function (keys, scores, value, callback) {
|
||||||
callback = callback || helpers.noop;
|
callback = callback || helpers.noop;
|
||||||
if (!Array.isArray(keys) || !keys.length) {
|
if (!Array.isArray(keys) || !keys.length) {
|
||||||
return callback();
|
return setImmediate(callback);
|
||||||
}
|
}
|
||||||
if (!utils.isNumber(score)) {
|
const isArrayOfScores = Array.isArray(scores);
|
||||||
return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]'));
|
if (!isArrayOfScores && !utils.isNumber(scores)) {
|
||||||
|
return setImmediate(callback, new Error('[[error:invalid-score, ' + scores + ']]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isArrayOfScores && scores.length !== keys.length) {
|
||||||
|
return setImmediate(callback, new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
|
||||||
value = helpers.valueToString(value);
|
value = helpers.valueToString(value);
|
||||||
|
|
||||||
var bulk = db.collection('objects').initializeUnorderedBulkOp();
|
var bulk = db.collection('objects').initializeUnorderedBulkOp();
|
||||||
|
|
||||||
for (var i = 0; i < keys.length; i += 1) {
|
for (var i = 0; i < keys.length; i += 1) {
|
||||||
bulk.find({ _key: keys[i], value: value }).upsert().updateOne({ $set: { score: parseFloat(score) } });
|
bulk.find({ _key: keys[i], value: value }).upsert().updateOne({ $set: { score: parseFloat(isArrayOfScores ? scores[i] : scores) } });
|
||||||
}
|
}
|
||||||
|
|
||||||
bulk.execute(function (err) {
|
bulk.execute(function (err) {
|
||||||
|
|||||||
@@ -82,17 +82,23 @@ SELECT $1::TEXT, v, s
|
|||||||
}, callback);
|
}, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.sortedSetsAdd = function (keys, score, value, callback) {
|
module.sortedSetsAdd = function (keys, scores, value, callback) {
|
||||||
callback = callback || helpers.noop;
|
callback = callback || helpers.noop;
|
||||||
|
|
||||||
if (!Array.isArray(keys) || !keys.length) {
|
if (!Array.isArray(keys) || !keys.length) {
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
if (!utils.isNumber(score)) {
|
const isArrayOfScores = Array.isArray(scores);
|
||||||
return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]'));
|
if (!isArrayOfScores && !utils.isNumber(scores)) {
|
||||||
|
return setImmediate(callback, new Error('[[error:invalid-score, ' + scores + ']]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isArrayOfScores && scores.length !== keys.length) {
|
||||||
|
return setImmediate(callback, new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
|
||||||
value = helpers.valueToString(value);
|
value = helpers.valueToString(value);
|
||||||
score = parseFloat(score);
|
scores = isArrayOfScores ? scores.map(score => parseFloat(score)) : parseFloat(scores);
|
||||||
|
|
||||||
module.transaction(function (tx, done) {
|
module.transaction(function (tx, done) {
|
||||||
var query = tx.client.query.bind(tx.client);
|
var query = tx.client.query.bind(tx.client);
|
||||||
@@ -107,7 +113,7 @@ SELECT k, $2::TEXT, $3::NUMERIC
|
|||||||
FROM UNNEST($1::TEXT[]) k
|
FROM UNNEST($1::TEXT[]) k
|
||||||
ON CONFLICT ("_key", "value")
|
ON CONFLICT ("_key", "value")
|
||||||
DO UPDATE SET "score" = $3::NUMERIC`,
|
DO UPDATE SET "score" = $3::NUMERIC`,
|
||||||
values: [keys, value, score],
|
values: [keys, value, scores],
|
||||||
}),
|
}),
|
||||||
], function (err) {
|
], function (err) {
|
||||||
done(err);
|
done(err);
|
||||||
|
|||||||
@@ -43,19 +43,25 @@ module.exports = function (redisClient, module) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
module.sortedSetsAdd = function (keys, score, value, callback) {
|
module.sortedSetsAdd = function (keys, scores, value, callback) {
|
||||||
callback = callback || function () {};
|
callback = callback || function () {};
|
||||||
if (!Array.isArray(keys) || !keys.length) {
|
if (!Array.isArray(keys) || !keys.length) {
|
||||||
return setImmediate(callback);
|
return setImmediate(callback);
|
||||||
}
|
}
|
||||||
if (!utils.isNumber(score)) {
|
const isArrayOfScores = Array.isArray(scores);
|
||||||
return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]'));
|
if (!isArrayOfScores && !utils.isNumber(scores)) {
|
||||||
|
return setImmediate(callback, new Error('[[error:invalid-score, ' + scores + ']]'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isArrayOfScores && scores.length !== keys.length) {
|
||||||
|
return setImmediate(callback, new Error('[[error:invalid-data]]'));
|
||||||
|
}
|
||||||
|
|
||||||
var batch = redisClient.batch();
|
var batch = redisClient.batch();
|
||||||
|
|
||||||
for (var i = 0; i < keys.length; i += 1) {
|
for (var i = 0; i < keys.length; i += 1) {
|
||||||
if (keys[i]) {
|
if (keys[i]) {
|
||||||
batch.zadd(keys[i], score, String(value));
|
batch.zadd(keys[i], isArrayOfScores ? scores[i] : scores, String(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,6 +93,24 @@ describe('Sorted Set methods', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should add an element to two sorted sets with different scores', function (done) {
|
||||||
|
db.sortedSetsAdd(['sorted1', 'sorted2'], [4, 5], 'value4', function (err) {
|
||||||
|
assert.ifError(err);
|
||||||
|
db.sortedSetsScore(['sorted1', 'sorted2'], 'value4', function (err, scores) {
|
||||||
|
assert.ifError(err);
|
||||||
|
assert.deepStrictEqual(scores, [4, 5]);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should error if keys.length is different than scores.length', function (done) {
|
||||||
|
db.sortedSetsAdd(['sorted1', 'sorted2'], [4], 'value4', function (err) {
|
||||||
|
assert.equal(err.message, '[[error:invalid-data]]');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('should error if score is null', function (done) {
|
it('should error if score is null', function (done) {
|
||||||
db.sortedSetsAdd(['sorted1', 'sorted2'], null, 'value1', function (err) {
|
db.sortedSetsAdd(['sorted1', 'sorted2'], null, 'value1', function (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user