class CsvOrm::Query
Attributes
data[R]
Public Class Methods
new(data)
click to toggle source
# File lib/csv_orm/query.rb, line 5 def initialize(data) @data = data nil # suppress output end
Public Instance Methods
aggregate(*fields)
click to toggle source
# File lib/csv_orm/query.rb, line 18 def aggregate(*fields) agg = {} @data.each do |row| fields.each do |field| agg[field] ||= {} agg[field][row.send(field)] ||= 0 agg[field][row.send(field)] += 1 end end agg end
build_expression(conditional, attrs)
click to toggle source
# File lib/csv_orm/query.rb, line 83 def build_expression(conditional, attrs) string = '' is_first = true attrs.each do |k, v| string << " #{conditional} " unless is_first string << build_expression_part(k, v) is_first = false end string end
build_expression_part(key, value)
click to toggle source
# File lib/csv_orm/query.rb, line 67 def build_expression_part(key, value) case when value.class == String "row.send(:#{key}) == '#{value}'" when value.class == Regexp "row.send(:#{key}).match(/#{value.source}/)" when value.class == Array "#{value}.include?(row.send(:#{key}))" when value.class == Range parsed_range_value = parse_range_values(value) "(#{parsed_range_value}).cover?(row.send(:#{key}))" when [TrueClass, FalseClass].include?(value.class) "row.send(:#{key}) == '#{value.to_s}'" end end
explain(method, args)
click to toggle source
# File lib/csv_orm/query.rb, line 30 def explain(method, args) case when method == :where build_expression('&&', args) when method == :where_any build_expression('||', args) else 'not supported at this time' end end
not(attrs)
click to toggle source
# File lib/csv_orm/query.rb, line 51 def not(attrs) expression = build_expression('&&', attrs) self.class.new(@data.reject {|row| eval(expression)}); end
parse_range_values(range)
click to toggle source
# File lib/csv_orm/query.rb, line 56 def parse_range_values(range) exclude = range.exclude_end? first, last = DateTime.parse(range.begin), DateTime.parse(range.end) rescue nil if first && last Range.new(first.to_time.to_i, last.to_time.to_i, exclude) else range end end
queryable_fields()
click to toggle source
# File lib/csv_orm/query.rb, line 14 def queryable_fields @data&.first&.to_h&.keys end
size()
click to toggle source
# File lib/csv_orm/query.rb, line 10 def size @data.size end
where(attrs)
click to toggle source
# File lib/csv_orm/query.rb, line 46 def where(attrs) expression = build_expression('&&', attrs) self.class.new(@data.select {|row| eval(expression)}); end
where_any(attrs)
click to toggle source
# File lib/csv_orm/query.rb, line 41 def where_any(attrs) expression = build_expression('||', attrs) self.class.new(@data.select {|row| eval(expression)}); end