arel 5.0.1.20140414130214 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -2
  3. data/History.txt +9 -4
  4. data/Manifest.txt +9 -7
  5. data/README.markdown +85 -8
  6. data/Rakefile +1 -1
  7. data/arel.gemspec +15 -16
  8. data/lib/arel.rb +1 -12
  9. data/lib/arel/collectors/bind.rb +36 -0
  10. data/lib/arel/collectors/plain_string.rb +18 -0
  11. data/lib/arel/collectors/sql_string.rb +18 -0
  12. data/lib/arel/factory_methods.rb +1 -1
  13. data/lib/arel/insert_manager.rb +5 -1
  14. data/lib/arel/nodes.rb +41 -0
  15. data/lib/arel/nodes/and.rb +1 -5
  16. data/lib/arel/nodes/binary.rb +2 -0
  17. data/lib/arel/nodes/extract.rb +0 -2
  18. data/lib/arel/nodes/full_outer_join.rb +6 -0
  19. data/lib/arel/nodes/function.rb +0 -1
  20. data/lib/arel/nodes/insert_statement.rb +5 -2
  21. data/lib/arel/nodes/node.rb +5 -1
  22. data/lib/arel/nodes/right_outer_join.rb +6 -0
  23. data/lib/arel/nodes/window.rb +23 -5
  24. data/lib/arel/predications.rb +41 -33
  25. data/lib/arel/select_manager.rb +13 -37
  26. data/lib/arel/table.rb +13 -9
  27. data/lib/arel/tree_manager.rb +8 -2
  28. data/lib/arel/update_manager.rb +2 -2
  29. data/lib/arel/visitors.rb +0 -2
  30. data/lib/arel/visitors/bind_substitute.rb +9 -0
  31. data/lib/arel/visitors/bind_visitor.rb +10 -5
  32. data/lib/arel/visitors/depth_first.rb +60 -57
  33. data/lib/arel/visitors/dot.rb +84 -80
  34. data/lib/arel/visitors/ibm_db.rb +4 -2
  35. data/lib/arel/visitors/informix.rb +39 -21
  36. data/lib/arel/visitors/mssql.rb +41 -23
  37. data/lib/arel/visitors/mysql.rb +48 -22
  38. data/lib/arel/visitors/oracle.rb +33 -24
  39. data/lib/arel/visitors/postgresql.rb +15 -8
  40. data/lib/arel/visitors/reduce.rb +25 -0
  41. data/lib/arel/visitors/sqlite.rb +3 -2
  42. data/lib/arel/visitors/to_sql.rb +455 -248
  43. data/lib/arel/visitors/visitor.rb +2 -2
  44. data/lib/arel/visitors/where_sql.rb +3 -2
  45. data/test/attributes/test_attribute.rb +12 -3
  46. data/test/collectors/test_bind_collector.rb +70 -0
  47. data/test/collectors/test_sql_string.rb +38 -0
  48. data/test/helper.rb +10 -1
  49. data/test/nodes/test_bin.rb +2 -2
  50. data/test/nodes/test_count.rb +0 -6
  51. data/test/nodes/test_equality.rb +1 -1
  52. data/test/nodes/test_grouping.rb +1 -1
  53. data/test/nodes/test_infix_operation.rb +1 -1
  54. data/test/nodes/test_select_core.rb +7 -7
  55. data/test/nodes/test_sql_literal.rb +10 -6
  56. data/test/nodes/test_window.rb +9 -3
  57. data/test/support/fake_record.rb +16 -4
  58. data/test/test_factory_methods.rb +1 -1
  59. data/test/test_insert_manager.rb +33 -4
  60. data/test/test_select_manager.rb +164 -92
  61. data/test/test_table.rb +49 -4
  62. data/test/visitors/test_bind_visitor.rb +18 -10
  63. data/test/visitors/test_depth_first.rb +12 -0
  64. data/test/visitors/test_dot.rb +4 -4
  65. data/test/visitors/test_ibm_db.rb +11 -5
  66. data/test/visitors/test_informix.rb +14 -8
  67. data/test/visitors/test_mssql.rb +12 -8
  68. data/test/visitors/test_mysql.rb +17 -12
  69. data/test/visitors/test_oracle.rb +25 -21
  70. data/test/visitors/test_postgres.rb +50 -12
  71. data/test/visitors/test_sqlite.rb +2 -2
  72. data/test/visitors/test_to_sql.rb +177 -81
  73. metadata +24 -19
  74. data/lib/arel/deprecated.rb +0 -4
  75. data/lib/arel/expression.rb +0 -5
  76. data/lib/arel/sql/engine.rb +0 -10
  77. data/lib/arel/sql_literal.rb +0 -4
  78. data/lib/arel/visitors/join_sql.rb +0 -19
  79. data/lib/arel/visitors/order_clauses.rb +0 -11
  80. data/test/visitors/test_join_sql.rb +0 -42
@@ -4,8 +4,14 @@ require 'support/fake_record'
4
4
 
5
5
  module Arel
6
6
  module Visitors
7
- class TestBindVisitor < Minitest::Test
8
-
7
+ class TestBindVisitor < Arel::Test
8
+ attr_reader :collector
9
+
10
+ def setup
11
+ @collector = Collectors::SQLString.new
12
+ super
13
+ end
14
+
9
15
  ##
10
16
  # Tests visit_Arel_Nodes_Assignment correctly
11
17
  # substitutes binds with values from block
@@ -19,12 +25,16 @@ module Arel
19
25
  }.new Table.engine.connection
20
26
 
21
27
  assignment = um.ast.values[0]
22
- actual = visitor.accept(assignment) { "replace" }
23
- actual.must_be_like "\"name\" = replace"
28
+ actual = visitor.accept(assignment, collector) {
29
+ "replace"
30
+ }
31
+ assert actual
32
+ value = actual.value
33
+ assert_like "\"name\" = replace", value
24
34
  end
25
35
 
26
36
  def test_visitor_yields_on_binds
27
- visitor = Class.new(Arel::Visitors::Visitor) {
37
+ visitor = Class.new(Arel::Visitors::ToSql) {
28
38
  def initialize omg
29
39
  end
30
40
 
@@ -33,12 +43,12 @@ module Arel
33
43
 
34
44
  bp = Nodes::BindParam.new 'omg'
35
45
  called = false
36
- visitor.accept(bp) { called = true }
46
+ visitor.accept(bp, collector) { called = true }
37
47
  assert called
38
48
  end
39
49
 
40
50
  def test_visitor_only_yields_on_binds
41
- visitor = Class.new(Arel::Visitors::Visitor) {
51
+ visitor = Class.new(Arel::Visitors::ToSql) {
42
52
  def initialize omg
43
53
  end
44
54
 
@@ -48,9 +58,7 @@ module Arel
48
58
  bp = Arel.sql 'omg'
49
59
  called = false
50
60
 
51
- assert_raises(TypeError) {
52
- visitor.accept(bp) { called = true }
53
- }
61
+ visitor.accept(bp, collector) { called = true }
54
62
  refute called
55
63
  end
56
64
  end
@@ -81,12 +81,24 @@ module Arel
81
81
  assert_equal [:a, :b, join], @collector.calls
82
82
  end
83
83
 
84
+ def test_full_outer_join
85
+ join = Nodes::FullOuterJoin.new :a, :b
86
+ @visitor.accept join
87
+ assert_equal [:a, :b, join], @collector.calls
88
+ end
89
+
84
90
  def test_outer_join
85
91
  join = Nodes::OuterJoin.new :a, :b
86
92
  @visitor.accept join
87
93
  assert_equal [:a, :b, join], @collector.calls
88
94
  end
89
95
 
96
+ def test_right_outer_join
97
+ join = Nodes::RightOuterJoin.new :a, :b
98
+ @visitor.accept join
99
+ assert_equal [:a, :b, join], @collector.calls
100
+ end
101
+
90
102
  [
91
103
  Arel::Nodes::Assignment,
92
104
  Arel::Nodes::Between,
@@ -17,13 +17,13 @@ module Arel
17
17
  ].each do |klass|
18
18
  define_method("test_#{klass.name.gsub('::', '_')}") do
19
19
  op = klass.new(:a, "z")
20
- @visitor.accept op
20
+ @visitor.accept op, Collectors::PlainString.new
21
21
  end
22
22
  end
23
23
 
24
24
  def test_named_function
25
25
  func = Nodes::NamedFunction.new 'omg', 'omg'
26
- @visitor.accept func
26
+ @visitor.accept func, Collectors::PlainString.new
27
27
  end
28
28
 
29
29
  # unary ops
@@ -41,7 +41,7 @@ module Arel
41
41
  ].each do |klass|
42
42
  define_method("test_#{klass.name.gsub('::', '_')}") do
43
43
  op = klass.new(:a)
44
- @visitor.accept op
44
+ @visitor.accept op, Collectors::PlainString.new
45
45
  end
46
46
  end
47
47
 
@@ -68,7 +68,7 @@ module Arel
68
68
  ].each do |klass|
69
69
  define_method("test_#{klass.name.gsub('::', '_')}") do
70
70
  binary = klass.new(:a, :b)
71
- @visitor.accept binary
71
+ @visitor.accept binary, Collectors::PlainString.new
72
72
  end
73
73
  end
74
74
  end
@@ -7,19 +7,25 @@ module Arel
7
7
  @visitor = IBM_DB.new Table.engine.connection
8
8
  end
9
9
 
10
+ def compile node
11
+ @visitor.accept(node, Collectors::SQLString.new).value
12
+ end
13
+
10
14
  it 'uses FETCH FIRST n ROWS to limit results' do
11
15
  stmt = Nodes::SelectStatement.new
12
16
  stmt.limit = Nodes::Limit.new(1)
13
- sql = @visitor.accept(stmt)
17
+ sql = compile(stmt)
14
18
  sql.must_be_like "SELECT FETCH FIRST 1 ROWS ONLY"
15
19
  end
16
20
 
17
21
  it 'uses FETCH FIRST n ROWS in updates with a limit' do
22
+ table = Table.new(:users)
18
23
  stmt = Nodes::UpdateStatement.new
19
- stmt.limit = Nodes::Limit.new(1)
20
- stmt.key = 'id'
21
- sql = @visitor.accept(stmt)
22
- sql.must_be_like "UPDATE NULL WHERE 'id' IN (SELECT 'id' FETCH FIRST 1 ROWS ONLY)"
24
+ stmt.relation = table
25
+ stmt.limit = Nodes::Limit.new(Nodes.build_quoted(1))
26
+ stmt.key = table[:id]
27
+ sql = compile(stmt)
28
+ sql.must_be_like "UPDATE \"users\" WHERE \"users\".\"id\" IN (SELECT \"users\".\"id\" FROM \"users\" FETCH FIRST 1 ROWS ONLY)"
23
29
  end
24
30
 
25
31
  end
@@ -7,25 +7,31 @@ module Arel
7
7
  @visitor = Informix.new Table.engine.connection
8
8
  end
9
9
 
10
+ def compile node
11
+ @visitor.accept(node, Collectors::SQLString.new).value
12
+ end
13
+
10
14
  it 'uses LIMIT n to limit results' do
11
15
  stmt = Nodes::SelectStatement.new
12
16
  stmt.limit = Nodes::Limit.new(1)
13
- sql = @visitor.accept(stmt)
17
+ sql = compile(stmt)
14
18
  sql.must_be_like "SELECT LIMIT 1"
15
19
  end
16
20
 
17
21
  it 'uses LIMIT n in updates with a limit' do
22
+ table = Table.new(:users)
18
23
  stmt = Nodes::UpdateStatement.new
19
- stmt.limit = Nodes::Limit.new(1)
20
- stmt.key = 'id'
21
- sql = @visitor.accept(stmt)
22
- sql.must_be_like "UPDATE NULL WHERE 'id' IN (SELECT LIMIT 1 'id')"
24
+ stmt.relation = table
25
+ stmt.limit = Nodes::Limit.new(Nodes.build_quoted(1))
26
+ stmt.key = table[:id]
27
+ sql = compile(stmt)
28
+ sql.must_be_like "UPDATE \"users\" WHERE \"users\".\"id\" IN (SELECT LIMIT 1 \"users\".\"id\" FROM \"users\")"
23
29
  end
24
30
 
25
31
  it 'uses SKIP n to jump results' do
26
32
  stmt = Nodes::SelectStatement.new
27
33
  stmt.offset = Nodes::Offset.new(10)
28
- sql = @visitor.accept(stmt)
34
+ sql = compile(stmt)
29
35
  sql.must_be_like "SELECT SKIP 10"
30
36
  end
31
37
 
@@ -33,7 +39,7 @@ module Arel
33
39
  stmt = Nodes::SelectStatement.new
34
40
  stmt.limit = Nodes::Limit.new(1)
35
41
  stmt.offset = Nodes::Offset.new(1)
36
- sql = @visitor.accept(stmt)
42
+ sql = compile(stmt)
37
43
  sql.must_be_like "SELECT SKIP 1 LIMIT 1"
38
44
  end
39
45
 
@@ -43,7 +49,7 @@ module Arel
43
49
  core.source = Nodes::JoinSource.new(table, [table.create_join(Table.new(:comments))])
44
50
 
45
51
  stmt = Nodes::SelectStatement.new([core])
46
- sql = @visitor.accept(stmt)
52
+ sql = compile(stmt)
47
53
  sql.must_be_like 'SELECT FROM "posts" INNER JOIN "comments"'
48
54
  end
49
55
 
@@ -8,9 +8,13 @@ module Arel
8
8
  @table = Arel::Table.new "users"
9
9
  end
10
10
 
11
+ def compile node
12
+ @visitor.accept(node, Collectors::SQLString.new).value
13
+ end
14
+
11
15
  it 'should not modify query if no offset or limit' do
12
16
  stmt = Nodes::SelectStatement.new
13
- sql = @visitor.accept(stmt)
17
+ sql = compile(stmt)
14
18
  sql.must_be_like "SELECT"
15
19
  end
16
20
 
@@ -18,15 +22,15 @@ module Arel
18
22
  stmt = Nodes::SelectStatement.new
19
23
  stmt.cores.first.from = @table
20
24
  stmt.limit = Nodes::Limit.new(10)
21
- sql = @visitor.accept(stmt)
22
- 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"
25
+ sql = compile(stmt)
26
+ 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"
23
27
  end
24
28
 
25
29
  it 'should go over query ORDER BY if .order()' do
26
30
  stmt = Nodes::SelectStatement.new
27
31
  stmt.limit = Nodes::Limit.new(10)
28
32
  stmt.orders << Nodes::SqlLiteral.new('order_by')
29
- sql = @visitor.accept(stmt)
33
+ sql = compile(stmt)
30
34
  sql.must_be_like "SELECT _t.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY order_by) as _row_num) as _t WHERE _row_num BETWEEN 1 AND 10"
31
35
  end
32
36
 
@@ -34,7 +38,7 @@ module Arel
34
38
  stmt = Nodes::SelectStatement.new
35
39
  stmt.cores.first.groups << Nodes::SqlLiteral.new('group_by')
36
40
  stmt.limit = Nodes::Limit.new(10)
37
- sql = @visitor.accept(stmt)
41
+ sql = compile(stmt)
38
42
  sql.must_be_like "SELECT _t.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY group_by) as _row_num GROUP BY group_by) as _t WHERE _row_num BETWEEN 1 AND 10"
39
43
  end
40
44
 
@@ -42,14 +46,14 @@ module Arel
42
46
  stmt = Nodes::SelectStatement.new
43
47
  stmt.limit = Nodes::Limit.new(10)
44
48
  stmt.offset = Nodes::Offset.new(20)
45
- sql = @visitor.accept(stmt)
49
+ sql = compile(stmt)
46
50
  sql.must_be_like "SELECT _t.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY ) as _row_num) as _t WHERE _row_num BETWEEN 21 AND 30"
47
51
  end
48
52
 
49
53
  it 'should use >= if only .offset' do
50
54
  stmt = Nodes::SelectStatement.new
51
55
  stmt.offset = Nodes::Offset.new(20)
52
- sql = @visitor.accept(stmt)
56
+ sql = compile(stmt)
53
57
  sql.must_be_like "SELECT _t.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY ) as _row_num) as _t WHERE _row_num >= 21"
54
58
  end
55
59
 
@@ -57,7 +61,7 @@ module Arel
57
61
  stmt = Nodes::SelectStatement.new
58
62
  stmt.limit = Nodes::Limit.new(10)
59
63
  stmt.cores.first.projections << Nodes::Count.new('*')
60
- sql = @visitor.accept(stmt)
64
+ sql = compile(stmt)
61
65
  sql.must_be_like "SELECT COUNT(1) as count_id FROM (SELECT _t.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY ) as _row_num) as _t WHERE _row_num BETWEEN 1 AND 10) AS subquery"
62
66
  end
63
67
 
@@ -7,14 +7,18 @@ module Arel
7
7
  @visitor = MySQL.new Table.engine.connection
8
8
  end
9
9
 
10
+ def compile node
11
+ @visitor.accept(node, Collectors::SQLString.new).value
12
+ end
13
+
10
14
  it 'squashes parenthesis on multiple unions' do
11
- subnode = Nodes::Union.new 'left', 'right'
12
- node = Nodes::Union.new subnode, 'topright'
13
- assert_equal 1, @visitor.accept(node).scan('(').length
15
+ subnode = Nodes::Union.new Arel.sql('left'), Arel.sql('right')
16
+ node = Nodes::Union.new subnode, Arel.sql('topright')
17
+ assert_equal 1, compile(node).scan('(').length
14
18
 
15
- subnode = Nodes::Union.new 'left', 'right'
16
- node = Nodes::Union.new 'topleft', subnode
17
- assert_equal 1, @visitor.accept(node).scan('(').length
19
+ subnode = Nodes::Union.new Arel.sql('left'), Arel.sql('right')
20
+ node = Nodes::Union.new Arel.sql('topleft'), subnode
21
+ assert_equal 1, compile(node).scan('(').length
18
22
  end
19
23
 
20
24
  ###
@@ -23,31 +27,32 @@ module Arel
23
27
  it 'defaults limit to 18446744073709551615' do
24
28
  stmt = Nodes::SelectStatement.new
25
29
  stmt.offset = Nodes::Offset.new(1)
26
- sql = @visitor.accept(stmt)
30
+ sql = compile(stmt)
27
31
  sql.must_be_like "SELECT FROM DUAL LIMIT 18446744073709551615 OFFSET 1"
28
32
  end
29
33
 
30
34
  it "should escape LIMIT" do
31
35
  sc = Arel::Nodes::UpdateStatement.new
32
- sc.limit = Nodes::Limit.new("omg")
33
- assert_equal("UPDATE NULL LIMIT 'omg'", @visitor.accept(sc))
36
+ sc.relation = Table.new(:users)
37
+ sc.limit = Nodes::Limit.new(Nodes.build_quoted("omg"))
38
+ assert_equal("UPDATE \"users\" LIMIT 'omg'", compile(sc))
34
39
  end
35
40
 
36
41
  it 'uses DUAL for empty from' do
37
42
  stmt = Nodes::SelectStatement.new
38
- sql = @visitor.accept(stmt)
43
+ sql = compile(stmt)
39
44
  sql.must_be_like "SELECT FROM DUAL"
40
45
  end
41
46
 
42
47
  describe 'locking' do
43
48
  it 'defaults to FOR UPDATE when locking' do
44
49
  node = Nodes::Lock.new(Arel.sql('FOR UPDATE'))
45
- @visitor.accept(node).must_be_like "FOR UPDATE"
50
+ compile(node).must_be_like "FOR UPDATE"
46
51
  end
47
52
 
48
53
  it 'allows a custom string to be used as a lock' do
49
54
  node = Nodes::Lock.new(Arel.sql('LOCK IN SHARE MODE'))
50
- @visitor.accept(node).must_be_like "LOCK IN SHARE MODE"
55
+ compile(node).must_be_like "LOCK IN SHARE MODE"
51
56
  end
52
57
  end
53
58
  end
@@ -7,13 +7,17 @@ module Arel
7
7
  @visitor = Oracle.new Table.engine.connection_pool
8
8
  end
9
9
 
10
+ def compile node
11
+ @visitor.accept(node, Collectors::SQLString.new).value
12
+ end
13
+
10
14
  it 'modifies order when there is distinct and first value' do
11
15
  # *sigh*
12
16
  select = "DISTINCT foo.id, FIRST_VALUE(projects.name) OVER (foo) AS alias_0__"
13
17
  stmt = Nodes::SelectStatement.new
14
18
  stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
15
19
  stmt.orders << Nodes::SqlLiteral.new('foo')
16
- sql = @visitor.accept(stmt)
20
+ sql = compile(stmt)
17
21
  sql.must_be_like %{
18
22
  SELECT #{select} ORDER BY alias_0__
19
23
  }
@@ -26,8 +30,8 @@ module Arel
26
30
  stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
27
31
  stmt.orders << Nodes::SqlLiteral.new('foo')
28
32
 
29
- sql = @visitor.accept(stmt)
30
- sql2 = @visitor.accept(stmt)
33
+ sql = compile(stmt)
34
+ sql2 = compile(stmt)
31
35
  sql.must_equal sql2
32
36
  end
33
37
 
@@ -37,7 +41,7 @@ module Arel
37
41
  stmt = Nodes::SelectStatement.new
38
42
  stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
39
43
  stmt.orders << Nodes::SqlLiteral.new('foo, bar')
40
- sql = @visitor.accept(stmt)
44
+ sql = compile(stmt)
41
45
  sql.must_be_like %{
42
46
  SELECT #{select} ORDER BY alias_0__, alias_1__
43
47
  }
@@ -49,7 +53,7 @@ module Arel
49
53
  stmt = Nodes::SelectStatement.new
50
54
  stmt.cores.first.projections << Nodes::SqlLiteral.new(select)
51
55
  stmt.orders << Nodes::SqlLiteral.new('NVL(LOWER(bar, foo), foo) DESC, UPPER(baz)')
52
- sql = @visitor.accept(stmt)
56
+ sql = compile(stmt)
53
57
  sql.must_be_like %{
54
58
  SELECT #{select} ORDER BY alias_0__ DESC, alias_1__
55
59
  }
@@ -60,7 +64,7 @@ module Arel
60
64
  it 'adds a rownum clause' do
61
65
  stmt = Nodes::SelectStatement.new
62
66
  stmt.limit = Nodes::Limit.new(10)
63
- sql = @visitor.accept stmt
67
+ sql = compile stmt
64
68
  sql.must_be_like %{ SELECT WHERE ROWNUM <= 10 }
65
69
  end
66
70
 
@@ -68,8 +72,8 @@ module Arel
68
72
  stmt = Nodes::SelectStatement.new
69
73
  stmt.orders << Nodes::SqlLiteral.new('foo')
70
74
  stmt.limit = Nodes::Limit.new(10)
71
- sql = @visitor.accept stmt
72
- sql2 = @visitor.accept stmt
75
+ sql = compile stmt
76
+ sql2 = compile stmt
73
77
  sql.must_equal sql2
74
78
  end
75
79
 
@@ -77,9 +81,9 @@ module Arel
77
81
  stmt = Nodes::SelectStatement.new
78
82
  stmt.orders << Nodes::SqlLiteral.new('foo')
79
83
  stmt.limit = Nodes::Limit.new(10)
80
- sql = @visitor.accept stmt
84
+ sql = compile stmt
81
85
  sql.must_be_like %{
82
- SELECT * FROM (SELECT ORDER BY foo) WHERE ROWNUM <= 10
86
+ SELECT * FROM (SELECT ORDER BY foo ) WHERE ROWNUM <= 10
83
87
  }
84
88
  end
85
89
 
@@ -88,21 +92,21 @@ module Arel
88
92
  stmt.cores.first.set_quantifier = Arel::Nodes::Distinct.new
89
93
  stmt.cores.first.projections << Nodes::SqlLiteral.new('id')
90
94
  stmt.limit = Arel::Nodes::Limit.new(10)
91
- sql = @visitor.accept stmt
95
+ sql = compile stmt
92
96
  sql.must_be_like %{
93
- SELECT * FROM (SELECT DISTINCT id) WHERE ROWNUM <= 10
97
+ SELECT * FROM (SELECT DISTINCT id ) WHERE ROWNUM <= 10
94
98
  }
95
99
  end
96
100
 
97
101
  it 'creates a different subquery when there is an offset' do
98
102
  stmt = Nodes::SelectStatement.new
99
- stmt.limit = Nodes::Limit.new(10)
103
+ stmt.limit = Nodes::Limit.new(Nodes.build_quoted(10))
100
104
  stmt.offset = Nodes::Offset.new(10)
101
- sql = @visitor.accept stmt
105
+ sql = compile stmt
102
106
  sql.must_be_like %{
103
107
  SELECT * FROM (
104
108
  SELECT raw_sql_.*, rownum raw_rnum_
105
- FROM (SELECT) raw_sql_
109
+ FROM (SELECT ) raw_sql_
106
110
  WHERE rownum <= 20
107
111
  )
108
112
  WHERE raw_rnum_ > 10
@@ -111,10 +115,10 @@ module Arel
111
115
 
112
116
  it 'is idempotent with different subquery' do
113
117
  stmt = Nodes::SelectStatement.new
114
- stmt.limit = Nodes::Limit.new(10)
118
+ stmt.limit = Nodes::Limit.new(Nodes.build_quoted(10))
115
119
  stmt.offset = Nodes::Offset.new(10)
116
- sql = @visitor.accept stmt
117
- sql2 = @visitor.accept stmt
120
+ sql = compile stmt
121
+ sql2 = compile stmt
118
122
  sql.must_equal sql2
119
123
  end
120
124
  end
@@ -123,7 +127,7 @@ module Arel
123
127
  it 'creates a select from subquery with rownum condition' do
124
128
  stmt = Nodes::SelectStatement.new
125
129
  stmt.offset = Nodes::Offset.new(10)
126
- sql = @visitor.accept stmt
130
+ sql = compile stmt
127
131
  sql.must_be_like %{
128
132
  SELECT * FROM (
129
133
  SELECT raw_sql_.*, rownum raw_rnum_
@@ -139,7 +143,7 @@ module Arel
139
143
  it 'modified except to be minus' do
140
144
  left = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 10")
141
145
  right = Nodes::SqlLiteral.new("SELECT * FROM users WHERE age > 20")
142
- sql = @visitor.accept Nodes::Except.new(left, right)
146
+ sql = compile Nodes::Except.new(left, right)
143
147
  sql.must_be_like %{
144
148
  ( SELECT * FROM users WHERE age > 10 MINUS SELECT * FROM users WHERE age > 20 )
145
149
  }
@@ -148,7 +152,7 @@ module Arel
148
152
  describe 'locking' do
149
153
  it 'defaults to FOR UPDATE when locking' do
150
154
  node = Nodes::Lock.new(Arel.sql('FOR UPDATE'))
151
- @visitor.accept(node).must_be_like "FOR UPDATE"
155
+ compile(node).must_be_like "FOR UPDATE"
152
156
  end
153
157
  end
154
158
  end