mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 19:15:58 +01:00 
			
		
		
		
	sortedSetScores for tag counts
This commit is contained in:
		| @@ -153,6 +153,35 @@ module.exports = function(db, module) { | |||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | 	module.sortedSetScores = function(key, values, callback) { | ||||||
|  | 		values = values.map(function(value) { | ||||||
|  | 			return value ? value.toString() : value; | ||||||
|  | 		}); | ||||||
|  |  | ||||||
|  | 		module.getListRange(key, 0, -1, function(err, list) { | ||||||
|  | 			if (err) { | ||||||
|  | 				return callback(err); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			var map = {}; | ||||||
|  | 			list = list.filter(function(item) { | ||||||
|  | 				return values.indexOf(item.value) !== -1; | ||||||
|  | 			}).forEach(function(item) { | ||||||
|  | 				map[item.value] = item.score; | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 			var	returnData = new Array(values.length), | ||||||
|  | 				score; | ||||||
|  |  | ||||||
|  | 			for(var i=0; i<values.length; ++i) { | ||||||
|  | 				score = map[values[i]]; | ||||||
|  | 				returnData[i] = score ? score : null; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			callback(null, returnData); | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	module.isSortedSetMember = function(key, value, callback) { | 	module.isSortedSetMember = function(key, value, callback) { | ||||||
| 		// maybe can be improved by having a parallel array | 		// maybe can be improved by having a parallel array | ||||||
| 		module.getListRange(key, 0, -1, function(err, list) { | 		module.getListRange(key, 0, -1, function(err, list) { | ||||||
|   | |||||||
| @@ -143,6 +143,50 @@ module.exports = function(db, module) { | |||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | 	module.sortedSetsScore = function(keys, value, callback) { | ||||||
|  | 		value = helpers.valueToString(value); | ||||||
|  | 		db.collection('objects').find({_key:{$in:keys}, value: value}).toArray(function(err, result) { | ||||||
|  | 			if (err) { | ||||||
|  | 				return callback(err); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			var map = helpers.toMap(result), | ||||||
|  | 				returnData = [], | ||||||
|  | 				item; | ||||||
|  |  | ||||||
|  | 			for(var i=0; i<keys.length; ++i) { | ||||||
|  | 				item = map[keys[i]]; | ||||||
|  | 				returnData.push(item ? item.score : null); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			callback(null, returnData); | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	module.sortedSetScores = function(key, values, callback) { | ||||||
|  | 		values = values.map(helpers.valueToString); | ||||||
|  | 		db.collection('objects').find({_key: key, value: {$in: values}}).toArray(function(err, result) { | ||||||
|  | 			if (err) { | ||||||
|  | 				return callback(err); | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			var map = {}; | ||||||
|  | 			result.forEach(function(item) { | ||||||
|  | 				map[item.value] = item.score; | ||||||
|  | 			}); | ||||||
|  |  | ||||||
|  | 			var	returnData = new Array(values.length), | ||||||
|  | 				score; | ||||||
|  |  | ||||||
|  | 			for(var i=0; i<values.length; ++i) { | ||||||
|  | 				score = map[values[i]]; | ||||||
|  | 				returnData[i] = score ? score : null; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			callback(null, returnData); | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	module.isSortedSetMember = function(key, value, callback) { | 	module.isSortedSetMember = function(key, value, callback) { | ||||||
| 		module.sortedSetScore(key, value, function(err, score) { | 		module.sortedSetScore(key, value, function(err, score) { | ||||||
| 			callback(err, !!score); | 			callback(err, !!score); | ||||||
| @@ -167,26 +211,6 @@ module.exports = function(db, module) { | |||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	module.sortedSetsScore = function(keys, value, callback) { |  | ||||||
| 		value = helpers.valueToString(value); |  | ||||||
| 		db.collection('objects').find({_key:{$in:keys}, value: value}).toArray(function(err, result) { |  | ||||||
| 			if(err) { |  | ||||||
| 				return callback(err); |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			var map = helpers.toMap(result), |  | ||||||
| 				returnData = [], |  | ||||||
| 				item; |  | ||||||
|  |  | ||||||
| 			for(var i=0; i<keys.length; ++i) { |  | ||||||
| 				item = map[keys[i]]; |  | ||||||
| 				returnData.push(item ? item.score : null); |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			callback(null, returnData); |  | ||||||
| 		}); |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	module.getSortedSetUnion = function(sets, start, stop, callback) { | 	module.getSortedSetUnion = function(sets, start, stop, callback) { | ||||||
| 		getSortedSetUnion(sets, 1, start, stop, callback); | 		getSortedSetUnion(sets, 1, start, stop, callback); | ||||||
| 	}; | 	}; | ||||||
|   | |||||||
| @@ -82,6 +82,18 @@ module.exports = function(redisClient, module) { | |||||||
| 		redisClient.zscore(key, value, callback); | 		redisClient.zscore(key, value, callback); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  | 	module.sortedSetsScore = function(keys, value, callback) { | ||||||
|  | 		multi('zscore', keys, value, callback); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	module.sortedSetScores = function(key, values, callback) { | ||||||
|  | 		var multi = redisClient.multi(); | ||||||
|  | 		for(var i=0; i<values.length; ++i) { | ||||||
|  | 			multi.zscore(key, values[i]); | ||||||
|  | 		} | ||||||
|  | 		multi.exec(callback); | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 	module.isSortedSetMember = function(key, value, callback) { | 	module.isSortedSetMember = function(key, value, callback) { | ||||||
| 		module.sortedSetScore(key, value, function(err, score) { | 		module.sortedSetScore(key, value, function(err, score) { | ||||||
| 			callback(err, !!score); | 			callback(err, !!score); | ||||||
| @@ -104,10 +116,6 @@ module.exports = function(redisClient, module) { | |||||||
| 		}); | 		}); | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	module.sortedSetsScore = function(keys, value, callback) { |  | ||||||
| 		multi('zscore', keys, value, callback); |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	function multi(command, keys, value, callback) { | 	function multi(command, keys, value, callback) { | ||||||
| 		var	m = redisClient.multi(); | 		var	m = redisClient.multi(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -104,14 +104,12 @@ module.exports = function(Topics) { | |||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			var uniqueTags = _.uniq(_.flatten(members)); | 			var uniqueTags = _.uniq(_.flatten(members)); | ||||||
| 			var tagTopicSets = uniqueTags.map(function(tag) { |  | ||||||
| 				return 'tag:' + tag + ':topics'; |  | ||||||
| 			}); |  | ||||||
|  |  | ||||||
| 			db.sortedSetsCard(tagTopicSets, function(err, data) { | 			db.sortedSetScores('tags:topic:count', uniqueTags, function(err, data) { | ||||||
| 				if (err) { | 				if (err) { | ||||||
| 					return callback(err); | 					return callback(err); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				var tagCounts = _.object(uniqueTags, data); | 				var tagCounts = _.object(uniqueTags, data); | ||||||
|  |  | ||||||
| 				members.forEach(function(tags, index) { | 				members.forEach(function(tags, index) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user