PERF: stop counting participants on very large topics

This query gets very expensive and can be bypassed on large topics
This commit is contained in:
Sam 2018-06-20 18:11:39 +10:00
parent 35e0ccfc84
commit cbdab71179

View File

@ -296,17 +296,26 @@ class TopicView
end end
end end
# if a topic has more that N posts no longer attempt to
# get accurate participant count, instead grab cached count
# from topic
MAX_POSTS_COUNT_PARTICIPANTS = 500
def participant_count def participant_count
@participant_count ||= @participant_count ||=
begin begin
if participants.size == MAX_PARTICIPANTS if participants.size == MAX_PARTICIPANTS
sql = <<~SQL if unfiltered_post_ids.length > MAX_POSTS_COUNT_PARTICIPANTS
SELECT COUNT(DISTINCT user_id) @topic.participant_count
FROM posts else
WHERE id IN (:post_ids) sql = <<~SQL
AND user_id IS NOT NULL SELECT COUNT(DISTINCT user_id)
SQL FROM posts
DB.query_single(sql, post_ids: unfiltered_post_ids).first.to_i WHERE id IN (:post_ids)
AND user_id IS NOT NULL
SQL
DB.query_single(sql, post_ids: unfiltered_post_ids).first.to_i
end
else else
participants.size participants.size
end end