mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
93 lines
2.9 KiB
Ruby
93 lines
2.9 KiB
Ruby
module Arel
|
|
module Visitors
|
|
class DepthFirst < Arel::Visitors::Visitor
|
|
def initialize block = nil
|
|
@block = block || Proc.new
|
|
end
|
|
|
|
private
|
|
|
|
def binary o
|
|
visit o.left
|
|
visit o.right
|
|
@block.call o
|
|
end
|
|
alias :visit_Arel_Nodes_And :binary
|
|
alias :visit_Arel_Nodes_Assignment :binary
|
|
alias :visit_Arel_Nodes_Between :binary
|
|
alias :visit_Arel_Nodes_DoesNotMatch :binary
|
|
alias :visit_Arel_Nodes_Equality :binary
|
|
alias :visit_Arel_Nodes_GreaterThan :binary
|
|
alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
|
|
alias :visit_Arel_Nodes_In :binary
|
|
alias :visit_Arel_Nodes_LessThan :binary
|
|
alias :visit_Arel_Nodes_LessThanOrEqual :binary
|
|
alias :visit_Arel_Nodes_Matches :binary
|
|
alias :visit_Arel_Nodes_NotEqual :binary
|
|
alias :visit_Arel_Nodes_NotIn :binary
|
|
alias :visit_Arel_Nodes_Or :binary
|
|
|
|
def visit_Arel_Attribute o
|
|
visit o.relation
|
|
visit o.name
|
|
@block.call o
|
|
end
|
|
alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
|
|
alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
|
|
alias :visit_Arel_Attributes_String :visit_Arel_Attribute
|
|
alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
|
|
alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
|
|
alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
|
|
|
|
def visit_Arel_Table o
|
|
visit o.name
|
|
@block.call o
|
|
end
|
|
|
|
def terminal o
|
|
@block.call o
|
|
end
|
|
alias :visit_Arel_Nodes_SqlLiteral :terminal
|
|
alias :visit_Arel_SqlLiteral :terminal
|
|
alias :visit_BigDecimal :terminal
|
|
alias :visit_Date :terminal
|
|
alias :visit_DateTime :terminal
|
|
alias :visit_FalseClass :terminal
|
|
alias :visit_Fixnum :terminal
|
|
alias :visit_Float :terminal
|
|
alias :visit_NilClass :terminal
|
|
alias :visit_String :terminal
|
|
alias :visit_Symbol :terminal
|
|
alias :visit_Time :terminal
|
|
alias :visit_TrueClass :terminal
|
|
|
|
def visit_Arel_Nodes_SelectCore o
|
|
visit o.projections
|
|
visit o.froms
|
|
visit o.wheres
|
|
visit o.groups
|
|
visit o.having
|
|
@block.call o
|
|
end
|
|
|
|
def visit_Arel_Nodes_UpdateStatement o
|
|
visit o.relation
|
|
visit o.values
|
|
visit o.wheres
|
|
visit o.orders
|
|
visit o.limit
|
|
@block.call o
|
|
end
|
|
|
|
def visit_Array o
|
|
o.each { |i| visit i }
|
|
@block.call o
|
|
end
|
|
|
|
def visit_Hash o
|
|
o.each { |k,v| visit(k); visit(v) }
|
|
@block.call o
|
|
end
|
|
end
|
|
end
|
|
end
|