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:
Cody Cutrer 2015-12-16 10:34:59 -07:00
parent e65a238f21
commit 3fcdb21a68
1 changed files with 10 additions and 2 deletions

View File

@ -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)) &&