Module: Whereable::ClassMethods
- Defined in:
- lib/whereable.rb
Instance Method Summary collapse
-
#whereable_deparse(hash) ⇒ Object
deparse hash tree to Arel.
-
#whereable_hash_tree(filter) ⇒ Object
Parse filter to hash tree using Treetop PEG.
-
#whereable_valid_column(column) ⇒ Object
Test column validity.
-
#whereable_valid_literal(column, literal) ⇒ Object
Test literal validity.
Instance Method Details
#whereable_deparse(hash) ⇒ Object
deparse hash tree to Arel
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/whereable.rb', line 58 def whereable_deparse(hash) raise FilterInvalid, "Invalid hash #{hash}" if hash.size > 1 key, value = hash.first case key when :and, :or arel = whereable_deparse(value.first) value[1..-1].each do |o| arel = arel.public_send(key, whereable_deparse(o)) end arel when :eq, :not_eq, :gt, :gteq, :lt, :lteq column = whereable_valid_column(value[:column]) literal = whereable_valid_literal(column, value[:literal]) arel_table[column].public_send(key, literal) when :between column = whereable_valid_column(value[:column]) literals = value[:literals] raise(FilterInvalid, "Invalid operation for #{column}") if defined_enums.key?(column) arel_table[column].between(literals) when :in column = whereable_valid_column(value[:column]) literals = value[:literals].map { |l| whereable_valid_literal(column, l) } arel_table[column].in(literals) else raise FilterInvalid, "Invalid hash #{hash}" end end |
#whereable_hash_tree(filter) ⇒ Object
Parse filter to hash tree using Treetop PEG
30 31 32 33 34 35 36 37 |
# File 'lib/whereable.rb', line 30 def whereable_hash_tree(filter) parser = WhereableClauseParser.new hash = parser.parse(filter.strip)&.to_h raise FilterInvalid, "Invalid filter at #{filter[parser.max_terminal_failure_index..-1]}" if hash.nil? hash end |
#whereable_valid_column(column) ⇒ Object
Test column validity
40 41 42 43 44 |
# File 'lib/whereable.rb', line 40 def whereable_valid_column(column) raise FilterInvalid, "Invalid column #{column}" unless column_names.include?(column) column end |
#whereable_valid_literal(column, literal) ⇒ Object
Test literal validity
47 48 49 50 51 52 53 54 55 |
# File 'lib/whereable.rb', line 47 def whereable_valid_literal(column, literal) if defined_enums.key?(column) raise(FilterInvalid, "Invalid value #{literal} for #{column}") unless defined_enums[column].key?(literal) defined_enums[column][literal] else literal end end |