From bbefdcb5bbe76a5b15880f55a4cd5689ae5c8d81 Mon Sep 17 00:00:00 2001 From: Nelson Jovel Date: Wed, 20 Dec 2023 13:47:09 -0800 Subject: [PATCH] chore: remove student loader since we load race information in data loader --- app/services/student_loader.rb | 107 --------------------------------- 1 file changed, 107 deletions(-) delete mode 100644 app/services/student_loader.rb diff --git a/app/services/student_loader.rb b/app/services/student_loader.rb deleted file mode 100644 index a3f03fff..00000000 --- a/app/services/student_loader.rb +++ /dev/null @@ -1,107 +0,0 @@ -# frozen_string_literal: true - -require 'csv' - -class StudentLoader - def self.load_data(filepath:, rules: []) - File.open(filepath) do |file| - headers = file.first - headers_array = headers.split(',') - - file.lazy.each_slice(1_000) do |lines| - CSV.parse(lines.join, headers:).map do |row| - next if rules.any? do |rule| - rule.new(row: SurveyItemValues.new(row:, headers: headers_array, genders: nil, survey_items: nil, - schools:)).skip_row? - end - - process_row(row:) - end - end - end - end - - def self.from_file(file:, rules: []) - headers = file.gets - headers_array = headers.split(',') - - survey_item_responses = [] - until file.eof? - line = file.gets - next unless line.present? - - CSV.parse(line, headers:).map do |row| - next if rules.any? do |rule| - rule.new(row: SurveyItemValues.new(row:, headers: headers_array, genders: nil, survey_items: nil, - schools:)).skip_row? - end - - process_row(row:) - end - - end - end - - def self.process_row(row:) - races = process_races(codes: race_codes(row:)) - response_id = row['ResponseId'] || row['Responseid'] || row['ResponseID'] || - row['Response ID'] || row['Response id'] || row['Response Id'] - lasid = row['LASID'] || row['lasid'] - - find_or_create_student(response_id:, lasid:, races:) - end - - def self.schools - @schools ||= School.all.map { |school| [school.dese_id, school] }.to_h - end - - def self.race_codes(row:) - race_codes = row['race'] || row['RACE'] || row['Race'] || '99' - race_codes.split(',').map(&:to_i) || [] - end - - def self.assign_student_to_responses(student:, response_id:) - responses = SurveyItemResponse.where(response_id:) - loadable_responses = responses.map do |response| - response.student = student - response - end - - SurveyItemResponse.import(loadable_responses.flatten.compact, batch_size: 1_000, on_duplicate_key_update: :all) - end - - def self.find_or_create_student(response_id:, lasid:, races:) - student = Student.find_or_create_by(response_id:, lasid:) - student.races.delete_all - races.map do |race| - student.races << race - end - assign_student_to_responses(student:, response_id:) - end - - def self.process_races(codes:) - races = codes.map do |code| - code = code.to_i - code = 99 if [6, 7].include?(code) || code.nil? || code.zero? - Race.find_by_qualtrics_code(code) - end.uniq - races = add_unknown_race_if_other_races_missing(races:) - races = remove_unknown_race_if_other_races_present(races:) - add_multiracial_designation(races:) - end - - def self.remove_unknown_race_if_other_races_present(races:) - races.delete(Race.find_by_qualtrics_code(99)) if races.length > 1 - races - end - - def self.add_multiracial_designation(races:) - races << Race.find_by_qualtrics_code(100) if races.length > 1 - races - end - - def self.add_unknown_race_if_other_races_missing(races:) - races << Race.find_by_qualtrics_code(99) if races.length == 0 - races - end -end