arel 1.0.1 → 2.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 (247) hide show
  1. data/MIT-LICENSE.txt +20 -0
  2. data/Manifest.txt +105 -0
  3. data/README.markdown +12 -32
  4. data/Rakefile +17 -0
  5. data/arel.gemspec +39 -0
  6. data/lib/arel.rb +30 -9
  7. data/lib/arel/attributes.rb +20 -0
  8. data/lib/arel/attributes/attribute.rb +190 -0
  9. data/lib/arel/compatibility/wheres.rb +33 -0
  10. data/lib/arel/crud.rb +37 -0
  11. data/lib/arel/delete_manager.rb +22 -0
  12. data/lib/arel/deprecated.rb +4 -0
  13. data/lib/arel/expression.rb +4 -0
  14. data/lib/arel/expressions.rb +23 -0
  15. data/lib/arel/insert_manager.rb +34 -0
  16. data/lib/arel/nodes.rb +44 -0
  17. data/lib/arel/nodes/and.rb +6 -0
  18. data/lib/arel/nodes/assignment.rb +6 -0
  19. data/lib/arel/nodes/avg.rb +6 -0
  20. data/lib/arel/nodes/between.rb +6 -0
  21. data/lib/arel/nodes/binary.rb +12 -0
  22. data/lib/arel/nodes/count.rb +13 -0
  23. data/lib/arel/nodes/delete_statement.rb +17 -0
  24. data/lib/arel/nodes/does_not_match.rb +6 -0
  25. data/lib/arel/nodes/equality.rb +9 -0
  26. data/lib/arel/nodes/exists.rb +11 -0
  27. data/lib/arel/nodes/function.rb +18 -0
  28. data/lib/arel/nodes/greater_than.rb +6 -0
  29. data/lib/arel/nodes/greater_than_or_equal.rb +6 -0
  30. data/lib/arel/nodes/group.rb +11 -0
  31. data/lib/arel/nodes/grouping.rb +11 -0
  32. data/lib/arel/nodes/having.rb +11 -0
  33. data/lib/arel/nodes/in.rb +6 -0
  34. data/lib/arel/nodes/inner_join.rb +6 -0
  35. data/lib/arel/nodes/insert_statement.rb +19 -0
  36. data/lib/arel/nodes/join.rb +13 -0
  37. data/lib/arel/nodes/less_than.rb +6 -0
  38. data/lib/arel/nodes/less_than_or_equal.rb +6 -0
  39. data/lib/arel/nodes/lock.rb +6 -0
  40. data/lib/arel/nodes/matches.rb +6 -0
  41. data/lib/arel/nodes/max.rb +6 -0
  42. data/lib/arel/nodes/min.rb +6 -0
  43. data/lib/arel/nodes/node.rb +30 -0
  44. data/lib/arel/nodes/not_equal.rb +6 -0
  45. data/lib/arel/nodes/not_in.rb +6 -0
  46. data/lib/arel/nodes/offset.rb +11 -0
  47. data/lib/arel/nodes/on.rb +11 -0
  48. data/lib/arel/nodes/or.rb +6 -0
  49. data/lib/arel/nodes/ordering.rb +19 -0
  50. data/lib/arel/nodes/outer_join.rb +6 -0
  51. data/lib/arel/nodes/select_core.rb +25 -0
  52. data/lib/arel/nodes/select_statement.rb +22 -0
  53. data/lib/arel/nodes/sql_literal.rb +7 -0
  54. data/lib/arel/nodes/string_join.rb +11 -0
  55. data/lib/arel/nodes/sum.rb +6 -0
  56. data/lib/arel/nodes/table_alias.rb +21 -0
  57. data/lib/arel/nodes/unqualified_column.rb +19 -0
  58. data/lib/arel/nodes/update_statement.rb +21 -0
  59. data/lib/arel/nodes/values.rb +12 -0
  60. data/lib/arel/relation.rb +6 -0
  61. data/lib/arel/select_manager.rb +203 -0
  62. data/lib/arel/sql/engine.rb +10 -0
  63. data/lib/arel/sql_literal.rb +1 -10
  64. data/lib/arel/table.rb +126 -0
  65. data/lib/arel/tree_manager.rb +26 -0
  66. data/lib/arel/update_manager.rb +48 -0
  67. data/lib/arel/visitors.rb +30 -0
  68. data/lib/arel/visitors/dot.rb +233 -0
  69. data/lib/arel/visitors/join_sql.rb +38 -0
  70. data/lib/arel/visitors/mysql.rb +16 -0
  71. data/lib/arel/visitors/oracle.rb +69 -0
  72. data/lib/arel/visitors/order_clauses.rb +9 -0
  73. data/lib/arel/visitors/postgresql.rb +54 -0
  74. data/lib/arel/visitors/to_sql.rb +301 -0
  75. data/lib/arel/visitors/where_sql.rb +9 -0
  76. data/spec/activerecord_compat_spec.rb +18 -0
  77. data/spec/attributes/attribute_spec.rb +648 -0
  78. data/spec/attributes_spec.rb +33 -6
  79. data/spec/crud_spec.rb +69 -0
  80. data/spec/delete_manager_spec.rb +53 -0
  81. data/spec/insert_manager_spec.rb +141 -0
  82. data/spec/nodes/count_spec.rb +18 -0
  83. data/spec/nodes/delete_statement_spec.rb +15 -0
  84. data/spec/nodes/equality_spec.rb +72 -0
  85. data/spec/nodes/insert_statement_spec.rb +18 -0
  86. data/spec/nodes/or_spec.rb +20 -0
  87. data/spec/nodes/select_core_spec.rb +21 -0
  88. data/spec/nodes/select_statement_spec.rb +14 -0
  89. data/spec/nodes/sql_literal_spec.rb +26 -0
  90. data/spec/nodes/sum_spec.rb +12 -0
  91. data/spec/nodes/update_statement_spec.rb +18 -0
  92. data/spec/select_manager_spec.rb +581 -0
  93. data/spec/spec.opts +3 -0
  94. data/spec/spec_helper.rb +6 -21
  95. data/spec/support/fake_record.rb +89 -0
  96. data/spec/support/shared/tree_manager_shared.rb +9 -0
  97. data/spec/table_spec.rb +176 -0
  98. data/spec/update_manager_spec.rb +89 -0
  99. data/spec/visitors/join_sql_spec.rb +35 -0
  100. data/spec/visitors/oracle_spec.rb +111 -0
  101. data/spec/visitors/to_sql_spec.rb +134 -0
  102. metadata +160 -260
  103. data/lib/arel/algebra.rb +0 -10
  104. data/lib/arel/algebra/attributes.rb +0 -7
  105. data/lib/arel/algebra/attributes/attribute.rb +0 -304
  106. data/lib/arel/algebra/attributes/boolean.rb +0 -21
  107. data/lib/arel/algebra/attributes/decimal.rb +0 -9
  108. data/lib/arel/algebra/attributes/float.rb +0 -9
  109. data/lib/arel/algebra/attributes/integer.rb +0 -10
  110. data/lib/arel/algebra/attributes/string.rb +0 -10
  111. data/lib/arel/algebra/attributes/time.rb +0 -6
  112. data/lib/arel/algebra/core_extensions.rb +0 -3
  113. data/lib/arel/algebra/core_extensions/hash.rb +0 -7
  114. data/lib/arel/algebra/core_extensions/object.rb +0 -13
  115. data/lib/arel/algebra/core_extensions/symbol.rb +0 -9
  116. data/lib/arel/algebra/expression.rb +0 -56
  117. data/lib/arel/algebra/header.rb +0 -66
  118. data/lib/arel/algebra/ordering.rb +0 -31
  119. data/lib/arel/algebra/predicates.rb +0 -306
  120. data/lib/arel/algebra/relations.rb +0 -16
  121. data/lib/arel/algebra/relations/operations/from.rb +0 -14
  122. data/lib/arel/algebra/relations/operations/group.rb +0 -14
  123. data/lib/arel/algebra/relations/operations/having.rb +0 -14
  124. data/lib/arel/algebra/relations/operations/join.rb +0 -103
  125. data/lib/arel/algebra/relations/operations/lock.rb +0 -10
  126. data/lib/arel/algebra/relations/operations/order.rb +0 -23
  127. data/lib/arel/algebra/relations/operations/project.rb +0 -20
  128. data/lib/arel/algebra/relations/operations/skip.rb +0 -14
  129. data/lib/arel/algebra/relations/operations/take.rb +0 -18
  130. data/lib/arel/algebra/relations/operations/where.rb +0 -24
  131. data/lib/arel/algebra/relations/relation.rb +0 -205
  132. data/lib/arel/algebra/relations/row.rb +0 -29
  133. data/lib/arel/algebra/relations/utilities/compound.rb +0 -55
  134. data/lib/arel/algebra/relations/utilities/externalization.rb +0 -26
  135. data/lib/arel/algebra/relations/utilities/nil.rb +0 -7
  136. data/lib/arel/algebra/relations/writes.rb +0 -47
  137. data/lib/arel/algebra/value.rb +0 -53
  138. data/lib/arel/engines.rb +0 -2
  139. data/lib/arel/engines/memory.rb +0 -2
  140. data/lib/arel/engines/memory/engine.rb +0 -10
  141. data/lib/arel/engines/memory/relations.rb +0 -2
  142. data/lib/arel/engines/memory/relations/array.rb +0 -37
  143. data/lib/arel/engines/memory/relations/operations.rb +0 -9
  144. data/lib/arel/engines/sql.rb +0 -6
  145. data/lib/arel/engines/sql/attributes.rb +0 -45
  146. data/lib/arel/engines/sql/christener.rb +0 -20
  147. data/lib/arel/engines/sql/compilers/ibm_db_compiler.rb +0 -48
  148. data/lib/arel/engines/sql/compilers/mysql_compiler.rb +0 -11
  149. data/lib/arel/engines/sql/compilers/oracle_compiler.rb +0 -106
  150. data/lib/arel/engines/sql/compilers/postgresql_compiler.rb +0 -50
  151. data/lib/arel/engines/sql/compilers/sqlite_compiler.rb +0 -9
  152. data/lib/arel/engines/sql/core_extensions.rb +0 -4
  153. data/lib/arel/engines/sql/core_extensions/array.rb +0 -24
  154. data/lib/arel/engines/sql/core_extensions/nil_class.rb +0 -15
  155. data/lib/arel/engines/sql/core_extensions/object.rb +0 -19
  156. data/lib/arel/engines/sql/core_extensions/range.rb +0 -19
  157. data/lib/arel/engines/sql/engine.rb +0 -47
  158. data/lib/arel/engines/sql/formatters.rb +0 -138
  159. data/lib/arel/engines/sql/relations.rb +0 -3
  160. data/lib/arel/engines/sql/relations/compiler.rb +0 -153
  161. data/lib/arel/engines/sql/relations/table.rb +0 -100
  162. data/lib/arel/engines/sql/relations/utilities/nil.rb +0 -6
  163. data/lib/arel/recursion/base_case.rb +0 -13
  164. data/lib/arel/session.rb +0 -35
  165. data/lib/arel/version.rb +0 -3
  166. data/spec/algebra/unit/predicates/binary_spec.rb +0 -35
  167. data/spec/algebra/unit/predicates/equality_spec.rb +0 -29
  168. data/spec/algebra/unit/predicates/in_spec.rb +0 -12
  169. data/spec/algebra/unit/predicates/inequality_spec.rb +0 -32
  170. data/spec/algebra/unit/predicates/predicate_spec.rb +0 -22
  171. data/spec/algebra/unit/primitives/attribute_spec.rb +0 -175
  172. data/spec/algebra/unit/primitives/expression_spec.rb +0 -39
  173. data/spec/algebra/unit/primitives/value_spec.rb +0 -15
  174. data/spec/algebra/unit/relations/alias_spec.rb +0 -16
  175. data/spec/algebra/unit/relations/delete_spec.rb +0 -9
  176. data/spec/algebra/unit/relations/group_spec.rb +0 -10
  177. data/spec/algebra/unit/relations/insert_spec.rb +0 -9
  178. data/spec/algebra/unit/relations/join_spec.rb +0 -18
  179. data/spec/algebra/unit/relations/order_spec.rb +0 -21
  180. data/spec/algebra/unit/relations/project_spec.rb +0 -34
  181. data/spec/algebra/unit/relations/relation_spec.rb +0 -241
  182. data/spec/algebra/unit/relations/skip_spec.rb +0 -10
  183. data/spec/algebra/unit/relations/table_spec.rb +0 -38
  184. data/spec/algebra/unit/relations/take_spec.rb +0 -10
  185. data/spec/algebra/unit/relations/update_spec.rb +0 -9
  186. data/spec/algebra/unit/relations/where_spec.rb +0 -19
  187. data/spec/algebra/unit/session/session_spec.rb +0 -84
  188. data/spec/attributes/boolean_spec.rb +0 -57
  189. data/spec/attributes/float_spec.rb +0 -119
  190. data/spec/attributes/header_spec.rb +0 -42
  191. data/spec/attributes/integer_spec.rb +0 -119
  192. data/spec/attributes/string_spec.rb +0 -43
  193. data/spec/attributes/time_spec.rb +0 -24
  194. data/spec/engines/memory/integration/joins/cross_engine_spec.rb +0 -61
  195. data/spec/engines/memory/unit/relations/array_spec.rb +0 -33
  196. data/spec/engines/memory/unit/relations/insert_spec.rb +0 -28
  197. data/spec/engines/memory/unit/relations/join_spec.rb +0 -32
  198. data/spec/engines/memory/unit/relations/order_spec.rb +0 -28
  199. data/spec/engines/memory/unit/relations/project_spec.rb +0 -27
  200. data/spec/engines/memory/unit/relations/skip_spec.rb +0 -31
  201. data/spec/engines/memory/unit/relations/take_spec.rb +0 -28
  202. data/spec/engines/memory/unit/relations/where_spec.rb +0 -43
  203. data/spec/engines/sql/integration/joins/with_adjacency_spec.rb +0 -258
  204. data/spec/engines/sql/integration/joins/with_aggregations_spec.rb +0 -221
  205. data/spec/engines/sql/integration/joins/with_compounds_spec.rb +0 -137
  206. data/spec/engines/sql/unit/engine_spec.rb +0 -65
  207. data/spec/engines/sql/unit/predicates/binary_spec.rb +0 -140
  208. data/spec/engines/sql/unit/predicates/equality_spec.rb +0 -75
  209. data/spec/engines/sql/unit/predicates/in_spec.rb +0 -179
  210. data/spec/engines/sql/unit/predicates/noteq_spec.rb +0 -75
  211. data/spec/engines/sql/unit/predicates/predicates_spec.rb +0 -79
  212. data/spec/engines/sql/unit/primitives/attribute_spec.rb +0 -36
  213. data/spec/engines/sql/unit/primitives/expression_spec.rb +0 -28
  214. data/spec/engines/sql/unit/primitives/literal_spec.rb +0 -43
  215. data/spec/engines/sql/unit/primitives/value_spec.rb +0 -29
  216. data/spec/engines/sql/unit/relations/alias_spec.rb +0 -53
  217. data/spec/engines/sql/unit/relations/delete_spec.rb +0 -83
  218. data/spec/engines/sql/unit/relations/from_spec.rb +0 -64
  219. data/spec/engines/sql/unit/relations/group_spec.rb +0 -72
  220. data/spec/engines/sql/unit/relations/having_spec.rb +0 -78
  221. data/spec/engines/sql/unit/relations/insert_spec.rb +0 -143
  222. data/spec/engines/sql/unit/relations/join_spec.rb +0 -180
  223. data/spec/engines/sql/unit/relations/lock_spec.rb +0 -86
  224. data/spec/engines/sql/unit/relations/order_spec.rb +0 -161
  225. data/spec/engines/sql/unit/relations/project_spec.rb +0 -143
  226. data/spec/engines/sql/unit/relations/skip_spec.rb +0 -41
  227. data/spec/engines/sql/unit/relations/table_spec.rb +0 -122
  228. data/spec/engines/sql/unit/relations/take_spec.rb +0 -75
  229. data/spec/engines/sql/unit/relations/update_spec.rb +0 -203
  230. data/spec/engines/sql/unit/relations/where_spec.rb +0 -72
  231. data/spec/relations/join_spec.rb +0 -42
  232. data/spec/relations/relation_spec.rb +0 -31
  233. data/spec/shared/relation_spec.rb +0 -255
  234. data/spec/sql/christener_spec.rb +0 -70
  235. data/spec/support/connections/mysql_connection.rb +0 -14
  236. data/spec/support/connections/oracle_connection.rb +0 -17
  237. data/spec/support/connections/postgresql_connection.rb +0 -13
  238. data/spec/support/connections/sqlite3_connection.rb +0 -24
  239. data/spec/support/guards.rb +0 -28
  240. data/spec/support/matchers/disambiguate_attributes.rb +0 -28
  241. data/spec/support/matchers/hash_the_same_as.rb +0 -26
  242. data/spec/support/matchers/have_rows.rb +0 -18
  243. data/spec/support/model.rb +0 -67
  244. data/spec/support/schemas/mysql_schema.rb +0 -26
  245. data/spec/support/schemas/oracle_schema.rb +0 -20
  246. data/spec/support/schemas/postgresql_schema.rb +0 -26
  247. data/spec/support/schemas/sqlite3_schema.rb +0 -26
@@ -1,12 +1,39 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Arel
4
- module Sql
5
- describe 'Attributes' do
6
- describe 'for' do
7
- it 'should return undefined for undefined columns' do
8
- thing = Struct.new(:type).new(:HELLO)
9
- check Attributes.for(thing).should == Attributes::Undefined
4
+ describe 'Attributes' do
5
+ describe 'for' do
6
+ it 'returns the correct constant for strings' do
7
+ [:string, :text, :binary].each do |type|
8
+ column = Struct.new(:type).new type
9
+ Attributes.for(column).should == Attributes::String
10
+ end
11
+ end
12
+
13
+ it 'returns the correct constant for ints' do
14
+ column = Struct.new(:type).new :integer
15
+ Attributes.for(column).should == Attributes::Integer
16
+ end
17
+
18
+ it 'returns the correct constant for floats' do
19
+ column = Struct.new(:type).new :float
20
+ Attributes.for(column).should == Attributes::Float
21
+ end
22
+
23
+ it 'returns the correct constant for decimals' do
24
+ column = Struct.new(:type).new :decimal
25
+ Attributes.for(column).should == Attributes::Decimal
26
+ end
27
+
28
+ it 'returns the correct constant for boolean' do
29
+ column = Struct.new(:type).new :boolean
30
+ Attributes.for(column).should == Attributes::Boolean
31
+ end
32
+
33
+ it 'returns the correct constant for time' do
34
+ [:date, :datetime, :timestamp, :time].each do |type|
35
+ column = Struct.new(:type).new type
36
+ Attributes.for(column).should == Attributes::Time
10
37
  end
11
38
  end
12
39
  end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ class FakeCrudder < SelectManager
5
+ class FakeEngine
6
+ attr_reader :calls, :connection_pool, :spec, :config
7
+
8
+ def initialize
9
+ @calls = []
10
+ @connection_pool = self
11
+ @spec = self
12
+ @config = { :adapter => 'sqlite3' }
13
+ end
14
+
15
+ def connection; self end
16
+
17
+ def method_missing name, *args
18
+ @calls << [name, args]
19
+ end
20
+ end
21
+
22
+ include Crud
23
+
24
+ attr_reader :engine
25
+ attr_accessor :ctx
26
+
27
+ def initialize engine = FakeEngine.new
28
+ super
29
+ end
30
+ end
31
+
32
+ describe 'crud' do
33
+ describe 'insert' do
34
+ it 'should call insert on the connection' do
35
+ table = Table.new :users
36
+ fc = FakeCrudder.new
37
+ fc.from table
38
+ fc.insert [[table[:id], 'foo']]
39
+ fc.engine.calls.find { |method, _|
40
+ method == :insert
41
+ }.should_not be_nil
42
+ end
43
+ end
44
+
45
+ describe 'update' do
46
+ it 'should call update on the connection' do
47
+ table = Table.new :users
48
+ fc = FakeCrudder.new
49
+ fc.from table
50
+ fc.update [[table[:id], 'foo']]
51
+ fc.engine.calls.find { |method, _|
52
+ method == :update
53
+ }.should_not be_nil
54
+ end
55
+ end
56
+
57
+ describe 'delete' do
58
+ it 'should call delete on the connection' do
59
+ table = Table.new :users
60
+ fc = FakeCrudder.new
61
+ fc.from table
62
+ fc.delete
63
+ fc.engine.calls.find { |method, _|
64
+ method == :delete
65
+ }.should_not be_nil
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe 'delete manager' do
5
+ describe 'new' do
6
+ it 'takes an engine' do
7
+ Arel::DeleteManager.new Table.engine
8
+ end
9
+ end
10
+
11
+ describe 'from' do
12
+ it 'uses from' do
13
+ table = Table.new(:users)
14
+ dm = Arel::DeleteManager.new Table.engine
15
+ dm.from table
16
+ dm.to_sql.should be_like %{ DELETE FROM "users" }
17
+ end
18
+
19
+ it 'chains' do
20
+ table = Table.new(:users)
21
+ dm = Arel::DeleteManager.new Table.engine
22
+ check dm.from(table).should == dm
23
+ end
24
+ end
25
+
26
+ describe 'where' do
27
+ it 'uses where values' do
28
+ table = Table.new(:users)
29
+ dm = Arel::DeleteManager.new Table.engine
30
+ dm.from table
31
+ dm.where table[:id].eq(10)
32
+ dm.to_sql.should be_like %{ DELETE FROM "users" WHERE "users"."id" = 10}
33
+ end
34
+
35
+ it 'chains' do
36
+ table = Table.new(:users)
37
+ dm = Arel::DeleteManager.new Table.engine
38
+ check dm.where(table[:id].eq(10)).should == dm
39
+ end
40
+ end
41
+
42
+ describe "TreeManager" do
43
+ subject do
44
+ table = Table.new :users
45
+ Arel::DeleteManager.new(Table.engine).tap do |manager|
46
+ manager.where(table[:id].eq(10))
47
+ end
48
+ end
49
+
50
+ it_should_behave_like "TreeManager"
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,141 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe 'insert manager' do
5
+ describe 'new' do
6
+ it 'takes an engine' do
7
+ Arel::InsertManager.new Table.engine
8
+ end
9
+ end
10
+
11
+ describe 'insert' do
12
+ it "inserts false" do
13
+ table = Table.new(:users)
14
+ manager = Arel::InsertManager.new Table.engine
15
+
16
+ table[:id].column.extend(Module.new {
17
+ def type; :boolean; end
18
+ })
19
+
20
+ manager.insert [[table[:id], false]]
21
+ manager.to_sql.should be_like %{
22
+ INSERT INTO "users" ("id") VALUES ('f')
23
+ }
24
+ end
25
+
26
+ it "inserts null" do
27
+ table = Table.new(:users)
28
+ manager = Arel::InsertManager.new Table.engine
29
+ manager.insert [[table[:id], nil]]
30
+ manager.to_sql.should be_like %{
31
+ INSERT INTO "users" ("id") VALUES (NULL)
32
+ }
33
+ end
34
+
35
+ it "inserts time" do
36
+ table = Table.new(:users)
37
+ manager = Arel::InsertManager.new Table.engine
38
+
39
+ time = Time.now
40
+ attribute = table[:id]
41
+ attribute.column.type = :date
42
+
43
+ manager.insert [[attribute, time]]
44
+ manager.to_sql.should be_like %{
45
+ INSERT INTO "users" ("id") VALUES (#{Table.engine.connection.quote time})
46
+ }
47
+ end
48
+
49
+ it 'takes a list of lists' do
50
+ table = Table.new(:users)
51
+ manager = Arel::InsertManager.new Table.engine
52
+ manager.into table
53
+ manager.insert [[table[:id], 1], [table[:name], 'aaron']]
54
+ manager.to_sql.should be_like %{
55
+ INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
56
+ }
57
+ end
58
+
59
+ it 'defaults the table' do
60
+ table = Table.new(:users)
61
+ manager = Arel::InsertManager.new Table.engine
62
+ manager.insert [[table[:id], 1], [table[:name], 'aaron']]
63
+ manager.to_sql.should be_like %{
64
+ INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
65
+ }
66
+ end
67
+
68
+ it 'takes an empty list' do
69
+ manager = Arel::InsertManager.new Table.engine
70
+ manager.insert []
71
+ end
72
+ end
73
+
74
+ describe 'into' do
75
+ it 'takes an engine' do
76
+ manager = Arel::InsertManager.new Table.engine
77
+ manager.into(Table.new(:users)).should == manager
78
+ end
79
+
80
+ it 'converts to sql' do
81
+ table = Table.new :users
82
+ manager = Arel::InsertManager.new Table.engine
83
+ manager.into table
84
+ manager.to_sql.should be_like %{
85
+ INSERT INTO "users"
86
+ }
87
+ end
88
+ end
89
+
90
+ describe 'columns' do
91
+ it "converts to sql" do
92
+ table = Table.new :users
93
+ manager = Arel::InsertManager.new Table.engine
94
+ manager.into table
95
+ manager.columns << table[:id]
96
+ manager.to_sql.should be_like %{
97
+ INSERT INTO "users" ("id")
98
+ }
99
+ end
100
+ end
101
+
102
+ describe "values" do
103
+ it "converts to sql" do
104
+ table = Table.new :users
105
+ manager = Arel::InsertManager.new Table.engine
106
+ manager.into table
107
+
108
+ manager.values = Nodes::Values.new [1]
109
+ manager.to_sql.should be_like %{
110
+ INSERT INTO "users" VALUES (1)
111
+ }
112
+ end
113
+ end
114
+
115
+ describe "combo" do
116
+ it "puts shit together" do
117
+ table = Table.new :users
118
+ manager = Arel::InsertManager.new Table.engine
119
+ manager.into table
120
+
121
+ manager.values = Nodes::Values.new [1, 'aaron']
122
+ manager.columns << table[:id]
123
+ manager.columns << table[:name]
124
+ manager.to_sql.should be_like %{
125
+ INSERT INTO "users" ("id", "name") VALUES (1, 'aaron')
126
+ }
127
+ end
128
+ end
129
+
130
+ describe "TreeManager" do
131
+ subject do
132
+ table = Table.new(:users)
133
+ Arel::InsertManager.new(Table.engine).tap do |manager|
134
+ manager.insert [[table[:id], nil]]
135
+ end
136
+ end
137
+
138
+ it_should_behave_like "TreeManager"
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arel::Nodes::Count do
4
+ describe 'backwards compatibility' do
5
+ it 'must be an expression' do
6
+ Arel::Nodes::Count.new('foo').should be_kind_of Arel::Expression
7
+ end
8
+ end
9
+
10
+ describe "as" do
11
+ it 'should alias the count' do
12
+ table = Arel::Table.new :users
13
+ table[:id].count.as('foo').to_sql.should be_like %{
14
+ COUNT("users"."id") AS foo
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_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
+ statement.wheres.should_receive(:clone).and_return([:wheres])
10
+
11
+ dolly = statement.clone
12
+ dolly.wheres.should == [:wheres]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,72 @@
1
+ module Arel
2
+ module Nodes
3
+ describe 'equality' do
4
+ # FIXME: backwards compat
5
+ describe 'backwards compat' do
6
+ describe 'operator' do
7
+ it 'returns :==' do
8
+ attr = Table.new(:users)[:id]
9
+ left = attr.eq(10)
10
+ check left.operator.should == :==
11
+ end
12
+ end
13
+
14
+ describe 'operand1' do
15
+ it "should equal left" do
16
+ attr = Table.new(:users)[:id]
17
+ left = attr.eq(10)
18
+ check left.left.should == left.operand1
19
+ end
20
+ end
21
+
22
+ describe 'operand2' do
23
+ it "should equal right" do
24
+ attr = Table.new(:users)[:id]
25
+ left = attr.eq(10)
26
+ check left.right.should == left.operand2
27
+ end
28
+ end
29
+
30
+ describe 'to_sql' do
31
+ it 'takes an engine' do
32
+ engine = FakeRecord::Base.new
33
+ engine.connection.extend Module.new {
34
+ attr_accessor :quote_count
35
+ def quote(*args) @quote_count += 1; super; end
36
+ def quote_column_name(*args) @quote_count += 1; super; end
37
+ def quote_table_name(*args) @quote_count += 1; super; end
38
+ }
39
+ engine.connection.quote_count = 0
40
+
41
+ attr = Table.new(:users)[:id]
42
+ test = attr.eq(10)
43
+ test.to_sql engine
44
+ check engine.connection.quote_count.should == 2
45
+ end
46
+ end
47
+ end
48
+
49
+ describe 'or' do
50
+ it 'makes an OR node' do
51
+ attr = Table.new(:users)[:id]
52
+ left = attr.eq(10)
53
+ right = attr.eq(11)
54
+ node = left.or right
55
+ check node.expr.left.should == left
56
+ check node.expr.right.should == right
57
+ end
58
+ end
59
+
60
+ describe 'and' do
61
+ it 'makes and AND node' do
62
+ attr = Table.new(:users)[:id]
63
+ left = attr.eq(10)
64
+ right = attr.eq(11)
65
+ node = left.and right
66
+ check node.left.should == left
67
+ check node.right.should == right
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arel::Nodes::InsertStatement do
4
+ describe "#clone" do
5
+ it "clones columns and values" do
6
+ statement = Arel::Nodes::InsertStatement.new
7
+ statement.columns = %w[a b c]
8
+ statement.values = %w[x y z]
9
+
10
+ statement.columns.should_receive(:clone).and_return([:columns])
11
+ statement.values.should_receive(:clone).and_return([:values])
12
+
13
+ dolly = statement.clone
14
+ check dolly.columns.should == [:columns]
15
+ check dolly.values.should == [:values]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module Arel
2
+ module Nodes
3
+ describe 'or' do
4
+ describe '#or' do
5
+ it 'makes an OR node' do
6
+ attr = Table.new(:users)[:id]
7
+ left = attr.eq(10)
8
+ right = attr.eq(11)
9
+ node = left.or right
10
+ check node.expr.left.should == left
11
+ check node.expr.right.should == right
12
+
13
+ oror = node.or(right)
14
+ check oror.expr.left == node
15
+ check oror.expr.right == right
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end