arel 3.0.3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/.travis.yml +2 -4
  2. data/Gemfile +2 -2
  3. data/History.txt +3 -54
  4. data/Manifest.txt +8 -2
  5. data/README.markdown +8 -4
  6. data/Rakefile +1 -1
  7. data/arel.gemspec +21 -29
  8. data/lib/arel/crud.rb +3 -3
  9. data/lib/arel/nodes/and.rb +10 -0
  10. data/lib/arel/nodes/binary.rb +11 -0
  11. data/lib/arel/nodes/extract.rb +11 -0
  12. data/lib/arel/nodes/false.rb +7 -0
  13. data/lib/arel/nodes/function.rb +11 -0
  14. data/lib/arel/nodes/grouping.rb +7 -0
  15. data/lib/arel/nodes/insert_statement.rb +12 -0
  16. data/lib/arel/nodes/named_function.rb +9 -0
  17. data/lib/arel/nodes/select_core.rb +20 -0
  18. data/lib/arel/nodes/select_statement.rb +15 -1
  19. data/lib/arel/nodes/table_alias.rb +4 -0
  20. data/lib/arel/nodes/terminal.rb +7 -0
  21. data/lib/arel/nodes/true.rb +7 -0
  22. data/lib/arel/nodes/unary.rb +10 -1
  23. data/lib/arel/nodes/update_statement.rb +15 -0
  24. data/lib/arel/nodes/window.rb +30 -3
  25. data/lib/arel/nodes.rb +1 -0
  26. data/lib/arel/predications.rb +18 -2
  27. data/lib/arel/select_manager.rb +6 -2
  28. data/lib/arel/table.rb +14 -1
  29. data/lib/arel/tree_manager.rb +0 -2
  30. data/lib/arel/visitors/bind_visitor.rb +10 -0
  31. data/lib/arel/visitors/dot.rb +2 -2
  32. data/lib/arel/visitors/to_sql.rb +142 -31
  33. data/lib/arel.rb +1 -3
  34. data/test/nodes/test_and.rb +20 -0
  35. data/test/nodes/test_as.rb +12 -0
  36. data/test/nodes/test_ascending.rb +10 -0
  37. data/test/nodes/test_bin.rb +10 -0
  38. data/test/nodes/test_count.rb +12 -0
  39. data/test/nodes/test_delete_statement.rb +20 -0
  40. data/test/nodes/test_descending.rb +10 -0
  41. data/test/nodes/test_distinct.rb +20 -0
  42. data/test/nodes/test_equality.rb +10 -0
  43. data/test/nodes/test_extract.rb +14 -0
  44. data/test/nodes/test_false.rb +20 -0
  45. data/test/nodes/test_grouping.rb +25 -0
  46. data/test/nodes/test_infix_operation.rb +10 -0
  47. data/test/nodes/test_insert_statement.rb +24 -0
  48. data/test/nodes/test_named_function.rb +16 -0
  49. data/test/nodes/test_not.rb +12 -0
  50. data/test/nodes/test_or.rb +12 -0
  51. data/test/nodes/test_over.rb +18 -0
  52. data/test/nodes/test_select_core.rb +38 -0
  53. data/test/nodes/test_select_statement.rb +36 -0
  54. data/test/nodes/test_sql_literal.rb +10 -0
  55. data/test/nodes/test_sum.rb +12 -0
  56. data/test/nodes/test_table_alias.rb +36 -0
  57. data/test/nodes/test_true.rb +21 -0
  58. data/test/nodes/test_update_statement.rb +40 -0
  59. data/test/nodes/test_window.rb +73 -0
  60. data/test/support/fake_record.rb +5 -1
  61. data/test/test_attributes.rb +12 -0
  62. data/test/test_insert_manager.rb +0 -2
  63. data/test/test_select_manager.rb +10 -5
  64. data/test/test_table.rb +24 -0
  65. data/test/test_update_manager.rb +8 -0
  66. data/test/visitors/test_bind_visitor.rb +20 -1
  67. data/test/visitors/test_to_sql.rb +78 -0
  68. metadata +84 -82
  69. data/lib/arel/nodes/ordering.rb +0 -6
  70. data/lib/arel/relation.rb +0 -6
@@ -1,9 +1,28 @@
1
1
  require 'helper'
2
2
  require 'arel/visitors/bind_visitor'
3
+ require 'support/fake_record'
3
4
 
4
5
  module Arel
5
6
  module Visitors
6
- class TestBindVisitor < MiniTest::Unit::TestCase
7
+ class TestBindVisitor < MiniTest::Unit::TestCase
8
+
9
+ ##
10
+ # Tests visit_Arel_Nodes_Assignment correctly
11
+ # substitutes binds with values from block
12
+ def test_assignment_binds_are_substituted
13
+ table = Table.new(:users)
14
+ um = Arel::UpdateManager.new Table.engine
15
+ bp = Nodes::BindParam.new '?'
16
+ um.set [[table[:name], bp]]
17
+ visitor = Class.new(Arel::Visitors::ToSql) {
18
+ include Arel::Visitors::BindVisitor
19
+ }.new Table.engine.connection
20
+
21
+ assignment = um.ast.values[0]
22
+ actual = visitor.accept(assignment) { "replace" }
23
+ actual.must_be_like "\"name\" = replace"
24
+ end
25
+
7
26
  def test_visitor_yields_on_binds
8
27
  visitor = Class.new(Arel::Visitors::Visitor) {
9
28
  def initialize omg
@@ -48,6 +48,45 @@ module Arel
48
48
  sql.must_be_like %{ omg(*) = 2 }
49
49
  end
50
50
 
51
+ it 'should visit built-in functions' do
52
+ function = Nodes::Count.new([Arel.star])
53
+ assert_equal 'COUNT(*)', @visitor.accept(function)
54
+
55
+ function = Nodes::Sum.new([Arel.star])
56
+ assert_equal 'SUM(*)', @visitor.accept(function)
57
+
58
+ function = Nodes::Max.new([Arel.star])
59
+ assert_equal 'MAX(*)', @visitor.accept(function)
60
+
61
+ function = Nodes::Min.new([Arel.star])
62
+ assert_equal 'MIN(*)', @visitor.accept(function)
63
+
64
+ function = Nodes::Avg.new([Arel.star])
65
+ assert_equal 'AVG(*)', @visitor.accept(function)
66
+ end
67
+
68
+ it 'should visit built-in functions operating on distinct values' do
69
+ function = Nodes::Count.new([Arel.star])
70
+ function.distinct = true
71
+ assert_equal 'COUNT(DISTINCT *)', @visitor.accept(function)
72
+
73
+ function = Nodes::Sum.new([Arel.star])
74
+ function.distinct = true
75
+ assert_equal 'SUM(DISTINCT *)', @visitor.accept(function)
76
+
77
+ function = Nodes::Max.new([Arel.star])
78
+ function.distinct = true
79
+ assert_equal 'MAX(DISTINCT *)', @visitor.accept(function)
80
+
81
+ function = Nodes::Min.new([Arel.star])
82
+ function.distinct = true
83
+ assert_equal 'MIN(DISTINCT *)', @visitor.accept(function)
84
+
85
+ function = Nodes::Avg.new([Arel.star])
86
+ function.distinct = true
87
+ assert_equal 'AVG(DISTINCT *)', @visitor.accept(function)
88
+ end
89
+
51
90
  it 'works with lists' do
52
91
  function = Nodes::NamedFunction.new('omg', [Arel.star, Arel.star])
53
92
  assert_equal 'omg(*, *)', @visitor.accept(function)
@@ -126,6 +165,11 @@ module Arel
126
165
  @visitor.accept(nil).must_be_like "NULL"
127
166
  end
128
167
 
168
+ it "should visit_Arel_SelectManager, which is a subquery" do
169
+ mgr = Table.new(:foo).project(:bar)
170
+ @visitor.accept(mgr).must_be_like '(SELECT bar FROM "foo")'
171
+ end
172
+
129
173
  it "should visit_Arel_Nodes_And" do
130
174
  node = Nodes::And.new [@attr.eq(10), @attr.eq(11)]
131
175
  @visitor.accept(node).must_be_like %{
@@ -186,6 +230,23 @@ module Arel
186
230
  }
187
231
  end
188
232
 
233
+ it 'can handle ranges bounded by infinity' do
234
+ node = @attr.in 1..Float::INFINITY
235
+ @visitor.accept(node).must_be_like %{
236
+ "users"."id" >= 1
237
+ }
238
+ node = @attr.in(-Float::INFINITY..3)
239
+ @visitor.accept(node).must_be_like %{
240
+ "users"."id" <= 3
241
+ }
242
+ node = @attr.in(-Float::INFINITY...3)
243
+ @visitor.accept(node).must_be_like %{
244
+ "users"."id" < 3
245
+ }
246
+ node = @attr.in(-Float::INFINITY..Float::INFINITY)
247
+ @visitor.accept(node).must_be_like %{1=1}
248
+ end
249
+
189
250
  it 'can handle subqueries' do
190
251
  table = Table.new(:users)
191
252
  subquery = table.project(:id).where(table[:name].eq('Aaron'))
@@ -272,6 +333,23 @@ module Arel
272
333
  }
273
334
  end
274
335
 
336
+ it 'can handle ranges bounded by infinity' do
337
+ node = @attr.not_in 1..Float::INFINITY
338
+ @visitor.accept(node).must_be_like %{
339
+ "users"."id" < 1
340
+ }
341
+ node = @attr.not_in(-Float::INFINITY..3)
342
+ @visitor.accept(node).must_be_like %{
343
+ "users"."id" > 3
344
+ }
345
+ node = @attr.not_in(-Float::INFINITY...3)
346
+ @visitor.accept(node).must_be_like %{
347
+ "users"."id" >= 3
348
+ }
349
+ node = @attr.not_in(-Float::INFINITY..Float::INFINITY)
350
+ @visitor.accept(node).must_be_like %{1=0}
351
+ end
352
+
275
353
  it 'can handle subqueries' do
276
354
  table = Table.new(:users)
277
355
  subquery = table.project(:id).where(table[:name].eq('Aaron'))
metadata CHANGED
@@ -1,15 +1,10 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: arel
3
- version: !ruby/object:Gem::Version
4
- hash: 1
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.0.0
5
5
  prerelease:
6
- segments:
7
- - 3
8
- - 0
9
- - 3
10
- version: 3.0.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Aaron Patterson
14
9
  - Bryan Halmkamp
15
10
  - Emilio Tagua
@@ -17,79 +12,82 @@ authors:
17
12
  autorequire:
18
13
  bindir: bin
19
14
  cert_chain: []
20
-
21
- date: 2013-11-14 00:00:00 -02:00
22
- default_executable:
23
- dependencies:
24
- - !ruby/object:Gem::Dependency
15
+ date: 2013-04-18 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
25
18
  name: minitest
26
- prerelease: false
27
- requirement: &id001 !ruby/object:Gem::Requirement
19
+ requirement: !ruby/object:Gem::Requirement
28
20
  none: false
29
- requirements:
21
+ requirements:
30
22
  - - ~>
31
- - !ruby/object:Gem::Version
32
- hash: 21
33
- segments:
34
- - 4
35
- - 7
36
- version: "4.7"
23
+ - !ruby/object:Gem::Version
24
+ version: '4.4'
37
25
  type: :development
38
- version_requirements: *id001
39
- - !ruby/object:Gem::Dependency
40
- name: rdoc
41
26
  prerelease: false
42
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '4.4'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rdoc
35
+ requirement: !ruby/object:Gem::Requirement
43
36
  none: false
44
- requirements:
37
+ requirements:
45
38
  - - ~>
46
- - !ruby/object:Gem::Version
47
- hash: 27
48
- segments:
49
- - 4
50
- - 0
51
- version: "4.0"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
52
41
  type: :development
53
- version_requirements: *id002
54
- - !ruby/object:Gem::Dependency
55
- name: hoe
56
42
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '4.0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: hoe
51
+ requirement: !ruby/object:Gem::Requirement
58
52
  none: false
59
- requirements:
53
+ requirements:
60
54
  - - ~>
61
- - !ruby/object:Gem::Version
62
- hash: 9
63
- segments:
64
- - 3
65
- - 7
66
- version: "3.7"
55
+ - !ruby/object:Gem::Version
56
+ version: '3.5'
67
57
  type: :development
68
- version_requirements: *id003
69
- description: |-
70
- Arel is a SQL AST manager for Ruby. It
71
-
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: '3.5'
65
+ description: ! 'Arel is a SQL AST manager for Ruby. It
66
+
67
+
72
68
  1. Simplifies the generation of complex SQL queries
69
+
73
70
  2. Adapts to various RDBMS systems
74
-
71
+
72
+
75
73
  It is intended to be a framework framework; that is, you can build your own ORM
74
+
76
75
  with it, focusing on innovative object and collection modeling as opposed to
77
- database compatibility and query generation.
78
- email:
76
+
77
+ database compatibility and query generation.'
78
+ email:
79
79
  - aaron@tenderlovemaking.com
80
80
  - bryan@brynary.com
81
81
  - miloops@gmail.com
82
82
  - nick@example.org
83
83
  executables: []
84
-
85
84
  extensions: []
86
-
87
- extra_rdoc_files:
85
+ extra_rdoc_files:
88
86
  - History.txt
89
87
  - MIT-LICENSE.txt
90
88
  - Manifest.txt
91
89
  - README.markdown
92
- files:
90
+ files:
93
91
  - .autotest
94
92
  - .gemtest
95
93
  - .travis.yml
@@ -124,6 +122,7 @@ files:
124
122
  - lib/arel/nodes/extract.rb
125
123
  - lib/arel/nodes/false.rb
126
124
  - lib/arel/nodes/function.rb
125
+ - lib/arel/nodes/grouping.rb
127
126
  - lib/arel/nodes/in.rb
128
127
  - lib/arel/nodes/infix_operation.rb
129
128
  - lib/arel/nodes/inner_join.rb
@@ -131,7 +130,6 @@ files:
131
130
  - lib/arel/nodes/join_source.rb
132
131
  - lib/arel/nodes/named_function.rb
133
132
  - lib/arel/nodes/node.rb
134
- - lib/arel/nodes/ordering.rb
135
133
  - lib/arel/nodes/outer_join.rb
136
134
  - lib/arel/nodes/over.rb
137
135
  - lib/arel/nodes/select_core.rb
@@ -149,7 +147,6 @@ files:
149
147
  - lib/arel/nodes/with.rb
150
148
  - lib/arel/order_predications.rb
151
149
  - lib/arel/predications.rb
152
- - lib/arel/relation.rb
153
150
  - lib/arel/select_manager.rb
154
151
  - lib/arel/sql/engine.rb
155
152
  - lib/arel/sql_literal.rb
@@ -175,14 +172,18 @@ files:
175
172
  - lib/arel/window_predications.rb
176
173
  - test/attributes/test_attribute.rb
177
174
  - test/helper.rb
175
+ - test/nodes/test_and.rb
178
176
  - test/nodes/test_as.rb
179
177
  - test/nodes/test_ascending.rb
180
178
  - test/nodes/test_bin.rb
181
179
  - test/nodes/test_count.rb
182
180
  - test/nodes/test_delete_statement.rb
183
181
  - test/nodes/test_descending.rb
182
+ - test/nodes/test_distinct.rb
184
183
  - test/nodes/test_equality.rb
185
184
  - test/nodes/test_extract.rb
185
+ - test/nodes/test_false.rb
186
+ - test/nodes/test_grouping.rb
186
187
  - test/nodes/test_infix_operation.rb
187
188
  - test/nodes/test_insert_statement.rb
188
189
  - test/nodes/test_named_function.rb
@@ -194,7 +195,10 @@ files:
194
195
  - test/nodes/test_select_statement.rb
195
196
  - test/nodes/test_sql_literal.rb
196
197
  - test/nodes/test_sum.rb
198
+ - test/nodes/test_table_alias.rb
199
+ - test/nodes/test_true.rb
197
200
  - test/nodes/test_update_statement.rb
201
+ - test/nodes/test_window.rb
198
202
  - test/support/fake_record.rb
199
203
  - test/test_activerecord_compat.rb
200
204
  - test/test_attributes.rb
@@ -217,51 +221,46 @@ files:
217
221
  - test/visitors/test_postgres.rb
218
222
  - test/visitors/test_sqlite.rb
219
223
  - test/visitors/test_to_sql.rb
220
- has_rdoc: true
221
224
  homepage: http://github.com/rails/arel
222
- licenses:
223
- - MIT
225
+ licenses: []
224
226
  post_install_message:
225
- rdoc_options:
227
+ rdoc_options:
226
228
  - --main
227
229
  - README.markdown
228
- require_paths:
230
+ require_paths:
229
231
  - lib
230
- required_ruby_version: !ruby/object:Gem::Requirement
232
+ required_ruby_version: !ruby/object:Gem::Requirement
231
233
  none: false
232
- requirements:
233
- - - ">="
234
- - !ruby/object:Gem::Version
235
- hash: 3
236
- segments:
237
- - 0
238
- version: "0"
239
- required_rubygems_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
239
  none: false
241
- requirements:
242
- - - ">="
243
- - !ruby/object:Gem::Version
244
- hash: 3
245
- segments:
246
- - 0
247
- version: "0"
240
+ requirements:
241
+ - - ! '>='
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
248
244
  requirements: []
249
-
250
245
  rubyforge_project: arel
251
- rubygems_version: 1.6.2
246
+ rubygems_version: 1.8.23
252
247
  signing_key:
253
248
  specification_version: 3
254
249
  summary: Arel is a SQL AST manager for Ruby
255
- test_files:
250
+ test_files:
256
251
  - test/attributes/test_attribute.rb
252
+ - test/nodes/test_and.rb
257
253
  - test/nodes/test_as.rb
258
254
  - test/nodes/test_ascending.rb
259
255
  - test/nodes/test_bin.rb
260
256
  - test/nodes/test_count.rb
261
257
  - test/nodes/test_delete_statement.rb
262
258
  - test/nodes/test_descending.rb
259
+ - test/nodes/test_distinct.rb
263
260
  - test/nodes/test_equality.rb
264
261
  - test/nodes/test_extract.rb
262
+ - test/nodes/test_false.rb
263
+ - test/nodes/test_grouping.rb
265
264
  - test/nodes/test_infix_operation.rb
266
265
  - test/nodes/test_insert_statement.rb
267
266
  - test/nodes/test_named_function.rb
@@ -273,7 +272,10 @@ test_files:
273
272
  - test/nodes/test_select_statement.rb
274
273
  - test/nodes/test_sql_literal.rb
275
274
  - test/nodes/test_sum.rb
275
+ - test/nodes/test_table_alias.rb
276
+ - test/nodes/test_true.rb
276
277
  - test/nodes/test_update_statement.rb
278
+ - test/nodes/test_window.rb
277
279
  - test/test_activerecord_compat.rb
278
280
  - test/test_attributes.rb
279
281
  - test/test_crud.rb
@@ -1,6 +0,0 @@
1
- module Arel
2
- module Nodes
3
- class Ordering < Unary
4
- end
5
- end
6
- end
data/lib/arel/relation.rb DELETED
@@ -1,6 +0,0 @@
1
- module Arel
2
- ###
3
- # This is deprecated. Fix rails, then remove this.
4
- module Relation
5
- end
6
- end