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 41 42 43 44 |
# 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) if entity.nil? raise MapperError, "Entity \"#{entity_name}\" is not defined in the mapping. Query:\n#{expression}" end 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 |