aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/attributes/test_attribute.rb290
-rw-r--r--test/collectors/test_bind_collector.rb10
-rw-r--r--test/collectors/test_sql_string.rb4
-rw-r--r--test/helper.rb2
-rw-r--r--test/nodes/test_binary.rb26
-rw-r--r--test/nodes/test_bind_param.rb15
-rw-r--r--test/nodes/test_select_core.rb8
-rw-r--r--test/nodes/test_sql_literal.rb2
-rw-r--r--test/nodes/test_sum.rb9
-rw-r--r--test/nodes/test_table_alias.rb16
-rw-r--r--test/test_delete_manager.rb18
-rw-r--r--test/test_insert_manager.rb32
-rw-r--r--test/test_select_manager.rb270
-rw-r--r--test/test_table.rb50
-rw-r--r--test/test_update_manager.rb28
-rw-r--r--test/visitors/test_bind_visitor.rb6
-rw-r--r--test/visitors/test_depth_first.rb5
-rw-r--r--test/visitors/test_dot.rb1
-rw-r--r--test/visitors/test_mssql.rb28
-rw-r--r--test/visitors/test_oracle.rb17
-rw-r--r--test/visitors/test_oracle12.rb47
-rw-r--r--test/visitors/test_postgres.rb81
-rw-r--r--test/visitors/test_to_sql.rb64
23 files changed, 754 insertions, 275 deletions
diff --git a/test/attributes/test_attribute.rb b/test/attributes/test_attribute.rb
index 768df23d4d..4e55069df4 100644
--- a/test/attributes/test_attribute.rb
+++ b/test/attributes/test_attribute.rb
@@ -1,4 +1,5 @@
require 'helper'
+require 'ostruct'
module Arel
module Attributes
@@ -557,15 +558,155 @@ module Arel
end
end
+ describe 'with a range' do
+ it 'can be constructed with a standard range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(1..3)
+
+ node.must_equal Nodes::Between.new(
+ attribute,
+ Nodes::And.new([
+ Nodes::Casted.new(1, attribute),
+ Nodes::Casted.new(3, attribute)
+ ])
+ )
+ end
+
+ it 'can be constructed with a range starting from -Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(-::Float::INFINITY..3)
+
+ node.must_equal Nodes::LessThanOrEqual.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ end
+
+ it 'can be constructed with a quoted range starting from -Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(quoted_range(-::Float::INFINITY, 3, false))
+
+ node.must_equal Nodes::LessThanOrEqual.new(
+ attribute,
+ Nodes::Quoted.new(3)
+ )
+ end
+
+ it 'can be constructed with an exclusive range starting from -Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(-::Float::INFINITY...3)
+
+ node.must_equal Nodes::LessThan.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ end
+
+ it 'can be constructed with a quoted exclusive range starting from -Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(quoted_range(-::Float::INFINITY, 3, true))
+
+ node.must_equal Nodes::LessThan.new(
+ attribute,
+ Nodes::Quoted.new(3)
+ )
+ end
+
+ it 'can be constructed with an infinite range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(-::Float::INFINITY..::Float::INFINITY)
+
+ node.must_equal Nodes::NotIn.new(attribute, [])
+ end
+
+ it 'can be constructed with a quoted infinite range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(quoted_range(-::Float::INFINITY, ::Float::INFINITY, false))
+
+ node.must_equal Nodes::NotIn.new(attribute, [])
+ end
+
+
+ it 'can be constructed with a range ending at Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(0..::Float::INFINITY)
+
+ node.must_equal Nodes::GreaterThanOrEqual.new(
+ attribute,
+ Nodes::Casted.new(0, attribute)
+ )
+ end
+
+ it 'can be constructed with a quoted range ending at Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(quoted_range(0, ::Float::INFINITY, false))
+
+ node.must_equal Nodes::GreaterThanOrEqual.new(
+ attribute,
+ Nodes::Quoted.new(0)
+ )
+ end
+
+ it 'can be constructed with an exclusive range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.between(0...3)
+
+ node.must_equal Nodes::And.new([
+ Nodes::GreaterThanOrEqual.new(
+ attribute,
+ Nodes::Casted.new(0, attribute)
+ ),
+ Nodes::LessThan.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ ])
+ end
+
+ def quoted_range(begin_val, end_val, exclude)
+ OpenStruct.new(
+ begin: Nodes::Quoted.new(begin_val),
+ end: Nodes::Quoted.new(end_val),
+ exclude_end?: exclude,
+ )
+ end
+ end
+
describe '#in' do
+ it 'can be constructed with a subquery' do
+ relation = Table.new(:users)
+ mgr = relation.project relation[:id]
+ mgr.where relation[:name].does_not_match_all(['%chunky%','%bacon%'])
+ attribute = Attribute.new nil, nil
+
+ node = attribute.in(mgr)
+
+ node.must_equal Nodes::In.new(attribute, mgr.ast)
+ end
+
it 'can be constructed with a list' do
+ attribute = Attribute.new nil, nil
+ node = attribute.in([1, 2, 3])
+
+ node.must_equal Nodes::In.new(
+ attribute,
+ [
+ Nodes::Casted.new(1, attribute),
+ Nodes::Casted.new(2, attribute),
+ Nodes::Casted.new(3, attribute),
+ ]
+ )
end
- it 'should return an in node' do
+ it 'can be constructed with a random object' do
attribute = Attribute.new nil, nil
- node = Nodes::In.new attribute, [1,2,3]
- node.left.must_equal attribute
- node.right.must_equal [1, 2, 3]
+ random_object = Object.new
+ node = attribute.in(random_object)
+
+ node.must_equal Nodes::In.new(
+ attribute,
+ Nodes::Casted.new(random_object, attribute)
+ )
end
it 'should generate IN in sql' do
@@ -610,13 +751,112 @@ module Arel
end
end
+ describe 'with a range' do
+ it 'can be constructed with a standard range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_between(1..3)
+
+ node.must_equal Nodes::Grouping.new(Nodes::Or.new(
+ Nodes::LessThan.new(
+ attribute,
+ Nodes::Casted.new(1, attribute)
+ ),
+ Nodes::GreaterThan.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ ))
+ end
+
+ it 'can be constructed with a range starting from -Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_between(-::Float::INFINITY..3)
+
+ node.must_equal Nodes::GreaterThan.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ end
+
+ it 'can be constructed with an exclusive range starting from -Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_between(-::Float::INFINITY...3)
+
+ node.must_equal Nodes::GreaterThanOrEqual.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ end
+
+ it 'can be constructed with an infinite range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_between(-::Float::INFINITY..::Float::INFINITY)
+
+ node.must_equal Nodes::In.new(attribute, [])
+ end
+
+ it 'can be constructed with a range ending at Infinity' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_between(0..::Float::INFINITY)
+
+ node.must_equal Nodes::LessThan.new(
+ attribute,
+ Nodes::Casted.new(0, attribute)
+ )
+ end
+
+ it 'can be constructed with an exclusive range' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_between(0...3)
+
+ node.must_equal Nodes::Grouping.new(Nodes::Or.new(
+ Nodes::LessThan.new(
+ attribute,
+ Nodes::Casted.new(0, attribute)
+ ),
+ Nodes::GreaterThanOrEqual.new(
+ attribute,
+ Nodes::Casted.new(3, attribute)
+ )
+ ))
+ end
+ end
+
describe '#not_in' do
+ it 'can be constructed with a subquery' do
+ relation = Table.new(:users)
+ mgr = relation.project relation[:id]
+ mgr.where relation[:name].does_not_match_all(['%chunky%','%bacon%'])
+ attribute = Attribute.new nil, nil
+
+ node = attribute.not_in(mgr)
+
+ node.must_equal Nodes::NotIn.new(attribute, mgr.ast)
+ end
+
+ it 'can be constructed with a list' do
+ attribute = Attribute.new nil, nil
+ node = attribute.not_in([1, 2, 3])
+
+ node.must_equal Nodes::NotIn.new(
+ attribute,
+ [
+ Nodes::Casted.new(1, attribute),
+ Nodes::Casted.new(2, attribute),
+ Nodes::Casted.new(3, attribute),
+ ]
+ )
+ end
- it 'should return a NotIn node' do
+ it 'can be constructed with a random object' do
attribute = Attribute.new nil, nil
- node = Nodes::NotIn.new attribute, [1,2,3]
- node.left.must_equal attribute
- node.right.must_equal [1, 2, 3]
+ random_object = Object.new
+ node = attribute.not_in(random_object)
+
+ node.must_equal Nodes::NotIn.new(
+ attribute,
+ Nodes::Casted.new(random_object, attribute)
+ )
end
it 'should generate NOT IN in sql' do
@@ -719,5 +959,39 @@ module Arel
end
end
end
+
+ describe 'type casting' do
+ it 'does not type cast by default' do
+ table = Table.new(:foo)
+ condition = table["id"].eq("1")
+
+ refute table.able_to_type_cast?
+ condition.to_sql.must_equal %("foo"."id" = '1')
+ end
+
+ it 'type casts when given an explicit caster' do
+ fake_caster = Object.new
+ def fake_caster.type_cast_for_database(attr_name, value)
+ if attr_name == "id"
+ value.to_i
+ else
+ value
+ end
+ end
+ table = Table.new(:foo, type_caster: fake_caster)
+ condition = table["id"].eq("1").and(table["other_id"].eq("2"))
+
+ assert table.able_to_type_cast?
+ condition.to_sql.must_equal %("foo"."id" = 1 AND "foo"."other_id" = '2')
+ end
+
+ it 'falls back to using the connection adapter for type casting' do
+ table = Table.new(:users)
+ condition = table["id"].eq("1")
+
+ refute table.able_to_type_cast?
+ condition.to_sql.must_equal %("users"."id" = 1)
+ end
+ end
end
end
diff --git a/test/collectors/test_bind_collector.rb b/test/collectors/test_bind_collector.rb
index 60532f061c..fc7df2fc45 100644
--- a/test/collectors/test_bind_collector.rb
+++ b/test/collectors/test_bind_collector.rb
@@ -20,21 +20,21 @@ module Arel
def ast_with_binds bv
table = Table.new(:users)
- manager = Arel::SelectManager.new Table.engine, table
+ manager = Arel::SelectManager.new table
manager.where(table[:age].eq(bv))
manager.where(table[:name].eq(bv))
manager.ast
end
def test_leaves_binds
- node = Nodes::BindParam.new 'omg'
+ node = Nodes::BindParam.new
list = compile node
assert_equal node, list.first
assert_equal node.class, list.first.class
end
def test_adds_strings
- bv = Nodes::BindParam.new('?')
+ bv = Nodes::BindParam.new
list = compile ast_with_binds bv
assert_operator list.length, :>, 0
assert_equal bv, list.grep(Nodes::BindParam).first
@@ -42,7 +42,7 @@ module Arel
end
def test_substitute_binds
- bv = Nodes::BindParam.new('?')
+ bv = Nodes::BindParam.new
collector = collect ast_with_binds bv
values = collector.value
@@ -59,7 +59,7 @@ module Arel
end
def test_compile
- bv = Nodes::BindParam.new('?')
+ bv = Nodes::BindParam.new
collector = collect ast_with_binds bv
sql = collector.compile ["hello", "world"]
diff --git a/test/collectors/test_sql_string.rb b/test/collectors/test_sql_string.rb
index 6d2e23151b..37a9e41f71 100644
--- a/test/collectors/test_sql_string.rb
+++ b/test/collectors/test_sql_string.rb
@@ -20,14 +20,14 @@ module Arel
def ast_with_binds bv
table = Table.new(:users)
- manager = Arel::SelectManager.new Table.engine, table
+ manager = Arel::SelectManager.new table
manager.where(table[:age].eq(bv))
manager.where(table[:name].eq(bv))
manager.ast
end
def test_compile
- bv = Nodes::BindParam.new('?')
+ bv = Nodes::BindParam.new
collector = collect ast_with_binds bv
sql = collector.compile ["hello", "world"]
diff --git a/test/helper.rb b/test/helper.rb
index 6e8ac836fc..87f5756d24 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -6,6 +6,8 @@ require 'arel'
require 'support/fake_record'
Arel::Table.engine = FakeRecord::Base.new
+$arel_silence_type_casting_deprecation = true
+
class Object
def must_be_like other
gsub(/\s+/, ' ').strip.must_equal other.gsub(/\s+/, ' ').strip
diff --git a/test/nodes/test_binary.rb b/test/nodes/test_binary.rb
new file mode 100644
index 0000000000..7e25a21151
--- /dev/null
+++ b/test/nodes/test_binary.rb
@@ -0,0 +1,26 @@
+require 'helper'
+require 'set'
+
+module Arel
+ module Nodes
+ describe 'Binary' do
+ describe '#hash' do
+ it 'generates a hash based on its value' do
+ eq = Equality.new('foo', 'bar')
+ eq2 = Equality.new('foo', 'bar')
+ eq3 = Equality.new('bar', 'baz')
+
+ assert_equal eq.hash, eq2.hash
+ refute_equal eq.hash, eq3.hash
+ end
+
+ it 'generates a hash specific to its class' do
+ eq = Equality.new('foo', 'bar')
+ neq = NotEqual.new('foo', 'bar')
+
+ refute_equal eq.hash, neq.hash
+ end
+ end
+ end
+ end
+end
diff --git a/test/nodes/test_bind_param.rb b/test/nodes/test_bind_param.rb
new file mode 100644
index 0000000000..ea008f4c99
--- /dev/null
+++ b/test/nodes/test_bind_param.rb
@@ -0,0 +1,15 @@
+require 'helper'
+
+module Arel
+ module Nodes
+ describe 'BindParam' do
+ it 'is equal to other bind params' do
+ BindParam.new.must_equal(BindParam.new)
+ end
+
+ it 'is not equal to other nodes' do
+ BindParam.new.wont_equal(Node.new)
+ end
+ end
+ end
+end
diff --git a/test/nodes/test_select_core.rb b/test/nodes/test_select_core.rb
index ca4f070444..4114bcf4ff 100644
--- a/test/nodes/test_select_core.rb
+++ b/test/nodes/test_select_core.rb
@@ -34,14 +34,14 @@ module Arel
core1.wheres = %w[g h i]
core1.groups = %w[j k l]
core1.windows = %w[m n o]
- core1.having = %w[p q r]
+ core1.havings = %w[p q r]
core2 = SelectCore.new
core2.froms = %w[a b c]
core2.projections = %w[d e f]
core2.wheres = %w[g h i]
core2.groups = %w[j k l]
core2.windows = %w[m n o]
- core2.having = %w[p q r]
+ core2.havings = %w[p q r]
array = [core1, core2]
assert_equal 1, array.uniq.size
end
@@ -53,14 +53,14 @@ module Arel
core1.wheres = %w[g h i]
core1.groups = %w[j k l]
core1.windows = %w[m n o]
- core1.having = %w[p q r]
+ core1.havings = %w[p q r]
core2 = SelectCore.new
core2.froms = %w[a b c]
core2.projections = %w[d e f]
core2.wheres = %w[g h i]
core2.groups = %w[j k l]
core2.windows = %w[m n o]
- core2.having = %w[l o l]
+ core2.havings = %w[l o l]
array = [core1, core2]
assert_equal 2, array.uniq.size
end
diff --git a/test/nodes/test_sql_literal.rb b/test/nodes/test_sql_literal.rb
index ed602cc47d..c09e5882d5 100644
--- a/test/nodes/test_sql_literal.rb
+++ b/test/nodes/test_sql_literal.rb
@@ -56,7 +56,7 @@ module Arel
end
describe 'grouped "and" equality' do
- it 'makes a grouping node with an or node' do
+ it 'makes a grouping node with an and node' do
node = SqlLiteral.new('foo').eq_all([1,2])
compile(node).must_be_like %{ (foo = 1 AND foo = 2) }
end
diff --git a/test/nodes/test_sum.rb b/test/nodes/test_sum.rb
index d65cd31d4b..d387e7f9ef 100644
--- a/test/nodes/test_sum.rb
+++ b/test/nodes/test_sum.rb
@@ -21,4 +21,13 @@ describe Arel::Nodes::Sum do
assert_equal 2, array.uniq.size
end
end
+
+ describe 'order' do
+ it 'should order the sum' do
+ table = Arel::Table.new :users
+ table[:id].sum.desc.to_sql.must_be_like %{
+ SUM("users"."id") DESC
+ }
+ end
+ end
end
diff --git a/test/nodes/test_table_alias.rb b/test/nodes/test_table_alias.rb
index 4aafd12b79..57c9a42fc6 100644
--- a/test/nodes/test_table_alias.rb
+++ b/test/nodes/test_table_alias.rb
@@ -4,28 +4,20 @@ require 'ostruct'
module Arel
module Nodes
describe 'table alias' do
- it 'has an #engine which delegates to the relation' do
- engine = 'vroom'
- relation = Table.new(:users, engine)
-
- node = TableAlias.new relation, :foo
- node.engine.must_equal engine
- end
-
describe 'equality' do
it 'is equal with equal ivars' do
- relation1 = Table.new(:users, 'vroom')
+ relation1 = Table.new(:users)
node1 = TableAlias.new relation1, :foo
- relation2 = Table.new(:users, 'vroom')
+ relation2 = Table.new(:users)
node2 = TableAlias.new relation2, :foo
array = [node1, node2]
assert_equal 1, array.uniq.size
end
it 'is not equal with different ivars' do
- relation1 = Table.new(:users, 'vroom')
+ relation1 = Table.new(:users)
node1 = TableAlias.new relation1, :foo
- relation2 = Table.new(:users, 'vroom')
+ relation2 = Table.new(:users)
node2 = TableAlias.new relation2, :bar
array = [node1, node2]
assert_equal 2, array.uniq.size
diff --git a/test/test_delete_manager.rb b/test/test_delete_manager.rb
index fd12c5acd2..ece2389d88 100644
--- a/test/test_delete_manager.rb
+++ b/test/test_delete_manager.rb
@@ -4,21 +4,29 @@ module Arel
describe 'delete manager' do
describe 'new' do
it 'takes an engine' do
- Arel::DeleteManager.new Table.engine
+ Arel::DeleteManager.new
end
end
+ it 'handles limit properly' do
+ table = Table.new(:users)
+ dm = Arel::DeleteManager.new
+ dm.take 10
+ dm.from table
+ assert_match(/LIMIT 10/, dm.to_sql)
+ end
+
describe 'from' do
it 'uses from' do
table = Table.new(:users)
- dm = Arel::DeleteManager.new Table.engine
+ dm = Arel::DeleteManager.new
dm.from table
dm.to_sql.must_be_like %{ DELETE FROM "users" }
end
it 'chains' do
table = Table.new(:users)
- dm = Arel::DeleteManager.new Table.engine
+ dm = Arel::DeleteManager.new
dm.from(table).must_equal dm
end
end
@@ -26,7 +34,7 @@ module Arel
describe 'where' do
it 'uses where values' do
table = Table.new(:users)
- dm = Arel::DeleteManager.new Table.engine
+ dm = Arel::DeleteManager.new
dm.from table
dm.where table[:id].eq(10)
dm.to_sql.must_be_like %{ DELETE FROM "users" WHERE "users"."id" = 10}
@@ -34,7 +42,7 @@ module Arel
it 'chains' do
table = Table.new(:users)
- dm = Arel::DeleteManager.new Table.engine
+ dm = Arel::DeleteManager.new
dm.where(table[:id].eq(10)).must_equal dm
end
end
diff --git a/test/test_insert_manager.rb b/test/test_insert_manager.rb
index 9cfd01262b..4289b0fa8c 100644
--- a/test/test_insert_manager.rb
+++ b/test/test_insert_manager.rb
@@ -4,13 +4,13 @@ module Arel
describe 'insert manager' do
describe 'new' do
it 'takes an engine' do
- Arel::InsertManager.new Table.engine
+ Arel::InsertManager.new
end
end
describe 'insert' do
it 'can create a Values node' do
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
values = manager.create_values %w{ a b }, %w{ c d }
assert_kind_of Arel::Nodes::Values, values
@@ -19,7 +19,7 @@ module Arel
end
it 'allows sql literals' do
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into Table.new(:users)
manager.values = manager.create_values [Arel.sql('*')], %w{ a }
manager.to_sql.must_be_like %{
@@ -29,7 +29,7 @@ module Arel
it "inserts false" do
table = Table.new(:users)
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.insert [[table[:bool], false]]
manager.to_sql.must_be_like %{
@@ -39,7 +39,7 @@ module Arel
it "inserts null" do
table = Table.new(:users)
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.insert [[table[:id], nil]]
manager.to_sql.must_be_like %{
INSERT INTO "users" ("id") VALUES (NULL)
@@ -48,7 +48,7 @@ module Arel
it "inserts time" do
table = Table.new(:users)
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
time = Time.now
attribute = table[:created_at]
@@ -61,7 +61,7 @@ module Arel
it 'takes a list of lists' do
table = Table.new(:users)
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into table
manager.insert [[table[:id], 1], [table[:name], 'aaron']]
manager.to_sql.must_be_like %{
@@ -71,7 +71,7 @@ module Arel
it 'defaults the table' do
table = Table.new(:users)
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.insert [[table[:id], 1], [table[:name], 'aaron']]
manager.to_sql.must_be_like %{
INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
@@ -80,7 +80,7 @@ module Arel
it 'noop for empty list' do
table = Table.new(:users)
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.insert [[table[:id], 1]]
manager.insert []
manager.to_sql.must_be_like %{
@@ -91,13 +91,13 @@ module Arel
describe 'into' do
it 'takes a Table and chains' do
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into(Table.new(:users)).must_equal manager
end
it 'converts to sql' do
table = Table.new :users
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into table
manager.to_sql.must_be_like %{
INSERT INTO "users"
@@ -108,7 +108,7 @@ module Arel
describe 'columns' do
it "converts to sql" do
table = Table.new :users
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into table
manager.columns << table[:id]
manager.to_sql.must_be_like %{
@@ -120,7 +120,7 @@ module Arel
describe "values" do
it "converts to sql" do
table = Table.new :users
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into table
manager.values = Nodes::Values.new [1]
@@ -133,7 +133,7 @@ module Arel
describe "combo" do
it "combines columns and values list in order" do
table = Table.new :users
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into table
manager.values = Nodes::Values.new [1, 'aaron']
@@ -150,10 +150,10 @@ module Arel
it "accepts a select query in place of a VALUES clause" do
table = Table.new :users
- manager = Arel::InsertManager.new Table.engine
+ manager = Arel::InsertManager.new
manager.into table
- select = Arel::SelectManager.new Table.engine
+ select = Arel::SelectManager.new
select.project Arel.sql('1')
select.project Arel.sql('"aaron"')
diff --git a/test/test_select_manager.rb b/test/test_select_manager.rb
index 1ffb56fd9f..8425cee031 100644
--- a/test/test_select_manager.rb
+++ b/test/test_select_manager.rb
@@ -4,13 +4,13 @@ module Arel
describe 'select manager' do
def test_join_sources
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.join_sources << Arel::Nodes::StringJoin.new(Nodes.build_quoted('foo'))
assert_equal "SELECT FROM 'foo'", manager.to_sql
end
def test_manager_stores_bind_values
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
assert_equal [], manager.bind_values
manager.bind_values = [1]
assert_equal [1], manager.bind_values
@@ -20,7 +20,7 @@ module Arel
describe 'project' do
it 'accepts symbols as sql literals' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project :id
manager.from table
manager.to_sql.must_be_like %{
@@ -32,7 +32,7 @@ module Arel
describe 'order' do
it 'accepts symbols' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Nodes::SqlLiteral.new '*'
manager.from table
manager.order :foo
@@ -43,7 +43,7 @@ module Arel
describe 'group' do
it 'takes a symbol' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.group :foo
manager.to_sql.must_be_like %{ SELECT FROM "users" GROUP BY foo }
@@ -52,7 +52,7 @@ module Arel
describe 'as' do
it 'makes an AS node by grouping the AST' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
as = manager.as(Arel.sql('foo'))
assert_kind_of Arel::Nodes::Grouping, as.left
assert_equal manager.ast, as.left.expr
@@ -60,18 +60,18 @@ module Arel
end
it 'converts right to SqlLiteral if a string' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
as = manager.as('foo')
assert_kind_of Arel::Nodes::SqlLiteral, as.right
end
it 'can make a subselect' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Arel.star
manager.from Arel.sql('zomg')
as = manager.as(Arel.sql('foo'))
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Arel.sql('name')
manager.from as
manager.to_sql.must_be_like "SELECT name FROM (SELECT * FROM zomg) foo"
@@ -81,7 +81,7 @@ module Arel
describe 'from' do
it 'ignores strings when table of same name exists' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.from 'users'
@@ -91,9 +91,9 @@ module Arel
it 'should support any ast' do
table = Table.new :users
- manager1 = Arel::SelectManager.new Table.engine
+ manager1 = Arel::SelectManager.new
- manager2 = Arel::SelectManager.new Table.engine
+ manager2 = Arel::SelectManager.new
manager2.project(Arel.sql('*'))
manager2.from table
@@ -110,23 +110,23 @@ module Arel
describe 'having' do
it 'converts strings to SQLLiterals' do
table = Table.new :users
- mgr = table.from table
- mgr.having 'foo'
+ mgr = table.from
+ mgr.having Arel.sql('foo')
mgr.to_sql.must_be_like %{ SELECT FROM "users" HAVING foo }
end
it 'can have multiple items specified separately' do
table = Table.new :users
- mgr = table.from table
- mgr.having 'foo'
- mgr.having 'bar'
+ mgr = table.from
+ mgr.having Arel.sql('foo')
+ mgr.having Arel.sql('bar')
mgr.to_sql.must_be_like %{ SELECT FROM "users" HAVING foo AND bar }
end
- it 'can have multiple items specified together' do
+ it 'can receive any node' do
table = Table.new :users
- mgr = table.from table
- mgr.having 'foo', 'bar'
+ mgr = table.from
+ mgr.having Arel::Nodes::And.new([Arel.sql('foo'), Arel.sql('bar')])
mgr.to_sql.must_be_like %{ SELECT FROM "users" HAVING foo AND bar }
end
end
@@ -135,7 +135,7 @@ module Arel
it 'converts to sqlliterals' do
table = Table.new :users
right = table.alias
- mgr = table.from table
+ mgr = table.from
mgr.join(right).on("omg")
mgr.to_sql.must_be_like %{ SELECT FROM "users" INNER JOIN "users" "users_2" ON omg }
end
@@ -143,7 +143,7 @@ module Arel
it 'converts to sqlliterals with multiple items' do
table = Table.new :users
right = table.alias
- mgr = table.from table
+ mgr = table.from
mgr.join(right).on("omg", "123")
mgr.to_sql.must_be_like %{ SELECT FROM "users" INNER JOIN "users" "users_2" ON omg AND 123 }
end
@@ -153,7 +153,7 @@ module Arel
describe 'clone' do
it 'creates new cores' do
table = Table.new :users, :as => 'foo'
- mgr = table.from table
+ mgr = table.from
m2 = mgr.clone
m2.project "foo"
mgr.to_sql.wont_equal m2.to_sql
@@ -161,7 +161,7 @@ module Arel
it 'makes updates to the correct copy' do
table = Table.new :users, :as => 'foo'
- mgr = table.from table
+ mgr = table.from
m2 = mgr.clone
m3 = m2.clone
m2.project "foo"
@@ -173,7 +173,7 @@ module Arel
describe 'initialize' do
it 'uses alias in sql' do
table = Table.new :users, :as => 'foo'
- mgr = table.from table
+ mgr = table.from
mgr.skip 10
mgr.to_sql.must_be_like %{ SELECT FROM "users" "foo" OFFSET 10 }
end
@@ -182,14 +182,14 @@ module Arel
describe 'skip' do
it 'should add an offset' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.skip 10
mgr.to_sql.must_be_like %{ SELECT FROM "users" OFFSET 10 }
end
it 'should chain' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.skip(10).to_sql.must_be_like %{ SELECT FROM "users" OFFSET 10 }
end
end
@@ -197,14 +197,14 @@ module Arel
describe 'offset' do
it 'should add an offset' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.offset = 10
mgr.to_sql.must_be_like %{ SELECT FROM "users" OFFSET 10 }
end
it 'should remove an offset' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.offset = 10
mgr.to_sql.must_be_like %{ SELECT FROM "users" OFFSET 10 }
@@ -214,7 +214,7 @@ module Arel
it 'should return the offset' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.offset = 10
assert_equal 10, mgr.offset
end
@@ -223,7 +223,7 @@ module Arel
describe 'exists' do
it 'should create an exists clause' do
table = Table.new(:users)
- manager = Arel::SelectManager.new Table.engine, table
+ manager = Arel::SelectManager.new table
manager.project Nodes::SqlLiteral.new '*'
m2 = Arel::SelectManager.new(manager.engine)
m2.project manager.exists
@@ -232,7 +232,7 @@ module Arel
it 'can be aliased' do
table = Table.new(:users)
- manager = Arel::SelectManager.new Table.engine, table
+ manager = Arel::SelectManager.new table
manager.project Nodes::SqlLiteral.new '*'
m2 = Arel::SelectManager.new(manager.engine)
m2.project manager.exists.as('foo')
@@ -243,11 +243,11 @@ module Arel
describe 'union' do
before do
table = Table.new :users
- @m1 = Arel::SelectManager.new Table.engine, table
+ @m1 = Arel::SelectManager.new table
@m1.project Arel.star
@m1.where(table[:age].lt(18))
- @m2 = Arel::SelectManager.new Table.engine, table
+ @m2 = Arel::SelectManager.new table
@m2.project Arel.star
@m2.where(table[:age].gt(99))
@@ -278,11 +278,11 @@ module Arel
describe 'intersect' do
before do
table = Table.new :users
- @m1 = Arel::SelectManager.new Table.engine, table
+ @m1 = Arel::SelectManager.new table
@m1.project Arel.star
@m1.where(table[:age].gt(18))
- @m2 = Arel::SelectManager.new Table.engine, table
+ @m2 = Arel::SelectManager.new table
@m2.project Arel.star
@m2.where(table[:age].lt(99))
@@ -305,15 +305,13 @@ module Arel
describe 'except' do
before do
table = Table.new :users
- @m1 = Arel::SelectManager.new Table.engine, table
+ @m1 = Arel::SelectManager.new table
@m1.project Arel.star
- @m1.where(table[:age].in(18..60))
+ @m1.where(table[:age].between(18..60))
- @m2 = Arel::SelectManager.new Table.engine, table
+ @m2 = Arel::SelectManager.new table
@m2.project Arel.star
- @m2.where(table[:age].in(40..99))
-
-
+ @m2.where(table[:age].between(40..99))
end
it 'should except two managers' do
@@ -353,17 +351,17 @@ module Arel
replies = Table.new(:replies)
replies_id = replies[:id]
- recursive_term = Arel::SelectManager.new Table.engine
+ recursive_term = Arel::SelectManager.new
recursive_term.from(comments).project(comments_id, comments_parent_id).where(comments_id.eq 42)
- non_recursive_term = Arel::SelectManager.new Table.engine
+ non_recursive_term = Arel::SelectManager.new
non_recursive_term.from(comments).project(comments_id, comments_parent_id).join(replies).on(comments_parent_id.eq replies_id)
union = recursive_term.union(non_recursive_term)
as_statement = Arel::Nodes::As.new replies, union
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.with(:recursive, as_statement).from(replies).project(Arel.star)
sql = manager.to_sql
@@ -381,13 +379,13 @@ module Arel
describe 'ast' do
it 'should return the ast' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
assert mgr.ast
end
it 'should allow orders to work when the ast is grepped' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.project Arel.sql '*'
mgr.from table
mgr.orders << Arel::Nodes::Ascending.new(Arel.sql('foo'))
@@ -398,7 +396,7 @@ module Arel
describe 'taken' do
it 'should return limit' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.take 10
manager.taken.must_equal 10
end
@@ -408,7 +406,7 @@ module Arel
# This should fail on other databases
it 'adds a lock node' do
table = Table.new :users
- mgr = table.from table
+ mgr = table.from
mgr.lock.to_sql.must_be_like %{ SELECT FROM "users" FOR UPDATE }
end
end
@@ -416,7 +414,7 @@ module Arel
describe 'orders' do
it 'returns order clauses' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
order = table[:id]
manager.order table[:id]
manager.orders.must_equal [order]
@@ -426,7 +424,7 @@ module Arel
describe 'order' do
it 'generates order clauses' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Nodes::SqlLiteral.new '*'
manager.from table
manager.order table[:id]
@@ -438,7 +436,7 @@ module Arel
# FIXME: I would like to deprecate this
it 'takes *args' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Nodes::SqlLiteral.new '*'
manager.from table
manager.order table[:id], table[:name]
@@ -449,13 +447,13 @@ module Arel
it 'chains' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.order(table[:id]).must_equal manager
end
it 'has order attributes' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Nodes::SqlLiteral.new '*'
manager.from table
manager.order table[:id].desc
@@ -470,7 +468,7 @@ module Arel
left = Table.new :users
right = left.alias
predicate = left[:id].eq(right[:id])
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from left
manager.join(right).on(predicate, predicate)
@@ -486,7 +484,7 @@ module Arel
left = Table.new :users
right = left.alias
predicate = left[:id].eq(right[:id])
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from left
manager.join(right).on(
@@ -505,12 +503,12 @@ module Arel
end
it 'should hand back froms' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
assert_equal [], relation.froms
end
it 'should create and nodes' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
children = ['foo', 'bar', 'baz']
clause = relation.create_and children
assert_kind_of Arel::Nodes::And, clause
@@ -518,13 +516,13 @@ module Arel
end
it 'should create insert managers' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
insert = relation.create_insert
assert_kind_of Arel::InsertManager, insert
end
it 'should create join nodes' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
join = relation.create_join 'foo', 'bar'
assert_kind_of Arel::Nodes::InnerJoin, join
assert_equal 'foo', join.left
@@ -532,7 +530,7 @@ module Arel
end
it 'should create join nodes with a full outer join klass' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
join = relation.create_join 'foo', 'bar', Arel::Nodes::FullOuterJoin
assert_kind_of Arel::Nodes::FullOuterJoin, join
assert_equal 'foo', join.left
@@ -540,7 +538,7 @@ module Arel
end
it 'should create join nodes with a outer join klass' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
join = relation.create_join 'foo', 'bar', Arel::Nodes::OuterJoin
assert_kind_of Arel::Nodes::OuterJoin, join
assert_equal 'foo', join.left
@@ -548,7 +546,7 @@ module Arel
end
it 'should create join nodes with a right outer join klass' do
- relation = Arel::SelectManager.new Table.engine
+ relation = Arel::SelectManager.new
join = relation.create_join 'foo', 'bar', Arel::Nodes::RightOuterJoin
assert_kind_of Arel::Nodes::RightOuterJoin, join
assert_equal 'foo', join.left
@@ -560,7 +558,7 @@ module Arel
left = Table.new :users
right = left.alias
predicate = left[:id].eq(right[:id])
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from left
manager.join(right).on(predicate)
@@ -575,7 +573,7 @@ module Arel
left = Table.new :users
right = left.alias
predicate = left[:id].eq(right[:id])
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from left
manager.join(right, Nodes::OuterJoin).on(predicate)
@@ -586,8 +584,38 @@ module Arel
}
end
+ it 'takes the full outer join class' do
+ left = Table.new :users
+ right = left.alias
+ predicate = left[:id].eq(right[:id])
+ manager = Arel::SelectManager.new
+
+ manager.from left
+ manager.join(right, Nodes::FullOuterJoin).on(predicate)
+ manager.to_sql.must_be_like %{
+ SELECT FROM "users"
+ FULL OUTER JOIN "users" "users_2"
+ ON "users"."id" = "users_2"."id"
+ }
+ end
+
+ it 'takes the right outer join class' do
+ left = Table.new :users
+ right = left.alias
+ predicate = left[:id].eq(right[:id])
+ manager = Arel::SelectManager.new
+
+ manager.from left
+ manager.join(right, Nodes::RightOuterJoin).on(predicate)
+ manager.to_sql.must_be_like %{
+ SELECT FROM "users"
+ RIGHT OUTER JOIN "users" "users_2"
+ ON "users"."id" = "users_2"."id"
+ }
+ end
+
it 'noops on nil' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.join(nil).must_equal manager
end
end
@@ -597,7 +625,7 @@ module Arel
left = Table.new :users
right = left.alias
predicate = left[:id].eq(right[:id])
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from left
manager.outer_join(right).on(predicate)
@@ -609,7 +637,7 @@ module Arel
end
it 'noops on nil' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.outer_join(nil).must_equal manager
end
end
@@ -619,7 +647,7 @@ module Arel
it 'returns inner join sql' do
table = Table.new :users
aliaz = table.alias
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from Nodes::InnerJoin.new(aliaz, table[:id].eq(aliaz[:id]))
assert_match 'INNER JOIN "users" "users_2" "users"."id" = "users_2"."id"',
manager.to_sql
@@ -628,7 +656,7 @@ module Arel
it 'returns outer join sql' do
table = Table.new :users
aliaz = table.alias
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from Nodes::OuterJoin.new(aliaz, table[:id].eq(aliaz[:id]))
assert_match 'LEFT OUTER JOIN "users" "users_2" "users"."id" = "users_2"."id"',
manager.to_sql
@@ -638,7 +666,7 @@ module Arel
users = Table.new :users
comments = Table.new :comments
- counts = comments.from(comments).
+ counts = comments.from.
group(comments[:user_id]).
project(
comments[:user_id].as("user_id"),
@@ -668,7 +696,7 @@ module Arel
end
it 'returns string join sql' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from Nodes::StringJoin.new(Nodes.build_quoted('hello'))
assert_match "'hello'", manager.to_sql
end
@@ -677,7 +705,7 @@ module Arel
describe 'group' do
it 'takes an attribute' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.group table[:id]
manager.to_sql.must_be_like %{
@@ -687,13 +715,13 @@ module Arel
it 'chains' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.group(table[:id]).must_equal manager
end
it 'takes multiple args' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.group table[:id], table[:name]
manager.to_sql.must_be_like %{
@@ -704,7 +732,7 @@ module Arel
# FIXME: backwards compat
it 'makes strings literals' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.group 'foo'
manager.to_sql.must_be_like %{ SELECT FROM "users" GROUP BY foo }
@@ -714,7 +742,7 @@ module Arel
describe 'window definition' do
it 'can be empty' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window')
manager.to_sql.must_be_like %{
@@ -724,7 +752,7 @@ module Arel
it 'takes an order' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').order(table['foo'].asc)
manager.to_sql.must_be_like %{
@@ -734,7 +762,7 @@ module Arel
it 'takes an order with multiple columns' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').order(table['foo'].asc, table['bar'].desc)
manager.to_sql.must_be_like %{
@@ -744,7 +772,7 @@ module Arel
it 'takes a partition' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').partition(table['bar'])
manager.to_sql.must_be_like %{
@@ -754,7 +782,7 @@ module Arel
it 'takes a partition and an order' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').partition(table['foo']).order(table['foo'].asc)
manager.to_sql.must_be_like %{
@@ -765,7 +793,7 @@ module Arel
it 'takes a partition with multiple columns' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').partition(table['bar'], table['baz'])
manager.to_sql.must_be_like %{
@@ -775,7 +803,7 @@ module Arel
it 'takes a rows frame, unbounded preceding' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').rows(Arel::Nodes::Preceding.new)
manager.to_sql.must_be_like %{
@@ -785,7 +813,7 @@ module Arel
it 'takes a rows frame, bounded preceding' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').rows(Arel::Nodes::Preceding.new(5))
manager.to_sql.must_be_like %{
@@ -795,7 +823,7 @@ module Arel
it 'takes a rows frame, unbounded following' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').rows(Arel::Nodes::Following.new)
manager.to_sql.must_be_like %{
@@ -805,7 +833,7 @@ module Arel
it 'takes a rows frame, bounded following' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').rows(Arel::Nodes::Following.new(5))
manager.to_sql.must_be_like %{
@@ -815,7 +843,7 @@ module Arel
it 'takes a rows frame, current row' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').rows(Arel::Nodes::CurrentRow.new)
manager.to_sql.must_be_like %{
@@ -825,7 +853,7 @@ module Arel
it 'takes a rows frame, between two delimiters' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
window = manager.window('a_window')
window.frame(
@@ -842,7 +870,7 @@ module Arel
it 'takes a range frame, unbounded preceding' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').range(Arel::Nodes::Preceding.new)
manager.to_sql.must_be_like %{
@@ -852,7 +880,7 @@ module Arel
it 'takes a range frame, bounded preceding' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').range(Arel::Nodes::Preceding.new(5))
manager.to_sql.must_be_like %{
@@ -862,7 +890,7 @@ module Arel
it 'takes a range frame, unbounded following' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').range(Arel::Nodes::Following.new)
manager.to_sql.must_be_like %{
@@ -872,7 +900,7 @@ module Arel
it 'takes a range frame, bounded following' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').range(Arel::Nodes::Following.new(5))
manager.to_sql.must_be_like %{
@@ -882,7 +910,7 @@ module Arel
it 'takes a range frame, current row' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.window('a_window').range(Arel::Nodes::CurrentRow.new)
manager.to_sql.must_be_like %{
@@ -892,7 +920,7 @@ module Arel
it 'takes a range frame, between two delimiters' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
window = manager.window('a_window')
window.frame(
@@ -911,7 +939,7 @@ module Arel
describe 'delete' do
it "copies from" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
stmt = manager.compile_delete
@@ -920,7 +948,7 @@ module Arel
it "copies where" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.where table[:id].eq 10
stmt = manager.compile_delete
@@ -934,7 +962,7 @@ module Arel
describe 'where_sql' do
it 'gives me back the where sql' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.where table[:id].eq 10
manager.where_sql.must_be_like %{ WHERE "users"."id" = 10 }
@@ -942,7 +970,7 @@ module Arel
it 'returns nil when there are no wheres' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.where_sql.must_be_nil
end
@@ -952,7 +980,7 @@ module Arel
it 'creates an update statement' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
stmt = manager.compile_update({table[:id] => 1}, Arel::Attributes::Attribute.new(table, 'id'))
@@ -963,7 +991,7 @@ module Arel
it 'takes a string' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
@@ -972,7 +1000,7 @@ module Arel
it 'copies limits' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.take 1
stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
@@ -986,7 +1014,7 @@ module Arel
it 'copies order' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.order :foo
stmt = manager.compile_update(Nodes::SqlLiteral.new('foo = bar'), Arel::Attributes::Attribute.new(table, 'id'))
@@ -1000,7 +1028,7 @@ module Arel
it 'copies where clauses' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.where table[:id].eq 10
manager.from table
stmt = manager.compile_update({table[:id] => 1}, Arel::Attributes::Attribute.new(table, 'id'))
@@ -1012,7 +1040,7 @@ module Arel
it 'copies where clauses when nesting is triggered' do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.where table[:foo].eq 10
manager.take 42
manager.from table
@@ -1027,20 +1055,20 @@ module Arel
describe 'project' do
it "takes sql literals" do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
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 = Arel::SelectManager.new
manager.project Nodes::SqlLiteral.new('foo'),
Nodes::SqlLiteral.new('bar')
manager.to_sql.must_be_like %{ SELECT foo, bar }
end
it 'takes strings' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project '*'
manager.to_sql.must_be_like %{ SELECT * }
end
@@ -1049,7 +1077,7 @@ module Arel
describe 'projections' do
it 'reads projections' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Arel.sql('foo'), Arel.sql('bar')
manager.projections.must_equal [Arel.sql('foo'), Arel.sql('bar')]
end
@@ -1057,7 +1085,7 @@ module Arel
describe 'projections=' do
it 'overwrites projections' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.project Arel.sql('foo')
manager.projections = [Arel.sql('bar')]
manager.to_sql.must_be_like %{ SELECT bar }
@@ -1067,7 +1095,7 @@ module Arel
describe 'take' do
it "knows take" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
manager.take 1
@@ -1081,12 +1109,12 @@ module Arel
end
it "chains" do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.take(1).must_equal manager
end
it 'removes LIMIT when nil is passed' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.limit = 10
assert_match('LIMIT', manager.to_sql)
@@ -1098,7 +1126,7 @@ module Arel
describe 'where' do
it "knows where" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
manager.to_sql.must_be_like %{
@@ -1110,7 +1138,7 @@ module Arel
it "chains" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from(table)
manager.project(table['id']).where(table['id'].eq 1).must_equal manager
end
@@ -1119,7 +1147,7 @@ module Arel
describe 'from' do
it "makes sql" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from table
manager.project table['id']
@@ -1128,7 +1156,7 @@ module Arel
it "chains" do
table = Table.new :users
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.from(table).project(table['id']).must_equal manager
manager.to_sql.must_be_like 'SELECT "users"."id" FROM "users"'
end
@@ -1136,14 +1164,14 @@ module Arel
describe 'source' do
it 'returns the join source of the select core' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.source.must_equal manager.ast.cores.last.source
end
end
describe 'distinct' do
it 'sets the quantifier' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.distinct
manager.ast.cores.last.set_quantifier.class.must_equal Arel::Nodes::Distinct
@@ -1153,7 +1181,7 @@ module Arel
end
it "chains" do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
manager.distinct.must_equal manager
manager.distinct(false).must_equal manager
end
@@ -1161,7 +1189,7 @@ module Arel
describe 'distinct_on' do
it 'sets the quantifier' do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
table = Table.new :users
manager.distinct_on(table['id'])
@@ -1172,7 +1200,7 @@ module Arel
end
it "chains" do
- manager = Arel::SelectManager.new Table.engine
+ manager = Arel::SelectManager.new
table = Table.new :users
manager.distinct_on(table['id']).must_equal manager
diff --git a/test/test_table.rb b/test/test_table.rb
index 14256475ec..e8eaf901cc 100644
--- a/test/test_table.rb
+++ b/test/test_table.rb
@@ -47,12 +47,6 @@ module Arel
assert_equal "INSERT INTO \"users\" VALUES(NULL)", im.to_sql
end
- it 'should return IM from insert_manager' do
- im = @relation.insert_manager
- assert_kind_of Arel::InsertManager, im
- assert_equal im.engine, @relation.engine
- end
-
describe 'skip' do
it 'should add an offset' do
sm = @relation.skip 2
@@ -60,29 +54,6 @@ module Arel
end
end
- describe 'select_manager' do
- it 'should return an empty select manager' do
- sm = @relation.select_manager
- sm.to_sql.must_be_like 'SELECT'
- end
- end
-
- describe 'update_manager' do
- it 'should return an update manager' do
- um = @relation.update_manager
- assert_kind_of Arel::UpdateManager, um
- assert_equal um.engine, @relation.engine
- end
- end
-
- describe 'delete_manager' do
- it 'should return a delete manager' do
- dm = @relation.delete_manager
- assert_kind_of Arel::DeleteManager, dm
- assert_equal dm.engine, @relation.engine
- end
- end
-
describe 'having' do
it 'adds a having clause' do
mgr = @relation.having @relation[:id].eq(10)
@@ -149,14 +120,9 @@ module Arel
end
describe 'new' do
- it 'should accept an engine' do
- rel = Table.new :users, 'foo'
- rel.engine.must_equal 'foo'
- end
-
it 'should accept a hash' do
- rel = Table.new :users, :engine => 'foo'
- rel.engine.must_equal 'foo'
+ rel = Table.new :users, :as => 'foo'
+ rel.table_alias.must_equal 'foo'
end
it 'ignores as if it equals name' do
@@ -213,10 +179,6 @@ module Arel
@relation.table_name.must_equal 'users'
end
- it "should have an engine" do
- @relation.engine.must_equal Table.engine
- end
-
describe '[]' do
describe 'when given a Symbol' do
it "manufactures an attribute if the symbol names an attribute within the relation" do
@@ -228,10 +190,10 @@ module Arel
describe 'equality' do
it 'is equal with equal ivars' do
- relation1 = Table.new(:users, 'vroom')
+ relation1 = Table.new(:users)
relation1.aliases = %w[a b c]
relation1.table_alias = 'zomg'
- relation2 = Table.new(:users, 'vroom')
+ relation2 = Table.new(:users)
relation2.aliases = %w[a b c]
relation2.table_alias = 'zomg'
array = [relation1, relation2]
@@ -239,10 +201,10 @@ module Arel
end
it 'is not equal with different ivars' do
- relation1 = Table.new(:users, 'vroom')
+ relation1 = Table.new(:users)
relation1.aliases = %w[a b c]
relation1.table_alias = 'zomg'
- relation2 = Table.new(:users, 'vroom')
+ relation2 = Table.new(:users)
relation2.aliases = %w[x y z]
relation2.table_alias = 'zomg'
array = [relation1, relation2]
diff --git a/test/test_update_manager.rb b/test/test_update_manager.rb
index f1a019970d..f41dc46e7d 100644
--- a/test/test_update_manager.rb
+++ b/test/test_update_manager.rb
@@ -4,21 +4,21 @@ module Arel
describe 'update manager' do
describe 'new' do
it 'takes an engine' do
- Arel::UpdateManager.new Table.engine
+ Arel::UpdateManager.new
end
end
it "should not quote sql literals" do
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table table
- um.set [[table[:name], (Arel::Nodes::BindParam.new '?')]]
+ um.set [[table[:name], Arel::Nodes::BindParam.new]]
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = ? }
end
it 'handles limit properly' do
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.key = 'id'
um.take 10
um.table table
@@ -29,7 +29,7 @@ module Arel
describe 'set' do
it "updates with null" do
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table table
um.set [[table[:name], nil]]
um.to_sql.must_be_like %{ UPDATE "users" SET "name" = NULL }
@@ -37,7 +37,7 @@ module Arel
it 'takes a string' do
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table table
um.set Nodes::SqlLiteral.new "foo = bar"
um.to_sql.must_be_like %{ UPDATE "users" SET foo = bar }
@@ -45,7 +45,7 @@ module Arel
it 'takes a list of lists' do
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table table
um.set [[table[:id], 1], [table[:name], 'hello']]
um.to_sql.must_be_like %{
@@ -55,25 +55,25 @@ module Arel
it 'chains' do
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.set([[table[:id], 1], [table[:name], 'hello']]).must_equal um
end
end
describe 'table' do
it 'generates an update statement' do
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table Table.new(:users)
um.to_sql.must_be_like %{ UPDATE "users" }
end
it 'chains' do
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table(Table.new(:users)).must_equal um
end
it 'generates an update statement with joins' do
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
table = Table.new(:users)
join_source = Arel::Nodes::JoinSource.new(
@@ -89,7 +89,7 @@ module Arel
describe 'where' do
it 'generates a where clause' do
table = Table.new :users
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table table
um.where table[:id].eq(1)
um.to_sql.must_be_like %{
@@ -99,7 +99,7 @@ module Arel
it 'chains' do
table = Table.new :users
- um = Arel::UpdateManager.new Table.engine
+ um = Arel::UpdateManager.new
um.table table
um.where(table[:id].eq(1)).must_equal um
end
@@ -108,7 +108,7 @@ module Arel
describe 'key' do
before do
@table = Table.new :users
- @um = Arel::UpdateManager.new Table.engine
+ @um = Arel::UpdateManager.new
@um.key = @table[:foo]
end
diff --git a/test/visitors/test_bind_visitor.rb b/test/visitors/test_bind_visitor.rb
index 333636ed51..f0007cabbf 100644
--- a/test/visitors/test_bind_visitor.rb
+++ b/test/visitors/test_bind_visitor.rb
@@ -17,8 +17,8 @@ module Arel
# substitutes binds with values from block
def test_assignment_binds_are_substituted
table = Table.new(:users)
- um = Arel::UpdateManager.new Table.engine
- bp = Nodes::BindParam.new '?'
+ um = Arel::UpdateManager.new
+ bp = Nodes::BindParam.new
um.set [[table[:name], bp]]
visitor = Class.new(Arel::Visitors::ToSql) {
include Arel::Visitors::BindVisitor
@@ -38,7 +38,7 @@ module Arel
include Arel::Visitors::BindVisitor
}.new nil
- bp = Nodes::BindParam.new 'omg'
+ bp = Nodes::BindParam.new
called = false
visitor.accept(bp, collector) { called = true }
assert called
diff --git a/test/visitors/test_depth_first.rb b/test/visitors/test_depth_first.rb
index d50ea3e59a..3356759b7d 100644
--- a/test/visitors/test_depth_first.rb
+++ b/test/visitors/test_depth_first.rb
@@ -30,7 +30,6 @@ module Arel
Arel::Nodes::Grouping,
Arel::Nodes::Offset,
Arel::Nodes::Ordering,
- Arel::Nodes::Having,
Arel::Nodes::StringJoin,
Arel::Nodes::UnqualifiedColumn,
Arel::Nodes::Top,
@@ -206,7 +205,7 @@ module Arel
core.wheres << :c
core.groups << :d
core.windows << :e
- core.having = :f
+ core.havings << :f
@visitor.accept core
assert_equal [
@@ -216,7 +215,7 @@ module Arel
:c, core.wheres,
:d, core.groups,
:e, core.windows,
- :f,
+ :f, core.havings,
core], @collector.calls
end
diff --git a/test/visitors/test_dot.rb b/test/visitors/test_dot.rb
index 7763350f5c..4dc3c9c6c5 100644
--- a/test/visitors/test_dot.rb
+++ b/test/visitors/test_dot.rb
@@ -34,7 +34,6 @@ module Arel
Arel::Nodes::Grouping,
Arel::Nodes::Offset,
Arel::Nodes::Ordering,
- Arel::Nodes::Having,
Arel::Nodes::UnqualifiedColumn,
Arel::Nodes::Top,
Arel::Nodes::Limit,
diff --git a/test/visitors/test_mssql.rb b/test/visitors/test_mssql.rb
index a3efcb8b27..fe228bce4b 100644
--- a/test/visitors/test_mssql.rb
+++ b/test/visitors/test_mssql.rb
@@ -26,6 +26,34 @@ module Arel
sql.must_be_like "SELECT _t.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY \"users\".\"id\") as _row_num FROM \"users\") as _t WHERE _row_num BETWEEN 1 AND 10"
end
+ it 'caches the PK lookup for order' do
+ connection = MiniTest::Mock.new
+ connection.expect(:primary_key, ["id"], ["users"])
+
+ # We don't care how many times these methods are called
+ def connection.quote_table_name(*); ""; end
+ def connection.quote_column_name(*); ""; end
+
+ @visitor = MSSQL.new(connection)
+ stmt = Nodes::SelectStatement.new
+ stmt.cores.first.from = @table
+ stmt.limit = Nodes::Limit.new(10)
+
+ compile(stmt)
+ compile(stmt)
+
+ connection.verify
+ end
+
+ it 'should use TOP for limited deletes' do
+ stmt = Nodes::DeleteStatement.new
+ stmt.relation = @table
+ stmt.limit = Nodes::Limit.new(10)
+ sql = compile(stmt)
+
+ sql.must_be_like "DELETE TOP (10) FROM \"users\""
+ end
+
it 'should go over query ORDER BY if .order()' do
stmt = Nodes::SelectStatement.new
stmt.limit = Nodes::Limit.new(10)
diff --git a/test/visitors/test_oracle.rb b/test/visitors/test_oracle.rb
index 29d7042084..e9ed9d76b3 100644
--- a/test/visitors/test_oracle.rb
+++ b/test/visitors/test_oracle.rb
@@ -4,7 +4,8 @@ module Arel
module Visitors
describe 'the oracle visitor' do
before do
- @visitor = Oracle.new Table.engine.connection_pool
+ @visitor = Oracle.new Table.engine.connection
+ @table = Table.new(:users)
end
def compile node
@@ -110,7 +111,7 @@ module Arel
it 'creates a different subquery when there is an offset' do
stmt = Nodes::SelectStatement.new
- stmt.limit = Nodes::Limit.new(Nodes.build_quoted(10))
+ stmt.limit = Nodes::Limit.new(10)
stmt.offset = Nodes::Offset.new(10)
sql = compile stmt
sql.must_be_like %{
@@ -125,7 +126,7 @@ module Arel
it 'is idempotent with different subquery' do
stmt = Nodes::SelectStatement.new
- stmt.limit = Nodes::Limit.new(Nodes.build_quoted(10))
+ stmt.limit = Nodes::Limit.new(10)
stmt.offset = Nodes::Offset.new(10)
sql = compile stmt
sql2 = compile stmt
@@ -165,6 +166,16 @@ module Arel
compile(node).must_be_like "FOR UPDATE"
end
end
+
+ describe "Nodes::BindParam" do
+ it "increments each bind param" do
+ query = @table[:name].eq(Arel::Nodes::BindParam.new)
+ .and(@table[:id].eq(Arel::Nodes::BindParam.new))
+ compile(query).must_be_like %{
+ "users"."name" = :a1 AND "users"."id" = :a2
+ }
+ end
+ end
end
end
end
diff --git a/test/visitors/test_oracle12.rb b/test/visitors/test_oracle12.rb
new file mode 100644
index 0000000000..df0f01b30b
--- /dev/null
+++ b/test/visitors/test_oracle12.rb
@@ -0,0 +1,47 @@
+require 'helper'
+
+module Arel
+ module Visitors
+ describe 'the oracle visitor' do
+ before do
+ @visitor = Oracle12.new Table.engine.connection_pool
+ end
+
+ def compile node
+ @visitor.accept(node, Collectors::SQLString.new).value
+ end
+
+ it 'modified except to be minus' do
+ left = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 10")
+ right = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 20")
+ sql = compile Nodes::Except.new(left, right)
+ sql.must_be_like %{
+ ( SELECT * FROM users WHERE age > 10 MINUS SELECT * FROM users WHERE age > 20 )
+ }
+ end
+
+ it 'generates select options offset then limit' do
+ stmt = Nodes::SelectStatement.new
+ stmt.offset = Nodes::Offset.new(1)
+ stmt.limit = Nodes::Limit.new(10)
+ sql = compile(stmt)
+ sql.must_be_like "SELECT OFFSET 1 ROWS FETCH FIRST 10 ROWS ONLY"
+ end
+
+ describe 'locking' do
+ it 'removes limit when locking' do
+ stmt = Nodes::SelectStatement.new
+ stmt.limit = Nodes::Limit.new(10)
+ stmt.lock = Nodes::Lock.new(Arel.sql('FOR UPDATE'))
+ sql = compile(stmt)
+ sql.must_be_like "SELECT FOR UPDATE"
+ end
+
+ it 'defaults to FOR UPDATE when locking' do
+ node = Nodes::Lock.new(Arel.sql('FOR UPDATE'))
+ compile(node).must_be_like "FOR UPDATE"
+ end
+ end
+ end
+ end
+end
diff --git a/test/visitors/test_postgres.rb b/test/visitors/test_postgres.rb
index 3d646a7324..4b7dbe367f 100644
--- a/test/visitors/test_postgres.rb
+++ b/test/visitors/test_postgres.rb
@@ -53,11 +53,28 @@ module Arel
describe "Nodes::Matches" do
it "should know how to visit" do
node = @table[:name].matches('foo%')
+ node.must_be_kind_of Nodes::Matches
+ node.case_sensitive.must_equal(false)
compile(node).must_be_like %{
"users"."name" ILIKE 'foo%'
}
end
+ it "should know how to visit case sensitive" do
+ node = @table[:name].matches('foo%', nil, true)
+ node.case_sensitive.must_equal(true)
+ compile(node).must_be_like %{
+ "users"."name" LIKE 'foo%'
+ }
+ end
+
+ it "can handle ESCAPE" do
+ node = @table[:name].matches('foo!%', '!')
+ compile(node).must_be_like %{
+ "users"."name" ILIKE 'foo!%' ESCAPE '!'
+ }
+ end
+
it 'can handle subqueries' do
subquery = @table.project(:id).where(@table[:name].matches('foo%'))
node = @attr.in subquery
@@ -70,11 +87,28 @@ module Arel
describe "Nodes::DoesNotMatch" do
it "should know how to visit" do
node = @table[:name].does_not_match('foo%')
+ node.must_be_kind_of Nodes::DoesNotMatch
+ node.case_sensitive.must_equal(false)
compile(node).must_be_like %{
"users"."name" NOT ILIKE 'foo%'
}
end
+ it "should know how to visit case sensitive" do
+ node = @table[:name].does_not_match('foo%', nil, true)
+ node.case_sensitive.must_equal(true)
+ compile(node).must_be_like %{
+ "users"."name" NOT LIKE 'foo%'
+ }
+ end
+
+ it "can handle ESCAPE" do
+ node = @table[:name].does_not_match('foo!%', '!')
+ compile(node).must_be_like %{
+ "users"."name" NOT ILIKE 'foo!%' ESCAPE '!'
+ }
+ end
+
it 'can handle subqueries' do
subquery = @table.project(:id).where(@table[:name].does_not_match('foo%'))
node = @attr.in subquery
@@ -86,34 +120,65 @@ module Arel
describe "Nodes::Regexp" do
it "should know how to visit" do
- node = Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%'))
+ node = @table[:name].matches_regexp('foo.*')
+ node.must_be_kind_of Nodes::Regexp
+ node.case_sensitive.must_equal(true)
compile(node).must_be_like %{
- "users"."name" ~ 'foo%'
+ "users"."name" ~ 'foo.*'
+ }
+ end
+
+ it "can handle case insensitive" do
+ node = @table[:name].matches_regexp('foo.*', false)
+ node.must_be_kind_of Nodes::Regexp
+ node.case_sensitive.must_equal(false)
+ compile(node).must_be_like %{
+ "users"."name" ~* 'foo.*'
}
end
it 'can handle subqueries' do
- subquery = @table.project(:id).where(Arel::Nodes::Regexp.new(@table[:name], Nodes.build_quoted('foo%')))
+ subquery = @table.project(:id).where(@table[:name].matches_regexp('foo.*'))
node = @attr.in subquery
compile(node).must_be_like %{
- "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ~ 'foo%')
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" ~ 'foo.*')
}
end
end
describe "Nodes::NotRegexp" do
it "should know how to visit" do
- node = Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%'))
+ node = @table[:name].does_not_match_regexp('foo.*')
+ node.must_be_kind_of Nodes::NotRegexp
+ node.case_sensitive.must_equal(true)
+ compile(node).must_be_like %{
+ "users"."name" !~ 'foo.*'
+ }
+ end
+
+ it "can handle case insensitive" do
+ node = @table[:name].does_not_match_regexp('foo.*', false)
+ node.case_sensitive.must_equal(false)
compile(node).must_be_like %{
- "users"."name" !~ 'foo%'
+ "users"."name" !~* 'foo.*'
}
end
it 'can handle subqueries' do
- subquery = @table.project(:id).where(Arel::Nodes::NotRegexp.new(@table[:name], Nodes.build_quoted('foo%')))
+ subquery = @table.project(:id).where(@table[:name].does_not_match_regexp('foo.*'))
node = @attr.in subquery
compile(node).must_be_like %{
- "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" !~ 'foo%')
+ "users"."id" IN (SELECT id FROM "users" WHERE "users"."name" !~ 'foo.*')
+ }
+ end
+ end
+
+ describe "Nodes::BindParam" do
+ it "increments each bind param" do
+ query = @table[:name].eq(Arel::Nodes::BindParam.new)
+ .and(@table[:id].eq(Arel::Nodes::BindParam.new))
+ compile(query).must_be_like %{
+ "users"."name" = $1 AND "users"."id" = $2
}
end
end
diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb
index abd8cfe356..7ae5d5b3af 100644
--- a/test/visitors/test_to_sql.rb
+++ b/test/visitors/test_to_sql.rb
@@ -16,9 +16,16 @@ module Arel
end
it 'works with BindParams' do
- node = Nodes::BindParam.new 'omg'
+ node = Nodes::BindParam.new
sql = compile node
- sql.must_be_like 'omg'
+ sql.must_be_like '?'
+ end
+
+ it 'does not quote BindParams used as part of a Values' do
+ bp = Nodes::BindParam.new
+ values = Nodes::Values.new([bp])
+ sql = compile values
+ sql.must_be_like 'VALUES (?)'
end
it 'can define a dispatch method' do
@@ -29,7 +36,7 @@ module Arel
end
def dispatch
- { Arel::Table.name => 'hello' }
+ { Arel::Table => 'hello' }
end
}.new
@@ -174,6 +181,13 @@ module Arel
assert_match(/LIMIT 'omg'/, compile(sc))
end
+ it "should contain a single space before ORDER BY" do
+ table = Table.new(:users)
+ test = table.order(table[:name])
+ sql = compile test
+ assert_match(/"users" ORDER BY/, sql)
+ end
+
it "should quote LIMIT without column type coercion" do
table = Table.new(:users)
sc = table.where(table[:name].eq(0)).take(1).ast
@@ -259,9 +273,9 @@ module Arel
compile(Nodes.build_quoted(nil)).must_be_like "NULL"
end
- it "unsupported input should not raise ArgumentError" do
- error = assert_raises(RuntimeError) { compile(nil) }
- assert_match(/\Aunsupported/, error.message)
+ it "unsupported input should raise UnsupportedVisitError" do
+ error = assert_raises(UnsupportedVisitError) { compile(nil) }
+ assert_match(/\AUnsupported/, error.message)
end
it "should visit_Arel_SelectManager, which is a subquery" do
@@ -284,7 +298,7 @@ module Arel
end
it "should visit_Arel_Nodes_Assignment" do
- column = @table["id"]
+ column = @table["id"]
node = Nodes::Assignment.new(
Nodes::UnqualifiedColumn.new(column),
Nodes::UnqualifiedColumn.new(column)
@@ -375,33 +389,33 @@ module Arel
end
it 'can handle two dot ranges' do
- node = @attr.in 1..3
+ node = @attr.between 1..3
compile(node).must_be_like %{
"users"."id" BETWEEN 1 AND 3
}
end
it 'can handle three dot ranges' do
- node = @attr.in 1...3
+ node = @attr.between 1...3
compile(node).must_be_like %{
"users"."id" >= 1 AND "users"."id" < 3
}
end
it 'can handle ranges bounded by infinity' do
- node = @attr.in 1..Float::INFINITY
+ node = @attr.between 1..Float::INFINITY
compile(node).must_be_like %{
"users"."id" >= 1
}
- node = @attr.in(-Float::INFINITY..3)
+ node = @attr.between(-Float::INFINITY..3)
compile(node).must_be_like %{
"users"."id" <= 3
}
- node = @attr.in(-Float::INFINITY...3)
+ node = @attr.between(-Float::INFINITY...3)
compile(node).must_be_like %{
"users"."id" < 3
}
- node = @attr.in(-Float::INFINITY..Float::INFINITY)
+ node = @attr.between(-Float::INFINITY..Float::INFINITY)
compile(node).must_be_like %{1=1}
end
@@ -479,33 +493,33 @@ module Arel
end
it 'can handle two dot ranges' do
- node = @attr.not_in 1..3
- compile(node).must_be_like %{
- "users"."id" < 1 OR "users"."id" > 3
- }
+ node = @attr.not_between 1..3
+ compile(node).must_equal(
+ %{("users"."id" < 1 OR "users"."id" > 3)}
+ )
end
it 'can handle three dot ranges' do
- node = @attr.not_in 1...3
- compile(node).must_be_like %{
- "users"."id" < 1 OR "users"."id" >= 3
- }
+ node = @attr.not_between 1...3
+ compile(node).must_equal(
+ %{("users"."id" < 1 OR "users"."id" >= 3)}
+ )
end
it 'can handle ranges bounded by infinity' do
- node = @attr.not_in 1..Float::INFINITY
+ node = @attr.not_between 1..Float::INFINITY
compile(node).must_be_like %{
"users"."id" < 1
}
- node = @attr.not_in(-Float::INFINITY..3)
+ node = @attr.not_between(-Float::INFINITY..3)
compile(node).must_be_like %{
"users"."id" > 3
}
- node = @attr.not_in(-Float::INFINITY...3)
+ node = @attr.not_between(-Float::INFINITY...3)
compile(node).must_be_like %{
"users"."id" >= 3
}
- node = @attr.not_in(-Float::INFINITY..Float::INFINITY)
+ node = @attr.not_between(-Float::INFINITY..Float::INFINITY)
compile(node).must_be_like %{1=0}
end