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