depth_first.rb 5.7 KB
Newer Older
1 2 3 4 5 6 7 8 9
module Arel
  module Visitors
    class DepthFirst < Arel::Visitors::Visitor
      def initialize block = nil
        @block = block || Proc.new
      end

      private

10
      def visit o
11 12 13 14
        super
        @block.call o
      end

15 16
      def unary o
        visit o.expr
17 18 19 20
      end
      alias :visit_Arel_Nodes_Group             :unary
      alias :visit_Arel_Nodes_Grouping          :unary
      alias :visit_Arel_Nodes_Having            :unary
A
Aaron Patterson 已提交
21
      alias :visit_Arel_Nodes_Limit             :unary
22 23 24
      alias :visit_Arel_Nodes_Not               :unary
      alias :visit_Arel_Nodes_Offset            :unary
      alias :visit_Arel_Nodes_On                :unary
25
      alias :visit_Arel_Nodes_Ordering          :unary
26 27
      alias :visit_Arel_Nodes_Ascending         :unary
      alias :visit_Arel_Nodes_Descending        :unary
A
Aaron Patterson 已提交
28
      alias :visit_Arel_Nodes_Top               :unary
29 30
      alias :visit_Arel_Nodes_UnqualifiedColumn :unary

31 32 33 34
      def function o
        visit o.expressions
        visit o.alias
        visit o.distinct
35 36 37 38 39 40 41
      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

42 43 44 45 46
      def visit_Arel_Nodes_NamedFunction o
        visit o.name
        visit o.expressions
        visit o.distinct
        visit o.alias
47 48
      end

49 50 51 52
      def visit_Arel_Nodes_Count o
        visit o.expressions
        visit o.alias
        visit o.distinct
53 54
      end

55 56
      def nary o
        o.children.each { |child| visit child}
57 58 59
      end
      alias :visit_Arel_Nodes_And :nary

60 61 62
      def binary o
        visit o.left
        visit o.right
63
      end
64
      alias :visit_Arel_Nodes_As                 :binary
65 66
      alias :visit_Arel_Nodes_Assignment         :binary
      alias :visit_Arel_Nodes_Between            :binary
67
      alias :visit_Arel_Nodes_DeleteStatement    :binary
68 69
      alias :visit_Arel_Nodes_DoesNotMatch       :binary
      alias :visit_Arel_Nodes_Equality           :binary
70
      alias :visit_Arel_Nodes_FullOuterJoin      :binary
71 72 73
      alias :visit_Arel_Nodes_GreaterThan        :binary
      alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
      alias :visit_Arel_Nodes_In                 :binary
74
      alias :visit_Arel_Nodes_InfixOperation     :binary
75
      alias :visit_Arel_Nodes_JoinSource         :binary
A
Aaron Patterson 已提交
76
      alias :visit_Arel_Nodes_InnerJoin          :binary
77 78 79 80 81
      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
82
      alias :visit_Arel_Nodes_NotRegexp          :binary
83
      alias :visit_Arel_Nodes_Or                 :binary
A
Aaron Patterson 已提交
84
      alias :visit_Arel_Nodes_OuterJoin          :binary
85
      alias :visit_Arel_Nodes_Regexp             :binary
86
      alias :visit_Arel_Nodes_RightOuterJoin     :binary
87 88
      alias :visit_Arel_Nodes_TableAlias         :binary
      alias :visit_Arel_Nodes_Values             :binary
89

90 91
      def visit_Arel_Nodes_StringJoin o
        visit o.left
A
Aaron Patterson 已提交
92 93
      end

94 95 96
      def visit_Arel_Attribute o
        visit o.relation
        visit o.name
97 98 99 100 101 102 103
      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
104
      alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
105

106 107
      def visit_Arel_Table o
        visit o.name
108 109
      end

110
      def terminal o
111
      end
112 113 114
      alias :visit_ActiveSupport_Multibyte_Chars :terminal
      alias :visit_ActiveSupport_StringInquirer  :terminal
      alias :visit_Arel_Nodes_Lock               :terminal
A
Aaron Patterson 已提交
115
      alias :visit_Arel_Nodes_Node               :terminal
116
      alias :visit_Arel_Nodes_SqlLiteral         :terminal
117
      alias :visit_Arel_Nodes_BindParam          :terminal
118
      alias :visit_Arel_Nodes_Window             :terminal
119 120 121 122 123 124 125 126 127 128 129 130 131
      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
132

133 134 135 136
      def visit_Arel_Nodes_InsertStatement o
        visit o.relation
        visit o.columns
        visit o.values
A
Aaron Patterson 已提交
137 138
      end

139 140 141 142 143 144 145
      def visit_Arel_Nodes_SelectCore o
        visit o.projections
        visit o.source
        visit o.wheres
        visit o.groups
        visit o.windows
        visit o.having
A
Aaron Patterson 已提交
146 147
      end

148 149 150 151 152 153
      def visit_Arel_Nodes_SelectStatement o
        visit o.cores
        visit o.orders
        visit o.limit
        visit o.lock
        visit o.offset
A
Aaron Patterson 已提交
154 155
      end

156 157 158 159 160 161
      def visit_Arel_Nodes_UpdateStatement o
        visit o.relation
        visit o.values
        visit o.wheres
        visit o.orders
        visit o.limit
A
Aaron Patterson 已提交
162 163
      end

164 165
      def visit_Array o
        o.each { |i| visit i }
166 167
      end

168 169
      def visit_Hash o
        o.each { |k,v| visit(k); visit(v) }
170 171 172 173
      end
    end
  end
end