mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-27 09:49:52 +01:00
feat: setAddBulk (#13805)
* feat: setAddBulk add some tests * fix: sAdd with value array on redis
This commit is contained in:
@@ -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) {
|
module.setRemove = async function (key, value) {
|
||||||
if (!Array.isArray(value)) {
|
if (!Array.isArray(value)) {
|
||||||
value = [value];
|
value = [value];
|
||||||
|
|||||||
@@ -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) {
|
module.setRemove = async function (key, value) {
|
||||||
if (!Array.isArray(key)) {
|
if (!Array.isArray(key)) {
|
||||||
key = [key];
|
key = [key];
|
||||||
|
|||||||
@@ -14,11 +14,29 @@ module.exports = function (module) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
module.setsAdd = async function (keys, value) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
const batch = module.client.batch();
|
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);
|
await helpers.execBatch(batch);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,36 @@ describe('Set methods', () => {
|
|||||||
done();
|
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()', () => {
|
describe('getSetsMembers()', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user