feat: setAddBulk (#13805)

* feat: setAddBulk

add some tests

* fix: sAdd with value array on redis
This commit is contained in:
Barış Uşaklı
2025-12-03 18:18:14 -05:00
committed by GitHub
parent d8e55d58de
commit 7d5402fe66
4 changed files with 101 additions and 2 deletions

View File

@@ -68,6 +68,31 @@ module.exports = function (module) {
}
};
module.setAddBulk = async function (data) {
if (!data.length) {
return;
}
const bulk = module.client.collection('objects').initializeUnorderedBulkOp();
data.forEach(([key, member]) => {
bulk.find({ _key: key }).upsert().updateOne({
$addToSet: {
members: helpers.valueToString(member),
},
});
});
try {
await bulk.execute();
} catch (err) {
if (err && err.message.includes('E11000 duplicate key error')) {
console.log(new Error('e11000').stack, data);
return await module.setAddBulk(data);
}
throw err;
}
};
module.setRemove = async function (key, value) {
if (!Array.isArray(value)) {
value = [value];

View File

@@ -54,6 +54,32 @@ DO NOTHING`,
});
};
module.setAddBulk = async function (data) {
if (!data.length) {
return;
}
const keys = [];
const members = [];
for (const [key, member] of data) {
keys.push(key);
members.push(member);
}
await module.transaction(async (client) => {
await helpers.ensureLegacyObjectsType(client, keys, 'set');
await client.query({
name: 'setAddBulk',
text: `
INSERT INTO "legacy_set" ("_key", "member")
SELECT k, m
FROM UNNEST($1::TEXT[], $2::TEXT[]) AS t(k, m)
ON CONFLICT ("_key", "member")
DO NOTHING;`,
values: [keys, members],
});
});
};
module.setRemove = async function (key, value) {
if (!Array.isArray(key)) {
key = [key];

View File

@@ -14,11 +14,29 @@ module.exports = function (module) {
};
module.setsAdd = async function (keys, value) {
if (!Array.isArray(keys) || !keys.length) {
if (!Array.isArray(keys) || !keys.length || !value) {
return;
}
if (!Array.isArray(value)) {
value = [value];
}
if (!value.length) {
return;
}
const batch = module.client.batch();
keys.forEach(k => batch.sAdd(String(k), String(value)));
keys.forEach((k) => {
value.forEach(v => batch.sAdd(String(k), String(v)));
});
await helpers.execBatch(batch);
};
module.setAddBulk = async function (data) {
if (!data.length) {
return;
}
const batch = module.client.batch();
data.forEach(([key, member]) => batch.sAdd(String(key), String(member)));
await helpers.execBatch(batch);
};