Class: JetSet::QueryParser

Inherits:
Object
  • Object
show all
Defined in:
lib/jet_set/query_parser.rb

Overview

A converter of JetSet syntax to SQL queries.

Instance Method Summary collapse

Constructor Details

#initialize(mapping) ⇒ QueryParser

Initializes the parser Parameters:

+mapping+:: JetSet mapping +JetSet:Mapping+.


9
10
11
# File 'lib/jet_set/query_parser.rb', line 9

def initialize(mapping)
  @mapping = mapping
end

Instance Method Details

#parse(expression) ⇒ Object

Parses JetSet query and returns SQL query. Parameters:

+expression+:: an SQL query with trivial extensions


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/jet_set/query_parser.rb', line 16

def parse(expression)
  sql = expression.dup

  returns_single_item = sql.scan(/LIMIT 1(\\n|;|\s)*\z/i).any?
  entity_matches = sql.scan(/(\s*)(\w+)\.\*\s+AS\s+ENTITY\s+(\w+)/i)
  entity_expressions = sql.scan(/(\w+\.\*\s+AS\s+ENTITY\s+\w+)/i).flatten

  entities = []
  entity_matches.each_with_index do |match, index|
    spaces_str = match[0]
    alias_name = match[1]
    entity_name = match[2]
    entity = @mapping.get(entity_name.to_sym)

    entities << entity
    fields_sql = entity.fields.map {|field| "#{alias_name}.#{field} AS #{entity_name}__#{field}"}.join(",#{spaces_str}")
    sql.sub!(entity_expressions[index], fields_sql)
  end

  Query.new({
    sql: sql,
    returns_single_item: returns_single_item,
    entities: entities
  })
end