From f948ad14506a6e024f39a804e40f942ddc58b353 Mon Sep 17 00:00:00 2001 From: zh000-star Date: Sat, 24 Jan 2026 02:29:01 +0000 Subject: [PATCH 1/5] Add a helpful function for sortedSetsAdd --- src/database/mongo/sorted/add.js | 192 +++++++++++++++++++------------ 1 file changed, 117 insertions(+), 75 deletions(-) diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index bc3a8bc8ec..5ee90611a6 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -1,90 +1,132 @@ 'use strict'; module.exports = function (module) { - const helpers = require('../helpers'); - const utils = require('../../../utils'); + const helpers = require('../helpers'); + const utils = require('../../../utils'); - module.sortedSetAdd = async function (key, score, value) { - if (!key) { - return; - } - if (Array.isArray(score) && Array.isArray(value)) { - return await sortedSetAddBulk(key, score, value); - } - if (!utils.isNumber(score)) { - throw new Error(`[[error:invalid-score, ${score}]]`); - } - value = helpers.valueToString(value); - - try { - await module.client.collection('objects').updateOne({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true }); - } catch (err) { - if (err && err.message.includes('E11000 duplicate key error')) { - console.log(new Error('e11000').stack, key, score, value); - return await module.sortedSetAdd(key, score, value); + function normalizeScores(keys, scores) { + const isArray = Array.isArray(scores); + if (!isArray) { + if (!utils.isNumber(scores)) { + throw new Error(`[[error:invalid-score, ${scores}]]`); } - throw err; + return { isArrayOfScores: false, scores }; } - }; - - async function sortedSetAddBulk(key, scores, values) { - if (!scores.length || !values.length) { - return; - } - if (scores.length !== values.length) { + + + if (scores.length !== keys.length) { throw new Error('[[error:invalid-data]]'); } - for (let i = 0; i < scores.length; i += 1) { - if (!utils.isNumber(scores[i])) { - throw new Error(`[[error:invalid-score, ${scores[i]}]]`); - } - } - values = values.map(helpers.valueToString); - - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - for (let i = 0; i < scores.length; i += 1) { - bulk.find({ _key: key, value: values[i] }).upsert().updateOne({ $set: { score: parseFloat(scores[i]) } }); + + + if (!scores.every(utils.isNumber)) { + throw new Error(`[[error:invalid-score, ${scores}]]`); } - await bulk.execute(); + + + return { isArrayOfScores: true, scores }; } + + module.sortedSetAdd = async function (key, score, value) { + if (!key) { + return; + } - module.sortedSetsAdd = async function (keys, scores, value) { - if (!Array.isArray(keys) || !keys.length) { - return; - } - const isArrayOfScores = Array.isArray(scores); - if ((!isArrayOfScores && !utils.isNumber(scores)) || - (isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false))) { - throw new Error(`[[error:invalid-score, ${scores}]]`); - } + if (Array.isArray(score) && Array.isArray(value)) { + return await sortedSetAddBulk(key, score, value); + } - if (isArrayOfScores && scores.length !== keys.length) { - throw new Error('[[error:invalid-data]]'); - } + if (!utils.isNumber(score)) { + throw new Error(`[[error:invalid-score, ${score}]]`); + } - value = helpers.valueToString(value); + value = helpers.valueToString(value); - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - for (let i = 0; i < keys.length; i += 1) { - bulk - .find({ _key: keys[i], value: value }) - .upsert() - .updateOne({ $set: { score: parseFloat(isArrayOfScores ? scores[i] : scores) } }); - } - await bulk.execute(); - }; + try { + await module.client.collection('objects').updateOne( + { _key: key, value: value }, + { $set: { score: parseFloat(score) } }, + { upsert: true } + ); + } catch (err) { + if (err && err.message.includes('E11000 duplicate key error')) { + console.log(new Error('e11000').stack, key, score, value); + return await module.sortedSetAdd(key, score, value); + } + throw err; + } + }; - module.sortedSetAddBulk = async function (data) { - if (!Array.isArray(data) || !data.length) { - return; - } - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - data.forEach((item) => { - if (!utils.isNumber(item[1])) { - throw new Error(`[[error:invalid-score, ${item[1]}]]`); - } - bulk.find({ _key: item[0], value: String(item[2]) }).upsert().updateOne({ $set: { score: parseFloat(item[1]) } }); - }); - await bulk.execute(); - }; -}; + async function sortedSetAddBulk(key, scores, values) { + if (!scores.length || !values.length) { + return; + } + + if (scores.length !== values.length) { + throw new Error('[[error:invalid-data]]'); + } + + for (let i = 0; i < scores.length; i += 1) { + if (!utils.isNumber(scores[i])) { + throw new Error(`[[error:invalid-score, ${scores[i]}]]`); + } + } + + values = values.map(helpers.valueToString); + + const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); + for (let i = 0; i < scores.length; i += 1) { + bulk.find({ _key: key, value: values[i] }) + .upsert() + .updateOne({ $set: { score: parseFloat(scores[i]) } }); + } + await bulk.execute(); + } + + module.sortedSetsAdd = async function (keys, scores, value) { + if (!Array.isArray(keys) || !keys.length) { + return; + } + + const isArrayOfScores = Array.isArray(scores); + if ( + (!isArrayOfScores && !utils.isNumber(scores)) || + (isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false)) + ) { + throw new Error(`[[error:invalid-score, ${scores}]]`); + } + + if (isArrayOfScores && scores.length !== keys.length) { + throw new Error('[[error:invalid-data]]'); + } + + value = helpers.valueToString(value); + + const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); + for (let i = 0; i < keys.length; i += 1) { + bulk.find({ _key: keys[i], value: value }) + .upsert() + .updateOne({ + $set: { score: parseFloat(isArrayOfScores ? scores[i] : scores) } + }); + } + await bulk.execute(); + }; + + module.sortedSetAddBulk = async function (data) { + if (!Array.isArray(data) || !data.length) { + return; + } + + const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); + data.forEach((item) => { + if (!utils.isNumber(item[1])) { + throw new Error(`[[error:invalid-score, ${item[1]}]]`); + } + bulk.find({ _key: item[0], value: String(item[2]) }) + .upsert() + .updateOne({ $set: { score: parseFloat(item[1]) } }); + }); + await bulk.execute(); + }; +}; \ No newline at end of file From 2c0a1e629c275a3cf9e922056fad61636cfe55c4 Mon Sep 17 00:00:00 2001 From: zh000-star Date: Sat, 24 Jan 2026 02:30:31 +0000 Subject: [PATCH 2/5] Find the smells and want to change sortedSetsAdd --- src/database/mongo/sorted/add.js | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index 5ee90611a6..64ce3293c9 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -4,29 +4,6 @@ module.exports = function (module) { const helpers = require('../helpers'); const utils = require('../../../utils'); - function normalizeScores(keys, scores) { - const isArray = Array.isArray(scores); - if (!isArray) { - if (!utils.isNumber(scores)) { - throw new Error(`[[error:invalid-score, ${scores}]]`); - } - return { isArrayOfScores: false, scores }; - } - - - if (scores.length !== keys.length) { - throw new Error('[[error:invalid-data]]'); - } - - - if (!scores.every(utils.isNumber)) { - throw new Error(`[[error:invalid-score, ${scores}]]`); - } - - - return { isArrayOfScores: true, scores }; - } - module.sortedSetAdd = async function (key, score, value) { if (!key) { return; From 377f819aaa0e5f2b8bc8cccd55f1dc1e958297e8 Mon Sep 17 00:00:00 2001 From: zh000-star Date: Sat, 24 Jan 2026 02:34:05 +0000 Subject: [PATCH 3/5] Add a helper function for sortedSetsAdd --- src/database/mongo/sorted/add.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index 64ce3293c9..d77b8ae283 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -4,6 +4,29 @@ module.exports = function (module) { const helpers = require('../helpers'); const utils = require('../../../utils'); + function normalizeScores(keys, scores) { + const isArray = Array.isArray(scores); + if (!isArray) { + if (!utils.isNumber(scores)) { + throw new Error(`[[error:invalid-score, ${scores}]]`); + } + return { isArrayOfScores: false, scores }; + } + + + if (scores.length !== keys.length) { + throw new Error('[[error:invalid-data]]'); + } + + + if (!scores.every(utils.isNumber)) { + throw new Error(`[[error:invalid-score, ${scores}]]`); + } + + + return { isArrayOfScores: true, scores }; + } + module.sortedSetAdd = async function (key, score, value) { if (!key) { return; From 498bdb21535d2592019a6b7e0e171150d5f3830f Mon Sep 17 00:00:00 2001 From: zh000-star Date: Sat, 24 Jan 2026 02:49:59 +0000 Subject: [PATCH 4/5] Changed sortedSetsAdd and fixed the smell and passed the test --- src/database/mongo/sorted/add.js | 143 ++++++++----------------------- 1 file changed, 37 insertions(+), 106 deletions(-) diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index d77b8ae283..7ad82d895d 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -1,8 +1,8 @@ 'use strict'; module.exports = function (module) { - const helpers = require('../helpers'); - const utils = require('../../../utils'); + const helpers = require('../helpers'); + const utils = require('../../../utils'); function normalizeScores(keys, scores) { const isArray = Array.isArray(scores); @@ -12,121 +12,52 @@ module.exports = function (module) { } return { isArrayOfScores: false, scores }; } - - + if (scores.length !== keys.length) { throw new Error('[[error:invalid-data]]'); } - - + if (!scores.every(utils.isNumber)) { throw new Error(`[[error:invalid-score, ${scores}]]`); } - - + return { isArrayOfScores: true, scores }; } - module.sortedSetAdd = async function (key, score, value) { - if (!key) { - return; - } - - if (Array.isArray(score) && Array.isArray(value)) { - return await sortedSetAddBulk(key, score, value); - } - - if (!utils.isNumber(score)) { - throw new Error(`[[error:invalid-score, ${score}]]`); - } - - value = helpers.valueToString(value); - - try { - await module.client.collection('objects').updateOne( - { _key: key, value: value }, - { $set: { score: parseFloat(score) } }, - { upsert: true } - ); - } catch (err) { - if (err && err.message.includes('E11000 duplicate key error')) { - console.log(new Error('e11000').stack, key, score, value); - return await module.sortedSetAdd(key, score, value); - } - throw err; - } - }; - - async function sortedSetAddBulk(key, scores, values) { - if (!scores.length || !values.length) { - return; - } - - if (scores.length !== values.length) { - throw new Error('[[error:invalid-data]]'); - } - - for (let i = 0; i < scores.length; i += 1) { - if (!utils.isNumber(scores[i])) { - throw new Error(`[[error:invalid-score, ${scores[i]}]]`); - } - } - - values = values.map(helpers.valueToString); - - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - for (let i = 0; i < scores.length; i += 1) { - bulk.find({ _key: key, value: values[i] }) - .upsert() - .updateOne({ $set: { score: parseFloat(scores[i]) } }); - } - await bulk.execute(); - } - - module.sortedSetsAdd = async function (keys, scores, value) { - if (!Array.isArray(keys) || !keys.length) { - return; - } - - const isArrayOfScores = Array.isArray(scores); - if ( - (!isArrayOfScores && !utils.isNumber(scores)) || - (isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false)) - ) { - throw new Error(`[[error:invalid-score, ${scores}]]`); - } - - if (isArrayOfScores && scores.length !== keys.length) { - throw new Error('[[error:invalid-data]]'); - } + module.sortedSetsAdd = async function (keys, scores, value) { + if (!Array.isArray(keys) || !keys.length) { + return; + } - value = helpers.valueToString(value); + const { isArrayOfScores, scores: normalizedScores } = normalizeScores(keys, scores); + value = helpers.valueToString(value); - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - for (let i = 0; i < keys.length; i += 1) { - bulk.find({ _key: keys[i], value: value }) - .upsert() - .updateOne({ - $set: { score: parseFloat(isArrayOfScores ? scores[i] : scores) } - }); - } - await bulk.execute(); - }; + const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); + for (let i = 0; i < keys.length; i += 1) { + const score = isArrayOfScores ? normalizedScores[i] : normalizedScores; + bulk + .find({ _key: keys[i], value: value }) + .upsert() + .updateOne({ $set: { score: parseFloat(score) } }); + } + await bulk.execute(); + }; - module.sortedSetAddBulk = async function (data) { - if (!Array.isArray(data) || !data.length) { - return; - } + module.sortedSetAddBulk = async function (data) { + if (!Array.isArray(data) || !data.length) { + return; + } - const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); - data.forEach((item) => { - if (!utils.isNumber(item[1])) { - throw new Error(`[[error:invalid-score, ${item[1]}]]`); - } - bulk.find({ _key: item[0], value: String(item[2]) }) - .upsert() - .updateOne({ $set: { score: parseFloat(item[1]) } }); - }); - await bulk.execute(); - }; + const bulk = module.client.collection('objects').initializeUnorderedBulkOp(); + for (const item of data) { + if (!utils.isNumber(item[1])) { + throw new Error(`[[error:invalid-score, ${item[1]}]]`); + } + bulk + .find({ _key: item[0], value: String(item[2]) }) + .upsert() + .updateOne({ $set: { score: parseFloat(item[1]) } }); + } + await bulk.execute(); + }; }; \ No newline at end of file From 4f833d35f2a5b85248e8ade6dd3e12c5865f6fcb Mon Sep 17 00:00:00 2001 From: zh000-star Date: Sat, 24 Jan 2026 02:51:56 +0000 Subject: [PATCH 5/5] Add print statement to sortedSetsAdd --- src/database/mongo/sorted/add.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js index 7ad82d895d..f06d3539ce 100644 --- a/src/database/mongo/sorted/add.js +++ b/src/database/mongo/sorted/add.js @@ -25,6 +25,7 @@ module.exports = function (module) { } module.sortedSetsAdd = async function (keys, scores, value) { + console.log('HELEN sortedSetsAdd hit'); if (!Array.isArray(keys) || !keys.length) { return; }