aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/arel/visitors/depth_first.rb
blob: 98c3f92cf102b0930e6ce1b5286c42ebc5aa66f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# frozen_string_literal: true

module Arel # :nodoc: all
  module Visitors
    class DepthFirst < Arel::Visitors::Visitor
      def initialize(block = nil)
        @block = block || Proc.new
        super()
      end

      private
        def visit(o, _ = nil)
          super
          @block.call o
        end

        def unary(o)
          visit o.expr
        end
        alias :visit_Arel_Nodes_Else              :unary
        alias :visit_Arel_Nodes_Group             :unary
        alias :visit_Arel_Nodes_Cube              :unary
        alias :visit_Arel_Nodes_RollUp            :unary
        alias :visit_Arel_Nodes_GroupingSet       :unary
        alias :visit_Arel_Nodes_GroupingElement   :unary
        alias :visit_Arel_Nodes_Grouping          :unary
        alias :visit_Arel_Nodes_Having            :unary
        alias :visit_Arel_Nodes_Lateral           :unary
        alias :visit_Arel_Nodes_Limit             :unary
        alias :visit_Arel_Nodes_Not               :unary
        alias :visit_Arel_Nodes_Offset            :unary
        alias :visit_Arel_Nodes_On                :unary
        alias :visit_Arel_Nodes_Ordering          :unary
        alias :visit_Arel_Nodes_Ascending         :unary
        alias :visit_Arel_Nodes_Descending        :unary
        alias :visit_Arel_Nodes_UnqualifiedColumn :unary
        alias :visit_Arel_Nodes_OptimizerHints    :unary
        alias :visit_Arel_Nodes_ValuesList        :unary

        def function(o)
          visit o.expressions
          visit o.alias
          visit o.distinct
        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

        def visit_Arel_Nodes_NamedFunction(o)
          visit o.name
          visit o.expressions
          visit o.distinct
          visit o.alias
        end

        def visit_Arel_Nodes_Count(o)
          visit o.expressions
          visit o.alias
          visit o.distinct
        end

        def visit_Arel_Nodes_Case(o)
          visit o.case
          visit o.conditions
          visit o.default
        end

        def nary(o)
          o.children.each { |child| visit child }
        end
        alias :visit_Arel_Nodes_And :nary

        def binary(o)
          visit o.left
          visit o.right
        end
        alias :visit_Arel_Nodes_As                 :binary
        alias :visit_Arel_Nodes_Assignment         :binary
        alias :visit_Arel_Nodes_Between            :binary
        alias :visit_Arel_Nodes_Concat             :binary
        alias :visit_Arel_Nodes_DeleteStatement    :binary
        alias :visit_Arel_Nodes_DoesNotMatch       :binary
        alias :visit_Arel_Nodes_Equality           :binary
        alias :visit_Arel_Nodes_FullOuterJoin      :binary
        alias :visit_Arel_Nodes_GreaterThan        :binary
        alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
        alias :visit_Arel_Nodes_In                 :binary
        alias :visit_Arel_Nodes_InfixOperation     :binary
        alias :visit_Arel_Nodes_JoinSource         :binary
        alias :visit_Arel_Nodes_InnerJoin          :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_NotRegexp          :binary
        alias :visit_Arel_Nodes_IsNotDistinctFrom  :binary
        alias :visit_Arel_Nodes_IsDistinctFrom     :binary
        alias :visit_Arel_Nodes_Or                 :binary
        alias :visit_Arel_Nodes_OuterJoin          :binary
        alias :visit_Arel_Nodes_Regexp             :binary
        alias :visit_Arel_Nodes_RightOuterJoin     :binary
        alias :visit_Arel_Nodes_TableAlias         :binary
        alias :visit_Arel_Nodes_When               :binary

        def visit_Arel_Nodes_StringJoin(o)
          visit o.left
        end

        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
        alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute

        def visit_Arel_Table(o)
          visit o.name
        end

        def terminal(o)
        end
        alias :visit_ActiveSupport_Multibyte_Chars :terminal
        alias :visit_ActiveSupport_StringInquirer  :terminal
        alias :visit_Arel_Nodes_Lock               :terminal
        alias :visit_Arel_Nodes_Node               :terminal
        alias :visit_Arel_Nodes_SqlLiteral         :terminal
        alias :visit_Arel_Nodes_BindParam          :terminal
        alias :visit_Arel_Nodes_Window             :terminal
        alias :visit_Arel_Nodes_True               :terminal
        alias :visit_Arel_Nodes_False              :terminal
        alias :visit_BigDecimal                    :terminal
        alias :visit_Class                         :terminal
        alias :visit_Date                          :terminal
        alias :visit_DateTime                      :terminal
        alias :visit_FalseClass                    :terminal
        alias :visit_Float                         :terminal
        alias :visit_Integer                       :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_InsertStatement(o)
          visit o.relation
          visit o.columns
          visit o.values
        end

        def visit_Arel_Nodes_SelectCore(o)
          visit o.projections
          visit o.source
          visit o.wheres
          visit o.groups
          visit o.windows
          visit o.havings
        end

        def visit_Arel_Nodes_SelectStatement(o)
          visit o.cores
          visit o.orders
          visit o.limit
          visit o.lock
          visit o.offset
        end

        def visit_Arel_Nodes_UpdateStatement(o)
          visit o.relation
          visit o.values
          visit o.wheres
          visit o.orders
          visit o.limit
        end

        def visit_Arel_Nodes_Comment(o)
          visit o.values
        end

        def visit_Array(o)
          o.each { |i| visit i }
        end
        alias :visit_Set :visit_Array

        def visit_Hash(o)
          o.each { |k, v| visit(k); visit(v) }
        end

        DISPATCH = dispatch_cache

        def get_dispatch_cache
          DISPATCH
        end
    end
  end
end