2016-12-23 14:12:00 +03:00
|
|
|
'use strict';
|
|
|
|
|
|
2019-08-05 09:20:00 -04:00
|
|
|
module.exports = function (module) {
|
2019-07-09 12:46:49 -04:00
|
|
|
var helpers = require('../helpers');
|
2019-02-11 11:23:18 -05:00
|
|
|
var utils = require('../../../utils');
|
2016-12-23 14:12:00 +03:00
|
|
|
|
2019-07-09 12:46:49 -04:00
|
|
|
module.sortedSetAdd = async function (key, score, value) {
|
2016-12-23 14:12:00 +03:00
|
|
|
if (!key) {
|
2019-07-09 12:46:49 -04:00
|
|
|
return;
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
|
|
|
|
if (Array.isArray(score) && Array.isArray(value)) {
|
2019-07-09 12:46:49 -04:00
|
|
|
return await sortedSetAddBulk(key, score, value);
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
2019-02-11 11:23:18 -05:00
|
|
|
if (!utils.isNumber(score)) {
|
2019-07-09 12:46:49 -04:00
|
|
|
throw new Error('[[error:invalid-score, ' + score + ']]');
|
2019-02-11 11:23:18 -05:00
|
|
|
}
|
2016-12-23 14:12:00 +03:00
|
|
|
value = helpers.valueToString(value);
|
|
|
|
|
|
2019-07-09 12:46:49 -04:00
|
|
|
try {
|
2019-08-05 09:20:00 -04:00
|
|
|
await module.client.collection('objects').updateOne({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true, w: 1 });
|
2019-07-09 12:46:49 -04:00
|
|
|
} catch (err) {
|
2016-12-23 14:12:00 +03:00
|
|
|
if (err && err.message.startsWith('E11000 duplicate key error')) {
|
2019-07-09 12:46:49 -04:00
|
|
|
return await module.sortedSetAdd(key, score, value);
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
2019-07-09 12:46:49 -04:00
|
|
|
throw err;
|
|
|
|
|
}
|
2016-12-23 14:12:00 +03:00
|
|
|
};
|
|
|
|
|
|
2019-07-09 12:46:49 -04:00
|
|
|
async function sortedSetAddBulk(key, scores, values) {
|
2016-12-23 14:12:00 +03:00
|
|
|
if (!scores.length || !values.length) {
|
2019-07-09 12:46:49 -04:00
|
|
|
return;
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
|
|
|
|
if (scores.length !== values.length) {
|
2019-07-09 12:46:49 -04:00
|
|
|
throw new Error('[[error:invalid-data]]');
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
2019-02-11 11:23:18 -05:00
|
|
|
for (let i = 0; i < scores.length; i += 1) {
|
|
|
|
|
if (!utils.isNumber(scores[i])) {
|
2019-07-09 12:46:49 -04:00
|
|
|
throw new Error('[[error:invalid-score, ' + scores[i] + ']]');
|
2019-02-11 11:23:18 -05:00
|
|
|
}
|
|
|
|
|
}
|
2016-12-23 14:12:00 +03:00
|
|
|
values = values.map(helpers.valueToString);
|
|
|
|
|
|
2019-08-05 09:20:00 -04:00
|
|
|
var bulk = module.client.collection('objects').initializeUnorderedBulkOp();
|
2017-02-18 01:52:56 -07:00
|
|
|
for (var i = 0; i < scores.length; i += 1) {
|
2017-02-18 12:30:49 -07:00
|
|
|
bulk.find({ _key: key, value: values[i] }).upsert().updateOne({ $set: { score: parseFloat(scores[i]) } });
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
2019-07-09 12:46:49 -04:00
|
|
|
await bulk.execute();
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
|
|
|
|
|
2019-07-09 12:46:49 -04:00
|
|
|
module.sortedSetsAdd = async function (keys, scores, value) {
|
2016-12-23 14:12:00 +03:00
|
|
|
if (!Array.isArray(keys) || !keys.length) {
|
2019-07-09 12:46:49 -04:00
|
|
|
return;
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
2019-05-31 15:44:50 -04:00
|
|
|
const isArrayOfScores = Array.isArray(scores);
|
2020-05-09 10:38:56 -04:00
|
|
|
if ((!isArrayOfScores && !utils.isNumber(scores)) ||
|
|
|
|
|
(isArrayOfScores && scores.map(s => utils.isNumber(s)).includes(false))) {
|
2019-07-09 12:46:49 -04:00
|
|
|
throw new Error('[[error:invalid-score, ' + scores + ']]');
|
2019-02-11 11:23:18 -05:00
|
|
|
}
|
2019-05-31 15:44:50 -04:00
|
|
|
|
|
|
|
|
if (isArrayOfScores && scores.length !== keys.length) {
|
2019-07-09 12:46:49 -04:00
|
|
|
throw new Error('[[error:invalid-data]]');
|
2019-05-31 15:44:50 -04:00
|
|
|
}
|
|
|
|
|
|
2016-12-23 14:12:00 +03:00
|
|
|
value = helpers.valueToString(value);
|
|
|
|
|
|
2019-08-05 09:20:00 -04:00
|
|
|
var bulk = module.client.collection('objects').initializeUnorderedBulkOp();
|
2017-02-18 01:52:56 -07:00
|
|
|
for (var i = 0; i < keys.length; i += 1) {
|
2019-05-31 15:44:50 -04:00
|
|
|
bulk.find({ _key: keys[i], value: value }).upsert().updateOne({ $set: { score: parseFloat(isArrayOfScores ? scores[i] : scores) } });
|
2016-12-23 14:12:00 +03:00
|
|
|
}
|
2019-07-09 12:46:49 -04:00
|
|
|
await bulk.execute();
|
2019-06-24 17:48:13 -04:00
|
|
|
};
|
|
|
|
|
|
2019-07-09 12:46:49 -04:00
|
|
|
module.sortedSetAddBulk = async function (data) {
|
2019-06-24 17:48:13 -04:00
|
|
|
if (!Array.isArray(data) || !data.length) {
|
2019-07-09 12:46:49 -04:00
|
|
|
return;
|
2019-06-24 17:48:13 -04:00
|
|
|
}
|
2019-08-05 09:20:00 -04:00
|
|
|
var bulk = module.client.collection('objects').initializeUnorderedBulkOp();
|
2019-06-24 17:48:13 -04:00
|
|
|
data.forEach(function (item) {
|
2020-05-09 10:38:56 -04:00
|
|
|
if (!utils.isNumber(item[1])) {
|
|
|
|
|
throw new Error('[[error:invalid-score, ' + item[1] + ']]');
|
|
|
|
|
}
|
2019-06-24 17:48:13 -04:00
|
|
|
bulk.find({ _key: item[0], value: String(item[2]) }).upsert().updateOne({ $set: { score: parseFloat(item[1]) } });
|
2016-12-23 14:12:00 +03:00
|
|
|
});
|
2019-07-09 12:46:49 -04:00
|
|
|
await bulk.execute();
|
2016-12-23 14:12:00 +03:00
|
|
|
};
|
2017-02-18 02:30:48 -07:00
|
|
|
};
|