koppen/csv_query

View on GitHub
lib/csv_query/query.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require "csv"
require "optparse"
require "sqlite3"

require "csv_query/database"
require "csv_query/query_builder"

module CsvQuery
  class Query
    attr_reader :csv_data, :options

    DEFAULT_OPTIONS = {
      :delimiter => ","
    }.freeze

    def initialize(csv_data, outputter, options = {})
      @csv_data = csv_data
      @outputter = outputter
      @options = DEFAULT_OPTIONS.merge(options)
    end

    def run
      results = run_query
      output_results_table(results)
    end

    private

    def build_sql_query
      sql_query = options[:sql_query]
      return sql_query unless sql_query.nil?

      QueryBuilder.new(options).call
    end

    def create_database_with_data_from_csv
      database = CsvQuery::Database.new(csv)
      database.import_data_from_csv(csv)
      database
    end

    def csv
      @csv ||= parse_csv_data
    end

    def database
      @database ||= create_database_with_data_from_csv
    end

    def headers
      options[:headers] || :first_row
    end

    def output_results_table(results)
      @outputter.output(results)
    end

    def parse_csv_data
      csv_options = {
        :headers => headers,
        :col_sep => options[:delimiter]
      }

      CSV.parse(csv_data, csv_options)
    end

    def run_query
      database.query(sql_query)
    end

    def sql_query
      @sql_query ||= build_sql_query
    end
  end
end