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,55 +0,0 @@
1
- module Arel
2
- class Compound
3
- include Relation
4
-
5
- attr_reader :relation, :engine
6
-
7
- def initialize relation
8
- @relation = relation
9
- @engine = relation.engine
10
- @attributes = nil
11
- @wheres = nil
12
- @groupings = nil
13
- @orders = nil
14
- @havings = nil
15
- @projections = nil
16
- end
17
-
18
- def join?; @relation.join? end
19
- def name; @relation.name end
20
- def table_alias; @relation.table_alias end
21
- def skipped; @relation.skipped end
22
- def taken; @relation.taken end
23
- def joins env; @relation.joins env end
24
- def column_for attr; @relation.column_for attr end
25
- def externalizable?; @relation.externalizable? end
26
-
27
- def sources
28
- @relation.sources
29
- end
30
-
31
- def table
32
- @relation.table
33
- end
34
-
35
- def table_sql(formatter = Sql::TableReference.new(self))
36
- @relation.table_sql formatter
37
- end
38
-
39
- [:wheres, :groupings, :orders, :havings, :projections].each do |operation_name|
40
- class_eval <<-OPERATION, __FILE__, __LINE__
41
- def #{operation_name}
42
- @#{operation_name} ||= relation.#{operation_name}.collect { |o| o.bind(self) }
43
- end
44
- OPERATION
45
- end
46
-
47
- def attributes
48
- @attributes ||= relation.attributes.bind(self)
49
- end
50
-
51
- def unoperated_rows
52
- relation.call.collect { |row| row.bind(self) }
53
- end
54
- end
55
- end
@@ -1,26 +0,0 @@
1
- module Arel
2
- class Externalization < Compound
3
- include Recursion::BaseCase
4
-
5
- def == other
6
- super || Externalization === other && relation == other.relation
7
- end
8
-
9
- def wheres
10
- []
11
- end
12
-
13
- def attributes
14
- @attributes ||= Header.new(relation.attributes.map { |a| a.to_attribute(self) })
15
- end
16
-
17
- def table_sql(formatter = Sql::TableReference.new(relation))
18
- formatter.select relation.compiler.select_sql, self
19
- end
20
-
21
- # REMOVEME
22
- def name
23
- relation.name + '_external'
24
- end
25
- end
26
- end
@@ -1,7 +0,0 @@
1
- require 'singleton'
2
-
3
- module Arel
4
- class Nil
5
- include Relation, Singleton
6
- end
7
- end
@@ -1,47 +0,0 @@
1
- module Arel
2
- class Action < Compound
3
- end
4
-
5
- class Deletion < Action
6
- def call
7
- engine.delete(self)
8
- end
9
-
10
- def to_sql
11
- compiler.delete_sql
12
- end
13
- end
14
-
15
- class Insert < Action
16
- attr_reader :record
17
-
18
- def initialize(relation, record)
19
- super(relation)
20
- @record = record.bind(relation)
21
- end
22
-
23
- def call
24
- engine.create(self)
25
- end
26
-
27
- def eval
28
- unoperated_rows + [Row.new(self, record.values.collect(&:value))]
29
- end
30
-
31
- def to_sql(include_returning = true)
32
- compiler.insert_sql(include_returning)
33
- end
34
- end
35
-
36
- class Update < Insert
37
- alias :assignments :record
38
-
39
- def call
40
- engine.update(self)
41
- end
42
-
43
- def to_sql
44
- compiler.update_sql
45
- end
46
- end
47
- end
@@ -1,53 +0,0 @@
1
- module Arel
2
- class Value
3
- attr_reader :value, :relation
4
-
5
- def initialize value, relation
6
- @value = value
7
- @relation = relation
8
- end
9
-
10
- def == other
11
- super ||
12
- Value === other &&
13
- value == other.value &&
14
- relation == other.relation
15
- end
16
-
17
- def eval(row)
18
- value
19
- end
20
-
21
- def bind(relation)
22
- Value.new(value, relation)
23
- end
24
-
25
- def to_ordering
26
- self
27
- end
28
-
29
- def inclusion_predicate_sql
30
- value.inclusion_predicate_sql
31
- end
32
-
33
- def exclusion_predicate_sql
34
- value.exclusion_predicate_sql
35
- end
36
-
37
- def equality_predicate_sql
38
- value.equality_predicate_sql
39
- end
40
-
41
- def inequality_predicate_sql
42
- value.inequality_predicate_sql
43
- end
44
-
45
- def to_sql(formatter = Sql::WhereCondition.new(relation))
46
- formatter.value value
47
- end
48
-
49
- def format(object)
50
- object.to_sql(Sql::Value.new(relation))
51
- end
52
- end
53
- end
@@ -1,2 +0,0 @@
1
- require 'arel/engines/sql'
2
- require 'arel/engines/memory'
@@ -1,2 +0,0 @@
1
- require 'arel/engines/memory/relations'
2
- require 'arel/engines/memory/engine'
@@ -1,10 +0,0 @@
1
- module Arel
2
- module Memory
3
- class Engine
4
- def read(relation)
5
- relation.eval
6
- end
7
- alias :create :read
8
- end
9
- end
10
- end
@@ -1,2 +0,0 @@
1
- require 'arel/engines/memory/relations/array'
2
- require 'arel/engines/memory/relations/operations'
@@ -1,37 +0,0 @@
1
- module Arel
2
- class Array
3
- include Relation
4
-
5
- attr_reader :array, :attribute_names_and_types
6
- include Recursion::BaseCase
7
-
8
- def initialize(array, attribute_names_and_types)
9
- @array = array
10
- @attribute_names_and_types = attribute_names_and_types
11
- @engine = nil
12
- @attributes = nil
13
- end
14
-
15
- def engine
16
- @engine ||= Memory::Engine.new
17
- end
18
-
19
- def attributes
20
- @attributes ||= begin
21
- attrs = @attribute_names_and_types.collect do |attribute, type|
22
- attribute = type.new(self, attribute) if Symbol === attribute
23
- attribute
24
- end
25
- Header.new(attrs)
26
- end
27
- end
28
-
29
- def format(attribute, value)
30
- value
31
- end
32
-
33
- def eval
34
- @array.collect { |r| Row.new(self, r) }
35
- end
36
- end
37
- end
@@ -1,9 +0,0 @@
1
- module Arel
2
- class Alias < Compound
3
- include Recursion::BaseCase
4
-
5
- def eval
6
- unoperated_rows
7
- end
8
- end
9
- end
@@ -1,6 +0,0 @@
1
- require 'arel/engines/sql/attributes'
2
- require 'arel/engines/sql/engine'
3
- require 'arel/engines/sql/relations'
4
- require 'arel/engines/sql/formatters'
5
- require 'arel/engines/sql/core_extensions'
6
- require 'arel/engines/sql/christener'
@@ -1,45 +0,0 @@
1
- module Arel
2
- module Sql
3
- module Attributes
4
- def self.for(column)
5
- case column.type
6
- when :string then String
7
- when :text then String
8
- when :integer then Integer
9
- when :float then Float
10
- when :decimal then Decimal
11
- when :date then Time
12
- when :datetime then Time
13
- when :timestamp then Time
14
- when :time then Time
15
- when :binary then String
16
- when :boolean then Boolean
17
- else
18
- Undefined
19
- end
20
- end
21
-
22
- def initialize(column, *args)
23
- @column = column
24
- super(*args)
25
- end
26
-
27
- def type_cast(value)
28
- @column.type_cast(value)
29
- end
30
-
31
- # Attribute type for column types that Arel doesn't know how to handle.
32
- class Undefined < Arel::Attribute
33
- include Attributes
34
- end
35
-
36
- %w(Boolean Decimal Float Integer String Time).each do |klass|
37
- class_eval <<-R
38
- class #{klass} < Arel::Attributes::#{klass}
39
- include Attributes
40
- end
41
- R
42
- end
43
- end
44
- end
45
- end
@@ -1,20 +0,0 @@
1
- module Arel
2
- module Sql
3
- class Christener
4
- def initialize
5
- @names = {}
6
- end
7
-
8
- def name_for(relation)
9
- table = relation.table
10
- name = table.table_alias || table.name
11
- list = @names[name] ||= []
12
-
13
- list << table unless list.include? table
14
-
15
- idx = list.index table
16
- name + (idx == 0 ? '' : "_#{idx + 1}")
17
- end
18
- end
19
- end
20
- end
@@ -1,48 +0,0 @@
1
- # +-----------------------------------------------------------------------+
2
- # | |
3
- # | Copyright (c) 2010 IBM Corporation |
4
- # | |
5
- # | Permission is hereby granted, free of charge, to any person obtaining |
6
- # | a copy of this software and associated documentation files (the |
7
- # | "Software"), to deal in the Software without restriction, including |
8
- # | without limitation the rights to use, copy, modify, merge, publish, |
9
- # | distribute, sublicense, and/or sell copies of the Software, and to |
10
- # | permit persons to whom the Software is furnished to do so, subject to |
11
- # | the following conditions: |
12
- # | |
13
- # | The above copyright notice and this permission notice shall be |
14
- # | included in all copies or substantial portions of the Software. |
15
- # | |
16
- # | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
17
- # | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
18
- # | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.|
19
- # | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR |
20
- # | ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
21
- # | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
22
- # | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
23
- # | |
24
- # +-----------------------------------------------------------------------+
25
-
26
- #
27
- # Author: Praveen Devarao <praveendrl@in.ibm.com>
28
- #
29
-
30
- module Arel
31
- module SqlCompiler
32
- class IBM_DBCompiler < GenericCompiler
33
-
34
- def limited_update_conditions(conditions, taken)
35
- quoted_primary_key = engine.quote_table_name(primary_key)
36
- update_conditions = "WHERE #{quoted_primary_key} IN (SELECT #{quoted_primary_key} FROM #{engine.connection.quote_table_name table.name} #{conditions} " #Note: - ')' not added, limit segment is to be appended
37
- engine.add_limit_offset!(update_conditions,{:limit=>taken,:offset=>nil})
38
- update_conditions << ")" # Close the sql segment
39
- update_conditions
40
- end
41
-
42
- def add_limit_on_delete(taken)
43
- raise "IBM_DB does not support limit on deletion" # Limiting the number of rows to be deleted is not supported by IBM_DB
44
- end
45
-
46
- end
47
- end
48
- end
@@ -1,11 +0,0 @@
1
- module Arel
2
- module SqlCompiler
3
- class MySQLCompiler < GenericCompiler
4
- def limited_update_conditions(conditions, taken)
5
- conditions << " LIMIT #{taken}"
6
- conditions
7
- end
8
- end
9
- end
10
- end
11
-
@@ -1,106 +0,0 @@
1
- module Arel
2
- module SqlCompiler
3
- class OracleCompiler < GenericCompiler
4
-
5
- def select_sql
6
- select_clauses = relation.select_clauses
7
- from_clauses = relation.from_clauses
8
- joins = relation.joins(self)
9
- where_clauses = relation.where_clauses
10
- order_clauses = relation.order_clauses
11
- group_clauses = relation.group_clauses
12
- having_clauses = relation.having_clauses
13
- taken = relation.taken
14
- skipped = relation.skipped
15
- if limit_or_offset = !taken.blank? || !skipped.blank?
16
- # if need to select first records without ORDER BY and GROUP BY and without DISTINCT
17
- # then can use simple ROWNUM in WHERE clause
18
- if skipped.blank? && group_clauses.blank? && order_clauses.blank? && select_clauses[0] !~ /^DISTINCT /
19
- where_clauses << "ROWNUM <= #{taken}" if !taken.blank? && skipped.blank? && group_clauses.blank? && order_clauses.blank?
20
- limit_or_offset = false
21
- end
22
- end
23
-
24
- # when limit or offset subquery is used then cannot use FOR UPDATE directly
25
- # and need to construct separate subquery for primary key
26
- if use_subquery_for_lock = limit_or_offset && !locked.blank?
27
- quoted_primary_key = engine.connection.quote_column_name(relation.primary_key)
28
- end
29
- select_attributes_string = use_subquery_for_lock ? quoted_primary_key : select_clauses.join(', ')
30
-
31
- # OracleEnhanced adapter workaround when ORDER BY is used with columns not
32
- # present in DISTINCT columns list
33
- order_clauses_array = if select_attributes_string =~ /DISTINCT.*FIRST_VALUE/ && !order_clauses.blank?
34
- order = order_clauses.join(', ').split(',').map { |s| s.strip }.reject(&:blank?)
35
- order = order.zip((0...order.size).to_a).map { |s,i| "alias_#{i}__ #{'DESC' if s =~ /\bdesc$/i}" }
36
- else
37
- order_clauses
38
- end
39
-
40
- query = build_query \
41
- "SELECT #{select_attributes_string}",
42
- "FROM #{from_clauses}",
43
- (joins unless joins.blank? ),
44
- ("WHERE #{where_clauses.join(' AND ')}" unless where_clauses.blank? ),
45
- ("GROUP BY #{group_clauses.join(', ')}" unless group_clauses.blank? ),
46
- ("HAVING #{having_clauses.join(' AND ')}" unless having_clauses.blank? ),
47
- ("ORDER BY #{order_clauses_array.join(', ')}" unless order_clauses_array.blank? )
48
-
49
- # Use existing method from oracle_enhanced adapter to implement limit and offset using subqueries
50
- engine.connection.add_limit_offset!(query, :limit => taken, :offset => skipped) if limit_or_offset
51
-
52
- if use_subquery_for_lock
53
- build_query \
54
- "SELECT #{select_clauses.join(', ')}",
55
- "FROM #{from_clauses}",
56
- "WHERE #{quoted_primary_key} IN (#{query})",
57
- "#{locked}"
58
- elsif !locked.blank?
59
- build_query query, "#{locked}"
60
- else
61
- query
62
- end
63
- end
64
-
65
- def delete_sql
66
- where_clauses = relation.wheres.collect(&:to_sql)
67
- taken = relation.taken
68
- where_clauses << "ROWNUM <= #{taken}" unless taken.blank?
69
- build_query \
70
- "DELETE",
71
- "FROM #{relation.table_sql}",
72
- ("WHERE #{where_clauses.join(' AND ')}" unless where_clauses.blank? )
73
- end
74
-
75
- protected
76
-
77
- def build_update_conditions_sql
78
- conditions = ""
79
- where_clauses = relation.wheres.collect(&:to_sql)
80
- taken = relation.taken
81
- # if need to select first records without ORDER BY
82
- # then can use simple ROWNUM in WHERE clause
83
- if !taken.blank? && relation.orders.blank?
84
- where_clauses << "ROWNUM <= #{taken}"
85
- end
86
- conditions << " WHERE #{where_clauses.join(' AND ')}" unless where_clauses.blank?
87
- unless taken.blank?
88
- conditions = limited_update_conditions(conditions, taken)
89
- end
90
- conditions
91
- end
92
-
93
- def limited_update_conditions(conditions, taken)
94
- order_clauses = relation.order_clauses
95
- # need to add ORDER BY only if just taken ones should be updated
96
- conditions << " ORDER BY #{order_clauses.join(', ')}" unless order_clauses.blank?
97
- quoted_primary_key = engine.connection.quote_column_name(relation.primary_key)
98
- subquery = "SELECT #{quoted_primary_key} FROM #{engine.connection.quote_table_name relation.table.name} #{conditions}"
99
- # Use existing method from oracle_enhanced adapter to get taken records when ORDER BY is used
100
- engine.connection.add_limit_offset!(subquery, :limit => taken) unless order_clauses.blank?
101
- "WHERE #{quoted_primary_key} IN (#{subquery})"
102
- end
103
-
104
- end
105
- end
106
- end