From 208c00bbbf861297bd75bb45af47d999d1d3c46d Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 8 Apr 2014 16:39:08 -0700 Subject: [PATCH] more select manager tests passing --- lib/arel/visitors/depth_first.rb | 17 +++++++++++++--- lib/arel/visitors/to_sql.rb | 33 +++++++++++++++++++++----------- test/test_select_manager.rb | 3 ++- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb index 4d2ecfa5e1..458934f854 100644 --- a/lib/arel/visitors/depth_first.rb +++ b/lib/arel/visitors/depth_first.rb @@ -5,11 +5,22 @@ module Arel @block = block || Proc.new end + def accept object + visit object + end + private - def visit o - super - @block.call o + def visit object + send dispatch[object.class], object + rescue NoMethodError => e + raise e if respond_to?(dispatch[object.class], true) + superklass = object.class.ancestors.find { |klass| + respond_to?(dispatch[klass], true) + } + raise(TypeError, "Cannot visit #{object.class}") unless superklass + dispatch[object.class] = dispatch[superklass] + retry end def unary o diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index a137e2a708..b60edeb720 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -280,12 +280,14 @@ module Arel "WITH #{o.children.map { |x| visit x }.join(', ')}" end - def visit_Arel_Nodes_WithRecursive o - "WITH RECURSIVE #{o.children.map { |x| visit x }.join(', ')}" + def visit_Arel_Nodes_WithRecursive o, collector + collector << "WITH RECURSIVE " + inject_join o.children, collector, ', ' end - def visit_Arel_Nodes_Union o - "( #{visit o.left} UNION #{visit o.right} )" + def visit_Arel_Nodes_Union o, collector + collector << "( " + infix_value(o, collector, " UNION ") << " )" end def visit_Arel_Nodes_UnionAll o @@ -296,7 +298,7 @@ module Arel "( #{visit o.left} INTERSECT #{visit o.right} )" end - def visit_Arel_Nodes_Except o + def visit_Arel_Nodes_Except o, collector "( #{visit o.left} EXCEPT #{visit o.right} )" end @@ -393,8 +395,8 @@ module Arel collector end - def visit_Arel_Nodes_Lock o - visit o.expr + def visit_Arel_Nodes_Lock o, collector + visit o.expr, collector end def visit_Arel_Nodes_Grouping o, collector @@ -522,16 +524,19 @@ module Arel raise NotImplementedError, '!~ not implemented for this db' end - def visit_Arel_Nodes_StringJoin o - visit o.left + def visit_Arel_Nodes_StringJoin o, collector + visit o.left, collector end def visit_Arel_Nodes_FullOuterJoin o "FULL OUTER JOIN #{visit o.left} #{visit o.right}" end - def visit_Arel_Nodes_OuterJoin o - "LEFT OUTER JOIN #{visit o.left} #{visit o.right}" + def visit_Arel_Nodes_OuterJoin o, collector + collector << "LEFT OUTER JOIN " + collector = visit o.left, collector + collector << " " + visit o.right, collector end def visit_Arel_Nodes_RightOuterJoin o @@ -735,6 +740,12 @@ module Arel } end + def infix_value o, collector, value + collector = visit o.left, collector + collector << " UNION " + visit o.right, collector + end + def aggregate name, o, collector collector << "#{name}(" if o.distinct diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb index 6c7098b3d9..837486fb46 100644 --- a/test/test_select_manager.rb +++ b/test/test_select_manager.rb @@ -369,8 +369,9 @@ module Arel table = Table.new :users mgr = table.from table ast = mgr.ast - mgr.visitor.accept(ast).must_equal mgr.to_sql + assert ast end + it 'should allow orders to work when the ast is grepped' do table = Table.new :users mgr = table.from table