mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 10:20:58 -06:00
db10dd5319
This PR improves the performance of the `most_replied_to_users` method on the `UserSummary` model. ### Old Query ```ruby post_query .joins( "JOIN posts replies ON posts.topic_id = replies.topic_id AND posts.reply_to_post_number = replies.post_number", ) # We are removing replies by @user, but we can simplify this by getting the using the user_id on the posts. .where("replies.user_id <> ?", @user.id) .group("replies.user_id") .order("COUNT(*) DESC") .limit(MAX_SUMMARY_RESULTS) .pluck("replies.user_id, COUNT(*)") .each { |r| replied_users[r[0]] = r[1] } ``` ### Old Query with corrections ```ruby post_query .joins( "JOIN posts replies ON posts.topic_id = replies.topic_id AND replies.reply_to_post_number = posts.post_number", ) # Remove replies by @user but instead look on loaded posts (we do this so we don't count self replies) .where("replies.user_id <> posts.user_id") .group("replies.user_id") .order("COUNT(*) DESC") .limit(MAX_SUMMARY_RESULTS) .pluck("replies.user_id, COUNT(*)") .each { |r| replied_users[r[0]] = r[1] } ``` ### New Query ```ruby post_query .joins( "JOIN posts replies ON posts.topic_id = replies.topic_id AND posts.reply_to_post_number = replies.post_number", ) # Only include regular posts in our joins, this makes sure we don't have the bloat of loading private messages .joins( "JOIN topics ON replies.topic_id = topics.id AND topics.archetype <> 'private_message'", ) # Only include visible post types, so exclude posts like whispers, etc .joins( "AND replies.post_type IN (#{Topic.visible_post_types(@user, include_moderator_actions: false).join(",")})", ) .where("replies.user_id <> posts.user_id") .group("replies.user_id") .order("COUNT(*) DESC") .limit(MAX_SUMMARY_RESULTS) .pluck("replies.user_id, COUNT(*)") .each { |r| replied_users[r[0]] = r[1] } ``` # Conclusion `most_replied_to_users` was untested, so I introduced a test for the logic, and have confirmed that it passes on both the new query **AND** the old query. Thank you @danielwaterworth for the debugging assistance. |
||
---|---|---|
.. | ||
fabricators | ||
fixtures | ||
generator | ||
helpers | ||
import_export | ||
initializers | ||
integration | ||
integrity | ||
jobs | ||
lib | ||
mailers | ||
migrations | ||
models | ||
multisite | ||
requests | ||
script/import_scripts | ||
serializers | ||
services | ||
support | ||
system | ||
tasks | ||
views | ||
rails_helper.rb | ||
regenerate_swagger_docs | ||
swagger_helper.rb |