From 7e23d613df80e0d8984081b1d22142f0a8a5414c Mon Sep 17 00:00:00 2001 From: bivanalhar Date: Fri, 15 Mar 2024 10:49:20 +0800 Subject: [PATCH] refactor(concern): refactor hash function - personal_end_at_hash and reference_time_hash to accept multiple assessment_id - to be reusable for future use --- .../statistics/reference_times_concern.rb | 39 ++++++++++--------- .../course/statistics/submissions_concern.rb | 8 ++-- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/app/controllers/concerns/course/statistics/reference_times_concern.rb b/app/controllers/concerns/course/statistics/reference_times_concern.rb index 70a44de5a1d..20b739388ec 100644 --- a/app/controllers/concerns/course/statistics/reference_times_concern.rb +++ b/app/controllers/concerns/course/statistics/reference_times_concern.rb @@ -2,40 +2,40 @@ module Course::Statistics::ReferenceTimesConcern private - def personal_end_at_hash + def personal_end_at_hash(assessment_id_array, course_id) personal_end_at = Course::PersonalTime.find_by_sql(<<-SQL.squish WITH course_user_personal_end_at AS ( - SELECT course_user_id, end_at + SELECT cpt.course_user_id, cpt.end_at, clpi.actable_id AS assessment_id FROM course_personal_times cpt JOIN ( - SELECT course_lesson_plan_items.id + SELECT course_lesson_plan_items.id, course_lesson_plan_items.actable_id FROM course_lesson_plan_items WHERE course_lesson_plan_items.actable_type = 'Course::Assessment' - AND course_lesson_plan_items.actable_id = #{assessment_params[:id]} + AND course_lesson_plan_items.actable_id IN (#{assessment_id_array.join(', ')}) ) clpi ON cpt.lesson_plan_item_id = clpi.id ), personal_times AS ( - SELECT cu.id AS course_user_id, pt.end_at + SELECT cu.id AS course_user_id, pt.end_at, pt.assessment_id FROM ( SELECT course_users.id FROM course_users - WHERE course_users.course_id = #{@assessment.course.id} + WHERE course_users.course_id = #{course_id} ) cu LEFT JOIN ( - SELECT course_user_id, end_at + SELECT course_user_id, end_at, assessment_id FROM course_user_personal_end_at ) pt ON cu.id = pt.course_user_id ), personal_reference_times AS ( - SELECT cu.id AS course_user_id, crt.end_at + SELECT cu.id AS course_user_id, crt.end_at, clpi.assessment_id FROM ( SELECT course_users.id, course_users.reference_timeline_id FROM course_users - WHERE course_users.course_id = #{@assessment.course.id} AND course_users.role = #{CourseUser.roles[:student]} + WHERE course_users.course_id = #{course_id} AND course_users.role = #{CourseUser.roles[:student]} ) cu LEFT JOIN ( SELECT reference_timeline_id, lesson_plan_item_id, end_at @@ -43,44 +43,47 @@ def personal_end_at_hash ) crt ON crt.reference_timeline_id = cu.reference_timeline_id LEFT JOIN ( - SELECT id + SELECT id, actable_id AS assessment_id FROM course_lesson_plan_items WHERE course_lesson_plan_items.actable_type = 'Course::Assessment' - AND course_lesson_plan_items.actable_id = #{assessment_params[:id]} + AND course_lesson_plan_items.actable_id IN (#{assessment_id_array.join(', ')}) ) clpi ON crt.lesson_plan_item_id = clpi.id ) SELECT + pt.assessment_id, pt.course_user_id, CASE WHEN pt.end_at IS NOT NULL THEN pt.end_at ELSE prt.end_at END AS end_at FROM personal_times pt LEFT JOIN personal_reference_times prt - ON pt.course_user_id = prt.course_user_id + ON + pt.course_user_id = prt.course_user_id + AND pt.assessment_id = prt.assessment_id SQL ) - personal_end_at.map { |pea| [pea.course_user_id, pea.end_at] }.to_h + personal_end_at.map { |pea| [[pea.assessment_id, pea.course_user_id], pea.end_at] }.to_h end - def reference_times_hash + def reference_times_hash(assessment_id_array, course_id) reference_times = Course::ReferenceTime.find_by_sql(<<-SQL.squish - SELECT clpi.actable_id AS lesson_plan_item_id, crt.end_at + SELECT clpi.actable_id AS assessment_id, crt.end_at FROM course_reference_times crt JOIN ( SELECT id FROM course_reference_timelines - WHERE course_id = #{@assessment.course.id} AND "default" = TRUE + WHERE course_id = #{course_id} AND "default" = TRUE ) crtl ON crt.reference_timeline_id = crtl.id JOIN ( SELECT id, actable_id FROM course_lesson_plan_items WHERE course_lesson_plan_items.actable_type = 'Course::Assessment' - AND course_lesson_plan_items.actable_id = #{assessment_params[:id]} + AND course_lesson_plan_items.actable_id IN (#{assessment_id_array.join(', ')}) ) clpi ON crt.lesson_plan_item_id = clpi.id SQL ) - reference_times.map { |rt| [rt.lesson_plan_item_id, rt.end_at] }.to_h + reference_times.map { |rt| [rt.assessment_id, rt.end_at] }.to_h end end diff --git a/app/controllers/concerns/course/statistics/submissions_concern.rb b/app/controllers/concerns/course/statistics/submissions_concern.rb index 5af0963b8ef..e41d29b0b33 100644 --- a/app/controllers/concerns/course/statistics/submissions_concern.rb +++ b/app/controllers/concerns/course/statistics/submissions_concern.rb @@ -91,7 +91,7 @@ def populate_hash_including_answers(student_hash, submissions) next unless submitter_course_user&.student? answers = answers_hash[submission.id] - end_at = @personal_end_at_hash[submitter_course_user.id] || @reference_times_hash[@assessment.id] + end_at = @personal_end_at_hash[[@assessment.id, submitter_course_user.id]] || @reference_times_hash[@assessment.id] student_hash[submitter_course_user] = [submission, answers, end_at] end @@ -104,14 +104,14 @@ def populate_hash_without_answers(student_hash, submissions) submitter_course_user = submission.creator.course_users.select { |u| u.course_id == @assessment.course_id }.first next unless submitter_course_user&.student? - end_at = @personal_end_at_hash[submitter_course_user.id] || @reference_times_hash[@assessment.id] + end_at = @personal_end_at_hash[[@assessment.id, submitter_course_user.id]] || @reference_times_hash[@assessment.id] student_hash[submitter_course_user] = [submission, end_at] end end def fetch_personal_and_reference_timeline_hash - @personal_end_at_hash = personal_end_at_hash - @reference_times_hash = reference_times_hash + @personal_end_at_hash = personal_end_at_hash([@assessment.id], @assessment.course.id) + @reference_times_hash = reference_times_hash([@assessment.id], @assessment.course.id) end end