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,221 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- describe Join do
5
- before do
6
- @relation1 = Table(:users)
7
- @relation2 = Table(:photos)
8
- @predicate = @relation1[:id].eq(@relation2[:user_id])
9
- end
10
-
11
- describe 'when joining aggregated relations' do
12
- before do
13
- @aggregation = @relation2 \
14
- .group(@relation2[:user_id]) \
15
- .project(@relation2[:user_id], @relation2[:id].count.as(:cnt)) \
16
- end
17
-
18
- describe '#to_sql' do
19
- # CLEANUP
20
- it '' do
21
- sql = @relation1.join(@relation2.take(3)).on(@predicate).to_sql
22
-
23
- adapter_is :mysql do
24
- sql.should be_like(%Q{
25
- SELECT `users`.`id`, `users`.`name`, `photos_external`.`id`, `photos_external`.`user_id`, `photos_external`.`camera_id`
26
- FROM `users`
27
- INNER JOIN (SELECT `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id` FROM `photos` LIMIT 3) `photos_external`
28
- ON `users`.`id` = `photos_external`.`user_id`
29
- })
30
- end
31
-
32
- adapter_is :oracle do
33
- sql.should be_like(%Q{
34
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS_EXTERNAL"."ID", "PHOTOS_EXTERNAL"."USER_ID", "PHOTOS_EXTERNAL"."CAMERA_ID"
35
- FROM "USERS"
36
- INNER JOIN (SELECT "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID" FROM "PHOTOS" WHERE ROWNUM <= 3) "PHOTOS_EXTERNAL"
37
- ON "USERS"."ID" = "PHOTOS_EXTERNAL"."USER_ID"
38
- })
39
- end
40
-
41
- adapter_is_not :mysql, :oracle do
42
- sql.should be_like(%Q{
43
- SELECT "users"."id", "users"."name", "photos_external"."id", "photos_external"."user_id", "photos_external"."camera_id"
44
- FROM "users"
45
- INNER JOIN (SELECT "photos"."id", "photos"."user_id", "photos"."camera_id" FROM "photos" LIMIT 3) "photos_external"
46
- ON "users"."id" = "photos_external"."user_id"
47
- })
48
- end
49
- end
50
-
51
- describe 'with the aggregation on the right' do
52
- it 'manufactures sql joining the left table to a derived table' do
53
- sql = @relation1.join(@aggregation).on(@predicate).to_sql
54
-
55
- adapter_is :mysql do
56
- sql.should be_like(%Q{
57
- SELECT `users`.`id`, `users`.`name`, `photos_external`.`user_id`, `photos_external`.`cnt`
58
- FROM `users`
59
- INNER JOIN (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) `photos_external`
60
- ON `users`.`id` = `photos_external`.`user_id`
61
- })
62
- end
63
-
64
- adapter_is :oracle do
65
- sql.should be_like(%Q{
66
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS_EXTERNAL"."USER_ID", "PHOTOS_EXTERNAL"."CNT"
67
- FROM "USERS"
68
- INNER JOIN (SELECT "PHOTOS"."USER_ID", COUNT("PHOTOS"."ID") AS "CNT" FROM "PHOTOS" GROUP BY "PHOTOS"."USER_ID") "PHOTOS_EXTERNAL"
69
- ON "USERS"."ID" = "PHOTOS_EXTERNAL"."USER_ID"
70
- })
71
- end
72
-
73
- adapter_is_not :mysql, :oracle do
74
- sql.should be_like(%Q{
75
- SELECT "users"."id", "users"."name", "photos_external"."user_id", "photos_external"."cnt"
76
- FROM "users"
77
- INNER JOIN (SELECT "photos"."user_id", COUNT("photos"."id") AS "cnt" FROM "photos" GROUP BY "photos"."user_id") "photos_external"
78
- ON "users"."id" = "photos_external"."user_id"
79
- })
80
- end
81
- end
82
- end
83
-
84
- describe 'with the aggregation on the left' do
85
- it 'manufactures sql joining the right table to a derived table' do
86
- sql = @aggregation.join(@relation1).on(@predicate).to_sql
87
-
88
- adapter_is :mysql do
89
- sql.should be_like(%Q{
90
- SELECT `photos_external`.`user_id`, `photos_external`.`cnt`, `users`.`id`, `users`.`name`
91
- FROM (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) `photos_external`
92
- INNER JOIN `users`
93
- ON `users`.`id` = `photos_external`.`user_id`
94
- })
95
- end
96
-
97
- adapter_is :oracle do
98
- sql.should be_like(%Q{
99
- SELECT "PHOTOS_EXTERNAL"."USER_ID", "PHOTOS_EXTERNAL"."CNT", "USERS"."ID", "USERS"."NAME"
100
- FROM (SELECT "PHOTOS"."USER_ID", COUNT("PHOTOS"."ID") AS "CNT" FROM "PHOTOS" GROUP BY "PHOTOS"."USER_ID") "PHOTOS_EXTERNAL"
101
- INNER JOIN "USERS"
102
- ON "USERS"."ID" = "PHOTOS_EXTERNAL"."USER_ID"
103
- })
104
- end
105
-
106
- adapter_is_not :mysql, :oracle do
107
- sql.should be_like(%Q{
108
- SELECT "photos_external"."user_id", "photos_external"."cnt", "users"."id", "users"."name"
109
- FROM (SELECT "photos"."user_id", COUNT("photos"."id") AS "cnt" FROM "photos" GROUP BY "photos"."user_id") "photos_external"
110
- INNER JOIN "users"
111
- ON "users"."id" = "photos_external"."user_id"
112
- })
113
- end
114
- end
115
- end
116
-
117
- describe 'with the aggregation on both sides' do
118
- it 'it properly aliases the aggregations' do
119
- aggregation2 = @aggregation.alias
120
- sql = @aggregation.join(aggregation2).on(aggregation2[:user_id].eq(@aggregation[:user_id])).to_sql
121
-
122
- adapter_is :mysql do
123
- sql.should be_like(%Q{
124
- SELECT `photos_external`.`user_id`, `photos_external`.`cnt`, `photos_external_2`.`user_id`, `photos_external_2`.`cnt`
125
- FROM (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) `photos_external`
126
- INNER JOIN (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) `photos_external_2`
127
- ON `photos_external_2`.`user_id` = `photos_external`.`user_id`
128
- })
129
- end
130
-
131
- adapter_is :oracle do
132
- sql.should be_like(%Q{
133
- SELECT "PHOTOS_EXTERNAL"."USER_ID", "PHOTOS_EXTERNAL"."CNT", "PHOTOS_EXTERNAL_2"."USER_ID", "PHOTOS_EXTERNAL_2"."CNT"
134
- FROM (SELECT "PHOTOS"."USER_ID", COUNT("PHOTOS"."ID") AS "CNT" FROM "PHOTOS" GROUP BY "PHOTOS"."USER_ID") "PHOTOS_EXTERNAL"
135
- INNER JOIN (SELECT "PHOTOS"."USER_ID", COUNT("PHOTOS"."ID") AS "CNT" FROM "PHOTOS" GROUP BY "PHOTOS"."USER_ID") "PHOTOS_EXTERNAL_2"
136
- ON "PHOTOS_EXTERNAL_2"."USER_ID" = "PHOTOS_EXTERNAL"."USER_ID"
137
- })
138
- end
139
-
140
- adapter_is_not :mysql, :oracle do
141
- sql.should be_like(%Q{
142
- SELECT "photos_external"."user_id", "photos_external"."cnt", "photos_external_2"."user_id", "photos_external_2"."cnt"
143
- FROM (SELECT "photos"."user_id", COUNT("photos"."id") AS "cnt" FROM "photos" GROUP BY "photos"."user_id") "photos_external"
144
- INNER JOIN (SELECT "photos"."user_id", COUNT("photos"."id") AS "cnt" FROM "photos" GROUP BY "photos"."user_id") "photos_external_2"
145
- ON "photos_external_2"."user_id" = "photos_external"."user_id"
146
- })
147
- end
148
- end
149
- end
150
-
151
- describe 'when the aggration has a where' do
152
- describe 'with the aggregation on the left' do
153
- it "manufactures sql keeping wheres on the aggregation within the derived table" do
154
- sql = @relation1.join(@aggregation.where(@aggregation[:user_id].eq(1))).on(@predicate).to_sql
155
-
156
- adapter_is :mysql do
157
- sql.should be_like(%Q{
158
- SELECT `users`.`id`, `users`.`name`, `photos_external`.`user_id`, `photos_external`.`cnt`
159
- FROM `users`
160
- INNER JOIN (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` WHERE `photos`.`user_id` = 1 GROUP BY `photos`.`user_id`) `photos_external`
161
- ON `users`.`id` = `photos_external`.`user_id`
162
- })
163
- end
164
-
165
- adapter_is :oracle do
166
- sql.should be_like(%Q{
167
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS_EXTERNAL"."USER_ID", "PHOTOS_EXTERNAL"."CNT"
168
- FROM "USERS"
169
- INNER JOIN (SELECT "PHOTOS"."USER_ID", COUNT("PHOTOS"."ID") AS "CNT" FROM "PHOTOS" WHERE "PHOTOS"."USER_ID" = 1 GROUP BY "PHOTOS"."USER_ID") "PHOTOS_EXTERNAL"
170
- ON "USERS"."ID" = "PHOTOS_EXTERNAL"."USER_ID"
171
- })
172
- end
173
-
174
- adapter_is_not :mysql, :oracle do
175
- sql.should be_like(%Q{
176
- SELECT "users"."id", "users"."name", "photos_external"."user_id", "photos_external"."cnt"
177
- FROM "users"
178
- INNER JOIN (SELECT "photos"."user_id", COUNT("photos"."id") AS "cnt" FROM "photos" WHERE "photos"."user_id" = 1 GROUP BY "photos"."user_id") "photos_external"
179
- ON "users"."id" = "photos_external"."user_id"
180
- })
181
- end
182
- end
183
- end
184
-
185
- describe 'with the aggregation on the right' do
186
- it "manufactures sql keeping wheres on the aggregation within the derived table" do
187
- sql = @aggregation.where(@aggregation[:user_id].eq(1)).join(@relation1).on(@predicate).to_sql
188
-
189
- adapter_is :mysql do
190
- sql.should be_like(%Q{
191
- SELECT `photos_external`.`user_id`, `photos_external`.`cnt`, `users`.`id`, `users`.`name`
192
- FROM (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` WHERE `photos`.`user_id` = 1 GROUP BY `photos`.`user_id`) `photos_external`
193
- INNER JOIN `users`
194
- ON `users`.`id` = `photos_external`.`user_id`
195
- })
196
- end
197
-
198
- adapter_is :oracle do
199
- sql.should be_like(%Q{
200
- SELECT "PHOTOS_EXTERNAL"."USER_ID", "PHOTOS_EXTERNAL"."CNT", "USERS"."ID", "USERS"."NAME"
201
- FROM (SELECT "PHOTOS"."USER_ID", COUNT("PHOTOS"."ID") AS "CNT" FROM "PHOTOS" WHERE "PHOTOS"."USER_ID" = 1 GROUP BY "PHOTOS"."USER_ID") "PHOTOS_EXTERNAL"
202
- INNER JOIN "USERS"
203
- ON "USERS"."ID" = "PHOTOS_EXTERNAL"."USER_ID"
204
- })
205
- end
206
-
207
- adapter_is_not :mysql, :oracle do
208
- sql.should be_like(%Q{
209
- SELECT "photos_external"."user_id", "photos_external"."cnt", "users"."id", "users"."name"
210
- FROM (SELECT "photos"."user_id", COUNT("photos"."id") AS "cnt" FROM "photos" WHERE "photos"."user_id" = 1 GROUP BY "photos"."user_id") "photos_external"
211
- INNER JOIN "users"
212
- ON "users"."id" = "photos_external"."user_id"
213
- })
214
- end
215
- end
216
- end
217
- end
218
- end
219
- end
220
- end
221
- end
@@ -1,137 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- describe Join do
5
- before do
6
- @relation1 = Table(:users)
7
- @relation2 = Table(:photos)
8
- @predicate = @relation1[:id].eq(@relation2[:user_id])
9
- end
10
-
11
- describe '#to_sql' do
12
- describe 'when the join contains a where' do
13
- describe 'and the where is given a string' do
14
- it 'does not escape the string' do
15
- sql = @relation1 \
16
- .join(@relation2.where("asdf")) \
17
- .on(@predicate) \
18
- .to_sql
19
-
20
- adapter_is :mysql do
21
- sql.should be_like(%Q{
22
- SELECT `users`.`id`, `users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
23
- FROM `users`
24
- INNER JOIN `photos`
25
- ON `users`.`id` = `photos`.`user_id` AND asdf
26
- })
27
- end
28
-
29
- adapter_is :oracle do
30
- sql.should be_like(%Q{
31
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
32
- FROM "USERS"
33
- INNER JOIN "PHOTOS"
34
- ON "USERS"."ID" = "PHOTOS"."USER_ID" AND asdf
35
- })
36
- end
37
-
38
- adapter_is_not :mysql, :oracle do
39
- sql.should be_like(%Q{
40
- SELECT "users"."id", "users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
41
- FROM "users"
42
- INNER JOIN "photos"
43
- ON "users"."id" = "photos"."user_id" AND asdf
44
- })
45
- end
46
- end
47
- end
48
- end
49
-
50
- describe 'when a compound contains a join' do
51
- describe 'and the compound is a where' do
52
- it 'manufactures sql disambiguating the tables' do
53
- sql = @relation1 \
54
- .where(@relation1[:id].eq(1)) \
55
- .join(@relation2) \
56
- .on(@predicate) \
57
- .where(@relation1[:id].eq(1)) \
58
- .to_sql
59
-
60
- adapter_is :mysql do
61
- sql.should be_like(%Q{
62
- SELECT `users`.`id`, `users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
63
- FROM `users`
64
- INNER JOIN `photos`
65
- ON `users`.`id` = `photos`.`user_id`
66
- WHERE `users`.`id` = 1
67
- AND `users`.`id` = 1
68
- })
69
- end
70
-
71
- adapter_is :oracle do
72
- sql.should be_like(%Q{
73
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
74
- FROM "USERS"
75
- INNER JOIN "PHOTOS"
76
- ON "USERS"."ID" = "PHOTOS"."USER_ID"
77
- WHERE "USERS"."ID" = 1
78
- AND "USERS"."ID" = 1
79
- })
80
- end
81
-
82
- adapter_is_not :mysql, :oracle do
83
- sql.should be_like(%Q{
84
- SELECT "users"."id", "users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
85
- FROM "users"
86
- INNER JOIN "photos"
87
- ON "users"."id" = "photos"."user_id"
88
- WHERE "users"."id" = 1
89
- AND "users"."id" = 1
90
- })
91
- end
92
- end
93
- end
94
-
95
- describe 'and the compound is a group' do
96
- it 'manufactures sql disambiguating the tables' do
97
- sql = @relation1 \
98
- .join(@relation2) \
99
- .on(@predicate) \
100
- .group(@relation1[:id]) \
101
- .to_sql
102
-
103
- adapter_is :mysql do
104
- sql.should be_like(%Q{
105
- SELECT `users`.`id`, `users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
106
- FROM `users`
107
- INNER JOIN `photos`
108
- ON `users`.`id` = `photos`.`user_id`
109
- GROUP BY `users`.`id`
110
- })
111
- end
112
-
113
- adapter_is :oracle do
114
- sql.should be_like(%Q{
115
- SELECT "USERS"."ID", "USERS"."NAME", "PHOTOS"."ID", "PHOTOS"."USER_ID", "PHOTOS"."CAMERA_ID"
116
- FROM "USERS"
117
- INNER JOIN "PHOTOS"
118
- ON "USERS"."ID" = "PHOTOS"."USER_ID"
119
- GROUP BY "USERS"."ID"
120
- })
121
- end
122
-
123
- adapter_is_not :mysql, :oracle do
124
- sql.should be_like(%Q{
125
- SELECT "users"."id", "users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
126
- FROM "users"
127
- INNER JOIN "photos"
128
- ON "users"."id" = "photos"."user_id"
129
- GROUP BY "users"."id"
130
- })
131
- end
132
- end
133
- end
134
- end
135
- end
136
- end
137
- end
@@ -1,65 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- FakeAR = Struct.new(:connection)
5
- class FakeConnection < Struct.new :called
6
- def initialize c = []; super; end
7
-
8
- def method_missing name, *args, &block
9
- called << [name, args, block]
10
- end
11
- end
12
-
13
- describe Sql::Engine do
14
- before do
15
- @users = Table.new(:users)
16
- @users.delete
17
- end
18
-
19
- describe "method missing" do
20
- it "should ask for a connection" do
21
- conn = FakeConnection.new
22
- ar = FakeAR.new conn
23
- engine = Arel::Sql::Engine.new ar
24
-
25
- ar.connection = nil
26
- lambda { engine.foo }.should raise_error
27
- end
28
- end
29
-
30
- describe "CRUD" do
31
- describe "#create" do
32
- it "inserts into the relation" do
33
- @users.insert @users[:name] => "Bryan"
34
- @users.first[@users[:name]].should == "Bryan"
35
- end
36
- end
37
-
38
- describe "#read" do
39
- it "reads from the relation" do
40
- @users.insert @users[:name] => "Bryan"
41
-
42
- @users.each do |row|
43
- row[@users[:name]].should == "Bryan"
44
- end
45
- end
46
- end
47
-
48
- describe "#update" do
49
- it "updates the relation" do
50
- @users.insert @users[:name] => "Nick"
51
- @users.update @users[:name] => "Bryan"
52
- @users.first[@users[:name]].should == "Bryan"
53
- end
54
- end
55
-
56
- describe "#delete" do
57
- it "deletes from the relation" do
58
- @users.insert @users[:name] => "Bryan"
59
- @users.delete
60
- @users.first.should == nil
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,140 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Arel
4
- module Predicates
5
- describe Binary do
6
- class ConcreteBinary < Binary
7
- def predicate_sql
8
- "<=>"
9
- end
10
- end
11
-
12
- before do
13
- @relation = Arel::Table.new(:users)
14
- @attribute1 = @relation[:id]
15
- @attribute2 = @relation[:name]
16
- end
17
-
18
- describe "with compound predicates" do
19
- before do
20
- @operand1 = ConcreteBinary.new(@attribute1, 1)
21
- @operand2 = ConcreteBinary.new(@attribute2, "name")
22
- end
23
-
24
- describe Or do
25
- describe "#to_sql" do
26
- it "manufactures sql with an OR operation" do
27
- sql = Or.new(@operand1, @operand2).to_sql
28
-
29
- adapter_is :mysql do
30
- sql.should be_like(%Q{(`users`.`id` <=> 1 OR `users`.`name` <=> 'name')})
31
- end
32
-
33
- adapter_is :postgresql do
34
- sql.should be_like(%Q{("users"."id" <=> 1 OR "users"."name" <=> E'name')})
35
- end
36
-
37
- adapter_is :sqlite3 do
38
- sql.should be_like(%Q{("users"."id" <=> 1 OR "users"."name" <=> 'name')})
39
- end
40
-
41
- adapter_is :oracle do
42
- sql.should be_like(%Q{("USERS"."ID" <=> 1 OR "USERS"."NAME" <=> 'name')})
43
- end
44
- end
45
- end
46
- end
47
-
48
- describe And do
49
- describe "#to_sql" do
50
- it "manufactures sql with an AND operation" do
51
- sql = And.new(@operand1, @operand2).to_sql
52
-
53
- adapter_is :mysql do
54
- sql.should be_like(%Q{(`users`.`id` <=> 1 AND `users`.`name` <=> 'name')})
55
- end
56
-
57
- adapter_is :sqlite3 do
58
- sql.should be_like(%Q{("users"."id" <=> 1 AND "users"."name" <=> 'name')})
59
- end
60
-
61
- adapter_is :postgresql do
62
- sql.should be_like(%Q{("users"."id" <=> 1 AND "users"."name" <=> E'name')})
63
- end
64
-
65
- adapter_is :oracle do
66
- sql.should be_like(%Q{("USERS"."ID" <=> 1 AND "USERS"."NAME" <=> 'name')})
67
- end
68
- end
69
- end
70
- end
71
- end
72
-
73
- describe '#to_sql' do
74
- describe 'when relating two attributes' do
75
- it 'manufactures sql with a binary operation' do
76
- sql = ConcreteBinary.new(@attribute1, @attribute2).to_sql
77
-
78
- adapter_is :mysql do
79
- sql.should be_like(%Q{`users`.`id` <=> `users`.`name`})
80
- end
81
-
82
- adapter_is :oracle do
83
- sql.should be_like(%Q{"USERS"."ID" <=> "USERS"."NAME"})
84
- end
85
-
86
- adapter_is_not :mysql, :oracle do
87
- sql.should be_like(%Q{"users"."id" <=> "users"."name"})
88
- end
89
- end
90
- end
91
-
92
- describe 'when relating an attribute and a value' do
93
- before do
94
- @value = "1-asdf"
95
- end
96
-
97
- describe 'when relating to an integer attribute' do
98
- it 'formats values as integers' do
99
- sql = ConcreteBinary.new(@attribute1, @value).to_sql
100
-
101
- adapter_is :mysql do
102
- sql.should be_like(%Q{`users`.`id` <=> 1})
103
- end
104
-
105
- adapter_is :oracle do
106
- sql.should be_like(%Q{"USERS"."ID" <=> 1})
107
- end
108
-
109
- adapter_is_not :mysql, :oracle do
110
- sql.should be_like(%Q{"users"."id" <=> 1})
111
- end
112
- end
113
- end
114
-
115
- describe 'when relating to a string attribute' do
116
- it 'formats values as strings' do
117
- sql = ConcreteBinary.new(@attribute2, @value).to_sql
118
-
119
- adapter_is :mysql do
120
- sql.should be_like(%Q{`users`.`name` <=> '1-asdf'})
121
- end
122
-
123
- adapter_is :sqlite3 do
124
- sql.should be_like(%Q{"users"."name" <=> '1-asdf'})
125
- end
126
-
127
- adapter_is :postgresql do
128
- sql.should be_like(%Q{"users"."name" <=> E'1-asdf'})
129
- end
130
-
131
- adapter_is :oracle do
132
- sql.should be_like(%Q{"USERS"."NAME" <=> '1-asdf'})
133
- end
134
- end
135
- end
136
- end
137
- end
138
- end
139
- end
140
- end