From a5ab25d0baa014a40c11e23b67930f25f1598bb9 Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 7 Oct 2019 21:50:36 -0500 Subject: [PATCH] pagination: avoid counting pages outside searches. Replace this common pattern in controllers: @tags = Tag.search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) with this: @tags = Tag.paginated_search(params) `search_count` is used to skip doing a full page count when we're not doing a search (on the assumption that the number of results will be high when not constrained by a search). We didn't do this consistently though. Refactor to do this in every controller. --- app/controllers/artist_commentaries_controller.rb | 2 +- app/controllers/artist_commentary_versions_controller.rb | 2 +- app/controllers/artist_urls_controller.rb | 2 +- app/controllers/artist_versions_controller.rb | 2 +- app/controllers/bans_controller.rb | 2 +- app/controllers/bulk_update_requests_controller.rb | 2 +- app/controllers/comments_controller.rb | 2 +- app/controllers/dmails_controller.rb | 3 +-- app/controllers/favorite_groups_controller.rb | 2 +- app/controllers/forum_posts_controller.rb | 3 +-- app/controllers/forum_topics_controller.rb | 3 +-- app/controllers/ip_bans_controller.rb | 2 +- app/controllers/janitor_trials_controller.rb | 2 +- app/controllers/mod_actions_controller.rb | 2 +- app/controllers/moderator/post/disapprovals_controller.rb | 2 +- app/controllers/note_versions_controller.rb | 2 +- app/controllers/notes_controller.rb | 2 +- app/controllers/pool_versions_controller.rb | 2 +- app/controllers/pools_controller.rb | 2 +- app/controllers/post_appeals_controller.rb | 3 +-- app/controllers/post_approvals_controller.rb | 2 +- app/controllers/post_flags_controller.rb | 3 +-- app/controllers/post_replacements_controller.rb | 2 +- app/controllers/post_versions_controller.rb | 2 +- app/controllers/saved_searches_controller.rb | 2 +- app/controllers/tag_aliases_controller.rb | 2 +- app/controllers/tag_implications_controller.rb | 2 +- app/controllers/tags_controller.rb | 2 +- app/controllers/uploads_controller.rb | 2 +- app/controllers/user_feedbacks_controller.rb | 3 +-- app/controllers/users_controller.rb | 2 +- app/controllers/wiki_page_versions_controller.rb | 2 +- app/controllers/wiki_pages_controller.rb | 2 +- app/models/application_record.rb | 5 +++++ 34 files changed, 38 insertions(+), 39 deletions(-) diff --git a/app/controllers/artist_commentaries_controller.rb b/app/controllers/artist_commentaries_controller.rb index 27f9db517..bf64af583 100644 --- a/app/controllers/artist_commentaries_controller.rb +++ b/app/controllers/artist_commentaries_controller.rb @@ -3,7 +3,7 @@ class ArtistCommentariesController < ApplicationController before_action :member_only, only: [:create_or_update, :revert] def index - @commentaries = ArtistCommentary.search(search_params).paginate(params[:page], :limit => params[:limit]) + @commentaries = ArtistCommentary.paginated_search(params) respond_with(@commentaries) end diff --git a/app/controllers/artist_commentary_versions_controller.rb b/app/controllers/artist_commentary_versions_controller.rb index 25421b282..f484bbf6a 100644 --- a/app/controllers/artist_commentary_versions_controller.rb +++ b/app/controllers/artist_commentary_versions_controller.rb @@ -2,7 +2,7 @@ class ArtistCommentaryVersionsController < ApplicationController respond_to :html, :xml, :json def index - @commentary_versions = ArtistCommentaryVersion.search(search_params).paginate(params[:page], :limit => params[:limit]) + @commentary_versions = ArtistCommentaryVersion.paginated_search(params) respond_with(@commentary_versions) end end diff --git a/app/controllers/artist_urls_controller.rb b/app/controllers/artist_urls_controller.rb index 2b2ba419e..900d8ff0b 100644 --- a/app/controllers/artist_urls_controller.rb +++ b/app/controllers/artist_urls_controller.rb @@ -3,7 +3,7 @@ class ArtistUrlsController < ApplicationController before_action :member_only, except: [:index] def index - @artist_urls = ArtistUrl.includes(:artist).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @artist_urls = ArtistUrl.includes(:artist).paginated_search(params) respond_with(@artist_urls) do |format| format.json { render json: @artist_urls.to_json(include: "artist",) } format.xml { render xml: @artist_urls.to_xml(include: "artist", root: "artist-urls") } diff --git a/app/controllers/artist_versions_controller.rb b/app/controllers/artist_versions_controller.rb index 2ffe51f20..bd6ae02f5 100644 --- a/app/controllers/artist_versions_controller.rb +++ b/app/controllers/artist_versions_controller.rb @@ -2,7 +2,7 @@ class ArtistVersionsController < ApplicationController respond_to :html, :xml, :json def index - @artist_versions = ArtistVersion.includes(:updater).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @artist_versions = ArtistVersion.includes(:updater).paginated_search(params) respond_with(@artist_versions) end diff --git a/app/controllers/bans_controller.rb b/app/controllers/bans_controller.rb index f24130339..c82eff967 100644 --- a/app/controllers/bans_controller.rb +++ b/app/controllers/bans_controller.rb @@ -12,7 +12,7 @@ class BansController < ApplicationController end def index - @bans = Ban.search(search_params).paginate(params[:page], :limit => params[:limit]) + @bans = Ban.paginated_search(params) respond_with(@bans) do |fmt| fmt.html { @bans = @bans.includes(:user, :banner) } end diff --git a/app/controllers/bulk_update_requests_controller.rb b/app/controllers/bulk_update_requests_controller.rb index 6f3878c7b..9ecbd807c 100644 --- a/app/controllers/bulk_update_requests_controller.rb +++ b/app/controllers/bulk_update_requests_controller.rb @@ -42,7 +42,7 @@ class BulkUpdateRequestsController < ApplicationController end def index - @bulk_update_requests = BulkUpdateRequest.search(search_params).paginate(params[:page], :limit => params[:limit]) + @bulk_update_requests = BulkUpdateRequest.paginated_search(params) respond_with(@bulk_update_requests) end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index a8e828c69..309289870 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -89,7 +89,7 @@ private end def index_by_comment - @comments = Comment.includes(:creator, :updater).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @comments = Comment.includes(:creator, :updater).paginated_search(params) respond_with(@comments) do |format| format.atom do @comments = @comments.includes(:post, :creator).load diff --git a/app/controllers/dmails_controller.rb b/app/controllers/dmails_controller.rb index ca57c9094..b02b103ea 100644 --- a/app/controllers/dmails_controller.rb +++ b/app/controllers/dmails_controller.rb @@ -19,8 +19,7 @@ class DmailsController < ApplicationController if params[:folder] && params[:set_default_folder] cookies.permanent[:dmail_folder] = params[:folder] end - @query = Dmail.active.visible.search(search_params) - @dmails = @query.paginate(params[:page], :limit => params[:limit]) + @dmails = Dmail.active.visible.paginated_search(params) respond_with(@dmails) end diff --git a/app/controllers/favorite_groups_controller.rb b/app/controllers/favorite_groups_controller.rb index c4dcc2c10..c7c5129d1 100644 --- a/app/controllers/favorite_groups_controller.rb +++ b/app/controllers/favorite_groups_controller.rb @@ -3,7 +3,7 @@ class FavoriteGroupsController < ApplicationController respond_to :html, :xml, :json, :js def index - @favorite_groups = FavoriteGroup.search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @favorite_groups = FavoriteGroup.paginated_search(params) respond_with(@favorite_groups) end diff --git a/app/controllers/forum_posts_controller.rb b/app/controllers/forum_posts_controller.rb index e58f12e17..63fd90657 100644 --- a/app/controllers/forum_posts_controller.rb +++ b/app/controllers/forum_posts_controller.rb @@ -24,8 +24,7 @@ class ForumPostsController < ApplicationController end def index - @query = ForumPost.search(search_params) - @forum_posts = @query.includes(:topic).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @forum_posts = ForumPost.paginated_search(params).includes(:topic) respond_with(@forum_posts) end diff --git a/app/controllers/forum_topics_controller.rb b/app/controllers/forum_topics_controller.rb index 746ac9315..076eef5a9 100644 --- a/app/controllers/forum_topics_controller.rb +++ b/app/controllers/forum_topics_controller.rb @@ -23,8 +23,7 @@ class ForumTopicsController < ApplicationController params[:search] ||= {} params[:search][:order] ||= "sticky" if request.format == Mime::Type.lookup("text/html") - @query = ForumTopic.active.search(search_params) - @forum_topics = @query.paginate(params[:page], :limit => per_page, :search_count => params[:search]) + @forum_topics = ForumTopic.active.paginated_search(params) @forum_topics = @forum_topics.includes(:creator, :updater).load if request.format.html? @forum_topics = @forum_topics.includes(:creator, :original_post).load if request.format.atom? diff --git a/app/controllers/ip_bans_controller.rb b/app/controllers/ip_bans_controller.rb index 5c5c2584a..006a8aeec 100644 --- a/app/controllers/ip_bans_controller.rb +++ b/app/controllers/ip_bans_controller.rb @@ -12,7 +12,7 @@ class IpBansController < ApplicationController end def index - @ip_bans = IpBan.includes(:creator).search(search_params).paginate(params[:page], :limit => params[:limit]) + @ip_bans = IpBan.includes(:creator).paginated_search(params) respond_with(@ip_bans) end diff --git a/app/controllers/janitor_trials_controller.rb b/app/controllers/janitor_trials_controller.rb index 0341ff9c9..0cac7913f 100644 --- a/app/controllers/janitor_trials_controller.rb +++ b/app/controllers/janitor_trials_controller.rb @@ -13,7 +13,7 @@ class JanitorTrialsController < ApplicationController end def index - @janitor_trials = JanitorTrial.search(search_params).paginate(params[:page], :limit => params[:limit]) + @janitor_trials = JanitorTrial.paginated_search(params) respond_with(@janitor_trials) end diff --git a/app/controllers/mod_actions_controller.rb b/app/controllers/mod_actions_controller.rb index 07dab53cb..af314605d 100644 --- a/app/controllers/mod_actions_controller.rb +++ b/app/controllers/mod_actions_controller.rb @@ -2,7 +2,7 @@ class ModActionsController < ApplicationController respond_to :html, :xml, :json def index - @mod_actions = ModAction.includes(:creator).search(search_params).paginate(params[:page], limit: params[:limit]) + @mod_actions = ModAction.includes(:creator).paginated_search(params) respond_with(@mod_actions) end diff --git a/app/controllers/moderator/post/disapprovals_controller.rb b/app/controllers/moderator/post/disapprovals_controller.rb index aef11f095..53dc28895 100644 --- a/app/controllers/moderator/post/disapprovals_controller.rb +++ b/app/controllers/moderator/post/disapprovals_controller.rb @@ -12,7 +12,7 @@ module Moderator end def index - @post_disapprovals = PostDisapproval.includes(:user).search(search_params).paginate(params[:page], limit: params[:limit]) + @post_disapprovals = PostDisapproval.includes(:user).paginated_search(params) respond_with(@post_disapprovals) end diff --git a/app/controllers/note_versions_controller.rb b/app/controllers/note_versions_controller.rb index c6c317f21..4b4cc572e 100644 --- a/app/controllers/note_versions_controller.rb +++ b/app/controllers/note_versions_controller.rb @@ -2,7 +2,7 @@ class NoteVersionsController < ApplicationController respond_to :html, :xml, :json def index - @note_versions = NoteVersion.search(search_params).paginate(params[:page], :limit => params[:limit]) + @note_versions = NoteVersion.paginated_search(params) @note_versions = @note_versions.includes(:updater) if request.format.html? respond_with(@note_versions) end diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index d8078846e..ef2ff5a02 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -6,7 +6,7 @@ class NotesController < ApplicationController end def index - @notes = Note.includes(:creator).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @notes = Note.includes(:creator).paginated_search(params) @notes = @notes.includes(:creator) if request.format.html? respond_with(@notes) end diff --git a/app/controllers/pool_versions_controller.rb b/app/controllers/pool_versions_controller.rb index de76835c3..c77cafd31 100644 --- a/app/controllers/pool_versions_controller.rb +++ b/app/controllers/pool_versions_controller.rb @@ -8,7 +8,7 @@ class PoolVersionsController < ApplicationController @pool = Pool.find(params[:search][:pool_id]) end - @pool_versions = PoolArchive.search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @pool_versions = PoolArchive.paginated_search(params) respond_with(@pool_versions) end diff --git a/app/controllers/pools_controller.rb b/app/controllers/pools_controller.rb index 952a67c5d..d0cdc3e38 100644 --- a/app/controllers/pools_controller.rb +++ b/app/controllers/pools_controller.rb @@ -17,7 +17,7 @@ class PoolsController < ApplicationController end def index - @pools = Pool.includes(:creator).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @pools = Pool.includes(:creator).paginated_search(search_params) respond_with(@pools) end diff --git a/app/controllers/post_appeals_controller.rb b/app/controllers/post_appeals_controller.rb index 3fa6d68e9..9116899e5 100644 --- a/app/controllers/post_appeals_controller.rb +++ b/app/controllers/post_appeals_controller.rb @@ -8,8 +8,7 @@ class PostAppealsController < ApplicationController end def index - @post_appeals = PostAppeal.includes(:creator).search(search_params).includes(post: [:appeals, :uploader, :approver]) - @post_appeals = @post_appeals.paginate(params[:page], limit: params[:limit]) + @post_appeals = PostAppeal.includes(:creator).paginated_search(params).includes(post: [:appeals, :uploader, :approver]) respond_with(@post_appeals) end diff --git a/app/controllers/post_approvals_controller.rb b/app/controllers/post_approvals_controller.rb index ed2262e24..51e453a03 100644 --- a/app/controllers/post_approvals_controller.rb +++ b/app/controllers/post_approvals_controller.rb @@ -2,7 +2,7 @@ class PostApprovalsController < ApplicationController respond_to :html, :xml, :json def index - @post_approvals = PostApproval.includes(:post, :user).search(search_params).paginate(params[:page], limit: params[:limit]) + @post_approvals = PostApproval.includes(:post, :user).paginated_search(params) respond_with(@post_approvals) end end diff --git a/app/controllers/post_flags_controller.rb b/app/controllers/post_flags_controller.rb index 03a390a68..456e4e304 100644 --- a/app/controllers/post_flags_controller.rb +++ b/app/controllers/post_flags_controller.rb @@ -8,8 +8,7 @@ class PostFlagsController < ApplicationController end def index - @post_flags = PostFlag.search(search_params).includes(:creator, post: [:flags, :uploader, :approver]) - @post_flags = @post_flags.paginate(params[:page], limit: params[:limit]) + @post_flags = PostFlag.paginated_search(params).includes(:creator, post: [:flags, :uploader, :approver]) respond_with(@post_flags) end diff --git a/app/controllers/post_replacements_controller.rb b/app/controllers/post_replacements_controller.rb index 8327b2a5e..2fe64f9b0 100644 --- a/app/controllers/post_replacements_controller.rb +++ b/app/controllers/post_replacements_controller.rb @@ -24,7 +24,7 @@ class PostReplacementsController < ApplicationController def index params[:search][:post_id] = params.delete(:post_id) if params.has_key?(:post_id) - @post_replacements = PostReplacement.search(search_params).paginate(params[:page], limit: params[:limit]) + @post_replacements = PostReplacement.paginated_search(params) respond_with(@post_replacements) end diff --git a/app/controllers/post_versions_controller.rb b/app/controllers/post_versions_controller.rb index 14d6fa8b4..0d0f8ef1c 100644 --- a/app/controllers/post_versions_controller.rb +++ b/app/controllers/post_versions_controller.rb @@ -6,7 +6,7 @@ class PostVersionsController < ApplicationController respond_to :js, only: [:undo] def index - @post_versions = PostArchive.includes(:updater, post: [:versions]).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @post_versions = PostArchive.includes(:updater, post: [:versions]).paginated_search(params) respond_with(@post_versions) end diff --git a/app/controllers/saved_searches_controller.rb b/app/controllers/saved_searches_controller.rb index 32337ec91..c2eefb3fa 100644 --- a/app/controllers/saved_searches_controller.rb +++ b/app/controllers/saved_searches_controller.rb @@ -2,7 +2,7 @@ class SavedSearchesController < ApplicationController respond_to :html, :xml, :json, :js def index - @saved_searches = saved_searches.search(search_params).paginate(params[:page], limit: params[:limit]) + @saved_searches = saved_searches.paginated_search(params) respond_with(@saved_searches) end diff --git a/app/controllers/tag_aliases_controller.rb b/app/controllers/tag_aliases_controller.rb index 1d7c11916..6f6520cd2 100644 --- a/app/controllers/tag_aliases_controller.rb +++ b/app/controllers/tag_aliases_controller.rb @@ -22,7 +22,7 @@ class TagAliasesController < ApplicationController end def index - @tag_aliases = TagAlias.includes(:antecedent_tag, :consequent_tag, :approver).search(search_params).paginate(params[:page], :limit => params[:limit]) + @tag_aliases = TagAlias.includes(:antecedent_tag, :consequent_tag, :approver).paginated_search(params) respond_with(@tag_aliases) end diff --git a/app/controllers/tag_implications_controller.rb b/app/controllers/tag_implications_controller.rb index 5d2e52475..fdd419de3 100644 --- a/app/controllers/tag_implications_controller.rb +++ b/app/controllers/tag_implications_controller.rb @@ -22,7 +22,7 @@ class TagImplicationsController < ApplicationController end def index - @tag_implications = TagImplication.includes(:antecedent_tag, :consequent_tag, :approver).search(search_params).paginate(params[:page], :limit => params[:limit]) + @tag_implications = TagImplication.includes(:antecedent_tag, :consequent_tag, :approver).paginated_search(params) respond_with(@tag_implications) end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index d183c687e..c4243db00 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -9,7 +9,7 @@ class TagsController < ApplicationController end def index - @tags = Tag.search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @tags = Tag.paginated_search(params) respond_with(@tags) end diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index 87c590973..c62bf5842 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -24,7 +24,7 @@ class UploadsController < ApplicationController end def index - @uploads = Upload.search(search_params).includes(:post, :uploader).paginate(params[:page], :limit => params[:limit]) + @uploads = Upload.paginated_search(params).includes(:post, :uploader) respond_with(@uploads) end diff --git a/app/controllers/user_feedbacks_controller.rb b/app/controllers/user_feedbacks_controller.rb index 1df6cbd17..7ce175c18 100644 --- a/app/controllers/user_feedbacks_controller.rb +++ b/app/controllers/user_feedbacks_controller.rb @@ -20,8 +20,7 @@ class UserFeedbacksController < ApplicationController end def index - @search = UserFeedback.visible.search(search_params) - @user_feedbacks = @search.paginate(params[:page], :limit => params[:limit]) + @user_feedbacks = UserFeedback.visible.paginated_search(params) respond_with(@user_feedbacks) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9fb1ab28f..864d1a520 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -29,7 +29,7 @@ class UsersController < ApplicationController @user = User.find_by_name!(params[:name]) redirect_to user_path(@user) else - @users = User.search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @users = User.paginated_search(params) respond_with(@users) end end diff --git a/app/controllers/wiki_page_versions_controller.rb b/app/controllers/wiki_page_versions_controller.rb index bfdfced06..112960d2d 100644 --- a/app/controllers/wiki_page_versions_controller.rb +++ b/app/controllers/wiki_page_versions_controller.rb @@ -3,7 +3,7 @@ class WikiPageVersionsController < ApplicationController layout "sidebar" def index - @wiki_page_versions = WikiPageVersion.search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @wiki_page_versions = WikiPageVersion.paginated_search(params) respond_with(@wiki_page_versions) end diff --git a/app/controllers/wiki_pages_controller.rb b/app/controllers/wiki_pages_controller.rb index 999fcf253..a8539e69c 100644 --- a/app/controllers/wiki_pages_controller.rb +++ b/app/controllers/wiki_pages_controller.rb @@ -16,7 +16,7 @@ class WikiPagesController < ApplicationController end def index - @wiki_pages = WikiPage.includes(:creator).search(search_params).paginate(params[:page], :limit => params[:limit], :search_count => params[:search]) + @wiki_pages = WikiPage.includes(:creator).paginated_search(params) respond_with(@wiki_pages) do |format| format.html do if params[:page].nil? || params[:page].to_i == 1 diff --git a/app/models/application_record.rb b/app/models/application_record.rb index bd65832ff..69354061b 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -6,6 +6,11 @@ class ApplicationRecord < ActiveRecord::Base def paginate(*options) extending(PaginationExtension).paginate(*options) end + + def paginated_search(params) + search_params = params.fetch(:search, {}).permit! + search(search_params).paginate(params[:page], limit: params[:limit], search_count: params[:search]) + end end end