aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_select_manager.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_select_manager.rb')
-rw-r--r--test/test_select_manager.rb160
1 files changed, 108 insertions, 52 deletions
diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb
index 09608ea71e..3380bbec6f 100644
--- a/test/test_select_manager.rb
+++ b/test/test_select_manager.rb
@@ -140,7 +140,7 @@ module Arel
mgr.to_sql.must_be_like %{ SELECT FROM "users" INNER JOIN "users" "users_2" ON omg }
end
- it 'converts to sqlliterals' do
+ it 'converts to sqlliterals with multiple items' do
table = Table.new :users
right = table.alias
mgr = table.from table
@@ -152,7 +152,7 @@ module Arel
describe 'clone' do
it 'creates new cores' do
- table = Table.new :users, :engine => Table.engine, :as => 'foo'
+ table = Table.new :users, :as => 'foo'
mgr = table.from table
m2 = mgr.clone
m2.project "foo"
@@ -160,7 +160,7 @@ module Arel
end
it 'makes updates to the correct copy' do
- table = Table.new :users, :engine => Table.engine, :as => 'foo'
+ table = Table.new :users, :as => 'foo'
mgr = table.from table
m2 = mgr.clone
m3 = m2.clone
@@ -172,7 +172,7 @@ module Arel
describe 'initialize' do
it 'uses alias in sql' do
- table = Table.new :users, :engine => Table.engine, :as => 'foo'
+ table = Table.new :users, :as => 'foo'
mgr = table.from table
mgr.skip 10
mgr.to_sql.must_be_like %{ SELECT FROM "users" "foo" OFFSET 10 }
@@ -330,6 +330,20 @@ module Arel
end
describe 'with' do
+ it 'should support basic WITH' do
+ users = Table.new(:users)
+ users_top = Table.new(:users_top)
+ comments = Table.new(:comments)
+
+ top = users.project(users[:id]).where(users[:karma].gt(100))
+ users_as = Arel::Nodes::As.new(users_top, top)
+ select_manager = comments.project(Arel.star).with(users_as)
+ .where(comments[:author_id].in(users_top.project(users_top[:id])))
+
+ select_manager.to_sql.must_be_like %{
+ WITH "users_top" AS (SELECT "users"."id" FROM "users" WHERE "users"."karma" > 100) SELECT * FROM "comments" WHERE "comments"."author_id" IN (SELECT "users_top"."id" FROM "users_top")
+ }
+ end
it "should support WITH RECURSIVE" do
comments = Table.new(:comments)
@@ -368,8 +382,7 @@ module Arel
it 'should return the ast' do
table = Table.new :users
mgr = table.from table
- ast = mgr.ast
- assert ast
+ assert mgr.ast
end
it 'should allow orders to work when the ast is grepped' do
@@ -518,7 +531,7 @@ module Arel
assert_equal 'bar', join.right
end
- it 'should create join nodes with a klass' do
+ it 'should create join nodes with a full outer join klass' do
relation = Arel::SelectManager.new Table.engine
join = relation.create_join 'foo', 'bar', Arel::Nodes::FullOuterJoin
assert_kind_of Arel::Nodes::FullOuterJoin, join
@@ -526,7 +539,7 @@ module Arel
assert_equal 'bar', join.right
end
- it 'should create join nodes with a klass' do
+ it 'should create join nodes with a outer join klass' do
relation = Arel::SelectManager.new Table.engine
join = relation.create_join 'foo', 'bar', Arel::Nodes::OuterJoin
assert_kind_of Arel::Nodes::OuterJoin, join
@@ -534,7 +547,7 @@ module Arel
assert_equal 'bar', join.right
end
- it 'should create join nodes with a klass' do
+ it 'should create join nodes with a right outer join klass' do
relation = Arel::SelectManager.new Table.engine
join = relation.create_join 'foo', 'bar', Arel::Nodes::RightOuterJoin
assert_kind_of Arel::Nodes::RightOuterJoin, join
@@ -602,7 +615,8 @@ module Arel
end
describe 'joins' do
- it 'returns join sql' do
+
+ it 'returns inner join sql' do
table = Table.new :users
aliaz = table.alias
manager = Arel::SelectManager.new Table.engine
@@ -637,6 +651,22 @@ module Arel
}
end
+ it "joins itself" do
+ left = Table.new :users
+ right = left.alias
+ predicate = left[:id].eq(right[:id])
+
+ mgr = left.join(right)
+ mgr.project Nodes::SqlLiteral.new('*')
+ mgr.on(predicate).must_equal mgr
+
+ mgr.to_sql.must_be_like %{
+ SELECT * FROM "users"
+ INNER JOIN "users" "users_2"
+ ON "users"."id" = "users_2"."id"
+ }
+ end
+
it 'returns string join sql' do
manager = Arel::SelectManager.new Table.engine
manager.from Nodes::StringJoin.new(Nodes.build_quoted('hello'))
@@ -702,6 +732,47 @@ module Arel
}
end
+ it 'takes an order with multiple columns' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.from table
+ manager.window('a_window').order(table['foo'].asc, table['bar'].desc)
+ manager.to_sql.must_be_like %{
+ SELECT FROM "users" WINDOW "a_window" AS (ORDER BY "users"."foo" ASC, "users"."bar" DESC)
+ }
+ end
+
+ it 'takes a partition' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.from table
+ manager.window('a_window').partition(table['bar'])
+ manager.to_sql.must_be_like %{
+ SELECT FROM "users" WINDOW "a_window" AS (PARTITION BY "users"."bar")
+ }
+ end
+
+ it 'takes a partition and an order' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.from table
+ manager.window('a_window').partition(table['foo']).order(table['foo'].asc)
+ manager.to_sql.must_be_like %{
+ SELECT FROM "users" WINDOW "a_window" AS (PARTITION BY "users"."foo"
+ ORDER BY "users"."foo" ASC)
+ }
+ end
+
+ it 'takes a partition with multiple columns' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.from table
+ manager.window('a_window').partition(table['bar'], table['baz'])
+ manager.to_sql.must_be_like %{
+ SELECT FROM "users" WINDOW "a_window" AS (PARTITION BY "users"."bar", "users"."baz")
+ }
+ end
+
it 'takes a rows frame, unbounded preceding' do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
@@ -878,6 +949,27 @@ module Arel
end
describe 'update' do
+
+ it 'creates an update statement' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.from table
+ stmt = manager.compile_update({table[:id] => 1}, Arel::Attributes::Attribute.new(table, 'id'))
+
+ stmt.to_sql.must_be_like %{
+ UPDATE "users" SET "id" = 1
+ }
+ end
+
+ it 'takes a string' do
+ table = Table.new :users
+ manager = Arel::SelectManager.new Table.engine
+ manager.from table
+ stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
+
+ stmt.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
+ end
+
it 'copies limits' do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
@@ -906,15 +998,6 @@ module Arel
}
end
- it 'takes a string' do
- table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
- manager.from table
- stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
-
- stmt.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
- end
-
it 'copies where clauses' do
table = Table.new :users
manager = Arel::SelectManager.new Table.engine
@@ -940,19 +1023,15 @@ module Arel
}
end
- it 'executes an update statement' do
- table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
- manager.from table
- stmt = manager.compile_update({table[:id] => 1}, Arel::Attributes::Attribute.new(table, 'id'))
-
- stmt.to_sql.must_be_like %{
- UPDATE "users" SET "id" = 1
- }
- end
end
describe 'project' do
+ it "takes sql literals" do
+ manager = Arel::SelectManager.new Table.engine
+ manager.project Nodes::SqlLiteral.new '*'
+ manager.to_sql.must_be_like %{ SELECT * }
+ end
+
it 'takes multiple args' do
manager = Arel::SelectManager.new Table.engine
manager.project Nodes::SqlLiteral.new('foo'),
@@ -966,11 +1045,6 @@ module Arel
manager.to_sql.must_be_like %{ SELECT * }
end
- it "takes sql literals" do
- manager = Arel::SelectManager.new Table.engine
- manager.project Nodes::SqlLiteral.new '*'
- manager.to_sql.must_be_like %{ SELECT * }
- end
end
describe 'projections' do
@@ -1042,24 +1116,6 @@ module Arel
end
end
- describe "join" do
- it "joins itself" do
- left = Table.new :users
- right = left.alias
- predicate = left[:id].eq(right[:id])
-
- mgr = left.join(right)
- mgr.project Nodes::SqlLiteral.new('*')
- mgr.on(predicate).must_equal mgr
-
- mgr.to_sql.must_be_like %{
- SELECT * FROM "users"
- INNER JOIN "users" "users_2"
- ON "users"."id" = "users_2"."id"
- }
- end
- end
-
describe 'from' do
it "makes sql" do
table = Table.new :users