reformulate expensive quiz submissions query with a constant table
fixes CNVS-25930 test plan: * visit the quizzes page of a course as a teacher * it should not asplode Change-Id: Iea4f65fc2abce992a67a77aeda237051f7ddf0c2 Reviewed-on: https://gerrit.instructure.com/69038 Reviewed-by: Rob Orton <rob@instructure.com> QA-Review: August Thornton <august@instructure.com> Tested-by: Jenkins Product-Review: Cody Cutrer <cody@instructure.com>
This commit is contained in:
parent
e65a238f21
commit
3fcdb21a68
|
@ -1170,8 +1170,16 @@ class Quizzes::Quiz < ActiveRecord::Base
|
|||
return unless quizzes.any?
|
||||
assmnt_ids_with_subs ||= Assignment.assignment_ids_with_submissions(quizzes.map(&:assignment_id).compact)
|
||||
|
||||
quiz_ids_with_subs = Quizzes::QuizSubmission.where(:quiz_id => quizzes.map(&:id)).
|
||||
not_settings_only.where("user_id IS NOT NULL").uniq.pluck(:quiz_id)
|
||||
# yes, this is a complicated query, but it greatly improves the runtime to do it this way
|
||||
filter = Quizzes::QuizSubmission.where("quiz_submissions.quiz_id=s.quiz_id").
|
||||
not_settings_only.where("user_id IS NOT NULL")
|
||||
values = quizzes.map { |q| "(#{q.id})" }.join(", ")
|
||||
constant_table = "( VALUES #{values} ) AS s(quiz_id)"
|
||||
|
||||
quiz_ids_with_subs = Quizzes::QuizSubmission.
|
||||
from(constant_table).
|
||||
where("EXISTS (?)", filter).
|
||||
pluck("s.quiz_id")
|
||||
|
||||
quizzes.each do |quiz|
|
||||
quiz.can_unpublish = !(quiz_ids_with_subs.include?(quiz.id)) &&
|
||||
|
|
Loading…
Reference in New Issue