arel 4.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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