mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-17 11:11:04 +01:00
refactor: setObjectBulk to match sortedSetAddBulk
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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: `
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user