class Ransack::Search

def build(params)

def build(params)
  collapse_multiparameter_attributes!(params).each do |key, value|
    case key
    when 's', 'sorts'
      send("#{key}=", value)
    else
      base.send("#{key}=", value) if base.attribute_method?(key)
    end
  end
  self
end

def build_sort(opts = {})

def build_sort(opts = {})
  new_sort(opts).tap do |sort|
    self.sorts << sort
  end
end

def collapse_multiparameter_attributes!(attrs)

def collapse_multiparameter_attributes!(attrs)
  attrs.keys.each do |k|
    if k.include?("(")
      real_attribute, position = k.split(/\(|\)/)
      cast = %w(a s i).include?(position.last) ? position.last : nil
      position = position.to_i - 1
      value = attrs.delete(k)
      attrs[real_attribute] ||= []
      attrs[real_attribute][position] = if cast
        (value.blank? && cast == 'i') ? nil : value.send("to_#{cast}")
      else
        value
      end
    elsif Hash === attrs[k]
      collapse_multiparameter_attributes!(attrs[k])
    end
  end
  attrs
end

def initialize(object, params = {}, options = {})

def initialize(object, params = {}, options = {})
  params ||= {}
  @context = Context.for(object)
  @context.auth_object = options[:auth_object]
  @base = Nodes::Grouping.new(@context, 'and')
  build(params.with_indifferent_access)
end

def method_missing(method_id, *args)

def method_missing(method_id, *args)
  method_name = method_id.to_s
  writer = method_name.sub!(/\=$/, '')
  if base.attribute_method?(method_name)
    base.send(method_id, *args)
  else
    super
  end
end

def new_sort(opts = {})

def new_sort(opts = {})
  Nodes::Sort.new(@context).build(opts)
end

def respond_to?(method_id)

def respond_to?(method_id)
  super or begin
    method_name = method_id.to_s
    writer = method_name.sub!(/\=$/, '')
    base.attribute_method?(method_name) ? true : false
  end
end

def result(opts = {})

def result(opts = {})
  @context.evaluate(self, opts)
end

def sorts

def sorts
  @sorts ||= []
end

def sorts=(args)

def sorts=(args)
  case args
  when Array
    args.each do |sort|
      sort = Nodes::Sort.extract(@context, sort)
      self.sorts << sort
    end
  when Hash
    args.each do |index, attrs|
      sort = Nodes::Sort.new(@context).build(attrs)
      self.sorts << sort
    end
  else
    self.sorts = [args]
  end
end