arel 1.0.1 → 2.0.0

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