summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2017-08-22 14:12:08 +0200
committerYorick Peterse <yorickpeterse@gmail.com>2017-08-22 16:02:40 +0200
commit6956b90594d45d3d7e87d69df7f4cd79237c323d (patch)
tree008221ae775d31fd633bc9140474f0aaafc91743
parente6f20e52f6f77f77942c047dca91d3e325cce8b2 (diff)
downloadgitlab-ce-issuables-pagination-without-count.tar.gz
Use pagination without COUNT for issues/MRsissuables-pagination-without-count
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.
-rw-r--r--app/controllers/projects/issues_controller.rb6
-rw-r--r--app/controllers/projects/merge_requests_controller.rb6
-rw-r--r--app/views/projects/issues/_issues.html.haml2
-rw-r--r--app/views/projects/merge_requests/_merge_requests.html.haml2
-rw-r--r--changelogs/unreleased/issuables-pagination-without-count.yml5
5 files changed, 9 insertions, 12 deletions
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