aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/visitors/depth_first.rb
blob: 5c89ef96b36c537c5273364994fd3533f060302c (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
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