def update_comment_votes(comments): from r2.models import CommentScoresByLink comments = tup(comments) link_map = {} for com in comments: link_map.setdefault(com.link_id, []).append(com) all_links = Link._byID(link_map.keys(), data=True) comment_trees = {} for link in all_links.values(): comment_trees[link._id] = get_comment_tree(link) for link_id, coms in link_map.iteritems(): link = all_links[link_id] for sort in ("_controversy", "_hot", "_confidence", "_score", "_date", "_qa"): cid_tree = comment_trees[link_id].tree scores_by_comment = _comment_sorter_from_cids(coms, sort, link, cid_tree, by_36=True) CommentScoresByLink.set_scores(link, sort, scores_by_comment)
def update_comment_votes(comments, write_consistency_level=None): from r2.models import CommentSortsCache, CommentScoresByLink comments = tup(comments) link_map = {} for com in comments: link_map.setdefault(com.link_id, []).append(com) all_links = Link._byID(link_map.keys(), data=True) comment_trees = {} for link in all_links.values(): comment_trees[link._id] = get_comment_tree(link) for link_id, coms in link_map.iteritems(): link = all_links[link_id] for sort in ("_controversy", "_hot", "_confidence", "_score", "_date", "_qa"): cid_tree = comment_trees[link_id].tree scores_by_comment = _comment_sorter_from_cids(coms, sort, link, cid_tree, by_36=True) # Cassandra always uses the id36 instead of the integer # ID, so we'll map that first before sending it c_key = sort_comments_key(link_id, sort) CommentSortsCache._set_values( c_key, scores_by_comment, write_consistency_level=write_consistency_level) CommentScoresByLink.set_scores(link, sort, scores_by_comment)
def update_comment_votes(comments, write_consistency_level = None): from r2.models import CommentSortsCache, CommentScoresByLink comments = tup(comments) link_map = {} for com in comments: link_map.setdefault(com.link_id, []).append(com) all_links = Link._byID(link_map.keys(), data=True) comment_trees = {} for link in all_links.values(): comment_trees[link._id] = get_comment_tree(link) for link_id, coms in link_map.iteritems(): link = all_links[link_id] for sort in ("_controversy", "_hot", "_confidence", "_score", "_date", "_qa"): cid_tree = comment_trees[link_id].tree scores_by_comment = _comment_sorter_from_cids( coms, sort, link, cid_tree, by_36=True) # Cassandra always uses the id36 instead of the integer # ID, so we'll map that first before sending it c_key = sort_comments_key(link_id, sort) CommentSortsCache._set_values(c_key, scores_by_comment, write_consistency_level=write_consistency_level) CommentScoresByLink.set_scores(link, sort, scores_by_comment)
def update_comment_votes(comments): from r2.models import CommentScoresByLink comments = tup(comments) comments_by_link_id = defaultdict(list) for comment in comments: comments_by_link_id[comment.link_id].append(comment) links_by_id = Link._byID(comments_by_link_id.keys(), data=True) for link_id, link_comments in comments_by_link_id.iteritems(): link = links_by_id[link_id] for sort in ("_controversy", "_confidence", "_score"): scores_by_comment = { comment._id36: getattr(comment, sort) for comment in link_comments } CommentScoresByLink.set_scores(link, sort, scores_by_comment) scores_by_comment = _get_qa_comment_scores(link, link_comments) CommentScoresByLink.set_scores(link, "_qa", scores_by_comment)
def _get_comment_sorter(link, sort): """Retrieve cached sort values for all comments on a post. Arguments: * link_id -- id of the Link containing the comments. * sort -- a string indicating the attribute on the comments to use for generating sort values. Returns a dictionary from cid to a numeric sort value. """ from r2.models import CommentScoresByLink sorter = CommentScoresByLink.get_scores(link, sort) # we store these id36ed, but there are still bits of the code that # want to deal in integer IDs sorter = dict((int(c_id, 36), val) for (c_id, val) in sorter.iteritems()) return sorter
def get_comment_scores(link, sort, comment_ids, timer): """Retrieve cached sort values for all comments on a post. Arguments: * link_id -- id of the Link containing the comments. * sort -- a string indicating the attribute on the comments to use for generating sort values. Returns a dictionary from cid to a numeric sort value. """ from r2.lib.db import queries from r2.models import CommentScoresByLink if not comment_ids: # no comments means no scores return {} if sort == "_date": # comment ids are monotonically increasing, so we can use them as a # substitute for creation date scores_by_id = {comment_id: comment_id for comment_id in comment_ids} else: scores_by_id36 = CommentScoresByLink.get_scores(link, sort) # we store these id36ed, but there are still bits of the code that # want to deal in integer IDs scores_by_id = { int(id36, 36): score for id36, score in scores_by_id36.iteritems() } scores_needed = set(comment_ids) - set(scores_by_id.keys()) if scores_needed: g.stats.simple_event('comment_tree_bad_sorter') missing_comments = Comment._byID(scores_needed, data=True, return_dict=False) # queue the missing comments to be added to the comments tree, which # will trigger adding their scores for comment in missing_comments: queries.add_to_commentstree_q(comment) if sort == "_qa": scores_by_missing_id36 = _get_qa_comment_scores( link, missing_comments) scores_by_missing = { int(id36, 36): score for id36, score in scores_by_missing_id36.iteritems() } else: scores_by_missing = { comment._id: getattr(comment, sort) for comment in missing_comments } scores_by_id.update(scores_by_missing) timer.intermediate('sort') return scores_by_id
def get_comment_scores(link, sort, comment_ids, timer): """Retrieve cached sort values for all comments on a post. Arguments: * link_id -- id of the Link containing the comments. * sort -- a string indicating the attribute on the comments to use for generating sort values. Returns a dictionary from cid to a numeric sort value. """ from r2.lib.db import queries from r2.models import CommentScoresByLink if not comment_ids: # no comments means no scores return {} if sort == "_date": # comment ids are monotonically increasing, so we can use them as a # substitute for creation date scores_by_id = {comment_id: comment_id for comment_id in comment_ids} else: scores_by_id36 = CommentScoresByLink.get_scores(link, sort) # we store these id36ed, but there are still bits of the code that # want to deal in integer IDs scores_by_id = { int(id36, 36): score for id36, score in scores_by_id36.iteritems() } scores_needed = set(comment_ids) - set(scores_by_id.keys()) if scores_needed: g.stats.simple_event('comment_tree_bad_sorter') missing_comments = Comment._byID( scores_needed, data=True, return_dict=False) # queue the missing comments to be added to the comments tree, which # will trigger adding their scores for comment in missing_comments: queries.add_to_commentstree_q(comment) if sort == "_qa": scores_by_missing_id36 = _get_qa_comment_scores( link, missing_comments) scores_by_missing = { int(id36, 36): score for id36, score in scores_by_missing_id36.iteritems() } else: scores_by_missing = { comment._id: getattr(comment, sort) for comment in missing_comments } scores_by_id.update(scores_by_missing) timer.intermediate('sort') return scores_by_id