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,180 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- describe Join do
5
- before do
6
- @relation1 = Table.new(:users)
7
- @relation2 = Table.new(:photos)
8
- @predicate1 = @relation1[:id].eq(@relation2[:user_id])
9
-
10
- @relation3 = Table.new(:users, :as => :super_users)
11
- @relation4 = Table.new(:photos, :as => :super_photos)
12
-
13
- @predicate2 = @relation3[:id].eq(@relation2[:user_id])
14
- @predicate3 = @relation3[:id].eq(@relation4[:user_id])
15
- end
16
-
17
- describe '#to_sql' do
18
-
19
- describe 'when joining with another relation' do
20
- it 'manufactures sql joining the two tables on the predicate' do
21
- sql = InnerJoin.new(@relation1, @relation2, @predicate1).to_sql
22
-
23
- adapter_is :mysql do
24
- sql.should be_like(%Q{
25
- SELECT `users`.`id`, `users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
26
- FROM `users`
27
- INNER JOIN `photos` ON `users`.`id` = `photos`.`user_id`
28
- })
29
- end
30
-
31
- adapter_is :oracle do
32
- sql.should be_like(%Q{
33
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
34
- FROM "USERS"
35
- INNER JOIN "PHOTOS" ON "USERS"."ID" = "PHOTOS"."USER_ID"
36
- })
37
- end
38
-
39
- adapter_is_not :mysql, :oracle do
40
- sql.should be_like(%Q{
41
- SELECT "users"."id", "users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
42
- FROM "users"
43
- INNER JOIN "photos" ON "users"."id" = "photos"."user_id"
44
- })
45
- end
46
- end
47
-
48
- describe 'when joining with another relation with an aliased table' do
49
- it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
50
- sql = InnerJoin.new(@relation3, @relation2, @predicate2).to_sql
51
-
52
- adapter_is :mysql do
53
- sql.should be_like(%Q{
54
- SELECT `super_users`.`id`, `super_users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
55
- FROM `users` `super_users`
56
- INNER JOIN `photos` ON `super_users`.`id` = `photos`.`user_id`
57
- })
58
- end
59
-
60
- adapter_is :oracle do
61
- sql.should be_like(%Q{
62
- SELECT "SUPER_USERS"."ID", "SUPER_USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
63
- FROM "USERS" "SUPER_USERS"
64
- INNER JOIN "PHOTOS" ON "SUPER_USERS"."ID" = "PHOTOS"."USER_ID"
65
- })
66
- end
67
-
68
- adapter_is_not :mysql, :oracle do
69
- sql.should be_like(%Q{
70
- SELECT "super_users"."id", "super_users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
71
- FROM "users" "super_users"
72
- INNER JOIN "photos" ON "super_users"."id" = "photos"."user_id"
73
- })
74
- end
75
- end
76
- end
77
-
78
- describe 'when joining with two relations with aliased tables' do
79
- it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
80
- sql = InnerJoin.new(@relation3, @relation4, @predicate3).to_sql
81
-
82
- adapter_is :mysql do
83
- sql.should be_like(%Q{
84
- SELECT `super_users`.`id`, `super_users`.`name`, `super_photos`.`id`, `super_photos`.`user_id`, `super_photos`.`camera_id`
85
- FROM `users` `super_users`
86
- INNER JOIN `photos` `super_photos` ON `super_users`.`id` = `super_photos`.`user_id`
87
- })
88
- end
89
-
90
- adapter_is :oracle do
91
- sql.should be_like(%Q{
92
- SELECT "SUPER_USERS"."ID", "SUPER_USERS"."NAME", "SUPER_PHOTOS"."ID", "SUPER_PHOTOS"."USER_ID", "SUPER_PHOTOS"."CAMERA_ID"
93
- FROM "USERS" "SUPER_USERS"
94
- INNER JOIN "PHOTOS" "SUPER_PHOTOS" ON "SUPER_USERS"."ID" = "SUPER_PHOTOS"."USER_ID"
95
- })
96
- end
97
-
98
- adapter_is_not :mysql, :oracle do
99
- sql.should be_like(%Q{
100
- SELECT "super_users"."id", "super_users"."name", "super_photos"."id", "super_photos"."user_id", "super_photos"."camera_id"
101
- FROM "users" "super_users"
102
- INNER JOIN "photos" "super_photos" ON "super_users"."id" = "super_photos"."user_id"
103
- })
104
- end
105
- end
106
- end
107
-
108
- end
109
-
110
- describe 'when joining with a string' do
111
- it "passes the string through to the where clause" do
112
- sql = StringJoin.new(@relation1, "INNER JOIN asdf ON fdsa").to_sql
113
-
114
- adapter_is :mysql do
115
- sql.should be_like(%Q{
116
- SELECT `users`.`id`, `users`.`name`
117
- FROM `users`
118
- INNER JOIN asdf ON fdsa
119
- })
120
- end
121
-
122
- adapter_is :oracle do
123
- sql.should be_like(%Q{
124
- SELECT "USERS"."ID", "USERS"."NAME"
125
- FROM "USERS"
126
- INNER JOIN asdf ON fdsa
127
- })
128
- end
129
-
130
- adapter_is_not :mysql, :oracle do
131
- sql.should be_like(%Q{
132
- SELECT "users"."id", "users"."name"
133
- FROM "users"
134
- INNER JOIN asdf ON fdsa
135
- })
136
- end
137
- end
138
-
139
- it "passes the string when there are multiple string joins" do
140
- relation = StringJoin.new(@relation1, "INNER JOIN asdf ON fdsa")
141
- relation = StringJoin.new(relation, "INNER JOIN lifo ON fifo")
142
- sql = StringJoin.new(relation, "INNER JOIN hatful ON hallow").to_sql
143
-
144
- adapter_is :mysql do
145
- sql.should be_like(%Q{
146
- SELECT `users`.`id`, `users`.`name`
147
- FROM `users`
148
- INNER JOIN asdf ON fdsa
149
- INNER JOIN lifo ON fifo
150
- INNER JOIN hatful ON hallow
151
- })
152
- end
153
-
154
- adapter_is :oracle do
155
- sql.should be_like(%Q{
156
- SELECT "USERS"."ID", "USERS"."NAME"
157
- FROM "USERS"
158
- INNER JOIN asdf ON fdsa
159
- INNER JOIN lifo ON fifo
160
- INNER JOIN hatful ON hallow
161
- })
162
- end
163
-
164
- adapter_is_not :mysql, :oracle do
165
- sql.should be_like(%Q{
166
- SELECT "users"."id", "users"."name"
167
- FROM "users"
168
- INNER JOIN asdf ON fdsa
169
- INNER JOIN lifo ON fifo
170
- INNER JOIN hatful ON hallow
171
- })
172
- end
173
- end
174
-
175
- end
176
-
177
-
178
- end
179
- end
180
- end
@@ -1,86 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- describe Lock do
5
- before do
6
- @relation = Table.new(:users)
7
- end
8
-
9
- describe '#to_sql' do
10
- it "manufactures a simple select query lock" do
11
- sql = @relation.lock.to_sql
12
-
13
- adapter_is :mysql do
14
- sql.should be_like(%Q{
15
- SELECT `users`.`id`, `users`.`name`
16
- FROM `users` FOR UPDATE
17
- })
18
- end
19
-
20
- adapter_is :postgresql do
21
- sql.should be_like(%Q{
22
- SELECT "users"."id", "users"."name"
23
- FROM "users" FOR UPDATE
24
- })
25
- end
26
-
27
- adapter_is :sqlite3 do
28
- sql.should be_like(%Q{
29
- SELECT "users"."id", "users"."name"
30
- FROM "users"
31
- })
32
- end
33
-
34
- adapter_is :oracle do
35
- sql.should be_like(%Q{
36
- SELECT "USERS"."ID", "USERS"."NAME"
37
- FROM "USERS" FOR UPDATE
38
- })
39
-
40
- sql_with_order_by = @relation.order(@relation[:id]).take(1).lock.to_sql
41
- sql_with_order_by.should be_like(%Q{
42
- SELECT "USERS"."ID", "USERS"."NAME"
43
- FROM "USERS"
44
- WHERE "ID" IN (select * from
45
- (SELECT "ID" FROM "USERS" ORDER BY "USERS"."ID" ASC)
46
- where rownum <= 1)
47
- FOR UPDATE
48
- })
49
-
50
- end
51
- end
52
-
53
- it "manufactures a select query locking with a given lock" do
54
- sql = @relation.lock("LOCK IN SHARE MODE").to_sql
55
-
56
- adapter_is :mysql do
57
- sql.should be_like(%Q{
58
- SELECT `users`.`id`, `users`.`name`
59
- FROM `users` LOCK IN SHARE MODE
60
- })
61
- end
62
-
63
- adapter_is :postgresql do
64
- sql.should be_like(%Q{
65
- SELECT "users"."id", "users"."name"
66
- FROM "users" LOCK IN SHARE MODE
67
- })
68
- end
69
-
70
- adapter_is :sqlite3 do
71
- sql.should be_like(%Q{
72
- SELECT "users"."id", "users"."name"
73
- FROM "users"
74
- })
75
- end
76
-
77
- adapter_is :oracle do
78
- sql.should be_like(%Q{
79
- SELECT "USERS"."ID", "USERS"."NAME"
80
- FROM "USERS" LOCK IN SHARE MODE
81
- })
82
- end
83
- end
84
- end
85
- end
86
- end
@@ -1,161 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- describe Order do
5
- before do
6
- @relation = Table.new(:users)
7
- @attribute = @relation[:id]
8
- end
9
-
10
- describe '#to_sql' do
11
- describe "when given an attribute" do
12
- it "manufactures sql with an order clause populated by the attribute" do
13
- sql = Order.new(@relation, [@attribute]).to_sql
14
-
15
- adapter_is :mysql do
16
- sql.should be_like(%Q{
17
- SELECT `users`.`id`, `users`.`name`
18
- FROM `users`
19
- ORDER BY `users`.`id` ASC
20
- })
21
- end
22
-
23
- adapter_is :oracle do
24
- sql.should be_like(%Q{
25
- SELECT "USERS"."ID", "USERS"."NAME"
26
- FROM "USERS"
27
- ORDER BY "USERS"."ID" ASC
28
- })
29
-
30
- distinct_attributes = ActiveRecord::Base.connection.distinct('"USERS"."NAME"', '"USERS"."ID"')
31
- @relation.project(distinct_attributes).order(@relation[:id]).to_sql.should be_like(%Q{
32
- SELECT DISTINCT "USERS"."NAME",
33
- FIRST_VALUE("USERS"."ID") OVER (PARTITION BY "USERS"."NAME" ORDER BY "USERS"."ID") AS alias_0__
34
- FROM "USERS"
35
- ORDER BY alias_0__
36
- })
37
-
38
- distinct_attributes = ActiveRecord::Base.connection.distinct('"USERS"."NAME"', '"USERS"."ID" DESC')
39
- @relation.project(distinct_attributes).order('"USERS"."ID" DESC').to_sql.should be_like(%Q{
40
- SELECT DISTINCT "USERS"."NAME",
41
- FIRST_VALUE("USERS"."ID") OVER (PARTITION BY "USERS"."NAME" ORDER BY "USERS"."ID" DESC) AS alias_0__
42
- FROM "USERS"
43
- ORDER BY alias_0__ DESC
44
- })
45
- end
46
-
47
- adapter_is_not :mysql, :oracle do
48
- sql.should be_like(%Q{
49
- SELECT "users"."id", "users"."name"
50
- FROM "users"
51
- ORDER BY "users"."id" ASC
52
- })
53
- end
54
- end
55
- end
56
-
57
- describe "when given multiple attributes" do
58
- before do
59
- @another_attribute = @relation[:name]
60
- end
61
-
62
- it "manufactures sql with an order clause populated by comma-separated attributes" do
63
- sql = Order.new(@relation, [@attribute, @another_attribute]).to_sql
64
-
65
- adapter_is :mysql do
66
- sql.should be_like(%Q{
67
- SELECT `users`.`id`, `users`.`name`
68
- FROM `users`
69
- ORDER BY `users`.`id` ASC, `users`.`name` ASC
70
- })
71
- end
72
-
73
- adapter_is :oracle do
74
- sql.should be_like(%Q{
75
- SELECT "USERS"."ID", "USERS"."NAME"
76
- FROM "USERS"
77
- ORDER BY "USERS"."ID" ASC, "USERS"."NAME" ASC
78
- })
79
- end
80
-
81
- adapter_is_not :mysql, :oracle do
82
- sql.should be_like(%Q{
83
- SELECT "users"."id", "users"."name"
84
- FROM "users"
85
- ORDER BY "users"."id" ASC, "users"."name" ASC
86
- })
87
- end
88
- end
89
- end
90
-
91
- describe "when given a string" do
92
- before do
93
- @string = "asdf"
94
- end
95
-
96
- it "passes the string through to the order clause" do
97
- sql = Order.new(@relation, [@string]).to_sql
98
-
99
- adapter_is :mysql do
100
- sql.should be_like(%Q{
101
- SELECT `users`.`id`, `users`.`name`
102
- FROM `users`
103
- ORDER BY asdf
104
- })
105
- end
106
-
107
- adapter_is :oracle do
108
- sql.should be_like(%Q{
109
- SELECT "USERS"."ID", "USERS"."NAME"
110
- FROM "USERS"
111
- ORDER BY asdf
112
- })
113
- end
114
-
115
- adapter_is_not :mysql, :oracle do
116
- sql.should be_like(%Q{
117
- SELECT "users"."id", "users"."name"
118
- FROM "users"
119
- ORDER BY asdf
120
- })
121
- end
122
- end
123
- end
124
-
125
- describe "when ordering an ordered relation" do
126
- before do
127
- @ordered_relation = Order.new(@relation, [@attribute])
128
- @another_attribute = @relation[:name]
129
- end
130
-
131
- it "manufactures sql with the order clause of the last ordering preceding the first ordering" do
132
- sql = Order.new(@ordered_relation, [@another_attribute]).to_sql
133
-
134
- adapter_is :mysql do
135
- sql.should be_like(%Q{
136
- SELECT `users`.`id`, `users`.`name`
137
- FROM `users`
138
- ORDER BY `users`.`name` ASC, `users`.`id` ASC
139
- })
140
- end
141
-
142
- adapter_is :oracle do
143
- sql.should be_like(%Q{
144
- SELECT "USERS"."ID", "USERS"."NAME"
145
- FROM "USERS"
146
- ORDER BY "USERS"."NAME" ASC, "USERS"."ID" ASC
147
- })
148
- end
149
-
150
- adapter_is_not :mysql, :oracle do
151
- sql.should be_like(%Q{
152
- SELECT "users"."id", "users"."name"
153
- FROM "users"
154
- ORDER BY "users"."name" ASC, "users"."id" ASC
155
- })
156
- end
157
- end
158
- end
159
- end
160
- end
161
- end
@@ -1,143 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- describe Project do
5
- before do
6
- @relation = Table.new(:users)
7
- @attribute = @relation[:id]
8
- end
9
-
10
- describe '#to_sql' do
11
- describe 'when given an attribute' do
12
- it "manufactures sql with a limited select clause" do
13
- sql = Project.new(@relation, [@attribute]).to_sql
14
-
15
- adapter_is :mysql do
16
- sql.should be_like(%Q{
17
- SELECT `users`.`id`
18
- FROM `users`
19
- })
20
- end
21
-
22
- adapter_is :oracle do
23
- sql.should be_like(%Q{
24
- SELECT "USERS"."ID"
25
- FROM "USERS"
26
- })
27
- end
28
-
29
- adapter_is_not :mysql, :oracle do
30
- sql.should be_like(%Q{
31
- SELECT "users"."id"
32
- FROM "users"
33
- })
34
- end
35
- end
36
- end
37
-
38
- describe 'when given a relation' do
39
- before do
40
- @scalar_relation = Project.new(@relation, [@relation[:name]])
41
- end
42
-
43
- it "manufactures sql with scalar selects" do
44
- sql = Project.new(@relation, [@scalar_relation]).to_sql
45
-
46
- adapter_is :mysql do
47
- sql.should be_like(%Q{
48
- SELECT (SELECT `users`.`name` FROM `users`) AS `users` FROM `users`
49
- })
50
- end
51
-
52
- adapter_is :oracle do
53
- sql.should be_like(%Q{
54
- SELECT (SELECT "USERS"."NAME" FROM "USERS") AS "USERS" FROM "USERS"
55
- })
56
- end
57
-
58
- adapter_is_not :mysql, :oracle do
59
- sql.should be_like(%Q{
60
- SELECT (SELECT "users"."name" FROM "users") AS "users" FROM "users"
61
- })
62
- end
63
- end
64
- end
65
-
66
- describe 'when given a string' do
67
- it "passes the string through to the select clause" do
68
- sql = Project.new(@relation, ['asdf']).to_sql
69
-
70
- adapter_is :mysql do
71
- sql.should be_like(%Q{
72
- SELECT asdf FROM `users`
73
- })
74
- end
75
-
76
- adapter_is :oracle do
77
- sql.should be_like(%Q{
78
- SELECT asdf FROM "USERS"
79
- })
80
- end
81
-
82
- adapter_is_not :mysql, :oracle do
83
- sql.should be_like(%Q{
84
- SELECT asdf FROM "users"
85
- })
86
- end
87
- end
88
- end
89
-
90
- describe 'when given an expression' do
91
- it 'manufactures sql with expressions' do
92
- sql = @relation.project(@attribute.count).to_sql
93
-
94
- adapter_is :mysql do
95
- sql.should be_like(%Q{
96
- SELECT COUNT(`users`.`id`) AS count_id
97
- FROM `users`
98
- })
99
- end
100
-
101
- adapter_is :oracle do
102
- sql.should be_like(%Q{
103
- SELECT COUNT("USERS"."ID") AS count_id
104
- FROM "USERS"
105
- })
106
- end
107
-
108
- adapter_is_not :mysql, :oracle do
109
- sql.should be_like(%Q{
110
- SELECT COUNT("users"."id") AS count_id
111
- FROM "users"
112
- })
113
- end
114
- end
115
-
116
- it 'manufactures sql with distinct expressions' do
117
- sql = @relation.project(@attribute.count(true)).to_sql
118
-
119
- adapter_is :mysql do
120
- sql.should be_like(%Q{
121
- SELECT COUNT(DISTINCT `users`.`id`) AS count_id
122
- FROM `users`
123
- })
124
- end
125
-
126
- adapter_is :oracle do
127
- sql.should be_like(%Q{
128
- SELECT COUNT(DISTINCT "USERS"."ID") AS count_id
129
- FROM "USERS"
130
- })
131
- end
132
-
133
- adapter_is_not :mysql, :oracle do
134
- sql.should be_like(%Q{
135
- SELECT COUNT(DISTINCT "users"."id") AS count_id
136
- FROM "users"
137
- })
138
- end
139
- end
140
- end
141
- end
142
- end
143
- end