From 6956b90594d45d3d7e87d69df7f4cd79237c323d Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Tue, 22 Aug 2017 14:12:08 +0200 Subject: Use pagination without COUNT for issues/MRs This changes the pagination of issues and merge request index pages so they don't use page numbers, instead only displaying a "Next" and "Previous" button. This removes the need for a COUNT(*) query which on GitLab.com can easily take up to 30 milliseconds. A downside of this approach is that if you specify an offset that no longer leads to data (e.g. because issues were closed) you won't be redirected to the last valid page. This can't be done since this functionality relies on us knowing the total number of pages, which in turn requires a COUNT(*) query. --- app/controllers/projects/issues_controller.rb | 6 +----- app/controllers/projects/merge_requests_controller.rb | 6 +----- app/views/projects/issues/_issues.html.haml | 2 +- app/views/projects/merge_requests/_merge_requests.html.haml | 2 +- changelogs/unreleased/issuables-pagination-without-count.yml | 5 +++++ 5 files changed, 9 insertions(+), 12 deletions(-) create mode 100644 changelogs/unreleased/issuables-pagination-without-count.yml diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 8893a514207..31a82af9f2a 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -25,13 +25,9 @@ class Projects::IssuesController < Projects::ApplicationController def index @collection_type = "Issue" @issues = issues_collection - @issues = @issues.page(params[:page]) + @issues = @issues.page(params[:page]).without_count @issuable_meta_data = issuable_meta_data(@issues, @collection_type) - if @issues.out_of_range? && @issues.total_pages != 0 - return redirect_to url_for(params.merge(page: @issues.total_pages, only_path: true)) - end - if params[:label_name].present? @labels = LabelsFinder.new(current_user, project_id: @project.id, title: params[:label_name]).execute end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 2a3b73577a5..a80fbb624f7 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -15,14 +15,10 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo def index @collection_type = "MergeRequest" @merge_requests = merge_requests_collection - @merge_requests = @merge_requests.page(params[:page]) + @merge_requests = @merge_requests.page(params[:page]).without_count @merge_requests = @merge_requests.preload(merge_request_diff: :merge_request) @issuable_meta_data = issuable_meta_data(@merge_requests, @collection_type) - if @merge_requests.out_of_range? && @merge_requests.total_pages != 0 - return redirect_to url_for(params.merge(page: @merge_requests.total_pages, only_path: true)) - end - if params[:label_name].present? labels_params = { project_id: @project.id, title: params[:label_name] } @labels = LabelsFinder.new(current_user, labels_params).execute diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 34d5a3e1831..0293bd8dd92 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -4,4 +4,4 @@ = render 'shared/empty_states/issues' - if @issues.present? - = paginate @issues, theme: "gitlab" + = paginate_collection(@issues) diff --git a/app/views/projects/merge_requests/_merge_requests.html.haml b/app/views/projects/merge_requests/_merge_requests.html.haml index 4e97f74dd6a..7aa9ab371db 100644 --- a/app/views/projects/merge_requests/_merge_requests.html.haml +++ b/app/views/projects/merge_requests/_merge_requests.html.haml @@ -5,4 +5,4 @@ = render 'shared/empty_states/merge_requests' - if @merge_requests.present? - = paginate @merge_requests, theme: "gitlab" + = paginate_collection(@merge_requests) diff --git a/changelogs/unreleased/issuables-pagination-without-count.yml b/changelogs/unreleased/issuables-pagination-without-count.yml new file mode 100644 index 00000000000..1ae56827504 --- /dev/null +++ b/changelogs/unreleased/issuables-pagination-without-count.yml @@ -0,0 +1,5 @@ +--- +title: Use pagination without COUNT for issues/MRs +merge_request: +author: +type: other -- cgit v1.2.1