Skip to content

Commit

Permalink
refactor(concern): refactor hash function
Browse files Browse the repository at this point in the history
- personal_end_at_hash and reference_time_hash to accept multiple assessment_id
- to be reusable for future use
  • Loading branch information
bivanalhar committed Mar 15, 2024
1 parent d304444 commit 7e23d61
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,85 +2,88 @@
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
FROM course_reference_times
) 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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

0 comments on commit 7e23d61

Please sign in to comment.