2011-04-11 16:04:31 +00:00
|
|
|
module Ransack
|
|
|
|
class Visitor
|
|
|
|
|
|
|
|
def accept(object)
|
|
|
|
visit(object)
|
|
|
|
end
|
|
|
|
|
|
|
|
def can_accept?(object)
|
|
|
|
respond_to? DISPATCH[object.class]
|
|
|
|
end
|
|
|
|
|
|
|
|
def visit_Array(object)
|
2013-08-12 08:27:50 +00:00
|
|
|
object.map { |o| accept(o) }.compact
|
2011-04-11 16:04:31 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def visit_Ransack_Nodes_Condition(object)
|
|
|
|
object.arel_predicate if object.valid?
|
|
|
|
end
|
|
|
|
|
2011-06-05 18:29:54 +00:00
|
|
|
def visit_Ransack_Nodes_Grouping(object)
|
2014-11-21 19:03:20 +00:00
|
|
|
if object.combinator == Constants::OR
|
2014-10-09 21:48:38 +00:00
|
|
|
visit_or(object)
|
|
|
|
else
|
|
|
|
visit_and(object)
|
|
|
|
end
|
2011-06-05 18:29:54 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def visit_and(object)
|
2014-08-01 06:36:12 +00:00
|
|
|
raise "not implemented"
|
2011-04-11 16:04:31 +00:00
|
|
|
end
|
|
|
|
|
2011-06-05 18:29:54 +00:00
|
|
|
def visit_or(object)
|
2013-08-12 08:27:50 +00:00
|
|
|
nodes = object.values.map { |o| accept(o) }.compact
|
2011-04-11 16:04:31 +00:00
|
|
|
return nil unless nodes.size > 0
|
|
|
|
|
|
|
|
if nodes.size > 1
|
|
|
|
nodes.inject(&:or)
|
|
|
|
else
|
|
|
|
nodes.first
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-06-05 18:29:54 +00:00
|
|
|
def visit_Ransack_Nodes_Sort(object)
|
|
|
|
object.attr.send(object.dir) if object.valid?
|
|
|
|
end
|
|
|
|
|
2011-04-11 16:04:31 +00:00
|
|
|
def quoted?(object)
|
2014-08-01 06:36:12 +00:00
|
|
|
raise "not implemented"
|
2011-04-11 16:04:31 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def visit(object)
|
|
|
|
send(DISPATCH[object.class], object)
|
|
|
|
end
|
|
|
|
|
2014-12-19 12:02:46 +00:00
|
|
|
DISPATCH = Hash.new do |h, klass|
|
|
|
|
h[klass] = "visit_#{
|
2014-11-21 19:03:20 +00:00
|
|
|
klass.name.gsub(Constants::TWO_COLONS, Constants::UNDERSCORE)
|
2014-10-09 21:48:38 +00:00
|
|
|
}"
|
2011-04-11 16:04:31 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
2013-08-12 08:27:50 +00:00
|
|
|
end
|