diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-11-29 14:11:28 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-11-29 14:11:28 -0800 |
commit | c86c37e5f32ca76fa7aa77e62018e368dbb37a54 (patch) | |
tree | d3e5f7abdd92b4a6349de2ce2d9ebde3723cb234 /lib/arel/visitors | |
parent | f092ae544f58255508242a5308c456d9b8a13b0c (diff) | |
download | rails-c86c37e5f32ca76fa7aa77e62018e368dbb37a54.tar.gz rails-c86c37e5f32ca76fa7aa77e62018e368dbb37a54.tar.bz2 rails-c86c37e5f32ca76fa7aa77e62018e368dbb37a54.zip |
mostly implemented depth-first traversal
Diffstat (limited to 'lib/arel/visitors')
-rw-r--r-- | lib/arel/visitors/depth_first.rb | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb new file mode 100644 index 0000000000..19796b6e72 --- /dev/null +++ b/lib/arel/visitors/depth_first.rb @@ -0,0 +1,75 @@ +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_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 |