depth_first.rb 2.9 KB
Newer Older
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
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

A
Aaron Patterson 已提交
64 65 66 67 68 69 70 71 72
      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

A
Aaron Patterson 已提交
73 74 75 76 77 78 79 80 81
      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

82 83 84 85 86 87 88 89 90 91 92 93
      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