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);
};

View File

@@ -88,6 +88,36 @@ describe('Set methods', () => {
done();
});
});
it('should add the values to each set', async () => {
await db.setsAdd(['saddarray1', 'saddarray2', 'saddarray3'], ['v1', 'v2', 'v3']);
const data = await db.getSetsMembers(['saddarray1', 'saddarray2', 'saddarray3']);
data.forEach(members => members.sort());
assert.deepStrictEqual(data, [
['v1', 'v2', 'v3'],
['v1', 'v2', 'v3'],
['v1', 'v2', 'v3'],
]);
});
});
describe('setAddBulk()', () => {
it('should add multiple key-member pairs', async () => {
await db.setAddBulk([
['bulkSet1', 'value1'],
['bulkSet2', 'value2'],
]);
let data = await db.getSetMembers('bulkSet1');
assert.deepStrictEqual(data, ['value1']);
data = await db.getSetMembers('bulkSet2');
assert.deepStrictEqual(data, ['value2']);
await db.setAddBulk([
['bulkSet1', 'value1'],
['bulkSet1', 'value3'],
]);
data = await db.getSetMembers('bulkSet1');
assert.deepStrictEqual(data.sort(), ['value1', 'value3']);
});
});
describe('getSetsMembers()', () => {