Class: JetSet::QueryParser
- Inherits:
-
Object
- Object
- JetSet::QueryParser
- Defined in:
- lib/jet_set/query_parser.rb
Overview
A converter of JetSet syntax to SQL queries.
Instance Method Summary collapse
-
#initialize(mapping) ⇒ QueryParser
constructor
- Initializes the parser Parameters:
mapping
-
JetSet mapping
JetSet:Mapping
.
- Initializes the parser Parameters:
-
#parse(expression) ⇒ Object
Parses JetSet query and returns SQL query.
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 |