Sha256: 8fea165fb116e08c926bb3169172ca28dde01ddc427fa7ba840344514a2b1f80

Contents?: true

Size: 1.21 KB

Versions: 6

Compression:

Stored size: 1.21 KB

Contents

class SearchCop::HashParser
  attr_reader :query_info

  def initialize(query_info)
    @query_info = query_info
  end

  def parse(hash, query_options = {})
    default_operator = SearchCop::Helpers.sanitize_default_operator(query_options)

    res = hash.collect do |key, value|
      case key
      when :and
        value.collect { |val| parse val }.inject(:and)
      when :or
        value.collect { |val| parse val }.inject(:or)
      when :not
        parse(value).not
      when :query
        SearchCop::Parser.parse(value, query_info)
      else
        parse_attribute(key, value)
      end
    end

    res.inject(default_operator)
  end

  private

  def parse_attribute(key, value)
    collection = SearchCopGrammar::Attributes::Collection.new(query_info, key.to_s)

    if value.is_a?(Hash)
      raise(SearchCop::ParseError, "Unknown operator #{value.keys.first}") unless collection.valid_operator?(value.keys.first)

      generator = collection.generator_for(value.keys.first)

      if generator
        collection.generator(generator, value.values.first)
      else
        collection.send(value.keys.first, value.values.first.to_s)
      end
    else
      collection.send(:matches, value.to_s)
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
search_cop-1.4.0 lib/search_cop/hash_parser.rb
search_cop-1.3.0 lib/search_cop/hash_parser.rb
search_cop-1.2.3 lib/search_cop/hash_parser.rb
search_cop-1.2.2 lib/search_cop/hash_parser.rb
search_cop-1.2.1 lib/search_cop/hash_parser.rb
search_cop-1.2.0 lib/search_cop/hash_parser.rb