Module: Whereable::ClassMethods

Defined in:
lib/whereable.rb

Instance Method Summary collapse

Instance Method Details

#whereable_deparse(hash) ⇒ Object

deparse hash tree to Arel

Raises:



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

Raises:



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

Raises:



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