add more preloads for enrollment state

should improve state_based_on_date performance

refs #CNVS-29460

Change-Id: Iaffdefd5280b3d3c360cd96b99e171b9c2b3f63e
Reviewed-on: https://gerrit.instructure.com/86977
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Product-Review: James Williams  <jamesw@instructure.com>
QA-Review: James Williams  <jamesw@instructure.com>
This commit is contained in:
James Williams 2016-08-05 10:07:05 -06:00
parent 2121cf7430
commit a814712b34
10 changed files with 21 additions and 17 deletions

View File

@ -647,7 +647,7 @@ class ApplicationController < ActionController::Base
# we already know the user can read these courses and groups, so skip
# the grants_right? check to avoid querying for the various memberships
# again.
enrollment_scope = @context.enrollments.current.shard(@context).preload(:course)
enrollment_scope = @context.enrollments.current.shard(@context).preload(:course, :enrollment_state)
group_scope = opts[:include_groups] ? @context.current_groups : nil
if only_contexts.present?
@ -669,7 +669,7 @@ class ApplicationController < ActionController::Base
end
end
end
courses = enrollment_scope.select { |e| e.state_based_on_date == :active }.map(&:course).uniq
courses = enrollment_scope.select(&:active?).map(&:course).uniq
groups = group_scope ? group_scope.shard(@context).to_a.reject{|g| g.context_type == "Course" && g.context.concluded?} : []
if opts[:favorites_first]

View File

@ -175,7 +175,7 @@ class UsersController < ApplicationController
add_crumb(@current_user.short_name, crumb_url)
add_crumb(t('crumbs.grades', 'Grades'), grades_path)
current_active_enrollments = @user.enrollments.current.preload(:course).shard(@user).to_a
current_active_enrollments = @user.enrollments.current.preload(:course, :enrollment_state).shard(@user).to_a
@presenter = GradesPresenter.new(current_active_enrollments)
@ -1009,7 +1009,7 @@ class UsersController < ApplicationController
shard(@user).
where("enrollments.workflow_state<>'deleted' AND courses.workflow_state<>'deleted'").
eager_load(:course).
preload(:associated_user, :course_section, course: { enrollment_term: :enrollment_dates_overrides }).to_a
preload(:associated_user, :course_section, :enrollment_state, course: { enrollment_term: :enrollment_dates_overrides }).to_a
# restrict view for other users
if @user != @current_user

View File

@ -23,7 +23,7 @@ module DashboardHelper
def show_welcome_message?
@current_user.present? &&
@current_user.cached_current_enrollments(:include_enrollment_uuid => session[:enrollment_uuid], :preload_dates => true).select(&:active?).empty?
@current_user.cached_current_enrollments(:include_enrollment_uuid => session[:enrollment_uuid], :preload_dates => true).all?{|e| !e.active?}
end
def welcome_message

View File

@ -103,7 +103,7 @@ module BroadcastPolicies
end
def user_active_or_invited?
course.student_enrollments.where(user_id: submission.user_id).to_a.any?{|e| e.active? || e.invited?}
course.student_enrollments.where(user_id: submission.user_id).preload(:enrollment_state).to_a.any?{|e| e.active? || e.invited?}
end
end
end

View File

@ -1196,7 +1196,7 @@ class Course < ActiveRecord::Base
# Prior users
given do |user|
(available? || completed?) && user &&
prior_enrollments.for_user(user).any?{|e| !e.inactive?}
prior_enrollments.for_user(user).preload(:enrollment_state).any?{|e| !e.inactive?}
end
can :read, :read_outcomes
@ -1217,7 +1217,7 @@ class Course < ActiveRecord::Base
given do |user|
!self.deleted? && user &&
(prior_enrollments.for_user(user).any?{|e| !e.inactive? && e.has_permission_to?(permission) && (!applicable_roles || applicable_roles.include?(e.type))} ||
(prior_enrollments.for_user(user).preload(:enrollment_state).any?{|e| !e.inactive? && e.has_permission_to?(permission) && (!applicable_roles || applicable_roles.include?(e.type))} ||
user.cached_not_ended_enrollments.any? do |e|
e.course_id == self.id && e.completed? && e.has_permission_to?(permission) && (!applicable_roles || applicable_roles.include?(e.type))
end
@ -1240,7 +1240,7 @@ class Course < ActiveRecord::Base
# Student of a concluded course
given do |user|
(self.available? || self.completed?) && user &&
(prior_enrollments.for_user(user).any?{|e| !e.inactive? && (e.student? || e.assigned_observer?) } ||
(prior_enrollments.for_user(user).preload(:enrollment_state).any?{|e| (e.student? || e.assigned_observer?) && !e.inactive?} ||
user.cached_not_ended_enrollments.any? do |e|
e.course_id == self.id && (e.student? || e.assigned_observer?) && e.state_based_on_date == :completed
end
@ -1287,7 +1287,8 @@ class Course < ActiveRecord::Base
is_unpublished = self.created? || self.claimed?
@enrollment_lookup ||= {}
@enrollment_lookup[user.id] ||= shard.activate do
self.enrollments.active_or_pending.for_user(user).reject { |e| (is_unpublished && !(e.admin? || e.fake_student?)) || [:inactive, :completed].include?(e.state_based_on_date)}
self.enrollments.active_or_pending.for_user(user).preload(:enrollment_state).
reject { |e| (is_unpublished && !(e.admin? || e.fake_student?)) || [:inactive, :completed].include?(e.state_based_on_date)}
end
@enrollment_lookup[user.id].any? {|e| (allow_future || e.state_based_on_date == :active) && e.has_permission_to?(permission) }

View File

@ -563,7 +563,7 @@ class Group < ActiveRecord::Base
return false unless user.present? && self.context.present?
return true if self.group_category.try(:communities?)
if self.context.is_a?(Course)
return self.context.enrollments.not_fake.except(:preload).where(:user_id => user.id).any?(&:participating?)
return self.context.enrollments.not_fake.except(:preload).preload(:enrollment_state).where(:user_id => user.id).any?(&:participating?)
elsif self.context.is_a?(Account)
return self.context.root_account.user_account_associations.where(:user_id => user.id).exists?
end

View File

@ -69,7 +69,7 @@ module Lti
def current_course_enrollments
return [] unless @canvas_context.is_a?(Course)
@current_course_enrollments ||= @canvas_user.enrollments.current.where(course_id: @canvas_context).to_a
@current_course_enrollments ||= @canvas_user.enrollments.current.where(course_id: @canvas_context).preload(:enrollment_state).to_a
end
def current_account_enrollments()

View File

@ -163,7 +163,7 @@ class Quizzes::QuizEligibility
end
def inactive_enrollment?
course.enrollments.where(user_id: user.id).all?(&:inactive?)
course.enrollments.where(user_id: user.id).preload(:enrollment_state).all?(&:inactive?)
end
def inactive_student_with_private_course?

View File

@ -613,7 +613,7 @@ class User < ActiveRecord::Base
# Returns an array of groups which are currently visible for the user.
def visible_groups
@visible_groups ||= begin
enrollments = self.cached_current_enrollments(preload_courses: true)
enrollments = self.cached_current_enrollments(preload_dates: true, preload_courses: true)
visible_groups = self.current_groups.select do |group|
group.context_type != 'Course' || enrollments.any? do |en|
en.course == group.context && !(en.inactive? || en.completed?) && (en.admin? || en.course.available?)
@ -1760,7 +1760,8 @@ class User < ActiveRecord::Base
if opts[:preload_dates]
Canvas::Builders::EnrollmentDateBuilder.preload_state(enrollments)
elsif opts[:preload_courses]
end
if opts[:preload_courses]
ActiveRecord::Associations::Preloader.new.preload(enrollments, :course)
end
enrollments
@ -1770,9 +1771,11 @@ class User < ActiveRecord::Base
def cached_not_ended_enrollments
RequestCache.cache("not_ended_enrollments", self) do
self.shard.activate do
Rails.cache.fetch([self, 'not_ended_enrollments2'].cache_key) do
enrollments = Rails.cache.fetch([self, 'not_ended_enrollments2'].cache_key) do
self.not_ended_enrollments.to_a
end
Canvas::Builders::EnrollmentDateBuilder.preload_state(enrollments)
enrollments
end
end
end

View File

@ -143,7 +143,7 @@ module Lti
end
def enrollment_state
enrollments = @user ? @context.enrollments.where(user_id: @user.id) : []
enrollments = @user ? @context.enrollments.where(user_id: @user.id).preload(:enrollment_state) : []
return '' if enrollments.size == 0
enrollments.any? { |membership| membership.state_based_on_date == :active } ? LtiOutbound::LTIUser::ACTIVE_STATE : LtiOutbound::LTIUser::INACTIVE_STATE
end