2010-11-29 17:11:28 -05:00
|
|
|
module Arel
|
|
|
|
module Visitors
|
|
|
|
class DepthFirst < Arel::Visitors::Visitor
|
|
|
|
def initialize block = nil
|
|
|
|
@block = block || Proc.new
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2010-11-29 18:19:13 -05:00
|
|
|
def visit o
|
|
|
|
super
|
|
|
|
@block.call o
|
|
|
|
end
|
|
|
|
|
2010-11-29 18:17:59 -05:00
|
|
|
def unary o
|
|
|
|
visit o.expr
|
|
|
|
end
|
|
|
|
alias :visit_Arel_Nodes_Group :unary
|
|
|
|
alias :visit_Arel_Nodes_Grouping :unary
|
|
|
|
alias :visit_Arel_Nodes_Having :unary
|
2011-01-03 14:12:46 -05:00
|
|
|
alias :visit_Arel_Nodes_Limit :unary
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Nodes_Not :unary
|
|
|
|
alias :visit_Arel_Nodes_Offset :unary
|
|
|
|
alias :visit_Arel_Nodes_On :unary
|
2011-06-14 17:43:22 -04:00
|
|
|
alias :visit_Arel_Nodes_Ordering :unary
|
2011-06-29 16:45:26 -04:00
|
|
|
alias :visit_Arel_Nodes_Ascending :unary
|
|
|
|
alias :visit_Arel_Nodes_Descending :unary
|
2011-01-03 14:12:46 -05:00
|
|
|
alias :visit_Arel_Nodes_Top :unary
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Nodes_UnqualifiedColumn :unary
|
|
|
|
|
|
|
|
def function o
|
|
|
|
visit o.expressions
|
|
|
|
visit o.alias
|
2011-01-04 23:27:34 -05:00
|
|
|
visit o.distinct
|
2010-11-29 18:17:59 -05:00
|
|
|
end
|
|
|
|
alias :visit_Arel_Nodes_Avg :function
|
|
|
|
alias :visit_Arel_Nodes_Exists :function
|
|
|
|
alias :visit_Arel_Nodes_Max :function
|
|
|
|
alias :visit_Arel_Nodes_Min :function
|
|
|
|
alias :visit_Arel_Nodes_Sum :function
|
|
|
|
|
2011-01-04 23:27:34 -05:00
|
|
|
def visit_Arel_Nodes_NamedFunction o
|
|
|
|
visit o.name
|
|
|
|
visit o.expressions
|
|
|
|
visit o.distinct
|
|
|
|
visit o.alias
|
|
|
|
end
|
|
|
|
|
2010-11-29 18:17:59 -05:00
|
|
|
def visit_Arel_Nodes_Count o
|
|
|
|
visit o.expressions
|
|
|
|
visit o.alias
|
|
|
|
visit o.distinct
|
|
|
|
end
|
|
|
|
|
2010-12-10 12:16:41 -05:00
|
|
|
def nary o
|
|
|
|
o.children.each { |child| visit child }
|
|
|
|
end
|
|
|
|
alias :visit_Arel_Nodes_And :nary
|
|
|
|
|
2010-11-29 17:11:28 -05:00
|
|
|
def binary o
|
|
|
|
visit o.left
|
|
|
|
visit o.right
|
|
|
|
end
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Nodes_As :binary
|
2010-11-29 17:11:28 -05:00
|
|
|
alias :visit_Arel_Nodes_Assignment :binary
|
|
|
|
alias :visit_Arel_Nodes_Between :binary
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Nodes_DeleteStatement :binary
|
2010-11-29 17:11:28 -05:00
|
|
|
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
|
2012-03-22 12:09:32 -04:00
|
|
|
alias :visit_Arel_Nodes_InfixOperation :binary
|
2010-12-14 13:38:55 -05:00
|
|
|
alias :visit_Arel_Nodes_JoinSource :binary
|
2010-12-14 12:43:19 -05:00
|
|
|
alias :visit_Arel_Nodes_InnerJoin :binary
|
2010-11-29 17:11:28 -05:00
|
|
|
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
|
2010-12-14 12:43:19 -05:00
|
|
|
alias :visit_Arel_Nodes_OuterJoin :binary
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Nodes_TableAlias :binary
|
|
|
|
alias :visit_Arel_Nodes_Values :binary
|
2010-11-29 17:11:28 -05:00
|
|
|
|
2010-12-14 14:04:08 -05:00
|
|
|
def visit_Arel_Nodes_StringJoin o
|
|
|
|
visit o.left
|
|
|
|
end
|
|
|
|
|
2010-11-29 17:11:28 -05:00
|
|
|
def visit_Arel_Attribute o
|
|
|
|
visit o.relation
|
|
|
|
visit o.name
|
|
|
|
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
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
|
2010-11-29 17:11:28 -05:00
|
|
|
|
|
|
|
def visit_Arel_Table o
|
|
|
|
visit o.name
|
|
|
|
end
|
|
|
|
|
|
|
|
def terminal o
|
|
|
|
end
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_ActiveSupport_Multibyte_Chars :terminal
|
|
|
|
alias :visit_ActiveSupport_StringInquirer :terminal
|
|
|
|
alias :visit_Arel_Nodes_Lock :terminal
|
2010-11-29 18:31:28 -05:00
|
|
|
alias :visit_Arel_Nodes_Node :terminal
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_Nodes_SqlLiteral :terminal
|
2012-02-20 20:57:37 -05:00
|
|
|
alias :visit_Arel_Nodes_BindParam :terminal
|
2012-02-22 09:25:10 -05:00
|
|
|
alias :visit_Arel_Nodes_Window :terminal
|
2010-11-29 18:17:59 -05:00
|
|
|
alias :visit_Arel_SqlLiteral :terminal
|
|
|
|
alias :visit_BigDecimal :terminal
|
|
|
|
alias :visit_Bignum :terminal
|
|
|
|
alias :visit_Class :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
|
2010-11-29 17:11:28 -05:00
|
|
|
|
2010-11-29 17:30:06 -05:00
|
|
|
def visit_Arel_Nodes_InsertStatement o
|
|
|
|
visit o.relation
|
|
|
|
visit o.columns
|
|
|
|
visit o.values
|
|
|
|
end
|
|
|
|
|
2010-11-29 17:23:58 -05:00
|
|
|
def visit_Arel_Nodes_SelectCore o
|
|
|
|
visit o.projections
|
2010-12-14 13:38:55 -05:00
|
|
|
visit o.source
|
2010-11-29 17:23:58 -05:00
|
|
|
visit o.wheres
|
|
|
|
visit o.groups
|
2012-02-22 09:25:10 -05:00
|
|
|
visit o.windows
|
2010-11-29 17:23:58 -05:00
|
|
|
visit o.having
|
|
|
|
end
|
|
|
|
|
2010-11-29 17:26:53 -05:00
|
|
|
def visit_Arel_Nodes_SelectStatement o
|
|
|
|
visit o.cores
|
|
|
|
visit o.orders
|
|
|
|
visit o.limit
|
|
|
|
visit o.lock
|
|
|
|
visit o.offset
|
|
|
|
end
|
|
|
|
|
2010-11-29 17:15:58 -05:00
|
|
|
def visit_Arel_Nodes_UpdateStatement o
|
|
|
|
visit o.relation
|
|
|
|
visit o.values
|
|
|
|
visit o.wheres
|
|
|
|
visit o.orders
|
|
|
|
visit o.limit
|
|
|
|
end
|
|
|
|
|
2010-11-29 17:11:28 -05:00
|
|
|
def visit_Array o
|
|
|
|
o.each { |i| visit i }
|
|
|
|
end
|
|
|
|
|
|
|
|
def visit_Hash o
|
|
|
|
o.each { |k,v| visit(k); visit(v) }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|