@ -1,10 +1,12 @@
# frozen_string_literal: true
require 'csv'
require 'csv'
class SurveyResponsesDataLoader
class SurveyResponsesDataLoader
def self . load_data ( filepath : )
def self . load_data ( filepath : )
File . open ( filepath ) do | file |
File . open ( filepath ) do | file |
headers = file . first
headers = file . first
survey_items = SurveyItem . where ( survey_item_id : get_survey_item_ids_from_headers ( file: , headers: ) )
survey_items = SurveyItem . where ( survey_item_id : get_survey_item_ids_from_headers ( headers: ) )
file . lazy . each_slice ( 1000 ) do | lines |
file . lazy . each_slice ( 1000 ) do | lines |
survey_item_responses = CSV . parse ( lines . join , headers : ) . map do | row |
survey_item_responses = CSV . parse ( lines . join , headers : ) . map do | row |
@ -19,43 +21,42 @@ class SurveyResponsesDataLoader
private
private
def self . process_row ( row : , survey_items : )
def self . process_row ( row : , survey_items : )
return unless dese_id? ( row [ 'DESE ID' ] )
id = dese_id ( row )
return unless dese_id? ( id )
school = School . find_by_dese_id ( row [ 'DESE ID' ] )
school = School . find_by_dese_id ( id )
return unless school . present?
return unless school . present?
process_survey_items ( row : , survey_items : , school : )
process_survey_items ( row : , survey_items : , school : )
end
end
def self . process_survey_items ( row : , survey_items : , school : )
def self . process_survey_items ( row : , survey_items : , school : )
response_id = row [ 'Response ID' ] || row [ 'ResponseId' ] || row [ 'ResponseID' ]
id = response_id ( row )
survey_items . map do | survey_item |
survey_items . map do | survey_item |
likert_score = row [ survey_item . survey_item_id ]
likert_score = row [ survey_item . survey_item_id ] || next
next if likert_score . nil?
unless likert_score . valid_likert_score?
unless likert_score . valid_likert_score?
puts " Response ID: #{ response_ id} , Likert score: #{ likert_score } rejected " unless likert_score == 'NA'
puts " Response ID: #{ id} , Likert score: #{ likert_score } rejected " unless likert_score == 'NA'
next
next
end
end
response = survey_item_response ( response_id : id , survey_item : )
survey_item_response = SurveyItemResponse . where ( response_id : , survey_item : ) . first
create_or_update_response ( survey_item_response : response , likert_score : , school : , row : , survey_item : )
create_or_update_survey_item_response ( survey_item_response : , likert_score : , school : , response_id : , row : ,
survey_item : )
end . compact
end . compact
end
end
def self . create_or_update_ survey_item_ response( survey_item_response : , likert_score : , school : , row : , survey_item : , response_id : )
def self . create_or_update_ response( survey_item_response : , likert_score : , school : , row : , survey_item : )
if survey_item_response . present?
if survey_item_response . present?
survey_item_response . update! ( likert_score : ) if survey_item_response . likert_score != likert_score
survey_item_response . update! ( likert_score : ) if survey_item_response . likert_score != likert_score
[ ]
[ ]
else
else
SurveyItemResponse . new ( response_id : , academic_year : academic_year ( row ) , school : , survey_item : , likert_score : )
SurveyItemResponse . new ( response_id : response_id ( row ) , academic_year : academic_year ( row ) , school : , survey_item : ,
likert_score : )
end
end
end
end
def self . get_survey_item_ids_from_headers ( file: , headers: )
def self . get_survey_item_ids_from_headers ( headers: )
CSV . parse ( headers , headers : true ) . headers
CSV . parse ( headers , headers : true ) . headers
. filter { | header | header . present? }
. filter ( & :present? )
. filter { | header | header . start_with? 't-' or header . start_with? 's-' }
. filter { | header | header . start_with? 't-' or header . start_with? 's-' }
end
end
@ -71,10 +72,28 @@ class SurveyResponsesDataLoader
AcademicYear . find_by_date response_date ( row )
AcademicYear . find_by_date response_date ( row )
end
end
def self . survey_item_response ( response_id : , survey_item : )
SurveyItemResponse . find_by ( response_id : , survey_item : )
end
def self . response_id ( row )
row [ 'Response ID' ] || row [ 'ResponseId' ] || row [ 'ResponseID' ]
end
def self . dese_id ( row )
row [ 'DESE ID' || 'Dese ID' ] || row [ 'DeseId' ] || row [ 'DeseID' ]
end
private_class_method :process_row
private_class_method :process_row
private_class_method :process_survey_items
private_class_method :process_survey_items
private_class_method :get_survey_item_ids_from_headers
private_class_method :get_survey_item_ids_from_headers
private_class_method :dese_id?
private_class_method :dese_id?
private_class_method :create_or_update_response
private_class_method :response_date
private_class_method :academic_year
private_class_method :survey_item_response
private_class_method :response_id
private_class_method :dese_id
end
end
module StringMonkeyPatches
module StringMonkeyPatches