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,10 +0,0 @@
1
- require 'arel/algebra/core_extensions'
2
-
3
- require 'arel/algebra/attributes'
4
- require 'arel/algebra/header'
5
- require 'arel/algebra/expression'
6
- require 'arel/algebra/ordering'
7
- require 'arel/algebra/predicates'
8
- require 'arel/algebra/relations'
9
- require 'arel/algebra/value'
10
-
@@ -1,7 +0,0 @@
1
- require "arel/algebra/attributes/attribute"
2
- require "arel/algebra/attributes/boolean"
3
- require "arel/algebra/attributes/decimal"
4
- require "arel/algebra/attributes/float"
5
- require "arel/algebra/attributes/integer"
6
- require "arel/algebra/attributes/string"
7
- require "arel/algebra/attributes/time"
@@ -1,304 +0,0 @@
1
- require 'set'
2
-
3
- module Arel
4
- class TypecastError < StandardError ; end
5
- class Attribute
6
- attr_reader :relation, :name, :alias, :ancestor, :hash
7
- attr_reader :history
8
-
9
- def initialize(relation, name, options = {})
10
- @relation = relation # this is actually a table (I think)
11
- @name = name
12
- @alias = options[:alias]
13
- @ancestor = options[:ancestor]
14
- @history = [self] + (@ancestor ? @ancestor.history : [])
15
- @root = @history.last
16
- @original_relation = nil
17
- @original_attribute = nil
18
-
19
- # FIXME: I think we can remove this eventually
20
- @hash = name.hash + root.relation.class.hash
21
- end
22
-
23
- def engine
24
- @relation.engine
25
- end
26
-
27
- def christener
28
- @relation.christener
29
- end
30
-
31
- def == other
32
- super ||
33
- Attribute === other &&
34
- @name == other.name &&
35
- @alias == other.alias &&
36
- @ancestor == other.ancestor &&
37
- @relation == other.relation
38
- end
39
-
40
- alias :eql? :==
41
-
42
- def named?(hypothetical_name)
43
- (@alias || name).to_s == hypothetical_name.to_s
44
- end
45
-
46
- def aggregation?
47
- false
48
- end
49
-
50
- def eval(row)
51
- row[self]
52
- end
53
-
54
- def as(aliaz = nil)
55
- Attribute.new(relation, name, :alias => aliaz, :ancestor => self)
56
- end
57
-
58
- def bind(new_relation)
59
- relation == new_relation ? self : Attribute.new(new_relation, name, :alias => @alias, :ancestor => self)
60
- end
61
-
62
- def to_attribute(relation)
63
- bind(relation)
64
- end
65
-
66
- def join?
67
- relation.join?
68
- end
69
-
70
- def root
71
- history.last
72
- end
73
-
74
- def original_relation
75
- @original_relation ||= original_attribute.relation
76
- end
77
-
78
- def original_attribute
79
- @original_attribute ||= history.detect { |a| !a.join? }
80
- end
81
-
82
- def find_correlate_in(relation)
83
- relation[self] || self
84
- end
85
-
86
- def descends_from?(other)
87
- history.include?(other)
88
- end
89
-
90
- def /(other)
91
- other ? (history & other.history).size : 0
92
- end
93
-
94
- PREDICATES = [
95
- :eq, :eq_any, :eq_all, :not_eq, :not_eq_any, :not_eq_all, :lt, :lt_any,
96
- :lt_all, :lteq, :lteq_any, :lteq_all, :gt, :gt_any, :gt_all, :gteq,
97
- :gteq_any, :gteq_all, :matches, :matches_any, :matches_all, :not_matches,
98
- :not_matches_any, :not_matches_all, :in, :in_any, :in_all, :not_in,
99
- :not_in_any, :not_in_all
100
- ]
101
-
102
- Predications = Class.new do
103
- def self.instance_methods *args
104
- warn "this module is deprecated, please use the PREDICATES constant"
105
- PREDICATES
106
- end
107
- end
108
-
109
- def eq(other)
110
- Predicates::Equality.new(self, other)
111
- end
112
-
113
- def eq_any(*others)
114
- Predicates::Any.build(Predicates::Equality, self, *others)
115
- end
116
-
117
- def eq_all(*others)
118
- Predicates::All.build(Predicates::Equality, self, *others)
119
- end
120
-
121
- def not_eq(other)
122
- Predicates::Inequality.new(self, other)
123
- end
124
-
125
- def not_eq_any(*others)
126
- Predicates::Any.build(Predicates::Inequality, self, *others)
127
- end
128
-
129
- def not_eq_all(*others)
130
- Predicates::All.build(Predicates::Inequality, self, *others)
131
- end
132
-
133
- def lt(other)
134
- Predicates::LessThan.new(self, other)
135
- end
136
-
137
- def lt_any(*others)
138
- Predicates::Any.build(Predicates::LessThan, self, *others)
139
- end
140
-
141
- def lt_all(*others)
142
- Predicates::All.build(Predicates::LessThan, self, *others)
143
- end
144
-
145
- def lteq(other)
146
- Predicates::LessThanOrEqualTo.new(self, other)
147
- end
148
-
149
- def lteq_any(*others)
150
- Predicates::Any.build(Predicates::LessThanOrEqualTo, self, *others)
151
- end
152
-
153
- def lteq_all(*others)
154
- Predicates::All.build(Predicates::LessThanOrEqualTo, self, *others)
155
- end
156
-
157
- def gt(other)
158
- Predicates::GreaterThan.new(self, other)
159
- end
160
-
161
- def gt_any(*others)
162
- Predicates::Any.build(Predicates::GreaterThan, self, *others)
163
- end
164
-
165
- def gt_all(*others)
166
- Predicates::All.build(Predicates::GreaterThan, self, *others)
167
- end
168
-
169
- def gteq(other)
170
- Predicates::GreaterThanOrEqualTo.new(self, other)
171
- end
172
-
173
- def gteq_any(*others)
174
- Predicates::Any.build(Predicates::GreaterThanOrEqualTo, self, *others)
175
- end
176
-
177
- def gteq_all(*others)
178
- Predicates::All.build(Predicates::GreaterThanOrEqualTo, self, *others)
179
- end
180
-
181
- def matches(other)
182
- Predicates::Match.new(self, other)
183
- end
184
-
185
- def matches_any(*others)
186
- Predicates::Any.build(Predicates::Match, self, *others)
187
- end
188
-
189
- def matches_all(*others)
190
- Predicates::All.build(Predicates::Match, self, *others)
191
- end
192
-
193
- def not_matches(other)
194
- Predicates::NotMatch.new(self, other)
195
- end
196
-
197
- def not_matches_any(*others)
198
- Predicates::Any.build(Predicates::NotMatch, self, *others)
199
- end
200
-
201
- def not_matches_all(*others)
202
- Predicates::All.build(Predicates::NotMatch, self, *others)
203
- end
204
-
205
- def in(other)
206
- Predicates::In.new(self, other)
207
- end
208
-
209
- def in_any(*others)
210
- Predicates::Any.build(Predicates::In, self, *others)
211
- end
212
-
213
- def in_all(*others)
214
- Predicates::All.build(Predicates::In, self, *others)
215
- end
216
-
217
- def not_in(other)
218
- Predicates::NotIn.new(self, other)
219
- end
220
-
221
- def not_in_any(*others)
222
- Predicates::Any.build(Predicates::NotIn, self, *others)
223
- end
224
-
225
- def not_in_all(*others)
226
- Predicates::All.build(Predicates::NotIn, self, *others)
227
- end
228
-
229
- module Expressions
230
- def count(distinct = false)
231
- distinct ? Distinct.new(self).count : Count.new(self)
232
- end
233
-
234
- def sum
235
- Sum.new(self)
236
- end
237
-
238
- def maximum
239
- Maximum.new(self)
240
- end
241
-
242
- def minimum
243
- Minimum.new(self)
244
- end
245
-
246
- def average
247
- Average.new(self)
248
- end
249
- end
250
- include Expressions
251
-
252
- module Orderings
253
- def asc
254
- Ascending.new(self)
255
- end
256
-
257
- def desc
258
- Descending.new(self)
259
- end
260
-
261
- alias_method :to_ordering, :asc
262
- end
263
- include Orderings
264
-
265
- module Types
266
- def type_cast(value)
267
- if root == self
268
- raise NotImplementedError, "#type_cast should be implemented in a subclass."
269
- else
270
- root.type_cast(value)
271
- end
272
- end
273
-
274
- def type_cast_to_numeric(value, method)
275
- return unless value
276
- if value.respond_to?(:to_str)
277
- str = value.to_str.strip
278
- return if str.empty?
279
- return $1.send(method) if str =~ /\A(-?(?:0|[1-9]\d*)(?:\.\d+)?|(?:\.\d+))\z/
280
- elsif value.respond_to?(method)
281
- return value.send(method)
282
- end
283
- raise typecast_error(value)
284
- end
285
-
286
- def typecast_error(value)
287
- raise TypecastError, "could not typecast #{value.inspect} to #{self.class.name.split('::').last}"
288
- end
289
- end
290
- include Types
291
-
292
- def column
293
- original_relation.column_for(self)
294
- end
295
-
296
- def format(object)
297
- object.to_sql(Sql::Attribute.new(self))
298
- end
299
-
300
- def to_sql(formatter = Sql::WhereCondition.new(relation))
301
- formatter.attribute self
302
- end
303
- end
304
- end
@@ -1,21 +0,0 @@
1
- module Arel
2
- module Attributes
3
- class Boolean < Attribute
4
- def type_cast(value)
5
- case value
6
- when true, false then value
7
- # when nil then options[:allow_nil] ? nil : false
8
- when nil then false
9
- when 1 then true
10
- when 0 then false
11
- else
12
- case value.to_s.downcase.strip
13
- when 'true' then true
14
- when 'false' then false
15
- else raise typecast_error(value)
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,9 +0,0 @@
1
- module Arel
2
- module Attributes
3
- class Decimal < Attribute
4
- def type_cast(val)
5
- type_cast_to_numeric(val, :to_d)
6
- end
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- module Arel
2
- module Attributes
3
- class Float < Attribute
4
- def type_cast(val)
5
- type_cast_to_numeric(val, :to_f)
6
- end
7
- end
8
- end
9
- end
@@ -1,10 +0,0 @@
1
- module Arel
2
- module Attributes
3
- class Integer < Attribute
4
- def type_cast(val)
5
- type_cast_to_numeric(val, :to_i)
6
- end
7
- end
8
- end
9
- end
10
-
@@ -1,10 +0,0 @@
1
- module Arel
2
- module Attributes
3
- class String < Attribute
4
- def type_cast(value)
5
- return unless value
6
- value.to_s
7
- end
8
- end
9
- end
10
- end
@@ -1,6 +0,0 @@
1
- module Arel
2
- module Attributes
3
- class Time < Attribute
4
- end
5
- end
6
- end
@@ -1,3 +0,0 @@
1
- require 'arel/algebra/core_extensions/object'
2
- require 'arel/algebra/core_extensions/symbol'
3
- require 'arel/algebra/core_extensions/hash'
@@ -1,7 +0,0 @@
1
- class Hash
2
- def bind(relation)
3
- Hash[map { |key, value|
4
- [key.bind(relation), value.bind(relation)]
5
- }]
6
- end
7
- end
@@ -1,13 +0,0 @@
1
- module Arel
2
- module ObjectExtensions
3
- def bind(relation)
4
- Arel::Value.new(self, relation)
5
- end
6
-
7
- def find_correlate_in(relation)
8
- bind(relation)
9
- end
10
-
11
- Object.send(:include, self)
12
- end
13
- end
@@ -1,9 +0,0 @@
1
- module Arel
2
- module SymbolExtensions
3
- def to_attribute(relation)
4
- Arel::Attribute.new(relation, self)
5
- end
6
-
7
- Symbol.send(:include, self)
8
- end
9
- end
@@ -1,56 +0,0 @@
1
- module Arel
2
- class Expression < Attribute
3
- attr_reader :attribute
4
- alias :name :alias
5
-
6
- def initialize(attribute, aliaz = nil, ancestor = nil)
7
- super(attribute.relation, aliaz, :alias => aliaz, :ancestor => ancestor)
8
- @attribute = attribute
9
- end
10
-
11
- def aggregation?
12
- true
13
- end
14
-
15
- def to_sql(formatter = Sql::SelectClause.new(relation))
16
- formatter.expression self
17
- end
18
-
19
- def as(aliaz)
20
- self.class.new(attribute, aliaz, self)
21
- end
22
-
23
- def bind(new_relation)
24
- new_relation == relation ? self : self.class.new(attribute.bind(new_relation), @alias, self)
25
- end
26
-
27
- def to_attribute(relation)
28
- Attribute.new(relation, @alias, :ancestor => self)
29
- end
30
- end
31
-
32
- class Count < Expression
33
- def function_sql; 'COUNT' end
34
- end
35
-
36
- class Distinct < Expression
37
- def function_sql; 'DISTINCT' end
38
- end
39
-
40
- class Sum < Expression
41
- def function_sql; 'SUM' end
42
- end
43
-
44
- class Maximum < Expression
45
- def function_sql; 'MAX' end
46
- end
47
-
48
- class Minimum < Expression
49
- def function_sql; 'MIN' end
50
- end
51
-
52
- class Average < Expression
53
- def function_sql; 'AVG' end
54
- end
55
- end
56
-