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,14 +0,0 @@
1
- module Arel
2
- class Having < Compound
3
- attr_reader :predicates
4
-
5
- def initialize(relation, predicates)
6
- super(relation)
7
- @predicates = predicates.map { |p| p.bind(relation) }
8
- end
9
-
10
- def havings
11
- @havings ||= relation.havings + predicates
12
- end
13
- end
14
- end
@@ -1,103 +0,0 @@
1
- module Arel
2
- class Join
3
- include Relation
4
-
5
- attr_reader :relation1, :relation2, :predicates
6
-
7
- def initialize(relation1, relation2 = Nil.instance, *predicates)
8
- @relation1 = relation1
9
- @relation2 = relation2
10
- @predicates = predicates
11
- @attributes = nil
12
- end
13
-
14
- def name
15
- relation1.name
16
- end
17
-
18
- def attributes
19
- @attributes ||= (relation1.externalize.attributes | relation2.externalize.attributes).bind(self)
20
- end
21
-
22
- def wheres
23
- # TESTME bind to self?
24
- relation1.externalize.wheres
25
- end
26
-
27
- def ons
28
- @ons ||= @predicates.collect { |p| p.bind(self) }
29
- end
30
-
31
- # TESTME
32
- def externalizable?
33
- relation1.externalizable? or relation2.externalizable?
34
- end
35
-
36
- def join?
37
- true
38
- end
39
-
40
- def engine
41
- relation1.engine != relation2.engine ? Memory::Engine.new : relation1.engine
42
- end
43
-
44
- def table_sql(formatter = Sql::TableReference.new(self))
45
- relation1.externalize.table_sql(formatter)
46
- end
47
-
48
- def joins(environment, formatter = Sql::TableReference.new(environment))
49
- @joins ||= begin
50
- this_join = [
51
- join_sql,
52
- relation2.externalize.table_sql(formatter),
53
- ("ON" unless predicates.blank?),
54
- (ons + relation2.externalize.wheres).collect { |p| p.bind(environment.relation).to_sql(Sql::WhereClause.new(environment)) }.join(' AND ')
55
- ].compact.join(" ")
56
- [relation1.joins(environment), this_join, relation2.joins(environment)].compact.join(" ")
57
- end
58
- end
59
-
60
- def eval
61
- result = []
62
- relation1.call.each do |row1|
63
- relation2.call.each do |row2|
64
- combined_row = row1.combine(row2, self)
65
- if predicates.all? { |p| p.eval(combined_row) }
66
- result << combined_row
67
- end
68
- end
69
- end
70
- result
71
- end
72
-
73
- def to_sql(formatter = nil)
74
- compiler.select_sql
75
- end
76
- end
77
-
78
- class InnerJoin < Join
79
- def join_sql; "INNER JOIN" end
80
- end
81
-
82
- class OuterJoin < Join
83
- def join_sql; "LEFT OUTER JOIN" end
84
- end
85
-
86
- class StringJoin < Join
87
- def joins(environment, formatter = Sql::TableReference.new(environment))
88
- [relation1.joins(environment), relation2].compact.join(" ")
89
- end
90
-
91
- def externalizable?
92
- relation1.externalizable?
93
- end
94
-
95
- def attributes
96
- relation1.externalize.attributes
97
- end
98
-
99
- def engine
100
- relation1.engine
101
- end
102
- end
103
- end
@@ -1,10 +0,0 @@
1
- module Arel
2
- class Lock < Compound
3
- attr_reader :locked
4
-
5
- def initialize(relation, locked)
6
- super(relation)
7
- @locked = true == locked ? " FOR UPDATE" : locked
8
- end
9
- end
10
- end
@@ -1,23 +0,0 @@
1
- module Arel
2
- class Order < Compound
3
- attr_reader :orderings
4
-
5
- def initialize(relation, orderings)
6
- super(relation)
7
- @orderings = orderings.collect { |o| o.bind(relation) }
8
- end
9
-
10
- # TESTME
11
- def orders
12
- # QUESTION - do we still need relation.orders ?
13
- (orderings + relation.orders).collect { |o| o.bind(self) }.collect { |o| o.to_ordering }
14
- end
15
-
16
- def eval
17
- unoperated_rows.sort do |row1, row2|
18
- ordering = orders.detect { |o| o.eval(row1, row2) != 0 } || orders.last
19
- ordering.eval(row1, row2)
20
- end
21
- end
22
- end
23
- end
@@ -1,20 +0,0 @@
1
- module Arel
2
- class Project < Compound
3
- attr_reader :projections, :attributes, :christener
4
-
5
- def initialize(relation, projections)
6
- super(relation)
7
- @projections = projections.map { |p| p.bind(relation) }
8
- @christener = Sql::Christener.new
9
- @attributes = Header.new(projections.map { |x| x.bind(self) })
10
- end
11
-
12
- def externalizable?
13
- attributes.any? { |a| a.respond_to?(:aggregation?) && a.aggregation? } || relation.externalizable?
14
- end
15
-
16
- def eval
17
- unoperated_rows.collect { |r| r.slice(*projections) }
18
- end
19
- end
20
- end
@@ -1,14 +0,0 @@
1
- module Arel
2
- class Skip < Compound
3
- attr_reader :relation, :skipped
4
-
5
- def initialize relation, skipped
6
- super(relation)
7
- @skipped = skipped
8
- end
9
-
10
- def eval
11
- unoperated_rows[skipped..-1]
12
- end
13
- end
14
- end
@@ -1,18 +0,0 @@
1
- module Arel
2
- class Take < Compound
3
- attr_reader :taken
4
-
5
- def initialize relation, taken
6
- super(relation)
7
- @taken = taken
8
- end
9
-
10
- def externalizable?
11
- true
12
- end
13
-
14
- def eval
15
- unoperated_rows[0, taken]
16
- end
17
- end
18
- end
@@ -1,24 +0,0 @@
1
- module Arel
2
- class Where < Compound
3
- attr_reader :predicates
4
-
5
- def initialize(relation, predicates)
6
- super(relation)
7
- @predicates = predicates.respond_to?(:map) ?
8
- predicates.map { |p| p.bind(relation) } : [predicates.bind(relation)]
9
- @wheres = nil
10
- end
11
-
12
- def wheres
13
- @wheres ||= relation.wheres + predicates
14
- end
15
-
16
- def eval
17
- unoperated_rows.select { |row| predicates.all? { |p| p.eval(row) } }
18
- end
19
-
20
- def to_sql(formatter = nil)
21
- compiler.select_sql
22
- end
23
- end
24
- end
@@ -1,205 +0,0 @@
1
- module Arel
2
- module Relation
3
- include Enumerable
4
-
5
- @@connection_tables_primary_keys = {}
6
-
7
- attr_reader :count
8
-
9
- def session
10
- Session.instance
11
- end
12
-
13
- def join?
14
- false
15
- end
16
-
17
- def call
18
- engine.read(self)
19
- end
20
-
21
- def bind(relation)
22
- self
23
- end
24
-
25
- def externalize
26
- @externalized ||= externalizable?? Externalization.new(self) : self
27
- end
28
-
29
- def externalizable?
30
- false
31
- end
32
-
33
- def compiler
34
- @compiler ||= begin
35
- Arel::SqlCompiler.const_get("#{engine.adapter_name}Compiler").new(self)
36
- rescue
37
- Arel::SqlCompiler::GenericCompiler.new(self)
38
- end
39
- end
40
-
41
- def to_sql(formatter = nil)
42
- sql = compiler.select_sql
43
-
44
- return sql unless formatter
45
- formatter.select sql, self
46
- end
47
-
48
- def christener
49
- @christener ||= Sql::Christener.new
50
- end
51
-
52
- def inclusion_predicate_sql
53
- "IN"
54
- end
55
-
56
- def exclusion_predicate_sql
57
- "NOT IN"
58
- end
59
-
60
- def primary_key
61
- connection_id = engine.connection.object_id
62
- if @@connection_tables_primary_keys[connection_id] && @@connection_tables_primary_keys[connection_id].has_key?(table.name)
63
- @@connection_tables_primary_keys[connection_id][table.name]
64
- else
65
- @@connection_tables_primary_keys[connection_id] ||= {}
66
- @@connection_tables_primary_keys[connection_id][table.name] = engine.connection.primary_key(table.name)
67
- end
68
- end
69
-
70
- def select_clauses
71
- attributes.map { |a|
72
- case a
73
- when Value
74
- a.value
75
- else
76
- a.to_sql(Sql::SelectClause.new(self))
77
- end
78
- }
79
- end
80
-
81
- def from_clauses
82
- sources.empty? ? table_sql : sources
83
- end
84
-
85
- def where_clauses
86
- wheres.map { |w| w.value }
87
- end
88
-
89
- def group_clauses
90
- groupings.collect { |g| g.to_sql(Sql::GroupClause.new(self)) }
91
- end
92
-
93
- def having_clauses
94
- havings.collect { |g| g.to_sql(Sql::HavingClause.new(self)) }
95
- end
96
-
97
- def order_clauses
98
- orders.collect { |o| o.to_sql(Sql::OrderClause.new(self)) }
99
- end
100
-
101
- def each
102
- session.read(self).each { |e| yield e }
103
- end
104
-
105
- def join(other_relation = nil, join_class = InnerJoin)
106
- case other_relation
107
- when String
108
- StringJoin.new(self, other_relation)
109
- when Relation
110
- JoinOperation.new(join_class, self, other_relation)
111
- else
112
- self
113
- end
114
- end
115
-
116
- def outer_join(other_relation = nil)
117
- join(other_relation, OuterJoin)
118
- end
119
-
120
- %w{
121
- having group order
122
- }.each do |op|
123
- class_eval <<-OPERATION, __FILE__, __LINE__
124
- def #{op}(*args)
125
- args.all? { |x| x.blank? } ? self : #{op.capitalize}.new(self, args)
126
- end
127
- OPERATION
128
- end
129
-
130
- def project *args
131
- args.empty? ? self : Project.new(self, args)
132
- end
133
-
134
- def where clause = nil
135
- clause ? Where.new(self, [clause].flatten) : self
136
- end
137
-
138
- def skip thing = nil
139
- thing ? Skip.new(self, thing) : self
140
- end
141
-
142
- def take count
143
- Take.new self, count
144
- end
145
-
146
- def from thing
147
- From.new self, thing
148
- end
149
-
150
- def lock(locking = true)
151
- Lock.new(self, locking)
152
- end
153
-
154
- def alias
155
- Alias.new(self)
156
- end
157
-
158
- def insert(record)
159
- session.create Insert.new(self, record)
160
- end
161
-
162
- def update(assignments)
163
- session.update Update.new(self, assignments)
164
- end
165
-
166
- def delete
167
- session.delete Deletion.new(self)
168
- end
169
-
170
- JoinOperation = Struct.new(:join_class, :relation1, :relation2) do
171
- def on(*predicates)
172
- join_class.new(relation1, relation2, *predicates)
173
- end
174
- end
175
-
176
- def [](index)
177
- attributes[index]
178
- end
179
-
180
- def find_attribute_matching_name(name)
181
- attributes.detect { |a| a.named?(name) } || Attribute.new(self, name)
182
- end
183
-
184
- def position_of(attribute)
185
- @position_of ||= {}
186
-
187
- return @position_of[attribute] if @position_of.key? attribute
188
-
189
- @position_of[attribute] = attributes.index(attributes[attribute])
190
- end
191
-
192
- def attributes; Header.new end
193
- def projections; [] end
194
- def wheres; [] end
195
- def orders; [] end
196
- def inserts; [] end
197
- def groupings; [] end
198
- def havings; [] end
199
- def joins(formatter = nil); nil end # FIXME
200
- def taken; nil end
201
- def skipped; nil end
202
- def sources; [] end
203
- def locked; [] end
204
- end
205
- end
@@ -1,29 +0,0 @@
1
- module Arel
2
- class Row
3
- attr_reader :tuple, :relation
4
-
5
- def initialize relation, tuple
6
- @relation = relation
7
- @tuple = tuple
8
- end
9
-
10
- def [](attribute)
11
- attribute.type_cast(tuple[relation.position_of(attribute)])
12
- end
13
-
14
- def slice(*attributes)
15
- Row.new(relation, attributes.map do |attribute|
16
- # FIXME TESTME method chaining
17
- tuple[relation.relation.position_of(attribute)]
18
- end)
19
- end
20
-
21
- def bind(relation)
22
- Row.new(relation, tuple)
23
- end
24
-
25
- def combine(other, relation)
26
- Row.new(relation, tuple + other.tuple)
27
- end
28
- end
29
- end