| 
									
										
										
										
											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); | 
					
						
							|  |  |  | 		if (!isArrayOfScores && !utils.isNumber(scores)) { | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							|  |  |  | 			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
										 |  |  | }; |