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