perf: memoize function when calculating response rates

pull/1/head
rebuilt 3 years ago
parent 452876ef09
commit d306319de1

@ -28,16 +28,19 @@ class StudentResponseRateCalculator < ResponseRateCalculator
end end
def survey_items_with_sufficient_responses(grade:) def survey_items_with_sufficient_responses(grade:)
@survey_items_with_sufficient_responses ||= Hash.new do |memo, grade|
threshold = 10 threshold = 10
quarter_of_grade = enrollment_by_grade[grade] / 4 quarter_of_grade = enrollment_by_grade[grade] / 4
threshold = threshold > quarter_of_grade ? quarter_of_grade : threshold threshold = threshold > quarter_of_grade ? quarter_of_grade : threshold
SurveyItem.joins('inner join survey_item_responses on survey_item_responses.survey_item_id = survey_items.id') memo[grade] = SurveyItem.joins('inner join survey_item_responses on survey_item_responses.survey_item_id = survey_items.id')
.student_survey_items .student_survey_items
.where("survey_item_responses.school": school, "survey_item_responses.academic_year": academic_year, "survey_item_responses.grade": grade, "survey_item_responses.survey_item_id": subcategory.survey_items.student_survey_items) .where("survey_item_responses.school": school, "survey_item_responses.academic_year": academic_year, "survey_item_responses.grade": grade, "survey_item_responses.survey_item_id": subcategory.survey_items.student_survey_items)
.group('survey_items.id') .group('survey_items.id')
.having("count(*) >= #{threshold}") .having("count(*) >= #{threshold}")
.count .count
end end
@survey_items_with_sufficient_responses[grade]
end
def survey_item_count(grade:) def survey_item_count(grade:)
survey_items_with_sufficient_responses(grade:).count survey_items_with_sufficient_responses(grade:).count

Loading…
Cancel
Save