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