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