arel 6.0.0.beta2 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +1 -1
  3. data/README.markdown +5 -5
  4. data/lib/arel.rb +1 -1
  5. data/lib/arel/collectors/sql_string.rb +7 -1
  6. data/lib/arel/expressions.rb +5 -4
  7. data/lib/arel/nodes.rb +1 -0
  8. data/lib/arel/nodes/bind_param.rb +6 -0
  9. data/lib/arel/nodes/sql_literal.rb +0 -3
  10. data/lib/arel/predications.rb +2 -2
  11. data/lib/arel/visitors/depth_first.rb +6 -0
  12. data/lib/arel/visitors/oracle.rb +4 -0
  13. data/lib/arel/visitors/postgresql.rb +4 -0
  14. data/lib/arel/visitors/reduce.rb +4 -4
  15. data/lib/arel/visitors/to_sql.rb +3 -2
  16. data/lib/arel/visitors/visitor.rb +15 -15
  17. metadata +26 -69
  18. data/.gitignore +0 -9
  19. data/.travis.yml +0 -18
  20. data/Gemfile +0 -5
  21. data/Rakefile +0 -15
  22. data/arel.gemspec +0 -24
  23. data/test/attributes/test_attribute.rb +0 -910
  24. data/test/collectors/test_bind_collector.rb +0 -70
  25. data/test/collectors/test_sql_string.rb +0 -38
  26. data/test/helper.rb +0 -22
  27. data/test/nodes/test_and.rb +0 -20
  28. data/test/nodes/test_as.rb +0 -34
  29. data/test/nodes/test_ascending.rb +0 -44
  30. data/test/nodes/test_bin.rb +0 -33
  31. data/test/nodes/test_binary.rb +0 -26
  32. data/test/nodes/test_count.rb +0 -33
  33. data/test/nodes/test_delete_statement.rb +0 -34
  34. data/test/nodes/test_descending.rb +0 -44
  35. data/test/nodes/test_distinct.rb +0 -20
  36. data/test/nodes/test_equality.rb +0 -84
  37. data/test/nodes/test_extract.rb +0 -41
  38. data/test/nodes/test_false.rb +0 -20
  39. data/test/nodes/test_grouping.rb +0 -25
  40. data/test/nodes/test_infix_operation.rb +0 -40
  41. data/test/nodes/test_insert_statement.rb +0 -42
  42. data/test/nodes/test_named_function.rb +0 -46
  43. data/test/nodes/test_node.rb +0 -39
  44. data/test/nodes/test_not.rb +0 -29
  45. data/test/nodes/test_or.rb +0 -34
  46. data/test/nodes/test_over.rb +0 -67
  47. data/test/nodes/test_select_core.rb +0 -69
  48. data/test/nodes/test_select_statement.rb +0 -49
  49. data/test/nodes/test_sql_literal.rb +0 -73
  50. data/test/nodes/test_sum.rb +0 -24
  51. data/test/nodes/test_table_alias.rb +0 -36
  52. data/test/nodes/test_true.rb +0 -21
  53. data/test/nodes/test_update_statement.rb +0 -58
  54. data/test/nodes/test_window.rb +0 -79
  55. data/test/support/fake_record.rb +0 -135
  56. data/test/test_attributes.rb +0 -66
  57. data/test/test_crud.rb +0 -63
  58. data/test/test_delete_manager.rb +0 -42
  59. data/test/test_factory_methods.rb +0 -44
  60. data/test/test_insert_manager.rb +0 -171
  61. data/test/test_select_manager.rb +0 -1181
  62. data/test/test_table.rb +0 -253
  63. data/test/test_update_manager.rb +0 -124
  64. data/test/visitors/test_bind_visitor.rb +0 -60
  65. data/test/visitors/test_depth_first.rb +0 -258
  66. data/test/visitors/test_dispatch_contamination.rb +0 -22
  67. data/test/visitors/test_dot.rb +0 -76
  68. data/test/visitors/test_ibm_db.rb +0 -33
  69. data/test/visitors/test_informix.rb +0 -58
  70. data/test/visitors/test_mssql.rb +0 -70
  71. data/test/visitors/test_mysql.rb +0 -60
  72. data/test/visitors/test_oracle.rb +0 -170
  73. data/test/visitors/test_postgres.rb +0 -122
  74. data/test/visitors/test_sqlite.rb +0 -23
  75. data/test/visitors/test_to_sql.rb +0 -598
@@ -1,70 +0,0 @@
1
- require 'helper'
2
- require 'arel/collectors/bind'
3
-
4
- module Arel
5
- module Collectors
6
- class TestBindCollector < Arel::Test
7
- def setup
8
- @conn = FakeRecord::Base.new
9
- @visitor = Visitors::ToSql.new @conn.connection
10
- super
11
- end
12
-
13
- def collect node
14
- @visitor.accept(node, Collectors::Bind.new)
15
- end
16
-
17
- def compile node
18
- collect(node).value
19
- end
20
-
21
- def ast_with_binds bv
22
- table = Table.new(:users)
23
- manager = Arel::SelectManager.new Table.engine, table
24
- manager.where(table[:age].eq(bv))
25
- manager.where(table[:name].eq(bv))
26
- manager.ast
27
- end
28
-
29
- def test_leaves_binds
30
- node = Nodes::BindParam.new 'omg'
31
- list = compile node
32
- assert_equal node, list.first
33
- assert_equal node.class, list.first.class
34
- end
35
-
36
- def test_adds_strings
37
- bv = Nodes::BindParam.new('?')
38
- list = compile ast_with_binds bv
39
- assert_operator list.length, :>, 0
40
- assert_equal bv, list.grep(Nodes::BindParam).first
41
- assert_equal bv.class, list.grep(Nodes::BindParam).first.class
42
- end
43
-
44
- def test_substitute_binds
45
- bv = Nodes::BindParam.new('?')
46
- collector = collect ast_with_binds bv
47
-
48
- values = collector.value
49
-
50
- offsets = values.map.with_index { |v,i|
51
- [v,i]
52
- }.find_all { |(v,_)| Nodes::BindParam === v }.map(&:last)
53
-
54
- list = collector.substitute_binds ["hello", "world"]
55
- assert_equal "hello", list[offsets[0]]
56
- assert_equal "world", list[offsets[1]]
57
-
58
- assert_equal 'SELECT FROM "users" WHERE "users"."age" = hello AND "users"."name" = world', list.join
59
- end
60
-
61
- def test_compile
62
- bv = Nodes::BindParam.new('?')
63
- collector = collect ast_with_binds bv
64
-
65
- sql = collector.compile ["hello", "world"]
66
- assert_equal 'SELECT FROM "users" WHERE "users"."age" = hello AND "users"."name" = world', sql
67
- end
68
- end
69
- end
70
- end
@@ -1,38 +0,0 @@
1
- require 'helper'
2
- require 'arel/collectors/bind'
3
-
4
- module Arel
5
- module Collectors
6
- class TestSqlString < Arel::Test
7
- def setup
8
- @conn = FakeRecord::Base.new
9
- @visitor = Visitors::ToSql.new @conn.connection
10
- super
11
- end
12
-
13
- def collect node
14
- @visitor.accept(node, Collectors::SQLString.new)
15
- end
16
-
17
- def compile node
18
- collect(node).value
19
- end
20
-
21
- def ast_with_binds bv
22
- table = Table.new(:users)
23
- manager = Arel::SelectManager.new Table.engine, table
24
- manager.where(table[:age].eq(bv))
25
- manager.where(table[:name].eq(bv))
26
- manager.ast
27
- end
28
-
29
- def test_compile
30
- bv = Nodes::BindParam.new('?')
31
- collector = collect ast_with_binds bv
32
-
33
- sql = collector.compile ["hello", "world"]
34
- assert_equal 'SELECT FROM "users" WHERE "users"."age" = ? AND "users"."name" = ?', sql
35
- end
36
- end
37
- end
38
- end
@@ -1,22 +0,0 @@
1
- require 'rubygems'
2
- require 'minitest/autorun'
3
- require 'fileutils'
4
- require 'arel'
5
-
6
- require 'support/fake_record'
7
- Arel::Table.engine = FakeRecord::Base.new
8
-
9
- class Object
10
- def must_be_like other
11
- gsub(/\s+/, ' ').strip.must_equal other.gsub(/\s+/, ' ').strip
12
- end
13
- end
14
-
15
- module Arel
16
- class Test < MiniTest::Test
17
- def assert_like expected, actual
18
- assert_equal expected.gsub(/\s+/, ' ').strip,
19
- actual.gsub(/\s+/, ' ').strip
20
- end
21
- end
22
- end
@@ -1,20 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- describe 'And' do
6
- describe 'equality' do
7
- it 'is equal with equal ivars' do
8
- array = [And.new(['foo', 'bar']), And.new(['foo', 'bar'])]
9
- assert_equal 1, array.uniq.size
10
- end
11
-
12
- it 'is not equal with different ivars' do
13
- array = [And.new(['foo', 'bar']), And.new(['foo', 'baz'])]
14
- assert_equal 2, array.uniq.size
15
- end
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,34 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- describe 'As' do
6
- describe '#as' do
7
- it 'makes an AS node' do
8
- attr = Table.new(:users)[:id]
9
- as = attr.as(Arel.sql('foo'))
10
- assert_equal attr, as.left
11
- assert_equal 'foo', as.right
12
- end
13
-
14
- it 'converts right to SqlLiteral if a string' do
15
- attr = Table.new(:users)[:id]
16
- as = attr.as('foo')
17
- assert_kind_of Arel::Nodes::SqlLiteral, as.right
18
- end
19
- end
20
-
21
- describe 'equality' do
22
- it 'is equal with equal ivars' do
23
- array = [As.new('foo', 'bar'), As.new('foo', 'bar')]
24
- assert_equal 1, array.uniq.size
25
- end
26
-
27
- it 'is not equal with different ivars' do
28
- array = [As.new('foo', 'bar'), As.new('foo', 'baz')]
29
- assert_equal 2, array.uniq.size
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,44 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- class TestAscending < Minitest::Test
6
- def test_construct
7
- ascending = Ascending.new 'zomg'
8
- assert_equal 'zomg', ascending.expr
9
- end
10
-
11
- def test_reverse
12
- ascending = Ascending.new 'zomg'
13
- descending = ascending.reverse
14
- assert_kind_of Descending, descending
15
- assert_equal ascending.expr, descending.expr
16
- end
17
-
18
- def test_direction
19
- ascending = Ascending.new 'zomg'
20
- assert_equal :asc, ascending.direction
21
- end
22
-
23
- def test_ascending?
24
- ascending = Ascending.new 'zomg'
25
- assert ascending.ascending?
26
- end
27
-
28
- def test_descending?
29
- ascending = Ascending.new 'zomg'
30
- assert !ascending.descending?
31
- end
32
-
33
- def test_equality_with_same_ivars
34
- array = [Ascending.new('zomg'), Ascending.new('zomg')]
35
- assert_equal 1, array.uniq.size
36
- end
37
-
38
- def test_inequality_with_different_ivars
39
- array = [Ascending.new('zomg'), Ascending.new('zomg!')]
40
- assert_equal 2, array.uniq.size
41
- end
42
- end
43
- end
44
- end
@@ -1,33 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- class TestBin < Minitest::Test
6
- def test_new
7
- assert Arel::Nodes::Bin.new('zomg')
8
- end
9
-
10
- def test_default_to_sql
11
- viz = Arel::Visitors::ToSql.new Table.engine.connection_pool
12
- node = Arel::Nodes::Bin.new(Arel.sql('zomg'))
13
- assert_equal 'zomg', viz.accept(node, Collectors::SQLString.new).value
14
- end
15
-
16
- def test_mysql_to_sql
17
- viz = Arel::Visitors::MySQL.new Table.engine.connection_pool
18
- node = Arel::Nodes::Bin.new(Arel.sql('zomg'))
19
- assert_equal 'BINARY zomg', viz.accept(node, Collectors::SQLString.new).value
20
- end
21
-
22
- def test_equality_with_same_ivars
23
- array = [Bin.new('zomg'), Bin.new('zomg')]
24
- assert_equal 1, array.uniq.size
25
- end
26
-
27
- def test_inequality_with_different_ivars
28
- array = [Bin.new('zomg'), Bin.new('zomg!')]
29
- assert_equal 2, array.uniq.size
30
- end
31
- end
32
- end
33
- end
@@ -1,26 +0,0 @@
1
- require 'helper'
2
- require 'set'
3
-
4
- module Arel
5
- module Nodes
6
- describe 'Binary' do
7
- describe '#hash' do
8
- it 'generates a hash based on its value' do
9
- eq = Equality.new('foo', 'bar')
10
- eq2 = Equality.new('foo', 'bar')
11
- eq3 = Equality.new('bar', 'baz')
12
-
13
- assert_equal eq.hash, eq2.hash
14
- refute_equal eq.hash, eq3.hash
15
- end
16
-
17
- it 'generates a hash specific to its class' do
18
- eq = Equality.new('foo', 'bar')
19
- neq = NotEqual.new('foo', 'bar')
20
-
21
- refute_equal eq.hash, neq.hash
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,33 +0,0 @@
1
- require 'helper'
2
-
3
- describe Arel::Nodes::Count do
4
- describe "as" do
5
- it 'should alias the count' do
6
- table = Arel::Table.new :users
7
- table[:id].count.as('foo').to_sql.must_be_like %{
8
- COUNT("users"."id") AS foo
9
- }
10
- end
11
- end
12
-
13
- describe "eq" do
14
- it "should compare the count" do
15
- table = Arel::Table.new :users
16
- table[:id].count.eq(2).to_sql.must_be_like %{
17
- COUNT("users"."id") = 2
18
- }
19
- end
20
- end
21
-
22
- describe 'equality' do
23
- it 'is equal with equal ivars' do
24
- array = [Arel::Nodes::Count.new('foo'), Arel::Nodes::Count.new('foo')]
25
- assert_equal 1, array.uniq.size
26
- end
27
-
28
- it 'is not equal with different ivars' do
29
- array = [Arel::Nodes::Count.new('foo'), Arel::Nodes::Count.new('foo!')]
30
- assert_equal 2, array.uniq.size
31
- end
32
- end
33
- end
@@ -1,34 +0,0 @@
1
- require 'helper'
2
-
3
- describe Arel::Nodes::DeleteStatement do
4
- describe "#clone" do
5
- it "clones wheres" do
6
- statement = Arel::Nodes::DeleteStatement.new
7
- statement.wheres = %w[a b c]
8
-
9
- dolly = statement.clone
10
- dolly.wheres.must_equal statement.wheres
11
- dolly.wheres.wont_be_same_as statement.wheres
12
- end
13
- end
14
-
15
- describe 'equality' do
16
- it 'is equal with equal ivars' do
17
- statement1 = Arel::Nodes::DeleteStatement.new
18
- statement1.wheres = %w[a b c]
19
- statement2 = Arel::Nodes::DeleteStatement.new
20
- statement2.wheres = %w[a b c]
21
- array = [statement1, statement2]
22
- assert_equal 1, array.uniq.size
23
- end
24
-
25
- it 'is not equal with different ivars' do
26
- statement1 = Arel::Nodes::DeleteStatement.new
27
- statement1.wheres = %w[a b c]
28
- statement2 = Arel::Nodes::DeleteStatement.new
29
- statement2.wheres = %w[1 2 3]
30
- array = [statement1, statement2]
31
- assert_equal 2, array.uniq.size
32
- end
33
- end
34
- end
@@ -1,44 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- class TestDescending < Minitest::Test
6
- def test_construct
7
- descending = Descending.new 'zomg'
8
- assert_equal 'zomg', descending.expr
9
- end
10
-
11
- def test_reverse
12
- descending = Descending.new 'zomg'
13
- ascending = descending.reverse
14
- assert_kind_of Ascending, ascending
15
- assert_equal descending.expr, ascending.expr
16
- end
17
-
18
- def test_direction
19
- descending = Descending.new 'zomg'
20
- assert_equal :desc, descending.direction
21
- end
22
-
23
- def test_ascending?
24
- descending = Descending.new 'zomg'
25
- assert !descending.ascending?
26
- end
27
-
28
- def test_descending?
29
- descending = Descending.new 'zomg'
30
- assert descending.descending?
31
- end
32
-
33
- def test_equality_with_same_ivars
34
- array = [Descending.new('zomg'), Descending.new('zomg')]
35
- assert_equal 1, array.uniq.size
36
- end
37
-
38
- def test_inequality_with_different_ivars
39
- array = [Descending.new('zomg'), Descending.new('zomg!')]
40
- assert_equal 2, array.uniq.size
41
- end
42
- end
43
- end
44
- end
@@ -1,20 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- describe 'Distinct' do
6
- describe 'equality' do
7
- it 'is equal to other distinct nodes' do
8
- array = [Distinct.new, Distinct.new]
9
- assert_equal 1, array.uniq.size
10
- end
11
-
12
- it 'is not equal with other nodes' do
13
- array = [Distinct.new, Node.new]
14
- assert_equal 2, array.uniq.size
15
- end
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,84 +0,0 @@
1
- require 'helper'
2
-
3
- module Arel
4
- module Nodes
5
- describe 'equality' do
6
- # FIXME: backwards compat
7
- describe 'backwards compat' do
8
- describe 'operator' do
9
- it 'returns :==' do
10
- attr = Table.new(:users)[:id]
11
- left = attr.eq(10)
12
- left.operator.must_equal :==
13
- end
14
- end
15
-
16
- describe 'operand1' do
17
- it "should equal left" do
18
- attr = Table.new(:users)[:id]
19
- left = attr.eq(10)
20
- left.left.must_equal left.operand1
21
- end
22
- end
23
-
24
- describe 'operand2' do
25
- it "should equal right" do
26
- attr = Table.new(:users)[:id]
27
- left = attr.eq(10)
28
- left.right.must_equal left.operand2
29
- end
30
- end
31
-
32
- describe 'to_sql' do
33
- it 'takes an engine' do
34
- engine = FakeRecord::Base.new
35
- engine.connection.extend Module.new {
36
- attr_accessor :quote_count
37
- def quote(*args) @quote_count += 1; super; end
38
- def quote_column_name(*args) @quote_count += 1; super; end
39
- def quote_table_name(*args) @quote_count += 1; super; end
40
- }
41
- engine.connection.quote_count = 0
42
-
43
- attr = Table.new(:users)[:id]
44
- test = attr.eq(10)
45
- test.to_sql engine
46
- engine.connection.quote_count.must_equal 3
47
- end
48
- end
49
- end
50
-
51
- describe 'or' do
52
- it 'makes an OR node' do
53
- attr = Table.new(:users)[:id]
54
- left = attr.eq(10)
55
- right = attr.eq(11)
56
- node = left.or right
57
- node.expr.left.must_equal left
58
- node.expr.right.must_equal right
59
- end
60
- end
61
-
62
- describe 'and' do
63
- it 'makes and AND node' do
64
- attr = Table.new(:users)[:id]
65
- left = attr.eq(10)
66
- right = attr.eq(11)
67
- node = left.and right
68
- node.left.must_equal left
69
- node.right.must_equal right
70
- end
71
- end
72
-
73
- it 'is equal with equal ivars' do
74
- array = [Equality.new('foo', 'bar'), Equality.new('foo', 'bar')]
75
- assert_equal 1, array.uniq.size
76
- end
77
-
78
- it 'is not equal with different ivars' do
79
- array = [Equality.new('foo', 'bar'), Equality.new('foo', 'baz')]
80
- assert_equal 2, array.uniq.size
81
- end
82
- end
83
- end
84
- end