depth_first.rb 5.1 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 11 12 13 14
      def visit o
        super
        @block.call o
      end

15 16 17 18 19 20
      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
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
A
Aaron Patterson 已提交
25
      alias :visit_Arel_Nodes_Top               :unary
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
      alias :visit_Arel_Nodes_UnqualifiedColumn :unary

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

44 45 46 47 48
      def nary o
        o.children.each { |child| visit child }
      end
      alias :visit_Arel_Nodes_And :nary

49 50 51 52
      def binary o
        visit o.left
        visit o.right
      end
53
      alias :visit_Arel_Nodes_As                 :binary
54 55
      alias :visit_Arel_Nodes_Assignment         :binary
      alias :visit_Arel_Nodes_Between            :binary
56
      alias :visit_Arel_Nodes_DeleteStatement    :binary
57 58 59 60 61
      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
62
      alias :visit_Arel_Nodes_JoinSource         :binary
A
Aaron Patterson 已提交
63
      alias :visit_Arel_Nodes_InnerJoin          :binary
64 65 66 67 68 69
      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
70
      alias :visit_Arel_Nodes_Ordering           :binary
A
Aaron Patterson 已提交
71
      alias :visit_Arel_Nodes_OuterJoin          :binary
72 73
      alias :visit_Arel_Nodes_TableAlias         :binary
      alias :visit_Arel_Nodes_Values             :binary
74

A
Aaron Patterson 已提交
75 76 77 78
      def visit_Arel_Nodes_StringJoin o
        visit o.left
      end

79 80 81 82 83 84 85 86 87 88
      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
89
      alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
90 91 92 93 94 95 96

      def visit_Arel_Table o
        visit o.name
      end

      def terminal o
      end
97 98 99
      alias :visit_ActiveSupport_Multibyte_Chars :terminal
      alias :visit_ActiveSupport_StringInquirer  :terminal
      alias :visit_Arel_Nodes_Lock               :terminal
A
Aaron Patterson 已提交
100
      alias :visit_Arel_Nodes_Node               :terminal
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
      alias :visit_Arel_Nodes_SqlLiteral         :terminal
      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
116

A
Aaron Patterson 已提交
117 118 119 120 121 122
      def visit_Arel_Nodes_InsertStatement o
        visit o.relation
        visit o.columns
        visit o.values
      end

A
Aaron Patterson 已提交
123 124
      def visit_Arel_Nodes_SelectCore o
        visit o.projections
125
        visit o.source
A
Aaron Patterson 已提交
126 127 128 129 130
        visit o.wheres
        visit o.groups
        visit o.having
      end

A
Aaron Patterson 已提交
131 132 133 134 135 136 137 138
      def visit_Arel_Nodes_SelectStatement o
        visit o.cores
        visit o.orders
        visit o.limit
        visit o.lock
        visit o.offset
      end

A
Aaron Patterson 已提交
139 140 141 142 143 144 145 146
      def visit_Arel_Nodes_UpdateStatement o
        visit o.relation
        visit o.values
        visit o.wheres
        visit o.orders
        visit o.limit
      end

147 148 149 150 151 152 153 154 155 156
      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