class Ransack::Visitor

def accept(object)

def accept(object)
  visit(object)
end

def can_accept?(object)

def can_accept?(object)
  respond_to? DISPATCH[object.class]
end

def quoted?(object)

def quoted?(object)
  case object
  when Arel::Nodes::SqlLiteral, Bignum, Fixnum
    false
  else
    true
  end
end

def visit(object)

def visit(object)
  send(DISPATCH[object.class], object)
end

def visit_Array(object)

def visit_Array(object)
  object.map {|o| accept(o)}.compact
end

def visit_Ransack_Nodes_And(object)

def visit_Ransack_Nodes_And(object)
  nodes = object.values.map {|o| accept(o)}.compact
  return nil unless nodes.size > 0
  if nodes.size > 1
    nodes.inject(&:and)
  else
    nodes.first
  end
end

def visit_Ransack_Nodes_Condition(object)

def visit_Ransack_Nodes_Condition(object)
  object.arel_predicate if object.valid?
end

def visit_Ransack_Nodes_Grouping(object)

def visit_Ransack_Nodes_Grouping(object)
  object.combinator == 'or' ? visit_or(object) : visit_and(object)
end

def visit_Ransack_Nodes_Sort(object)

def visit_Ransack_Nodes_Sort(object)
  object.attr.send(object.dir) if object.valid?
end

def visit_and(object)

def visit_and(object)
  nodes = object.values.map {|o| accept(o)}.compact
  return nil unless nodes.size > 0
  if nodes.size > 1
    Arel::Nodes::Grouping.new(Arel::Nodes::And.new(nodes))
  else
    nodes.first
  end
end

def visit_or(object)

def visit_or(object)
  nodes = object.values.map {|o| accept(o)}.compact
  return nil unless nodes.size > 0
  if nodes.size > 1
    nodes.inject(&:or)
  else
    nodes.first
  end
end