depth_first.rb 5.0 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 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
      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
      alias :visit_Arel_Nodes_Not               :unary
      alias :visit_Arel_Nodes_Offset            :unary
      alias :visit_Arel_Nodes_On                :unary
      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

      def join o
        visit o.left
        visit o.right
        visit o.constraint
      end
      alias :visit_Arel_Nodes_InnerJoin :join
      alias :visit_Arel_Nodes_OuterJoin :join

50 51 52 53 54
      def nary o
        o.children.each { |child| visit child }
      end
      alias :visit_Arel_Nodes_And :nary

55 56 57 58
      def binary o
        visit o.left
        visit o.right
      end
59
      alias :visit_Arel_Nodes_As                 :binary
60 61
      alias :visit_Arel_Nodes_Assignment         :binary
      alias :visit_Arel_Nodes_Between            :binary
62
      alias :visit_Arel_Nodes_DeleteStatement    :binary
63 64 65 66 67 68 69 70 71 72 73
      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
74 75 76 77
      alias :visit_Arel_Nodes_Ordering           :binary
      alias :visit_Arel_Nodes_StringJoin         :binary
      alias :visit_Arel_Nodes_TableAlias         :binary
      alias :visit_Arel_Nodes_Values             :binary
78 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 125 126 127 128 129 130
      def visit_Arel_Nodes_SelectCore o
        visit o.projections
        visit o.froms
        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