diff --git a/lib/arel/nodes/string_join.rb b/lib/arel/nodes/string_join.rb index b5420e2dfc..7fb0033c0f 100644 --- a/lib/arel/nodes/string_join.rb +++ b/lib/arel/nodes/string_join.rb @@ -1,6 +1,9 @@ module Arel module Nodes class StringJoin < Arel::Nodes::Join + def initialize left, right = nil + super + end end end end diff --git a/lib/arel/visitors/depth_first.rb b/lib/arel/visitors/depth_first.rb index 5ebd1296dd..eec356af4c 100644 --- a/lib/arel/visitors/depth_first.rb +++ b/lib/arel/visitors/depth_first.rb @@ -67,10 +67,13 @@ module Arel alias :visit_Arel_Nodes_Or :binary alias :visit_Arel_Nodes_Ordering :binary alias :visit_Arel_Nodes_OuterJoin :binary - alias :visit_Arel_Nodes_StringJoin :binary alias :visit_Arel_Nodes_TableAlias :binary alias :visit_Arel_Nodes_Values :binary + def visit_Arel_Nodes_StringJoin o + visit o.left + end + def visit_Arel_Attribute o visit o.relation visit o.name diff --git a/lib/arel/visitors/join_sql.rb b/lib/arel/visitors/join_sql.rb index 8c31934cd0..1cdd7eb5ca 100644 --- a/lib/arel/visitors/join_sql.rb +++ b/lib/arel/visitors/join_sql.rb @@ -14,13 +14,6 @@ module Arel def visit_Arel_Nodes_SelectCore o o.source.right.map { |j| visit j }.join ' ' end - - def visit_Arel_Nodes_StringJoin o - [ - (visit o.left if Nodes::Join === o.left), - visit(o.right) - ].compact.join ' ' - end end end end diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb index 761ebdaee3..15153d3523 100644 --- a/test/test_select_manager.rb +++ b/test/test_select_manager.rb @@ -367,7 +367,7 @@ module Arel it 'returns string join sql' do table = Table.new :users manager = Arel::SelectManager.new Table.engine - manager.from Nodes::StringJoin.new(table, 'hello') + manager.from Nodes::StringJoin.new('hello') manager.join_sql.must_be_like %{ 'hello' } end diff --git a/test/visitors/test_depth_first.rb b/test/visitors/test_depth_first.rb index 34931c783e..4bce468183 100644 --- a/test/visitors/test_depth_first.rb +++ b/test/visitors/test_depth_first.rb @@ -29,6 +29,7 @@ module Arel Arel::Nodes::Grouping, Arel::Nodes::Offset, Arel::Nodes::Having, + Arel::Nodes::StringJoin, Arel::Nodes::UnqualifiedColumn, ].each do |klass| define_method("test_#{klass.name.gsub('::', '_')}") do @@ -91,7 +92,6 @@ module Arel Arel::Nodes::NotEqual, Arel::Nodes::NotIn, Arel::Nodes::Or, - Arel::Nodes::StringJoin, Arel::Nodes::TableAlias, Arel::Nodes::Values, Arel::Nodes::As, @@ -176,7 +176,8 @@ module Arel @visitor.accept core assert_equal [ :a, core.projections, - :b, + :b, [], + core.source, :c, core.wheres, :d, core.groups, :e, diff --git a/test/visitors/test_join_sql.rb b/test/visitors/test_join_sql.rb index b0eba172e6..b672f88ecf 100644 --- a/test/visitors/test_join_sql.rb +++ b/test/visitors/test_join_sql.rb @@ -8,6 +8,11 @@ module Arel @visitor.extend(JoinSql) end + it 'should visit string join' do + sql = @visitor.accept Nodes::StringJoin.new('omg') + sql.must_be_like "'omg'" + end + describe 'inner join' do it 'should visit left if left is a join' do t = Table.new :users