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: # some scores were missing from CommentScoresByLink--lookup the # comments and calculate the scores. g.stats.simple_event("comment_tree_bad_sorter") missing_comments = Comment._byID(scores_needed, data=True, return_dict=False) 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_id36 = {comment._id36: getattr(comment, sort) for comment in missing_comments} scores_by_missing = {int(id36, 36): score for id36, score in scores_by_missing_id36.iteritems()} # up to once per minute write the scores to limit writes but # eventually return us to the correct state. if not g.disallow_db_writes: write_key = "lock:score_{link}{sort}".format(link=link._id36, sort=sort) should_write = g.lock_cache.add(write_key, "", time=60) if should_write: CommentScoresByLink.set_scores(link, sort, scores_by_missing_id36) 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
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: # some scores were missing from CommentScoresByLink--lookup the # comments and calculate the scores. g.stats.simple_event('comment_tree_bad_sorter') missing_comments = Comment._byID(scores_needed, data=True, return_dict=False) 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_id36 = { comment._id36: getattr(comment, sort) for comment in missing_comments } scores_by_missing = { int(id36, 36): score for id36, score in scores_by_missing_id36.iteritems() } # up to once per minute write the scores to limit writes but # eventually return us to the correct state. if not g.disallow_db_writes: write_key = "lock:score_{link}{sort}".format( link=link._id36, sort=sort, ) should_write = g.lock_cache.add(write_key, "", time=60) if should_write: CommentScoresByLink.set_scores(link, sort, scores_by_missing_id36) 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