module Roqua::CsvExport

Constants

DB
VERSION

Public Class Methods

generate(**attrs) click to toggle source

Generate te export files. When done, output_path will contain a directory for each export_version. Each directory will contain csv file for each questionnare. @see Config#initialize Config for list of attributes

# File lib/roqua/csv_export.rb, line 24
def self.generate(**attrs)
  require 'csv'
  require 'json'
  config = Config.new(**attrs)
  load_db(DB, config.sqlite_path)
  create_indexes

  FileUtils.mkdir_p config.output_path
  do_export config.export_versions, config
end

Private Class Methods

create_indexes() click to toggle source
# File lib/roqua/csv_export.rb, line 49
def self.create_indexes
  Sequel.extension :migration
  Sequel.migration do
    change do
      alter_table(:responses) do
        add_index :questionnaire_key
      end
    end
  end
end
do_export(export_versions, config) click to toggle source
# File lib/roqua/csv_export.rb, line 64
def self.do_export(export_versions, config)
  questionnaire_keys.each do |questionnaire_key|
    responses = CsvExport::Models::Response \
                  .eager(:dossier, :team, :entered_by, :respondent, :response_values, :response_flags, :response_textvars, :team, measurement: :protocol)
                  .where(questionnaire_key: questionnaire_key)
                  .order(:id)

    CsvExportQuestionnaireVersion.with_versions_for(questionnaire_key,
                                                    config) do |versions|
      responses.paged_each do |response|
        versions.each do |version|
          version.write_response(response)
        end
      end
    end
  end
end
load_db(db, path) click to toggle source
# File lib/roqua/csv_export.rb, line 37
def self.load_db(db, path)
  source = SQLite3::Database.new(path.to_s)

  db.synchronize do |memory_db|
    backup = SQLite3::Backup.new(memory_db, 'main', source, 'main')
    backup.step(-1)
    backup.finish
  end
ensure
  source.close
end
questionnaire_keys() click to toggle source
# File lib/roqua/csv_export.rb, line 60
def self.questionnaire_keys
  Models::Response.distinct.select_map(:questionnaire_key)
end