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
@@ -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