def _get_hot_slice_by_threads(rlbb, nav_slice): ops_and_scores = rlbb.with_scores[nav_slice] if rlbb else [] ops = [Comment(id=id) for (id, score) in ops_and_scores] max_from_thread = 3 # Got the OPs, now I need to bulk fetch the top replies. pipeline = redis.pipeline() for comment in ops: pipeline.get(comment.redis_score.key) for comment in ops: pipeline.zrevrange(comment.popular_replies.key, 0, max_from_thread - 1, withscores=True) results = pipeline.execute() op_scores, pop_reply_lists = results[:len(ops)], results[len(ops):] ids = [] if ops_and_scores: # Lowest score sets the threshold, but replies get a "boost" factor cutoff = ops_and_scores[-1][1] / Config.get('reply_boost', 1) for op, op_score, pop_replies in zip(ops, op_scores, pop_reply_lists): items = [(int(id), float(score or 0)) for (id,score) in [(op.id, op_score)] + pop_replies] items.sort(key=lambda (id, score): -score) ids += [id for (id, score) in items if score >= cutoff][:max_from_thread] return ids
def create_comment(**kwargs): kwargs['author'] = kwargs.get('author', create_user()) kwargs['timestamp'] = kwargs.get('timestamp', Services.time.time()) kwargs['anonymous'] = kwargs.get('anonymous', False) if kwargs.get('parent_comment') is None: kwargs['title'] = kwargs.get('title', 'Sample title.') comment = Comment(**kwargs) comment.save() return comment