From c3e3afcb2ca1fe256f84b2d22e5c4aa290235168 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 4 May 2015 16:11:04 +1000 Subject: [PATCH] PERF: eliminate N+1 query due to polls --- lib/topic_view.rb | 9 ++++++++- plugins/poll/plugin.rb | 9 +++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/topic_view.rb b/lib/topic_view.rb index 041e837b900..2fe19b75610 100644 --- a/lib/topic_view.rb +++ b/lib/topic_view.rb @@ -433,7 +433,14 @@ class TopicView end def closest_post_to(post_number) - closest_post = @filtered_posts.order("@(post_number - #{post_number})").limit(1).pluck(:id) + # happy path + closest_post = @filtered_posts.where("post_number = ?", post_number).limit(1).pluck(:id) + + if closest_post.empty? + # less happy path, missing post + closest_post = @filtered_posts.order("@(post_number - #{post_number})").limit(1).pluck(:id) + end + return nil if closest_post.empty? filtered_post_ids.index(closest_post.first) || filtered_post_ids[0] diff --git a/plugins/poll/plugin.rb b/plugins/poll/plugin.rb index 853e39cde3d..76f814beffe 100644 --- a/plugins/poll/plugin.rb +++ b/plugins/poll/plugin.rb @@ -14,6 +14,15 @@ VOTES_CUSTOM_FIELD ||= "polls-votes".freeze after_initialize do + # PERF, avoids N+1 in serializer + TopicView.add_post_custom_fields_whitelister do |user| + POLLS_CUSTOM_FIELD + end + + TopicView.add_post_custom_fields_whitelister do |user| + VOTES_CUSTOM_FIELD + end + # remove "Vote Now!" & "Show Results" links in emails Email::Styles.register_plugin_style do |fragment| fragment.css(".poll a.cast-votes, .poll a.toggle-results").each(&:remove)