arel 4.0.0 → 4.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 43df8ad0c214e6f273a245b06ad740700735eadb
4
+ data.tar.gz: 15084841b2ad5743e4d81722bebbff6bc7471a2f
5
+ SHA512:
6
+ metadata.gz: f8c37e0d0b37551a9b27cbce6d7c3b7509bdbb98847175446a57fae35198ab9c996153baed4f9d3f7c7df018d4efa0830c9c150fc9f413a59087aa73cb09eebe
7
+ data.tar.gz: 439ace13cbdee92401d629c1874a82d9355c2a53a9fbc6b8b086a2fa1fac5a59fa9a6feb47163014bc452358154ded999b36fd2991a870c5557f5ea7ebe6fa3e
@@ -1,3 +1,15 @@
1
+ == 4.0.1 / 2013-10-22
2
+
3
+ * Enhancements
4
+
5
+ * Cache visitor dispatch on a per-visitor basis
6
+ * Improve performance of #uniq across a large number of nodes
7
+
8
+ * Bug Fixes
9
+
10
+ * Make visitors threadsafe by removing @last_column
11
+ * Support `columns_for_distinct` with Oracle adapter
12
+
1
13
  == 2.2.1 / 2011-09-15
2
14
 
3
15
  * Enhancements
@@ -19,11 +31,11 @@
19
31
  * Bug Fixes
20
32
 
21
33
  * Fix depth-first traversal to understand ascending / descending nodes.
22
- * Parentheis are suppressed with nested unions in MySQL. Thanks jhtwong!
34
+ * Parenthesis are suppressed with nested unions in MySQL. Thanks jhtwong!
23
35
 
24
36
  == 2.1.3 / 2011-06-27
25
37
 
26
- * Bug Fixues
38
+ * Bug Fixes
27
39
 
28
40
  * Fixed broken gem build.
29
41
 
@@ -31,7 +43,7 @@
31
43
 
32
44
  * Bug Fixes
33
45
 
34
- * Visitors can define their own cache strategey so caches are not shared.
46
+ * Visitors can define their own cache strategy so caches are not shared.
35
47
  Fixes #57
36
48
  * Informix support fixed. Thanks Khronos.
37
49
  * Ordering nodes broken to subclasses. Thanks Ernie Miller!
@@ -121,6 +121,7 @@ test/test_table.rb
121
121
  test/test_update_manager.rb
122
122
  test/visitors/test_bind_visitor.rb
123
123
  test/visitors/test_depth_first.rb
124
+ test/visitors/test_dispatch_contamination.rb
124
125
  test/visitors/test_dot.rb
125
126
  test/visitors/test_ibm_db.rb
126
127
  test/visitors/test_informix.rb
@@ -21,13 +21,17 @@ For the moment, Arel uses Active Record's connection adapters to connect to the
21
21
 
22
22
  Generating a query with Arel is simple. For example, in order to produce
23
23
 
24
- SELECT * FROM users
24
+ ```sql
25
+ SELECT * FROM users
26
+ ```
25
27
 
26
28
  you construct a table relation and convert it to sql:
27
29
 
28
- users = Arel::Table.new(:users)
29
- query = users.project(Arel.sql('*'))
30
- query.to_sql
30
+ ```ruby
31
+ users = Arel::Table.new(:users)
32
+ query = users.project(Arel.sql('*'))
33
+ query.to_sql
34
+ ```
31
35
 
32
36
  ### More Sophisticated Queries
33
37
 
@@ -35,45 +39,65 @@ Here is a whirlwind tour through the most common relational operators. These wil
35
39
 
36
40
  First is the 'restriction' operator, `where`:
37
41
 
38
- users.where(users[:name].eq('amy'))
39
- # => SELECT * FROM users WHERE users.name = 'amy'
42
+ ```ruby
43
+ users.where(users[:name].eq('amy'))
44
+ # => SELECT * FROM users WHERE users.name = 'amy'
45
+ ```
40
46
 
41
47
  What would, in SQL, be part of the `SELECT` clause is called in Arel a `projection`:
42
48
 
43
- users.project(users[:id]) # => SELECT users.id FROM users
49
+ ```ruby
50
+ users.project(users[:id])
51
+ # => SELECT users.id FROM users
52
+ ```
44
53
 
45
54
  Joins resemble SQL strongly:
46
55
 
47
- users.join(photos).on(users[:id].eq(photos[:user_id]))
48
- # => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id
56
+ ```ruby
57
+ users.join(photos).on(users[:id].eq(photos[:user_id]))
58
+ # => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id
59
+ ```
49
60
 
50
61
  What are called `LIMIT` and `OFFSET` in SQL are called `take` and `skip` in Arel:
51
62
 
52
- users.take(5) # => SELECT * FROM users LIMIT 5
53
- users.skip(4) # => SELECT * FROM users OFFSET 4
63
+ ```ruby
64
+ users.take(5) # => SELECT * FROM users LIMIT 5
65
+ users.skip(4) # => SELECT * FROM users OFFSET 4
66
+ ```
54
67
 
55
68
  `GROUP BY` is called `group`:
56
69
 
57
- users.project(users[:name]).group(users[:name]) # => SELECT users.name FROM users GROUP BY users.name
70
+ ```ruby
71
+ users.project(users[:name]).group(users[:name])
72
+ # => SELECT users.name FROM users GROUP BY users.name
73
+ ```
58
74
 
59
75
  The best property of the Relational Algebra is its "composability", or closure under all operations. For example, to restrict AND project, just "chain" the method invocations:
60
76
 
61
- users \
62
- .where(users[:name].eq('amy')) \
63
- .project(users[:id]) \
64
- # => SELECT users.id FROM users WHERE users.name = 'amy'
77
+ ```ruby
78
+ users \
79
+ .where(users[:name].eq('amy')) \
80
+ .project(users[:id]) \
81
+ # => SELECT users.id FROM users WHERE users.name = 'amy'
82
+ ```
65
83
 
66
84
  All operators are chainable in this way, and they are chainable any number of times, in any order.
67
85
 
68
- users.where(users[:name].eq('bob')).where(users[:age].lt(25))
86
+ ```ruby
87
+ users.where(users[:name].eq('bob')).where(users[:age].lt(25))
88
+ ```
69
89
 
70
90
  Of course, many of the operators take multiple arguments, so the last example can be written more tersely:
71
91
 
72
- users.where(users[:name].eq('bob'), users[:age].lt(25))
92
+ ```ruby
93
+ users.where(users[:name].eq('bob'), users[:age].lt(25))
94
+ ```
73
95
 
74
96
  The `OR` operator works like this:
75
97
 
76
- users.where(users[:name].eq('bob').or(users[:age].lt(25)))
98
+ ```ruby
99
+ users.where(users[:name].eq('bob').or(users[:age].lt(25)))
100
+ ```
77
101
 
78
102
  The `AND` operator behaves similarly.
79
103
 
@@ -85,38 +109,51 @@ The examples above are fairly simple and other libraries match or come close to
85
109
 
86
110
  Suppose we have a table `products` with prices in different currencies. And we have a table `currency_rates`, of constantly changing currency rates. In Arel:
87
111
 
88
- products = Arel::Table.new(:products)
89
- products.columns # => [products[:id], products[:name], products[:price], products[:currency_id]]
112
+ ```ruby
113
+ products = Arel::Table.new(:products)
114
+ products.columns
115
+ # => [products[:id], products[:name], products[:price], products[:currency_id]]
90
116
 
91
- currency_rates = Arel::Table.new(:currency_rates)
92
- currency_rates.columns # => [currency_rates[:from_id], currency_rates[:to_id], currency_rates[:date], currency_rates[:rate]]
117
+ currency_rates = Arel::Table.new(:currency_rates)
118
+ currency_rates.columns
119
+ # => [currency_rates[:from_id], currency_rates[:to_id], currency_rates[:date], currency_rates[:rate]]
120
+ ```
93
121
 
94
122
  Now, to order products by price in user preferred currency simply call:
95
123
 
96
- products.
97
- join(:currency_rates).on(products[:currency_id].eq(currency_rates[:from_id])).
98
- where(currency_rates[:to_id].eq(user_preferred_currency), currency_rates[:date].eq(Date.today)).
99
- order(products[:price] * currency_rates[:rate])
124
+ ```ruby
125
+ products.
126
+ join(:currency_rates).on(products[:currency_id].eq(currency_rates[:from_id])).
127
+ where(currency_rates[:to_id].eq(user_preferred_currency), currency_rates[:date].eq(Date.today)).
128
+ order(products[:price] * currency_rates[:rate])
129
+ ```
100
130
 
101
131
  #### Complex Joins
102
132
 
103
133
  Where Arel really shines in its ability to handle complex joins and aggregations. As a first example, let's consider an "adjacency list", a tree represented in a table. Suppose we have a table `comments`, representing a threaded discussion:
104
134
 
105
- comments = Arel::Table.new(:comments)
135
+ ```ruby
136
+ comments = Arel::Table.new(:comments)
137
+ ```
106
138
 
107
139
  And this table has the following attributes:
108
140
 
109
- comments.columns # => [comments[:id], comments[:body], comments[:parent_id]]
141
+ ```ruby
142
+ comments.columns
143
+ # => [comments[:id], comments[:body], comments[:parent_id]]
144
+ ```
110
145
 
111
146
  The `parent_id` column is a foreign key from the `comments` table to itself. Now, joining a table to itself requires aliasing in SQL. In fact, you may alias in Arel as well:
112
147
 
113
- replies = comments.alias
114
- comments_with_replies = \
115
- comments.join(replies).on(replies[:parent_id].eq(comments[:id]))
116
- # => SELECT * FROM comments INNER JOIN comments AS comments_2 WHERE comments_2.parent_id = comments.id
148
+ ```ruby
149
+ replies = comments.alias
150
+ comments_with_replies = \
151
+ comments.join(replies).on(replies[:parent_id].eq(comments[:id]))
152
+ # => SELECT * FROM comments INNER JOIN comments AS comments_2 WHERE comments_2.parent_id = comments.id
153
+ ```
117
154
 
118
155
  This will return the first comment's reply's body.
119
156
 
120
157
  ### License
121
-
158
+
122
159
  Arel is released under the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -14,6 +14,7 @@ Hoe.spec 'arel' do
14
14
  developer('Emilio Tagua', 'miloops@gmail.com')
15
15
  developer('Nick Kallen', 'nick@example.org') # FIXME: need Nick's email
16
16
 
17
+ self.licenses = ['MIT']
17
18
  self.readme_file = 'README.markdown'
18
19
  self.extra_rdoc_files = FileList['README.markdown']
19
20
  end
@@ -2,38 +2,39 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "arel"
5
- s.version = "4.0.0.20130418133826"
5
+ s.version = "4.0.1.20131022201058"
6
6
 
7
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Aaron Patterson", "Bryan Halmkamp", "Emilio Tagua", "Nick Kallen"]
9
- s.date = "2013-04-18"
9
+ s.date = "2013-10-22"
10
10
  s.description = "Arel is a SQL AST manager for Ruby. It\n\n1. Simplifies the generation of complex SQL queries\n2. Adapts to various RDBMS systems\n\nIt is intended to be a framework framework; that is, you can build your own ORM\nwith it, focusing on innovative object and collection modeling as opposed to\ndatabase compatibility and query generation."
11
11
  s.email = ["aaron@tenderlovemaking.com", "bryan@brynary.com", "miloops@gmail.com", "nick@example.org"]
12
12
  s.extra_rdoc_files = ["History.txt", "MIT-LICENSE.txt", "Manifest.txt", "README.markdown"]
13
- s.files = [".autotest", ".gemtest", ".travis.yml", "Gemfile", "History.txt", "MIT-LICENSE.txt", "Manifest.txt", "README.markdown", "Rakefile", "arel.gemspec", "lib/arel.rb", "lib/arel/alias_predication.rb", "lib/arel/attributes.rb", "lib/arel/attributes/attribute.rb", "lib/arel/compatibility/wheres.rb", "lib/arel/crud.rb", "lib/arel/delete_manager.rb", "lib/arel/deprecated.rb", "lib/arel/expression.rb", "lib/arel/expressions.rb", "lib/arel/factory_methods.rb", "lib/arel/insert_manager.rb", "lib/arel/math.rb", "lib/arel/nodes.rb", "lib/arel/nodes/and.rb", "lib/arel/nodes/ascending.rb", "lib/arel/nodes/binary.rb", "lib/arel/nodes/count.rb", "lib/arel/nodes/delete_statement.rb", "lib/arel/nodes/descending.rb", "lib/arel/nodes/equality.rb", "lib/arel/nodes/extract.rb", "lib/arel/nodes/false.rb", "lib/arel/nodes/function.rb", "lib/arel/nodes/grouping.rb", "lib/arel/nodes/in.rb", "lib/arel/nodes/infix_operation.rb", "lib/arel/nodes/inner_join.rb", "lib/arel/nodes/insert_statement.rb", "lib/arel/nodes/join_source.rb", "lib/arel/nodes/named_function.rb", "lib/arel/nodes/node.rb", "lib/arel/nodes/outer_join.rb", "lib/arel/nodes/over.rb", "lib/arel/nodes/select_core.rb", "lib/arel/nodes/select_statement.rb", "lib/arel/nodes/sql_literal.rb", "lib/arel/nodes/string_join.rb", "lib/arel/nodes/table_alias.rb", "lib/arel/nodes/terminal.rb", "lib/arel/nodes/true.rb", "lib/arel/nodes/unary.rb", "lib/arel/nodes/unqualified_column.rb", "lib/arel/nodes/update_statement.rb", "lib/arel/nodes/values.rb", "lib/arel/nodes/window.rb", "lib/arel/nodes/with.rb", "lib/arel/order_predications.rb", "lib/arel/predications.rb", "lib/arel/select_manager.rb", "lib/arel/sql/engine.rb", "lib/arel/sql_literal.rb", "lib/arel/table.rb", "lib/arel/tree_manager.rb", "lib/arel/update_manager.rb", "lib/arel/visitors.rb", "lib/arel/visitors/bind_visitor.rb", "lib/arel/visitors/depth_first.rb", "lib/arel/visitors/dot.rb", "lib/arel/visitors/ibm_db.rb", "lib/arel/visitors/informix.rb", "lib/arel/visitors/join_sql.rb", "lib/arel/visitors/mssql.rb", "lib/arel/visitors/mysql.rb", "lib/arel/visitors/oracle.rb", "lib/arel/visitors/order_clauses.rb", "lib/arel/visitors/postgresql.rb", "lib/arel/visitors/sqlite.rb", "lib/arel/visitors/to_sql.rb", "lib/arel/visitors/visitor.rb", "lib/arel/visitors/where_sql.rb", "lib/arel/window_predications.rb", "test/attributes/test_attribute.rb", "test/helper.rb", "test/nodes/test_and.rb", "test/nodes/test_as.rb", "test/nodes/test_ascending.rb", "test/nodes/test_bin.rb", "test/nodes/test_count.rb", "test/nodes/test_delete_statement.rb", "test/nodes/test_descending.rb", "test/nodes/test_distinct.rb", "test/nodes/test_equality.rb", "test/nodes/test_extract.rb", "test/nodes/test_false.rb", "test/nodes/test_grouping.rb", "test/nodes/test_infix_operation.rb", "test/nodes/test_insert_statement.rb", "test/nodes/test_named_function.rb", "test/nodes/test_node.rb", "test/nodes/test_not.rb", "test/nodes/test_or.rb", "test/nodes/test_over.rb", "test/nodes/test_select_core.rb", "test/nodes/test_select_statement.rb", "test/nodes/test_sql_literal.rb", "test/nodes/test_sum.rb", "test/nodes/test_table_alias.rb", "test/nodes/test_true.rb", "test/nodes/test_update_statement.rb", "test/nodes/test_window.rb", "test/support/fake_record.rb", "test/test_activerecord_compat.rb", "test/test_attributes.rb", "test/test_crud.rb", "test/test_delete_manager.rb", "test/test_factory_methods.rb", "test/test_insert_manager.rb", "test/test_select_manager.rb", "test/test_table.rb", "test/test_update_manager.rb", "test/visitors/test_bind_visitor.rb", "test/visitors/test_depth_first.rb", "test/visitors/test_dot.rb", "test/visitors/test_ibm_db.rb", "test/visitors/test_informix.rb", "test/visitors/test_join_sql.rb", "test/visitors/test_mssql.rb", "test/visitors/test_mysql.rb", "test/visitors/test_oracle.rb", "test/visitors/test_postgres.rb", "test/visitors/test_sqlite.rb", "test/visitors/test_to_sql.rb"]
13
+ s.files = [".autotest", ".gemtest", ".travis.yml", "Gemfile", "History.txt", "MIT-LICENSE.txt", "Manifest.txt", "README.markdown", "Rakefile", "arel.gemspec", "lib/arel.rb", "lib/arel/alias_predication.rb", "lib/arel/attributes.rb", "lib/arel/attributes/attribute.rb", "lib/arel/compatibility/wheres.rb", "lib/arel/crud.rb", "lib/arel/delete_manager.rb", "lib/arel/deprecated.rb", "lib/arel/expression.rb", "lib/arel/expressions.rb", "lib/arel/factory_methods.rb", "lib/arel/insert_manager.rb", "lib/arel/math.rb", "lib/arel/nodes.rb", "lib/arel/nodes/and.rb", "lib/arel/nodes/ascending.rb", "lib/arel/nodes/binary.rb", "lib/arel/nodes/count.rb", "lib/arel/nodes/delete_statement.rb", "lib/arel/nodes/descending.rb", "lib/arel/nodes/equality.rb", "lib/arel/nodes/extract.rb", "lib/arel/nodes/false.rb", "lib/arel/nodes/function.rb", "lib/arel/nodes/grouping.rb", "lib/arel/nodes/in.rb", "lib/arel/nodes/infix_operation.rb", "lib/arel/nodes/inner_join.rb", "lib/arel/nodes/insert_statement.rb", "lib/arel/nodes/join_source.rb", "lib/arel/nodes/named_function.rb", "lib/arel/nodes/node.rb", "lib/arel/nodes/outer_join.rb", "lib/arel/nodes/over.rb", "lib/arel/nodes/select_core.rb", "lib/arel/nodes/select_statement.rb", "lib/arel/nodes/sql_literal.rb", "lib/arel/nodes/string_join.rb", "lib/arel/nodes/table_alias.rb", "lib/arel/nodes/terminal.rb", "lib/arel/nodes/true.rb", "lib/arel/nodes/unary.rb", "lib/arel/nodes/unqualified_column.rb", "lib/arel/nodes/update_statement.rb", "lib/arel/nodes/values.rb", "lib/arel/nodes/window.rb", "lib/arel/nodes/with.rb", "lib/arel/order_predications.rb", "lib/arel/predications.rb", "lib/arel/select_manager.rb", "lib/arel/sql/engine.rb", "lib/arel/sql_literal.rb", "lib/arel/table.rb", "lib/arel/tree_manager.rb", "lib/arel/update_manager.rb", "lib/arel/visitors.rb", "lib/arel/visitors/bind_visitor.rb", "lib/arel/visitors/depth_first.rb", "lib/arel/visitors/dot.rb", "lib/arel/visitors/ibm_db.rb", "lib/arel/visitors/informix.rb", "lib/arel/visitors/join_sql.rb", "lib/arel/visitors/mssql.rb", "lib/arel/visitors/mysql.rb", "lib/arel/visitors/oracle.rb", "lib/arel/visitors/order_clauses.rb", "lib/arel/visitors/postgresql.rb", "lib/arel/visitors/sqlite.rb", "lib/arel/visitors/to_sql.rb", "lib/arel/visitors/visitor.rb", "lib/arel/visitors/where_sql.rb", "lib/arel/window_predications.rb", "test/attributes/test_attribute.rb", "test/helper.rb", "test/nodes/test_and.rb", "test/nodes/test_as.rb", "test/nodes/test_ascending.rb", "test/nodes/test_bin.rb", "test/nodes/test_count.rb", "test/nodes/test_delete_statement.rb", "test/nodes/test_descending.rb", "test/nodes/test_distinct.rb", "test/nodes/test_equality.rb", "test/nodes/test_extract.rb", "test/nodes/test_false.rb", "test/nodes/test_grouping.rb", "test/nodes/test_infix_operation.rb", "test/nodes/test_insert_statement.rb", "test/nodes/test_named_function.rb", "test/nodes/test_node.rb", "test/nodes/test_not.rb", "test/nodes/test_or.rb", "test/nodes/test_over.rb", "test/nodes/test_select_core.rb", "test/nodes/test_select_statement.rb", "test/nodes/test_sql_literal.rb", "test/nodes/test_sum.rb", "test/nodes/test_table_alias.rb", "test/nodes/test_true.rb", "test/nodes/test_update_statement.rb", "test/nodes/test_window.rb", "test/support/fake_record.rb", "test/test_activerecord_compat.rb", "test/test_attributes.rb", "test/test_crud.rb", "test/test_delete_manager.rb", "test/test_factory_methods.rb", "test/test_insert_manager.rb", "test/test_select_manager.rb", "test/test_table.rb", "test/test_update_manager.rb", "test/visitors/test_bind_visitor.rb", "test/visitors/test_depth_first.rb", "test/visitors/test_dispatch_contamination.rb", "test/visitors/test_dot.rb", "test/visitors/test_ibm_db.rb", "test/visitors/test_informix.rb", "test/visitors/test_join_sql.rb", "test/visitors/test_mssql.rb", "test/visitors/test_mysql.rb", "test/visitors/test_oracle.rb", "test/visitors/test_postgres.rb", "test/visitors/test_sqlite.rb", "test/visitors/test_to_sql.rb"]
14
14
  s.homepage = "http://github.com/rails/arel"
15
+ s.licenses = ["MIT"]
15
16
  s.rdoc_options = ["--main", "README.markdown"]
16
17
  s.require_paths = ["lib"]
17
18
  s.rubyforge_project = "arel"
18
- s.rubygems_version = "2.0.2"
19
+ s.rubygems_version = "2.0.6"
19
20
  s.summary = "Arel is a SQL AST manager for Ruby"
20
- s.test_files = ["test/attributes/test_attribute.rb", "test/nodes/test_and.rb", "test/nodes/test_as.rb", "test/nodes/test_ascending.rb", "test/nodes/test_bin.rb", "test/nodes/test_count.rb", "test/nodes/test_delete_statement.rb", "test/nodes/test_descending.rb", "test/nodes/test_distinct.rb", "test/nodes/test_equality.rb", "test/nodes/test_extract.rb", "test/nodes/test_false.rb", "test/nodes/test_grouping.rb", "test/nodes/test_infix_operation.rb", "test/nodes/test_insert_statement.rb", "test/nodes/test_named_function.rb", "test/nodes/test_node.rb", "test/nodes/test_not.rb", "test/nodes/test_or.rb", "test/nodes/test_over.rb", "test/nodes/test_select_core.rb", "test/nodes/test_select_statement.rb", "test/nodes/test_sql_literal.rb", "test/nodes/test_sum.rb", "test/nodes/test_table_alias.rb", "test/nodes/test_true.rb", "test/nodes/test_update_statement.rb", "test/nodes/test_window.rb", "test/test_activerecord_compat.rb", "test/test_attributes.rb", "test/test_crud.rb", "test/test_delete_manager.rb", "test/test_factory_methods.rb", "test/test_insert_manager.rb", "test/test_select_manager.rb", "test/test_table.rb", "test/test_update_manager.rb", "test/visitors/test_bind_visitor.rb", "test/visitors/test_depth_first.rb", "test/visitors/test_dot.rb", "test/visitors/test_ibm_db.rb", "test/visitors/test_informix.rb", "test/visitors/test_join_sql.rb", "test/visitors/test_mssql.rb", "test/visitors/test_mysql.rb", "test/visitors/test_oracle.rb", "test/visitors/test_postgres.rb", "test/visitors/test_sqlite.rb", "test/visitors/test_to_sql.rb"]
21
+ s.test_files = ["test/attributes/test_attribute.rb", "test/nodes/test_and.rb", "test/nodes/test_as.rb", "test/nodes/test_ascending.rb", "test/nodes/test_bin.rb", "test/nodes/test_count.rb", "test/nodes/test_delete_statement.rb", "test/nodes/test_descending.rb", "test/nodes/test_distinct.rb", "test/nodes/test_equality.rb", "test/nodes/test_extract.rb", "test/nodes/test_false.rb", "test/nodes/test_grouping.rb", "test/nodes/test_infix_operation.rb", "test/nodes/test_insert_statement.rb", "test/nodes/test_named_function.rb", "test/nodes/test_node.rb", "test/nodes/test_not.rb", "test/nodes/test_or.rb", "test/nodes/test_over.rb", "test/nodes/test_select_core.rb", "test/nodes/test_select_statement.rb", "test/nodes/test_sql_literal.rb", "test/nodes/test_sum.rb", "test/nodes/test_table_alias.rb", "test/nodes/test_true.rb", "test/nodes/test_update_statement.rb", "test/nodes/test_window.rb", "test/test_activerecord_compat.rb", "test/test_attributes.rb", "test/test_crud.rb", "test/test_delete_manager.rb", "test/test_factory_methods.rb", "test/test_insert_manager.rb", "test/test_select_manager.rb", "test/test_table.rb", "test/test_update_manager.rb", "test/visitors/test_bind_visitor.rb", "test/visitors/test_depth_first.rb", "test/visitors/test_dispatch_contamination.rb", "test/visitors/test_dot.rb", "test/visitors/test_ibm_db.rb", "test/visitors/test_informix.rb", "test/visitors/test_join_sql.rb", "test/visitors/test_mssql.rb", "test/visitors/test_mysql.rb", "test/visitors/test_oracle.rb", "test/visitors/test_postgres.rb", "test/visitors/test_sqlite.rb", "test/visitors/test_to_sql.rb"]
21
22
 
22
23
  if s.respond_to? :specification_version then
23
24
  s.specification_version = 4
24
25
 
25
26
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
- s.add_development_dependency(%q<minitest>, ["~> 4.6"])
27
- s.add_development_dependency(%q<rdoc>, ["~> 3.10"])
28
- s.add_development_dependency(%q<hoe>, ["~> 3.5"])
27
+ s.add_development_dependency(%q<minitest>, ["~> 5.0"])
28
+ s.add_development_dependency(%q<rdoc>, ["~> 4.0"])
29
+ s.add_development_dependency(%q<hoe>, ["~> 3.7"])
29
30
  else
30
- s.add_dependency(%q<minitest>, ["~> 4.6"])
31
- s.add_dependency(%q<rdoc>, ["~> 3.10"])
32
- s.add_dependency(%q<hoe>, ["~> 3.5"])
31
+ s.add_dependency(%q<minitest>, ["~> 5.0"])
32
+ s.add_dependency(%q<rdoc>, ["~> 4.0"])
33
+ s.add_dependency(%q<hoe>, ["~> 3.7"])
33
34
  end
34
35
  else
35
- s.add_dependency(%q<minitest>, ["~> 4.6"])
36
- s.add_dependency(%q<rdoc>, ["~> 3.10"])
37
- s.add_dependency(%q<hoe>, ["~> 3.5"])
36
+ s.add_dependency(%q<minitest>, ["~> 5.0"])
37
+ s.add_dependency(%q<rdoc>, ["~> 4.0"])
38
+ s.add_dependency(%q<hoe>, ["~> 3.7"])
38
39
  end
39
40
  end
@@ -32,7 +32,7 @@ require 'arel/sql_literal'
32
32
  ####
33
33
 
34
34
  module Arel
35
- VERSION = '4.0.0'
35
+ VERSION = '4.0.1'
36
36
 
37
37
  def self.sql raw_sql
38
38
  Arel::Nodes::SqlLiteral.new raw_sql
@@ -4,6 +4,7 @@ module Arel
4
4
  attr_reader :children
5
5
 
6
6
  def initialize children, right = nil
7
+ super()
7
8
  unless Array === children
8
9
  warn "(#{caller.first}) AND nodes should be created with a list"
9
10
  children = [children, right]
@@ -4,6 +4,7 @@ module Arel
4
4
  attr_accessor :left, :right
5
5
 
6
6
  def initialize left, right
7
+ super()
7
8
  @left = left
8
9
  @right = right
9
10
  end
@@ -7,6 +7,7 @@ module Arel
7
7
  attr_accessor :expressions, :alias, :distinct
8
8
 
9
9
  def initialize expr, aliaz = nil
10
+ super()
10
11
  @expressions = expr
11
12
  @alias = aliaz && SqlLiteral.new(aliaz)
12
13
  @distinct = false
@@ -4,6 +4,7 @@ module Arel
4
4
  attr_accessor :relation, :columns, :values
5
5
 
6
6
  def initialize
7
+ super()
7
8
  @relation = nil
8
9
  @columns = []
9
10
  @values = nil
@@ -6,6 +6,16 @@ module Arel
6
6
  include Arel::FactoryMethods
7
7
  include Enumerable
8
8
 
9
+ if $DEBUG
10
+ def _caller
11
+ @caller
12
+ end
13
+
14
+ def initialize
15
+ @caller = caller.dup
16
+ end
17
+ end
18
+
9
19
  ###
10
20
  # Factory method to create a Nodes::Not node that has the recipient of
11
21
  # the caller as a child.
@@ -5,6 +5,7 @@ module Arel
5
5
  attr_accessor :having, :source, :set_quantifier
6
6
 
7
7
  def initialize
8
+ super()
8
9
  @source = JoinSource.new nil
9
10
  @top = nil
10
11
 
@@ -5,6 +5,7 @@ module Arel
5
5
  attr_accessor :limit, :orders, :lock, :offset, :with
6
6
 
7
7
  def initialize cores = [SelectCore.new]
8
+ super()
8
9
  @cores = cores
9
10
  @orders = []
10
11
  @limit = nil
@@ -5,6 +5,7 @@ module Arel
5
5
  alias :value :expr
6
6
 
7
7
  def initialize expr
8
+ super()
8
9
  @expr = expr
9
10
  end
10
11
 
@@ -124,7 +124,10 @@ Arel 4.0.0 with no replacement. PEW PEW PEW!!!
124
124
  end
125
125
 
126
126
  def hash
127
- [@name, @engine, @aliases, @table_alias].hash
127
+ # Perf note: aliases, table alias and engine is excluded from the hash
128
+ # aliases can have a loop back to this table breaking hashes in parent
129
+ # relations, for the vast majority of cases @name is unique to a query
130
+ @name.hash
128
131
  end
129
132
 
130
133
  def eql? other
@@ -13,22 +13,22 @@ module Arel
13
13
 
14
14
  private
15
15
 
16
- def visit_Arel_Nodes_Assignment o
16
+ def visit_Arel_Nodes_Assignment o, a
17
17
  if o.right.is_a? Arel::Nodes::BindParam
18
- "#{visit o.left} = #{visit o.right}"
18
+ "#{visit o.left, a} = #{visit o.right, a}"
19
19
  else
20
20
  super
21
21
  end
22
22
  end
23
23
 
24
- def visit_Arel_Nodes_BindParam o
24
+ def visit_Arel_Nodes_BindParam o, a
25
25
  if @block
26
26
  @block.call
27
27
  else
28
28
  super
29
29
  end
30
30
  end
31
-
31
+
32
32
  end
33
33
  end
34
34
  end
@@ -7,13 +7,13 @@ module Arel
7
7
 
8
8
  private
9
9
 
10
- def visit o
10
+ def visit o, a = nil
11
11
  super
12
12
  @block.call o
13
13
  end
14
14
 
15
- def unary o
16
- visit o.expr
15
+ def unary o, a
16
+ visit o.expr, a
17
17
  end
18
18
  alias :visit_Arel_Nodes_Group :unary
19
19
  alias :visit_Arel_Nodes_Grouping :unary
@@ -28,10 +28,10 @@ module Arel
28
28
  alias :visit_Arel_Nodes_Top :unary
29
29
  alias :visit_Arel_Nodes_UnqualifiedColumn :unary
30
30
 
31
- def function o
32
- visit o.expressions
33
- visit o.alias
34
- visit o.distinct
31
+ def function o, a
32
+ visit o.expressions, a
33
+ visit o.alias, a
34
+ visit o.distinct, a
35
35
  end
36
36
  alias :visit_Arel_Nodes_Avg :function
37
37
  alias :visit_Arel_Nodes_Exists :function
@@ -39,27 +39,27 @@ module Arel
39
39
  alias :visit_Arel_Nodes_Min :function
40
40
  alias :visit_Arel_Nodes_Sum :function
41
41
 
42
- def visit_Arel_Nodes_NamedFunction o
43
- visit o.name
44
- visit o.expressions
45
- visit o.distinct
46
- visit o.alias
42
+ def visit_Arel_Nodes_NamedFunction o, a
43
+ visit o.name, a
44
+ visit o.expressions, a
45
+ visit o.distinct, a
46
+ visit o.alias, a
47
47
  end
48
48
 
49
- def visit_Arel_Nodes_Count o
50
- visit o.expressions
51
- visit o.alias
52
- visit o.distinct
49
+ def visit_Arel_Nodes_Count o, a
50
+ visit o.expressions, a
51
+ visit o.alias, a
52
+ visit o.distinct, a
53
53
  end
54
54
 
55
- def nary o
56
- o.children.each { |child| visit child }
55
+ def nary o, a
56
+ o.children.each { |child| visit child, a }
57
57
  end
58
58
  alias :visit_Arel_Nodes_And :nary
59
59
 
60
- def binary o
61
- visit o.left
62
- visit o.right
60
+ def binary o, a
61
+ visit o.left, a
62
+ visit o.right, a
63
63
  end
64
64
  alias :visit_Arel_Nodes_As :binary
65
65
  alias :visit_Arel_Nodes_Assignment :binary
@@ -83,13 +83,13 @@ module Arel
83
83
  alias :visit_Arel_Nodes_TableAlias :binary
84
84
  alias :visit_Arel_Nodes_Values :binary
85
85
 
86
- def visit_Arel_Nodes_StringJoin o
87
- visit o.left
86
+ def visit_Arel_Nodes_StringJoin o, a
87
+ visit o.left, a
88
88
  end
89
89
 
90
- def visit_Arel_Attribute o
91
- visit o.relation
92
- visit o.name
90
+ def visit_Arel_Attribute o, a
91
+ visit o.relation, a
92
+ visit o.name, a
93
93
  end
94
94
  alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
95
95
  alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
@@ -99,11 +99,11 @@ module Arel
99
99
  alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
100
100
  alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
101
101
 
102
- def visit_Arel_Table o
103
- visit o.name
102
+ def visit_Arel_Table o, a
103
+ visit o.name, a
104
104
  end
105
105
 
106
- def terminal o
106
+ def terminal o, a
107
107
  end
108
108
  alias :visit_ActiveSupport_Multibyte_Chars :terminal
109
109
  alias :visit_ActiveSupport_StringInquirer :terminal
@@ -127,43 +127,43 @@ module Arel
127
127
  alias :visit_Time :terminal
128
128
  alias :visit_TrueClass :terminal
129
129
 
130
- def visit_Arel_Nodes_InsertStatement o
131
- visit o.relation
132
- visit o.columns
133
- visit o.values
130
+ def visit_Arel_Nodes_InsertStatement o, a
131
+ visit o.relation, a
132
+ visit o.columns, a
133
+ visit o.values, a
134
134
  end
135
135
 
136
- def visit_Arel_Nodes_SelectCore o
137
- visit o.projections
138
- visit o.source
139
- visit o.wheres
140
- visit o.groups
141
- visit o.windows
142
- visit o.having
136
+ def visit_Arel_Nodes_SelectCore o, a
137
+ visit o.projections, a
138
+ visit o.source, a
139
+ visit o.wheres, a
140
+ visit o.groups, a
141
+ visit o.windows, a
142
+ visit o.having, a
143
143
  end
144
144
 
145
- def visit_Arel_Nodes_SelectStatement o
146
- visit o.cores
147
- visit o.orders
148
- visit o.limit
149
- visit o.lock
150
- visit o.offset
145
+ def visit_Arel_Nodes_SelectStatement o, a
146
+ visit o.cores, a
147
+ visit o.orders, a
148
+ visit o.limit, a
149
+ visit o.lock, a
150
+ visit o.offset, a
151
151
  end
152
152
 
153
- def visit_Arel_Nodes_UpdateStatement o
154
- visit o.relation
155
- visit o.values
156
- visit o.wheres
157
- visit o.orders
158
- visit o.limit
153
+ def visit_Arel_Nodes_UpdateStatement o, a
154
+ visit o.relation, a
155
+ visit o.values, a
156
+ visit o.wheres, a
157
+ visit o.orders, a
158
+ visit o.limit, a
159
159
  end
160
160
 
161
- def visit_Array o
162
- o.each { |i| visit i }
161
+ def visit_Array o, a
162
+ o.each { |i| visit i, a }
163
163
  end
164
164
 
165
- def visit_Hash o
166
- o.each { |k,v| visit(k); visit(v) }
165
+ def visit_Hash o, a
166
+ o.each { |k,v| visit(k, a); visit(v, a) }
167
167
  end
168
168
  end
169
169
  end