class Garage::NestedFieldQuery::Parser
Public Class Methods
parse(*args)
click to toggle source
# File lib/garage/nested_field_query.rb, line 7 def self.parse(*args) new.parse(*args) end
Public Instance Methods
parse(given_query, indent = nil)
click to toggle source
# File lib/garage/nested_field_query.rb, line 11 def parse(given_query, indent = nil) parse_recurse(given_query.to_s.dup, indent) end
Private Instance Methods
merge(result)
click to toggle source
# File lib/garage/nested_field_query.rb, line 59 def merge(result) hash = Hash.new result.each do |res| if res.is_a?(Hash) hash.merge!(res) else hash[res] = nil end end hash end
parse_recurse(query, indent)
click to toggle source
# File lib/garage/nested_field_query.rb, line 17 def parse_recurse(query, indent) result = [] current = nil while query.sub!(/^(?:\s*([\w\.\*]+)|(,)|(\[)|(\]))/, '') if $1 current = $1.to_s elsif $2 if current result << current current = nil else raise InvalidQuery, "Expected field name: #{query}" end elsif $3 if current current = { current => parse_recurse(query, 1) } else raise InvalidQuery, "'[' should come after field: #{query}" end elsif $4 if indent if current result << current return merge(result) else raise InvalidQuery, "']' should be after '[field': #{query}" end else raise InvalidQuery, "']' should be after '[field': #{query}" end end end if current result << current else raise InvalidQuery, "premature end of query" end merge(result) end