Class: ActiveDynamo::Query::QueryGenerator::Lexer

Inherits:
Object
  • Object
show all
Defined in:
lib/active_dynamo/query/query_generator.rb

Instance Method Summary collapse

Constructor Details

#initialize(query) ⇒ Lexer

S -> PARTION_EXPRESSION SORT_EXPRESSION FILTER_EXPRESSION $ PARTION_EXPRESSION -> partition_key = :value SORT_EXPRESSION -> ‘and’ sort_key = :value | E FILTER_EXPRESSION -> ‘and’ (SINGLE_EXPRESSION | DOUBLE_EXPRESSION) FILTER_EXPRESSION | E SINGLE_EXPRESSION -> key (=|<|>|<=|>=) :value DOUBLE_EXPRESSION -> key ‘BETWEEN’ :value1 ‘AND’ :value2



83
84
85
86
# File 'lib/active_dynamo/query/query_generator.rb', line 83

def initialize(query)
  @query  = query
  @tokens = []
end

Instance Method Details

#callObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/active_dynamo/query/query_generator.rb', line 88

def call
  grammar = [
    /(?<key>[\w\d_.-]+)\s*(?<op>BETWEEN)\s*(?<value1>[\w\d_.-]+)\s*AND\s*(?<value2>[\w\d_.-]+)/,
    /(?<key>[\w\d_.-]+)\s*(?<op>(>=|<=|>|<))\s*(?<value>[\w\d_.-]+)/,
    /(?<key>[\w\d_.-]+)\s*(?<op>(=))\s*(?<value>[\w\d_.-]+)/
  ]

  @query.split('and').each do |sub_query|
    grammar.each do |g|
      if g.match(sub_query)
        @tokens << g.match(sub_query).named_captures
        break
      end
    end
  end

  @tokens
end