Commit d9b2a3a8 authored by Yorick Peterse's avatar Yorick Peterse Committed by Regis

Merge branch '27395-reduce-group-activity-sql-queries' into 'master'

Resolve "GroupsController#activity.json is REALLY slow due to SQL"

Closes #27395

See merge request !9088
parent e1a238c3
class Dashboard::ProjectsController < Dashboard::ApplicationController class Dashboard::ProjectsController < Dashboard::ApplicationController
include FilterProjects include FilterProjects
before_action :event_filter
def index def index
@projects = current_user.authorized_projects.sorted_by_activity @projects = load_projects(current_user.authorized_projects)
@projects = filter_projects(@projects)
@projects = @projects.includes(:namespace)
@projects = @projects.sort(@sort = params[:sort]) @projects = @projects.sort(@sort = params[:sort])
@projects = @projects.page(params[:page]) @projects = @projects.page(params[:page])
respond_to do |format| respond_to do |format|
format.html { @last_push = current_user.recent_push } format.html { @last_push = current_user.recent_push }
format.atom do format.atom do
event_filter
load_events load_events
render layout: false render layout: false
end end
...@@ -26,9 +21,8 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController ...@@ -26,9 +21,8 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
end end
def starred def starred
@projects = current_user.viewable_starred_projects.sorted_by_activity @projects = load_projects(current_user.viewable_starred_projects)
@projects = filter_projects(@projects) @projects = @projects.includes(:forked_from_project, :tags)
@projects = @projects.includes(:namespace, :forked_from_project, :tags)
@projects = @projects.sort(@sort = params[:sort]) @projects = @projects.sort(@sort = params[:sort])
@projects = @projects.page(params[:page]) @projects = @projects.page(params[:page])
...@@ -37,7 +31,6 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController ...@@ -37,7 +31,6 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
respond_to do |format| respond_to do |format|
format.html format.html
format.json do format.json do
render json: { render json: {
html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects })
...@@ -48,9 +41,15 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController ...@@ -48,9 +41,15 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController
private private
def load_projects(base_scope)
projects = base_scope.sorted_by_activity.includes(:namespace)
filter_projects(projects)
end
def load_events def load_events
@events = Event.in_projects(@projects) @events = Event.in_projects(load_projects(current_user.authorized_projects))
@events = @event_filter.apply_filter(@events).with_associations @events = event_filter.apply_filter(@events).with_associations
@events = @events.limit(20).offset(params[:offset] || 0) @events = @events.limit(20).offset(params[:offset] || 0)
end end
end end
...@@ -36,10 +36,10 @@ class Event < ActiveRecord::Base ...@@ -36,10 +36,10 @@ class Event < ActiveRecord::Base
scope :code_push, -> { where(action: PUSHED) } scope :code_push, -> { where(action: PUSHED) }
scope :in_projects, ->(projects) do scope :in_projects, ->(projects) do
where(project_id: projects.map(&:id)).recent where(project_id: projects).recent
end end
scope :with_associations, -> { includes(project: :namespace) } scope :with_associations, -> { includes(:author, :project, project: :namespace).preload(:target) }
scope :for_milestone_id, ->(milestone_id) { where(target_type: "Milestone", target_id: milestone_id) } scope :for_milestone_id, ->(milestone_id) { where(target_type: "Milestone", target_id: milestone_id) }
class << self class << self
......
---
title: Include :author, :project, and :target in Event.with_associations
merge_request:
author:
---
title: Don't instantiate AR objects in Event.in_projects
merge_request:
author:
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment