aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.markdown2
-rw-r--r--lib/arel/select_manager.rb5
-rw-r--r--lib/arel/table.rb4
-rw-r--r--test/test_select_manager.rb28
-rw-r--r--test/test_table.rb14
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