refactor: setObjectBulk to match sortedSetAddBulk

This commit is contained in:
Barış Soner Uşaklı
2021-11-12 19:51:59 -05:00
parent 1a85aaad23
commit 8379c11b22
13 changed files with 75 additions and 82 deletions

View File

@@ -35,20 +35,26 @@ module.exports = function (module) {
cache.del(key);
};
module.setObjectBulk = async function (keys, data) {
if (!keys.length || !data.length) {
module.setObjectBulk = async function (...args) {
let data = args[0];
if (!Array.isArray(data) || !data.length) {
return;
}
if (Array.isArray(args[1])) {
console.warn('[deprecated] db.setObjectBulk(keys, data) usage is deprecated, please use db.setObjectBulk(data)');
// conver old format to new format for backwards compatibility
data = args[0].map((key, i) => [key, args[1][i]]);
}
const writeData = data.map(helpers.serializeData);
try {
let bulk;
keys.forEach((key, i) => {
if (Object.keys(writeData[i]).length) {
data.forEach((item) => {
const writeData = helpers.serializeData(item[1]);
if (Object.keys(writeData).length) {
if (!bulk) {
bulk = module.client.collection('objects').initializeUnorderedBulkOp();
}
bulk.find({ _key: key }).upsert().updateOne({ $set: writeData[i] });
bulk.find({ _key: item[0] }).upsert().updateOne({ $set: writeData });
}
});
if (bulk) {
@@ -56,12 +62,12 @@ module.exports = function (module) {
}
} catch (err) {
if (err && err.message.startsWith('E11000 duplicate key error')) {
return await module.setObjectBulk(keys, data);
return await module.setObjectBulk(data);
}
throw err;
}
cache.del(keys);
cache.del(data.map(item => item[0]));
};
module.setObjectField = async function (key, field, value) {

View File

@@ -44,29 +44,30 @@ module.exports = function (module) {
});
};
module.setObjectBulk = async function (keys, data) {
if (!keys.length || !data.length) {
module.setObjectBulk = async function (...args) {
let data = args[0];
if (!Array.isArray(data) || !data.length) {
return;
}
if (Array.isArray(args[1])) {
console.warn('[deprecated] db.setObjectBulk(keys, data) usage is deprecated, please use db.setObjectBulk(data)');
// conver old format to new format for backwards compatibility
data = args[0].map((key, i) => [key, args[1][i]]);
}
await module.transaction(async (client) => {
keys = keys.slice();
data = data.filter((d, i) => {
if (d.hasOwnProperty('')) {
delete d[''];
data = data.filter((item) => {
if (item[1].hasOwnProperty('')) {
delete item[1][''];
}
const keep = !!Object.keys(d).length;
if (!keep) {
keys.splice(i, 1);
}
return keep;
return !!Object.keys(item[1]).length;
});
const keys = data.map(item => item[0]);
if (!keys.length) {
return;
}
await helpers.ensureLegacyObjectsType(client, keys, 'hash');
const dataStrings = data.map(JSON.stringify);
const dataStrings = data.map(item => JSON.stringify(item[1]));
await client.query({
name: 'setObjectBulk',
text: `

View File

@@ -36,18 +36,25 @@ module.exports = function (module) {
cache.del(key);
};
module.setObjectBulk = async function (keys, data) {
if (!keys.length || !data.length) {
module.setObjectBulk = async function (...args) {
let data = args[0];
if (!Array.isArray(data) || !data.length) {
return;
}
if (Array.isArray(args[1])) {
console.warn('[deprecated] db.setObjectBulk(keys, data) usage is deprecated, please use db.setObjectBulk(data)');
// conver old format to new format for backwards compatibility
data = args[0].map((key, i) => [key, args[1][i]]);
}
const batch = module.client.batch();
keys.forEach((k, i) => {
if (Object.keys(data[i]).length) {
batch.hmset(k, data[i]);
data.forEach((item) => {
if (Object.keys(item[1]).length) {
batch.hmset(item[0], item[1]);
}
});
await helpers.execBatch(batch);
cache.del(keys);
cache.del(data.map(item => item[0]));
};
module.setObjectField = async function (key, field, value) {