class Csv2Psql::Analyzer

Analyzer file analyzer class

Constants

ANALYZERS_DIR
DEFAULT_OPTIONS
EXCLUDED_ANALYZERS

Attributes

analyzers[R]
files[R]

Public Class Methods

new(cache = nil) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 18
def initialize(cache = nil)
  @files = {}
  @cache = cache
  @analyzers = load_analyzers
end

Public Instance Methods

analyze(path, row, opts = {}) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 24
def analyze(path, row, opts = {})
  data = get_data(path)

  header = CsvHelper.get_header(row, opts)
  analyze_row(header, row, data)

  data[:lines] = data[:lines] + 1
end
analyze_column(analyzer, val, opts = { use_cache: false }) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 33
def analyze_column(analyzer, val, opts = { use_cache: false })
  if opts[:use_cache]
    res = cached_result(val) do
      analyzer[:class].analyze(val)
    end
  else
    res = analyzer[:class].analyze(val)
  end

  update_results(analyzer, res, val) if res
end
analyze_row(header, row, data) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 45
def analyze_row(header, row, data)
  header.each do |h|
    col = get_column(data, h)
    col.each do |_name, analyzer|
      analyze_column(analyzer, row[h])
    end
  end
end
cached_result(val, &_block) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 54
def cached_result(val, &_block)
  res = @cache.get(val)
  if res.nil?
    res = Proc.new.call(val)
    @cache.put(val, res)
  end
  res
end
create_column(data, column) click to toggle source

Create column analyzers

# File lib/csv2psql/analyzer/analyzer.rb, line 64
def create_column(data, column)
  data[:columns][column] = {}
  res = data[:columns][column]

  analyzers.each do |analyzer|
    analyzer_class = analyzer[:class]
    res[analyzer[:name]] = {
      class: analyzer_class.new,
      results: create_results(analyzer_class)
    }
  end

  res
end
create_data(path) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 79
def create_data(path)
  files[path] = {
    columns: {
    },
    lines: 0
  }
  files[path]
end
create_results(analyzer_class) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 88
def create_results(analyzer_class)
  res = {
    count: 0
  }

  res[:min] = nil if analyzer_class.numeric?
  res[:max] = nil if analyzer_class.numeric?

  res
end
get_column(data, column) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 105
def get_column(data, column)
  res = data[:columns][column]
  return res if res

  create_column(data, column)
end
get_data(path) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 99
def get_data(path)
  return files[path] if files.key?(path)

  create_data(path)
end
load_analyzer(path) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 118
def load_analyzer(path)
  fname = File.basename(path, '.rb')
  analyzer_class = fname.camel_case
  require(path)

  {
    name: analyzer_class,
    class: load_analyzer_class(analyzer_class)
  }
end
load_analyzer_class(analyzer_class) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 112
def load_analyzer_class(analyzer_class)
  Object.const_get('Csv2Psql')
  .const_get('Analyzers')
  .const_get(analyzer_class)
end
load_analyzers() click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 129
def load_analyzers
  res = Dir[ANALYZERS_DIR + '**/*.rb'].map do |path|
    name = File.basename(path, '.rb')
    next if EXCLUDED_ANALYZERS.include?(name)
    load_analyzer(path)
  end

  res.compact
end
update_numeric_results(ac, ar, val) click to toggle source

Update numeric results @param ac analyzer class @param ar analyzer results @param val value to be analyzed

# File lib/csv2psql/analyzer/analyzer.rb, line 143
def update_numeric_results(ac, ar, val)
  cval = ac.convert(val)
  ar[:min] = cval if ar[:min].nil? || cval < ar[:min]
  ar[:max] = cval if ar[:max].nil? || cval > ar[:max]
end
update_results(analyzer, res, val) click to toggle source
# File lib/csv2psql/analyzer/analyzer.rb, line 149
def update_results(analyzer, res, val)
  ac = analyzer[:class]
  ar = analyzer[:results]
  ar[:count] += 1

  update_numeric_results(ac, ar, val) if res && ac.numeric?
end