Psql multikey (#9852)

* perf: convert promise.all to single query

* perf: single query for removeBulk

* perf: list
isekai-main
Barış Soner Uşaklı 4 years ago committed by GitHub
parent ea04aeded4
commit e6a17a6349
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -9,28 +9,18 @@ module.exports = function (module) {
} }
await module.transaction(async (client) => { await module.transaction(async (client) => {
async function doPrepend(value) { await helpers.ensureLegacyObjectType(client, key, 'list');
value = Array.isArray(value) ? value : [value];
value.reverse();
await client.query({ await client.query({
name: 'listPrepend', name: 'listPrependValues',
text: ` text: `
INSERT INTO "legacy_list" ("_key", "array") INSERT INTO "legacy_list" ("_key", "array")
VALUES ($1::TEXT, ARRAY[$2::TEXT]) VALUES ($1::TEXT, $2::TEXT[])
ON CONFLICT ("_key") ON CONFLICT ("_key")
DO UPDATE SET "array" = ARRAY[$2::TEXT] || "legacy_list"."array"`, DO UPDATE SET "array" = EXCLUDED.array || "legacy_list"."array"`,
values: [key, value], values: [key, value],
}); });
}
await helpers.ensureLegacyObjectType(client, key, 'list');
if (Array.isArray(value)) {
// TODO: perf make single query
for (const v of value) {
// eslint-disable-next-line
await doPrepend(v);
}
return;
}
await doPrepend(value);
}); });
}; };
@ -39,27 +29,18 @@ module.exports = function (module) {
return; return;
} }
await module.transaction(async (client) => { await module.transaction(async (client) => {
async function doAppend(value) { value = Array.isArray(value) ? value : [value];
await helpers.ensureLegacyObjectType(client, key, 'list');
await client.query({ await client.query({
name: 'listAppend', name: 'listAppend',
text: ` text: `
INSERT INTO "legacy_list" ("_key", "array") INSERT INTO "legacy_list" ("_key", "array")
VALUES ($1::TEXT, ARRAY[$2::TEXT]) VALUES ($1::TEXT, $2::TEXT[])
ON CONFLICT ("_key") ON CONFLICT ("_key")
DO UPDATE SET "array" = "legacy_list"."array" || ARRAY[$2::TEXT]`, DO UPDATE SET "array" = "legacy_list"."array" || EXCLUDED.array`,
values: [key, value], values: [key, value],
}); });
}
await helpers.ensureLegacyObjectType(client, key, 'list');
if (Array.isArray(value)) {
// TODO: perf make single query
for (const v of value) {
// eslint-disable-next-line
await doAppend(v);
}
return;
}
await doAppend(value);
}); });
}; };

@ -71,25 +71,21 @@ DELETE FROM "legacy_zset"
}; };
module.sortedSetRemoveBulk = async function (data) { module.sortedSetRemoveBulk = async function (data) {
// const keys = []; if (!Array.isArray(data) || !data.length) {
// const values = []; return;
}
// data.forEach(function (item) { const keys = data.map(d => d[0]);
// keys.push(item[0]); const values = data.map(d => d[1]);
// values.push(item[1]);
// });
const promises = data.map(item => module.sortedSetRemove(item[0], item[1]));
await Promise.all(promises);
// TODO await module.pool.query({
// await query({ name: 'sortedSetRemoveBulk',
// name: 'sortedSetRemoveBulk', text: `
// text: ` DELETE FROM "legacy_zset"
// DELETE FROM "legacy_zset" WHERE (_key, value) IN (
// SELECT k, v SELECT k, v
// FROM UNNEST($1::TEXT[], $2::TEXT[]) vs(k, v)`, FROM UNNEST($1::TEXT[], $2::TEXT[]) vs(k, v)
// values: [keys, values], )`,
// }); values: [keys, values],
});
}; };
}; };

@ -1119,6 +1119,29 @@ describe('Sorted Set methods', () => {
const members = await db.getSortedSetsMembers(['bulkRemove1', 'bulkRemove2']); const members = await db.getSortedSetsMembers(['bulkRemove1', 'bulkRemove2']);
assert.deepStrictEqual(members, [[], []]); assert.deepStrictEqual(members, [[], []]);
}); });
it('should not remove wrong elements in bulk remove', async () => {
await db.sortedSetAddBulk([
['bulkRemove4', 1, 'value1'],
['bulkRemove4', 2, 'value2'],
['bulkRemove4', 3, 'value4'],
['bulkRemove5', 1, 'value1'],
['bulkRemove5', 2, 'value2'],
['bulkRemove5', 3, 'value3'],
]);
await db.sortedSetRemoveBulk([
['bulkRemove4', 'value1'],
['bulkRemove4', 'value3'],
['bulkRemove5', 'value1'],
['bulkRemove5', 'value4'],
]);
const members = await Promise.all([
db.getSortedSetRange('bulkRemove4', 0, -1),
db.getSortedSetRange('bulkRemove5', 0, -1),
]);
assert.deepStrictEqual(members[0], ['value2', 'value4']);
assert.deepStrictEqual(members[1], ['value2', 'value3']);
});
}); });
describe('sortedSetsRemove()', () => { describe('sortedSetsRemove()', () => {

Loading…
Cancel
Save