diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index 4694b03cc4..c85b1d15e7 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -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; if (!Array.isArray(keys) || !keys.length) { - return callback(); + return setImmediate(callback); } - if (!utils.isNumber(score)) { - return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + const isArrayOfScores = Array.isArray(scores); + 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); var bulk = db.collection('objects').initializeUnorderedBulkOp(); 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) { diff --git a/src/database/postgres/sorted/add.js b/src/database/postgres/sorted/add.js index 7121df4f97..487dd798ad 100644 --- a/src/database/postgres/sorted/add.js +++ b/src/database/postgres/sorted/add.js @@ -82,17 +82,23 @@ SELECT $1::TEXT, v, s }, callback); } - module.sortedSetsAdd = function (keys, score, value, callback) { + module.sortedSetsAdd = function (keys, scores, value, callback) { callback = callback || helpers.noop; if (!Array.isArray(keys) || !keys.length) { return callback(); } - if (!utils.isNumber(score)) { - return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + const isArrayOfScores = Array.isArray(scores); + 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); - score = parseFloat(score); + scores = isArrayOfScores ? scores.map(score => parseFloat(score)) : parseFloat(scores); module.transaction(function (tx, done) { var query = tx.client.query.bind(tx.client); @@ -107,7 +113,7 @@ SELECT k, $2::TEXT, $3::NUMERIC FROM UNNEST($1::TEXT[]) k ON CONFLICT ("_key", "value") DO UPDATE SET "score" = $3::NUMERIC`, - values: [keys, value, score], + values: [keys, value, scores], }), ], function (err) { done(err); diff --git a/src/database/redis/sorted/add.js b/src/database/redis/sorted/add.js index 22b9c3b69f..47f71191e8 100644 --- a/src/database/redis/sorted/add.js +++ b/src/database/redis/sorted/add.js @@ -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 () {}; if (!Array.isArray(keys) || !keys.length) { return setImmediate(callback); } - if (!utils.isNumber(score)) { - return setImmediate(callback, new Error('[[error:invalid-score, ' + score + ']]')); + const isArrayOfScores = Array.isArray(scores); + 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(); for (var i = 0; i < keys.length; i += 1) { if (keys[i]) { - batch.zadd(keys[i], score, String(value)); + batch.zadd(keys[i], isArrayOfScores ? scores[i] : scores, String(value)); } } diff --git a/test/database/sorted.js b/test/database/sorted.js index 2f7d671beb..a3416d6e11 100644 --- a/test/database/sorted.js +++ b/test/database/sorted.js @@ -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) { db.sortedSetsAdd(['sorted1', 'sorted2'], null, 'value1', function (err) {