Class: CsvOrm::Query
- Inherits:
-
Object
- Object
- CsvOrm::Query
- Defined in:
- lib/csv_orm/query.rb
Instance Attribute Summary collapse
-
#data ⇒ Object
readonly
Returns the value of attribute data.
Instance Method Summary collapse
- #aggregate(*fields) ⇒ Object
- #build_expression(conditional, attrs) ⇒ Object
- #build_expression_part(key, value) ⇒ Object
- #explain(method, args) ⇒ Object
-
#initialize(data) ⇒ Query
constructor
A new instance of Query.
- #not(attrs) ⇒ Object
- #parse_range_values(range) ⇒ Object
- #queryable_fields ⇒ Object
- #size ⇒ Object
- #where(attrs) ⇒ Object
- #where_any(attrs) ⇒ Object
Constructor Details
#initialize(data) ⇒ Query
Returns a new instance of Query.
5 6 7 8 |
# File 'lib/csv_orm/query.rb', line 5 def initialize(data) @data = data nil # suppress output end |
Instance Attribute Details
#data ⇒ Object (readonly)
Returns the value of attribute data.
3 4 5 |
# File 'lib/csv_orm/query.rb', line 3 def data @data end |
Instance Method Details
#aggregate(*fields) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 |
# 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) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 |
# 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) ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# 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) ⇒ Object
30 31 32 33 34 35 36 37 38 39 |
# 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) ⇒ Object
51 52 53 54 |
# 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) ⇒ Object
56 57 58 59 60 61 62 63 64 65 |
# 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 ⇒ Object
14 15 16 |
# File 'lib/csv_orm/query.rb', line 14 def queryable_fields @data&.first&.to_h&.keys end |
#size ⇒ Object
10 11 12 |
# File 'lib/csv_orm/query.rb', line 10 def size @data.size end |
#where(attrs) ⇒ Object
46 47 48 49 |
# 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) ⇒ Object
41 42 43 44 |
# 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 |