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
@@ -0,0 +1,3 @@
1
+ --backtrace
2
+ --diff
3
+ --color
@@ -1,33 +1,18 @@
1
1
  require 'rubygems'
2
2
  require 'spec'
3
- require 'pp'
4
3
  require 'fileutils'
5
4
  require 'arel'
6
5
 
7
- if adapter = ENV['ADAPTER']
8
- require "support/connections/#{adapter}_connection.rb"
9
- end
10
-
11
- Dir["spec/{support,shared}/*.rb"].each do |file|
12
- require file
13
- end
6
+ require 'support/matchers/be_like'
7
+ require 'support/check'
8
+ require 'support/fake_record'
9
+ require 'support/shared/tree_manager_shared'
14
10
 
15
11
  Spec::Runner.configure do |config|
16
12
  config.include Matchers
17
- config.include AdapterGuards
18
13
  config.include Check
19
14
 
20
- if defined?(ActiveRecord::Base)
21
- tmp = File.expand_path('../../tmp', __FILE__)
22
-
23
- FileUtils.mkdir_p(tmp)
24
- ActiveRecord::Base.logger = Logger.new("#{tmp}/debug.log")
25
- ActiveRecord::Base.establish_connection("unit")
26
-
27
- require "support/schemas/#{ENV['ADAPTER']}_schema.rb"
28
-
29
- config.before do
30
- Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
31
- end
15
+ config.before do
16
+ Arel::Table.engine = Arel::Sql::Engine.new(FakeRecord::Base.new)
32
17
  end
33
18
  end
@@ -0,0 +1,89 @@
1
+ module FakeRecord
2
+ class Column < Struct.new(:name, :type)
3
+ end
4
+
5
+ class Connection
6
+ attr_reader :tables
7
+
8
+ def initialize
9
+ @tables = %w{ users photos developers }
10
+ @columns = {
11
+ 'users' => [
12
+ Column.new('id', :integer),
13
+ Column.new('name', :string)
14
+ ]
15
+ }
16
+ @primary_keys = {
17
+ 'users' => 'id'
18
+ }
19
+ end
20
+
21
+ def primary_key name
22
+ @primary_keys[name.to_s]
23
+ end
24
+
25
+ def table_exists? name
26
+ @tables.include? name.to_s
27
+ end
28
+
29
+ def columns name, message = nil
30
+ @columns[name.to_s]
31
+ end
32
+
33
+ def quote_table_name name
34
+ "\"#{name.to_s}\""
35
+ end
36
+
37
+ def quote_column_name name
38
+ "\"#{name.to_s}\""
39
+ end
40
+
41
+ def quote thing, column = nil
42
+ if column && column.type == :integer
43
+ return 'NULL' if thing.nil?
44
+ return thing.to_i
45
+ end
46
+
47
+ case thing
48
+ when true
49
+ "'t'"
50
+ when false
51
+ "'f'"
52
+ when nil
53
+ 'NULL'
54
+ when Numeric
55
+ thing
56
+ else
57
+ "'#{thing}'"
58
+ end
59
+ end
60
+ end
61
+
62
+ class ConnectionPool
63
+ class Spec < Struct.new(:config)
64
+ end
65
+
66
+ attr_reader :spec, :connection
67
+
68
+ def initialize
69
+ @spec = Spec.new(:adapter => 'sqlite3')
70
+ @connection = Connection.new
71
+ end
72
+
73
+ def with_connection
74
+ yield connection
75
+ end
76
+ end
77
+
78
+ class Base
79
+ attr_accessor :connection_pool
80
+
81
+ def initialize
82
+ @connection_pool = ConnectionPool.new
83
+ end
84
+
85
+ def connection
86
+ connection_pool.connection
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,9 @@
1
+ shared_examples_for "TreeManager" do
2
+ describe "clone" do
3
+ it "clones the insert statement" do
4
+ subject.instance_variable_get("@head").should_receive(:clone).and_return(:foo) # TODO: ick.
5
+ dolly = subject.clone
6
+ dolly.instance_variable_get("@head").should == :foo
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,176 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe Table do
5
+ before do
6
+ @relation = Table.new(:users)
7
+ end
8
+
9
+ describe 'primary_key' do
10
+ it 'should return an attribute' do
11
+ check @relation.primary_key.name.should == :id
12
+ end
13
+ end
14
+
15
+ describe 'select_manager' do
16
+ it 'should return an empty select manager' do
17
+ sm = @relation.select_manager
18
+ sm.to_sql.should be_like 'SELECT'
19
+ end
20
+ end
21
+
22
+ describe 'having' do
23
+ it 'adds a having clause' do
24
+ mgr = @relation.having @relation[:id].eq(10)
25
+ mgr.to_sql.should be_like %{
26
+ SELECT FROM "users" HAVING "users"."id" = 10
27
+ }
28
+ end
29
+ end
30
+
31
+ describe 'backwards compat' do
32
+ describe 'joins' do
33
+ it 'returns nil' do
34
+ check @relation.joins(nil).should == nil
35
+ end
36
+ end
37
+
38
+ describe 'join' do
39
+ it 'noops on nil' do
40
+ mgr = @relation.join nil
41
+
42
+ mgr.to_sql.should be_like %{ SELECT FROM "users" }
43
+ end
44
+
45
+ it 'takes a second argument for join type' do
46
+ right = @relation.alias
47
+ predicate = @relation[:id].eq(right[:id])
48
+ mgr = @relation.join(right, Nodes::OuterJoin).on(predicate)
49
+
50
+ mgr.to_sql.should be_like %{
51
+ SELECT FROM "users"
52
+ LEFT OUTER JOIN "users" "users_2"
53
+ ON "users"."id" = "users_2"."id"
54
+ }
55
+ end
56
+ end
57
+ end
58
+
59
+ describe 'group' do
60
+ it 'should create a group' do
61
+ manager = @relation.group @relation[:id]
62
+ manager.to_sql.should be_like %{
63
+ SELECT FROM "users" GROUP BY "users"."id"
64
+ }
65
+ end
66
+ end
67
+
68
+ describe 'alias' do
69
+ it 'should create a node that proxies to a table' do
70
+ check @relation.aliases.should == []
71
+
72
+ node = @relation.alias
73
+ check @relation.aliases.should == [node]
74
+ check node.name.should == 'users_2'
75
+ check node[:id].relation.should == node
76
+ check node[:id].relation.should != node
77
+ end
78
+ end
79
+
80
+ describe 'new' do
81
+ it 'takes :columns' do
82
+ columns = Table.engine.connection.columns("users")
83
+ @relation = Table.new(:users, :columns => columns)
84
+ check @relation.columns.first.name.should == :id
85
+ check @relation.engine.should == Table.engine
86
+ end
87
+
88
+ it 'should accept an engine' do
89
+ rel = Table.new :users, 'foo'
90
+ check rel.engine.should == 'foo'
91
+ end
92
+
93
+ it 'should accept a hash' do
94
+ rel = Table.new :users, :engine => 'foo'
95
+ check rel.engine.should == 'foo'
96
+ end
97
+
98
+ it 'ignores as if it equals name' do
99
+ rel = Table.new :users, :as => 'users'
100
+ rel.table_alias.should be_nil
101
+ end
102
+ end
103
+
104
+ describe 'order' do
105
+ it "should take an order" do
106
+ manager = @relation.order "foo"
107
+ manager.to_sql.should be_like %{ SELECT FROM "users" ORDER BY foo }
108
+ end
109
+ end
110
+
111
+ describe 'take' do
112
+ it "should add a limit" do
113
+ manager = @relation.take 1
114
+ manager.project SqlLiteral.new '*'
115
+ manager.to_sql.should be_like %{ SELECT * FROM "users" LIMIT 1 }
116
+ end
117
+ end
118
+
119
+ describe 'project' do
120
+ it 'can project' do
121
+ manager = @relation.project SqlLiteral.new '*'
122
+ manager.to_sql.should be_like %{ SELECT * FROM "users" }
123
+ end
124
+
125
+ it 'takes multiple parameters' do
126
+ manager = @relation.project SqlLiteral.new('*'), SqlLiteral.new('*')
127
+ manager.to_sql.should be_like %{ SELECT *, * FROM "users" }
128
+ end
129
+ end
130
+
131
+ describe 'where' do
132
+ it "returns a tree manager" do
133
+ manager = @relation.where @relation[:id].eq 1
134
+ manager.project @relation[:id]
135
+ manager.should be_kind_of TreeManager
136
+ manager.to_sql.should be_like %{
137
+ SELECT "users"."id"
138
+ FROM "users"
139
+ WHERE "users"."id" = 1
140
+ }
141
+ end
142
+ end
143
+
144
+ describe 'columns' do
145
+ it 'returns a list of columns' do
146
+ columns = @relation.columns
147
+ check columns.length.should == 2
148
+ columns.map { |x| x.name.to_s }.sort.should == %w{ name id }.sort
149
+ end
150
+ end
151
+
152
+ it "should have a name" do
153
+ @relation.name.should == :users
154
+ end
155
+
156
+ it "should have an engine" do
157
+ @relation.engine.should == Table.engine
158
+ end
159
+
160
+ describe '[]' do
161
+ describe 'when given a', Symbol do
162
+ it "manufactures an attribute if the symbol names an attribute within the relation" do
163
+ column = @relation[:id]
164
+ check column.name.should == :id
165
+ column.should be_kind_of Attributes::Integer
166
+ end
167
+ end
168
+
169
+ describe 'when table does not exist' do
170
+ it 'returns nil' do
171
+ @relation[:foooo].should be_nil
172
+ end
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe 'update manager' do
5
+ describe 'new' do
6
+ it 'takes an engine' do
7
+ Arel::UpdateManager.new Table.engine
8
+ end
9
+ end
10
+
11
+ describe 'set' do
12
+ it "updates with null" do
13
+ table = Table.new(:users)
14
+ um = Arel::UpdateManager.new Table.engine
15
+ um.table table
16
+ um.set [[table[:name], nil]]
17
+ um.to_sql.should be_like %{ UPDATE "users" SET "name" = NULL }
18
+ end
19
+
20
+ it 'takes a string' do
21
+ table = Table.new(:users)
22
+ um = Arel::UpdateManager.new Table.engine
23
+ um.table table
24
+ um.set Nodes::SqlLiteral.new "foo = bar"
25
+ um.to_sql.should be_like %{ UPDATE "users" SET foo = bar }
26
+ end
27
+
28
+ it 'takes a list of lists' do
29
+ table = Table.new(:users)
30
+ um = Arel::UpdateManager.new Table.engine
31
+ um.table table
32
+ um.set [[table[:id], 1], [table[:name], 'hello']]
33
+ um.to_sql.should be_like %{
34
+ UPDATE "users" SET "id" = 1, "name" = 'hello'
35
+ }
36
+ end
37
+
38
+ it 'chains' do
39
+ table = Table.new(:users)
40
+ um = Arel::UpdateManager.new Table.engine
41
+ um.set([[table[:id], 1], [table[:name], 'hello']]).should == um
42
+ end
43
+ end
44
+
45
+ describe 'table' do
46
+ it 'generates an update statement' do
47
+ um = Arel::UpdateManager.new Table.engine
48
+ um.table Table.new(:users)
49
+ um.to_sql.should be_like %{ UPDATE "users" }
50
+ end
51
+
52
+ it 'chains' do
53
+ um = Arel::UpdateManager.new Table.engine
54
+ um.table(Table.new(:users)).should == um
55
+ end
56
+ end
57
+
58
+ describe 'where' do
59
+ it 'generates a where clause' do
60
+ table = Table.new :users
61
+ um = Arel::UpdateManager.new Table.engine
62
+ um.table table
63
+ um.where table[:id].eq(1)
64
+ um.to_sql.should be_like %{
65
+ UPDATE "users" WHERE "users"."id" = 1
66
+ }
67
+ end
68
+
69
+ it 'chains' do
70
+ table = Table.new :users
71
+ um = Arel::UpdateManager.new Table.engine
72
+ um.table table
73
+ um.where(table[:id].eq(1)).should == um
74
+ end
75
+ end
76
+
77
+ describe "TreeManager" do
78
+ subject do
79
+ table = Table.new :users
80
+ Arel::UpdateManager.new(Table.engine).tap do |manager|
81
+ manager.table table
82
+ manager.where table[:id].eq(1)
83
+ end
84
+ end
85
+
86
+ it_should_behave_like "TreeManager"
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ module Visitors
5
+ describe 'the join_sql visitor' do
6
+ before do
7
+ @visitor = JoinSql.new Table.engine
8
+ end
9
+
10
+ describe 'inner join' do
11
+ it 'should visit left if left is a join' do
12
+ t = Table.new :users
13
+ join = Nodes::InnerJoin.new t, t, Nodes::On.new(t[:id])
14
+ j2 = Nodes::InnerJoin.new join, t, Nodes::On.new(t[:id])
15
+ @visitor.accept(j2).should be_like %{
16
+ INNER JOIN "users" ON "users"."id"
17
+ INNER JOIN "users" ON "users"."id"
18
+ }
19
+ end
20
+ end
21
+
22
+ describe 'outer join' do
23
+ it 'should visit left if left is a join' do
24
+ t = Table.new :users
25
+ join = Nodes::OuterJoin.new t, t, Nodes::On.new(t[:id])
26
+ j2 = Nodes::OuterJoin.new join, t, Nodes::On.new(t[:id])
27
+ @visitor.accept(j2).should be_like %{
28
+ LEFT OUTER JOIN "users" ON "users"."id"
29
+ LEFT OUTER JOIN "users" ON "users"."id"
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end