diff options
-rw-r--r-- | README.markdown | 2 | ||||
-rw-r--r-- | lib/arel/select_manager.rb | 5 | ||||
-rw-r--r-- | lib/arel/table.rb | 4 | ||||
-rw-r--r-- | test/test_select_manager.rb | 28 | ||||
-rw-r--r-- | test/test_table.rb | 14 |
5 files changed, 52 insertions, 1 deletions
diff --git a/README.markdown b/README.markdown index ca9dd5a29a..75b0b3ee0b 100644 --- a/README.markdown +++ b/README.markdown @@ -206,7 +206,7 @@ users. When your query is too complex for `Arel`, you can use `Arel::SqlLiteral`: ```ruby -photo_clicks =Arel::Nodes::SqlLiteral.new(<<-SQL +photo_clicks = Arel::Nodes::SqlLiteral.new(<<-SQL CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb index 804316209c..f1dde6403a 100644 --- a/lib/arel/select_manager.rb +++ b/lib/arel/select_manager.rb @@ -114,6 +114,10 @@ module Arel self end + def outer_join relation + join(relation, Nodes::OuterJoin) + end + def having *exprs @ctx.having = Nodes::Having.new(collapse(exprs, @ctx.having)) self @@ -148,6 +152,7 @@ module Arel else @ctx.set_quantifier = nil end + self end def order *expr diff --git a/lib/arel/table.rb b/lib/arel/table.rb index b87c526de5..545e73e3ae 100644 --- a/lib/arel/table.rb +++ b/lib/arel/table.rb @@ -64,6 +64,10 @@ primary_key (#{caller.first}) is deprecated and will be removed in Arel 4.0.0 from(self).join(relation, klass) end + def outer_join relation + join(relation, Nodes::OuterJoin) + end + def group *columns from(self).group(*columns) end diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb index 837486fb46..09608ea71e 100644 --- a/test/test_select_manager.rb +++ b/test/test_select_manager.rb @@ -579,6 +579,28 @@ module Arel end end + describe 'outer join' do + it 'responds to join' do + left = Table.new :users + right = left.alias + predicate = left[:id].eq(right[:id]) + manager = Arel::SelectManager.new Table.engine + + manager.from left + manager.outer_join(right).on(predicate) + manager.to_sql.must_be_like %{ + SELECT FROM "users" + LEFT OUTER JOIN "users" "users_2" + ON "users"."id" = "users_2"."id" + } + end + + it 'noops on nil' do + manager = Arel::SelectManager.new Table.engine + manager.outer_join(nil).must_equal manager + end + end + describe 'joins' do it 'returns join sql' do table = Table.new :users @@ -1073,6 +1095,12 @@ module Arel manager.distinct(false) manager.ast.cores.last.set_quantifier.must_equal nil end + + it "chains" do + manager = Arel::SelectManager.new Table.engine + manager.distinct.must_equal manager + manager.distinct(false).must_equal manager + end end end end diff --git a/test/test_table.rb b/test/test_table.rb index 1591d1e49c..14256475ec 100644 --- a/test/test_table.rb +++ b/test/test_table.rb @@ -112,6 +112,20 @@ module Arel } end end + + describe 'join' do + it 'creates an outer join' do + right = @relation.alias + predicate = @relation[:id].eq(right[:id]) + mgr = @relation.outer_join(right).on(predicate) + + mgr.to_sql.must_be_like %{ + SELECT FROM "users" + LEFT OUTER JOIN "users" "users_2" + ON "users"."id" = "users_2"."id" + } + end + end end describe 'group' do |