activerecord 5.2.8.1 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +299 -816
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +1 -1
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record/aggregations.rb +4 -2
  7. data/lib/active_record/associations/association.rb +35 -19
  8. data/lib/active_record/associations/association_scope.rb +4 -6
  9. data/lib/active_record/associations/belongs_to_association.rb +36 -42
  10. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
  11. data/lib/active_record/associations/builder/belongs_to.rb +14 -50
  12. data/lib/active_record/associations/builder/collection_association.rb +3 -3
  13. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
  14. data/lib/active_record/associations/collection_association.rb +11 -25
  15. data/lib/active_record/associations/collection_proxy.rb +32 -6
  16. data/lib/active_record/associations/foreign_association.rb +7 -0
  17. data/lib/active_record/associations/has_many_association.rb +1 -1
  18. data/lib/active_record/associations/has_many_through_association.rb +25 -18
  19. data/lib/active_record/associations/has_one_association.rb +28 -30
  20. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  21. data/lib/active_record/associations/join_dependency/join_association.rb +11 -26
  22. data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
  23. data/lib/active_record/associations/join_dependency.rb +15 -20
  24. data/lib/active_record/associations/preloader/association.rb +1 -2
  25. data/lib/active_record/associations/preloader.rb +32 -29
  26. data/lib/active_record/associations/singular_association.rb +2 -16
  27. data/lib/active_record/associations.rb +16 -12
  28. data/lib/active_record/attribute_assignment.rb +7 -10
  29. data/lib/active_record/attribute_methods/dirty.rb +64 -26
  30. data/lib/active_record/attribute_methods/primary_key.rb +8 -7
  31. data/lib/active_record/attribute_methods/read.rb +16 -48
  32. data/lib/active_record/attribute_methods/serialization.rb +1 -1
  33. data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
  34. data/lib/active_record/attribute_methods/write.rb +15 -16
  35. data/lib/active_record/attribute_methods.rb +34 -56
  36. data/lib/active_record/autosave_association.rb +7 -21
  37. data/lib/active_record/base.rb +2 -2
  38. data/lib/active_record/callbacks.rb +3 -17
  39. data/lib/active_record/coders/yaml_column.rb +1 -13
  40. data/lib/active_record/collection_cache_key.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +13 -36
  42. data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
  43. data/lib/active_record/connection_adapters/abstract/database_statements.rb +25 -84
  44. data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -14
  45. data/lib/active_record/connection_adapters/abstract/quoting.rb +5 -11
  46. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +15 -11
  47. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +30 -13
  48. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +0 -2
  49. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +41 -27
  50. data/lib/active_record/connection_adapters/abstract/transaction.rb +81 -52
  51. data/lib/active_record/connection_adapters/abstract_adapter.rb +95 -31
  52. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +65 -90
  53. data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
  54. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +5 -9
  55. data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -7
  56. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  57. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
  58. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +65 -10
  59. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -4
  60. data/lib/active_record/connection_adapters/postgresql/column.rb +1 -2
  61. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +16 -1
  62. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  63. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  64. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
  65. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
  66. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  67. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
  68. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  69. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  70. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +11 -36
  71. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +9 -2
  72. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +38 -20
  73. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -1
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +75 -56
  75. data/lib/active_record/connection_adapters/schema_cache.rb +5 -0
  76. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +5 -5
  77. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +14 -9
  78. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +95 -62
  79. data/lib/active_record/connection_handling.rb +132 -26
  80. data/lib/active_record/core.rb +75 -52
  81. data/lib/active_record/counter_cache.rb +4 -29
  82. data/lib/active_record/database_configurations/database_config.rb +37 -0
  83. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  84. data/lib/active_record/database_configurations/url_config.rb +74 -0
  85. data/lib/active_record/database_configurations.rb +184 -0
  86. data/lib/active_record/enum.rb +22 -7
  87. data/lib/active_record/errors.rb +24 -21
  88. data/lib/active_record/explain.rb +1 -1
  89. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  90. data/lib/active_record/fixture_set/render_context.rb +17 -0
  91. data/lib/active_record/fixture_set/table_row.rb +153 -0
  92. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  93. data/lib/active_record/fixtures.rb +140 -472
  94. data/lib/active_record/gem_version.rb +4 -4
  95. data/lib/active_record/inheritance.rb +12 -2
  96. data/lib/active_record/integration.rb +56 -16
  97. data/lib/active_record/internal_metadata.rb +5 -1
  98. data/lib/active_record/locking/optimistic.rb +2 -2
  99. data/lib/active_record/locking/pessimistic.rb +3 -3
  100. data/lib/active_record/log_subscriber.rb +7 -26
  101. data/lib/active_record/migration/command_recorder.rb +35 -5
  102. data/lib/active_record/migration/compatibility.rb +34 -16
  103. data/lib/active_record/migration.rb +38 -37
  104. data/lib/active_record/model_schema.rb +30 -9
  105. data/lib/active_record/nested_attributes.rb +2 -2
  106. data/lib/active_record/no_touching.rb +7 -0
  107. data/lib/active_record/persistence.rb +18 -7
  108. data/lib/active_record/query_cache.rb +11 -4
  109. data/lib/active_record/querying.rb +19 -11
  110. data/lib/active_record/railtie.rb +71 -60
  111. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  112. data/lib/active_record/railties/controller_runtime.rb +30 -35
  113. data/lib/active_record/railties/databases.rake +94 -43
  114. data/lib/active_record/reflection.rb +60 -44
  115. data/lib/active_record/relation/batches.rb +13 -10
  116. data/lib/active_record/relation/calculations.rb +38 -28
  117. data/lib/active_record/relation/delegation.rb +4 -13
  118. data/lib/active_record/relation/finder_methods.rb +12 -25
  119. data/lib/active_record/relation/merger.rb +2 -6
  120. data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
  121. data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
  122. data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
  123. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  124. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
  125. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  126. data/lib/active_record/relation/predicate_builder.rb +4 -6
  127. data/lib/active_record/relation/query_attribute.rb +15 -12
  128. data/lib/active_record/relation/query_methods.rb +29 -52
  129. data/lib/active_record/relation/where_clause.rb +4 -0
  130. data/lib/active_record/relation/where_clause_factory.rb +1 -2
  131. data/lib/active_record/relation.rb +150 -69
  132. data/lib/active_record/result.rb +30 -11
  133. data/lib/active_record/sanitization.rb +2 -39
  134. data/lib/active_record/schema.rb +1 -10
  135. data/lib/active_record/schema_dumper.rb +12 -6
  136. data/lib/active_record/schema_migration.rb +4 -0
  137. data/lib/active_record/scoping/default.rb +10 -3
  138. data/lib/active_record/scoping/named.rb +10 -14
  139. data/lib/active_record/scoping.rb +9 -8
  140. data/lib/active_record/statement_cache.rb +32 -5
  141. data/lib/active_record/store.rb +39 -8
  142. data/lib/active_record/table_metadata.rb +1 -4
  143. data/lib/active_record/tasks/database_tasks.rb +89 -23
  144. data/lib/active_record/tasks/mysql_database_tasks.rb +2 -4
  145. data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
  146. data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
  147. data/lib/active_record/test_databases.rb +38 -0
  148. data/lib/active_record/test_fixtures.rb +224 -0
  149. data/lib/active_record/timestamp.rb +4 -6
  150. data/lib/active_record/transactions.rb +3 -22
  151. data/lib/active_record/translation.rb +1 -1
  152. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  153. data/lib/active_record/type.rb +3 -4
  154. data/lib/active_record/type_caster/connection.rb +1 -6
  155. data/lib/active_record/type_caster/map.rb +1 -4
  156. data/lib/active_record/validations/uniqueness.rb +13 -25
  157. data/lib/active_record.rb +2 -1
  158. data/lib/arel/alias_predication.rb +9 -0
  159. data/lib/arel/attributes/attribute.rb +37 -0
  160. data/lib/arel/attributes.rb +22 -0
  161. data/lib/arel/collectors/bind.rb +24 -0
  162. data/lib/arel/collectors/composite.rb +31 -0
  163. data/lib/arel/collectors/plain_string.rb +20 -0
  164. data/lib/arel/collectors/sql_string.rb +20 -0
  165. data/lib/arel/collectors/substitute_binds.rb +28 -0
  166. data/lib/arel/crud.rb +42 -0
  167. data/lib/arel/delete_manager.rb +18 -0
  168. data/lib/arel/errors.rb +9 -0
  169. data/lib/arel/expressions.rb +29 -0
  170. data/lib/arel/factory_methods.rb +49 -0
  171. data/lib/arel/insert_manager.rb +49 -0
  172. data/lib/arel/math.rb +45 -0
  173. data/lib/arel/nodes/and.rb +32 -0
  174. data/lib/arel/nodes/ascending.rb +23 -0
  175. data/lib/arel/nodes/binary.rb +52 -0
  176. data/lib/arel/nodes/bind_param.rb +36 -0
  177. data/lib/arel/nodes/case.rb +55 -0
  178. data/lib/arel/nodes/casted.rb +50 -0
  179. data/lib/arel/nodes/count.rb +12 -0
  180. data/lib/arel/nodes/delete_statement.rb +45 -0
  181. data/lib/arel/nodes/descending.rb +23 -0
  182. data/lib/arel/nodes/equality.rb +18 -0
  183. data/lib/arel/nodes/extract.rb +24 -0
  184. data/lib/arel/nodes/false.rb +16 -0
  185. data/lib/arel/nodes/full_outer_join.rb +8 -0
  186. data/lib/arel/nodes/function.rb +44 -0
  187. data/lib/arel/nodes/grouping.rb +8 -0
  188. data/lib/arel/nodes/in.rb +8 -0
  189. data/lib/arel/nodes/infix_operation.rb +80 -0
  190. data/lib/arel/nodes/inner_join.rb +8 -0
  191. data/lib/arel/nodes/insert_statement.rb +37 -0
  192. data/lib/arel/nodes/join_source.rb +20 -0
  193. data/lib/arel/nodes/matches.rb +18 -0
  194. data/lib/arel/nodes/named_function.rb +23 -0
  195. data/lib/arel/nodes/node.rb +50 -0
  196. data/lib/arel/nodes/node_expression.rb +13 -0
  197. data/lib/arel/nodes/outer_join.rb +8 -0
  198. data/lib/arel/nodes/over.rb +15 -0
  199. data/lib/arel/nodes/regexp.rb +16 -0
  200. data/lib/arel/nodes/right_outer_join.rb +8 -0
  201. data/lib/arel/nodes/select_core.rb +63 -0
  202. data/lib/arel/nodes/select_statement.rb +41 -0
  203. data/lib/arel/nodes/sql_literal.rb +16 -0
  204. data/lib/arel/nodes/string_join.rb +11 -0
  205. data/lib/arel/nodes/table_alias.rb +27 -0
  206. data/lib/arel/nodes/terminal.rb +16 -0
  207. data/lib/arel/nodes/true.rb +16 -0
  208. data/lib/arel/nodes/unary.rb +44 -0
  209. data/lib/arel/nodes/unary_operation.rb +20 -0
  210. data/lib/arel/nodes/unqualified_column.rb +22 -0
  211. data/lib/arel/nodes/update_statement.rb +41 -0
  212. data/lib/arel/nodes/values.rb +16 -0
  213. data/lib/arel/nodes/values_list.rb +24 -0
  214. data/lib/arel/nodes/window.rb +126 -0
  215. data/lib/arel/nodes/with.rb +11 -0
  216. data/lib/arel/nodes.rb +67 -0
  217. data/lib/arel/order_predications.rb +13 -0
  218. data/lib/arel/predications.rb +257 -0
  219. data/lib/arel/select_manager.rb +271 -0
  220. data/lib/arel/table.rb +110 -0
  221. data/lib/arel/tree_manager.rb +72 -0
  222. data/lib/arel/update_manager.rb +34 -0
  223. data/lib/arel/visitors/depth_first.rb +199 -0
  224. data/lib/arel/visitors/dot.rb +292 -0
  225. data/lib/arel/visitors/ibm_db.rb +21 -0
  226. data/lib/arel/visitors/informix.rb +56 -0
  227. data/lib/arel/visitors/mssql.rb +143 -0
  228. data/lib/arel/visitors/mysql.rb +83 -0
  229. data/lib/arel/visitors/oracle.rb +159 -0
  230. data/lib/arel/visitors/oracle12.rb +67 -0
  231. data/lib/arel/visitors/postgresql.rb +116 -0
  232. data/lib/arel/visitors/sqlite.rb +39 -0
  233. data/lib/arel/visitors/to_sql.rb +913 -0
  234. data/lib/arel/visitors/visitor.rb +42 -0
  235. data/lib/arel/visitors/where_sql.rb +23 -0
  236. data/lib/arel/visitors.rb +20 -0
  237. data/lib/arel/window_predications.rb +9 -0
  238. data/lib/arel.rb +44 -0
  239. data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
  240. data/lib/rails/generators/active_record/migration.rb +14 -1
  241. data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
  242. metadata +107 -29
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Grouping < Unary
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class In < Equality
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class InfixOperation < Binary
6
+ include Arel::Expressions
7
+ include Arel::Predications
8
+ include Arel::OrderPredications
9
+ include Arel::AliasPredication
10
+ include Arel::Math
11
+
12
+ attr_reader :operator
13
+
14
+ def initialize(operator, left, right)
15
+ super(left, right)
16
+ @operator = operator
17
+ end
18
+ end
19
+
20
+ class Multiplication < InfixOperation
21
+ def initialize(left, right)
22
+ super(:*, left, right)
23
+ end
24
+ end
25
+
26
+ class Division < InfixOperation
27
+ def initialize(left, right)
28
+ super(:/, left, right)
29
+ end
30
+ end
31
+
32
+ class Addition < InfixOperation
33
+ def initialize(left, right)
34
+ super(:+, left, right)
35
+ end
36
+ end
37
+
38
+ class Subtraction < InfixOperation
39
+ def initialize(left, right)
40
+ super(:-, left, right)
41
+ end
42
+ end
43
+
44
+ class Concat < InfixOperation
45
+ def initialize(left, right)
46
+ super("||", left, right)
47
+ end
48
+ end
49
+
50
+ class BitwiseAnd < InfixOperation
51
+ def initialize(left, right)
52
+ super(:&, left, right)
53
+ end
54
+ end
55
+
56
+ class BitwiseOr < InfixOperation
57
+ def initialize(left, right)
58
+ super(:|, left, right)
59
+ end
60
+ end
61
+
62
+ class BitwiseXor < InfixOperation
63
+ def initialize(left, right)
64
+ super(:^, left, right)
65
+ end
66
+ end
67
+
68
+ class BitwiseShiftLeft < InfixOperation
69
+ def initialize(left, right)
70
+ super(:<<, left, right)
71
+ end
72
+ end
73
+
74
+ class BitwiseShiftRight < InfixOperation
75
+ def initialize(left, right)
76
+ super(:>>, left, right)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class InnerJoin < Arel::Nodes::Join
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class InsertStatement < Arel::Nodes::Node
6
+ attr_accessor :relation, :columns, :values, :select
7
+
8
+ def initialize
9
+ super()
10
+ @relation = nil
11
+ @columns = []
12
+ @values = nil
13
+ @select = nil
14
+ end
15
+
16
+ def initialize_copy(other)
17
+ super
18
+ @columns = @columns.clone
19
+ @values = @values.clone if @values
20
+ @select = @select.clone if @select
21
+ end
22
+
23
+ def hash
24
+ [@relation, @columns, @values, @select].hash
25
+ end
26
+
27
+ def eql?(other)
28
+ self.class == other.class &&
29
+ self.relation == other.relation &&
30
+ self.columns == other.columns &&
31
+ self.select == other.select &&
32
+ self.values == other.values
33
+ end
34
+ alias :== :eql?
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ ###
6
+ # Class that represents a join source
7
+ #
8
+ # http://www.sqlite.org/syntaxdiagrams.html#join-source
9
+
10
+ class JoinSource < Arel::Nodes::Binary
11
+ def initialize(single_source, joinop = [])
12
+ super
13
+ end
14
+
15
+ def empty?
16
+ !left && right.empty?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Matches < Binary
6
+ attr_reader :escape
7
+ attr_accessor :case_sensitive
8
+
9
+ def initialize(left, right, escape = nil, case_sensitive = false)
10
+ super(left, right)
11
+ @escape = escape && Nodes.build_quoted(escape)
12
+ @case_sensitive = case_sensitive
13
+ end
14
+ end
15
+
16
+ class DoesNotMatch < Matches; end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class NamedFunction < Arel::Nodes::Function
6
+ attr_accessor :name
7
+
8
+ def initialize(name, expr, aliaz = nil)
9
+ super(expr, aliaz)
10
+ @name = name
11
+ end
12
+
13
+ def hash
14
+ super ^ @name.hash
15
+ end
16
+
17
+ def eql?(other)
18
+ super && self.name == other.name
19
+ end
20
+ alias :== :eql?
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ ###
6
+ # Abstract base class for all AST nodes
7
+ class Node
8
+ include Arel::FactoryMethods
9
+ include Enumerable
10
+
11
+ ###
12
+ # Factory method to create a Nodes::Not node that has the recipient of
13
+ # the caller as a child.
14
+ def not
15
+ Nodes::Not.new self
16
+ end
17
+
18
+ ###
19
+ # Factory method to create a Nodes::Grouping node that has an Nodes::Or
20
+ # node as a child.
21
+ def or(right)
22
+ Nodes::Grouping.new Nodes::Or.new(self, right)
23
+ end
24
+
25
+ ###
26
+ # Factory method to create an Nodes::And node.
27
+ def and(right)
28
+ Nodes::And.new [self, right]
29
+ end
30
+
31
+ # FIXME: this method should go away. I don't like people calling
32
+ # to_sql on non-head nodes. This forces us to walk the AST until we
33
+ # can find a node that has a "relation" member.
34
+ #
35
+ # Maybe we should just use `Table.engine`? :'(
36
+ def to_sql(engine = Table.engine)
37
+ collector = Arel::Collectors::SQLString.new
38
+ collector = engine.connection.visitor.accept self, collector
39
+ collector.value
40
+ end
41
+
42
+ # Iterate through AST, nodes will be yielded depth-first
43
+ def each(&block)
44
+ return enum_for(:each) unless block_given?
45
+
46
+ ::Arel::Visitors::DepthFirst.new(block).accept self
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class NodeExpression < Arel::Nodes::Node
6
+ include Arel::Expressions
7
+ include Arel::Predications
8
+ include Arel::AliasPredication
9
+ include Arel::OrderPredications
10
+ include Arel::Math
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class OuterJoin < Arel::Nodes::Join
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Over < Binary
6
+ include Arel::AliasPredication
7
+
8
+ def initialize(left, right = nil)
9
+ super(left, right)
10
+ end
11
+
12
+ def operator; "OVER" end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Regexp < Binary
6
+ attr_accessor :case_sensitive
7
+
8
+ def initialize(left, right, case_sensitive = true)
9
+ super(left, right)
10
+ @case_sensitive = case_sensitive
11
+ end
12
+ end
13
+
14
+ class NotRegexp < Regexp; end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class RightOuterJoin < Arel::Nodes::Join
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class SelectCore < Arel::Nodes::Node
6
+ attr_accessor :projections, :wheres, :groups, :windows
7
+ attr_accessor :havings, :source, :set_quantifier
8
+
9
+ def initialize
10
+ super()
11
+ @source = JoinSource.new nil
12
+
13
+ # https://ronsavage.github.io/SQL/sql-92.bnf.html#set%20quantifier
14
+ @set_quantifier = nil
15
+ @projections = []
16
+ @wheres = []
17
+ @groups = []
18
+ @havings = []
19
+ @windows = []
20
+ end
21
+
22
+ def from
23
+ @source.left
24
+ end
25
+
26
+ def from=(value)
27
+ @source.left = value
28
+ end
29
+
30
+ alias :froms= :from=
31
+ alias :froms :from
32
+
33
+ def initialize_copy(other)
34
+ super
35
+ @source = @source.clone if @source
36
+ @projections = @projections.clone
37
+ @wheres = @wheres.clone
38
+ @groups = @groups.clone
39
+ @havings = @havings.clone
40
+ @windows = @windows.clone
41
+ end
42
+
43
+ def hash
44
+ [
45
+ @source, @set_quantifier, @projections,
46
+ @wheres, @groups, @havings, @windows
47
+ ].hash
48
+ end
49
+
50
+ def eql?(other)
51
+ self.class == other.class &&
52
+ self.source == other.source &&
53
+ self.set_quantifier == other.set_quantifier &&
54
+ self.projections == other.projections &&
55
+ self.wheres == other.wheres &&
56
+ self.groups == other.groups &&
57
+ self.havings == other.havings &&
58
+ self.windows == other.windows
59
+ end
60
+ alias :== :eql?
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class SelectStatement < Arel::Nodes::NodeExpression
6
+ attr_reader :cores
7
+ attr_accessor :limit, :orders, :lock, :offset, :with
8
+
9
+ def initialize(cores = [SelectCore.new])
10
+ super()
11
+ @cores = cores
12
+ @orders = []
13
+ @limit = nil
14
+ @lock = nil
15
+ @offset = nil
16
+ @with = nil
17
+ end
18
+
19
+ def initialize_copy(other)
20
+ super
21
+ @cores = @cores.map { |x| x.clone }
22
+ @orders = @orders.map { |x| x.clone }
23
+ end
24
+
25
+ def hash
26
+ [@cores, @orders, @limit, @lock, @offset, @with].hash
27
+ end
28
+
29
+ def eql?(other)
30
+ self.class == other.class &&
31
+ self.cores == other.cores &&
32
+ self.orders == other.orders &&
33
+ self.limit == other.limit &&
34
+ self.lock == other.lock &&
35
+ self.offset == other.offset &&
36
+ self.with == other.with
37
+ end
38
+ alias :== :eql?
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class SqlLiteral < String
6
+ include Arel::Expressions
7
+ include Arel::Predications
8
+ include Arel::AliasPredication
9
+ include Arel::OrderPredications
10
+
11
+ def encode_with(coder)
12
+ coder.scalar = self.to_s
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class StringJoin < Arel::Nodes::Join
6
+ def initialize(left, right = nil)
7
+ super
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class TableAlias < Arel::Nodes::Binary
6
+ alias :name :right
7
+ alias :relation :left
8
+ alias :table_alias :name
9
+
10
+ def [](name)
11
+ Attribute.new(self, name)
12
+ end
13
+
14
+ def table_name
15
+ relation.respond_to?(:name) ? relation.name : name
16
+ end
17
+
18
+ def type_cast_for_database(*args)
19
+ relation.type_cast_for_database(*args)
20
+ end
21
+
22
+ def able_to_type_cast?
23
+ relation.respond_to?(:able_to_type_cast?) && relation.able_to_type_cast?
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Distinct < Arel::Nodes::NodeExpression
6
+ def hash
7
+ self.class.hash
8
+ end
9
+
10
+ def eql?(other)
11
+ self.class == other.class
12
+ end
13
+ alias :== :eql?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class True < Arel::Nodes::NodeExpression
6
+ def hash
7
+ self.class.hash
8
+ end
9
+
10
+ def eql?(other)
11
+ self.class == other.class
12
+ end
13
+ alias :== :eql?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Unary < Arel::Nodes::NodeExpression
6
+ attr_accessor :expr
7
+ alias :value :expr
8
+
9
+ def initialize(expr)
10
+ super()
11
+ @expr = expr
12
+ end
13
+
14
+ def hash
15
+ @expr.hash
16
+ end
17
+
18
+ def eql?(other)
19
+ self.class == other.class &&
20
+ self.expr == other.expr
21
+ end
22
+ alias :== :eql?
23
+ end
24
+
25
+ %w{
26
+ Bin
27
+ Cube
28
+ DistinctOn
29
+ Group
30
+ GroupingElement
31
+ GroupingSet
32
+ Lateral
33
+ Limit
34
+ Lock
35
+ Not
36
+ Offset
37
+ On
38
+ Ordering
39
+ RollUp
40
+ }.each do |name|
41
+ const_set(name, Class.new(Unary))
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class UnaryOperation < Unary
6
+ attr_reader :operator
7
+
8
+ def initialize(operator, operand)
9
+ super(operand)
10
+ @operator = operator
11
+ end
12
+ end
13
+
14
+ class BitwiseNot < UnaryOperation
15
+ def initialize(operand)
16
+ super(:~, operand)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class UnqualifiedColumn < Arel::Nodes::Unary
6
+ alias :attribute :expr
7
+ alias :attribute= :expr=
8
+
9
+ def relation
10
+ @expr.relation
11
+ end
12
+
13
+ def column
14
+ @expr.column
15
+ end
16
+
17
+ def name
18
+ @expr.name
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class UpdateStatement < Arel::Nodes::Node
6
+ attr_accessor :relation, :wheres, :values, :orders, :limit, :offset, :key
7
+
8
+ def initialize
9
+ @relation = nil
10
+ @wheres = []
11
+ @values = []
12
+ @orders = []
13
+ @limit = nil
14
+ @offset = nil
15
+ @key = nil
16
+ end
17
+
18
+ def initialize_copy(other)
19
+ super
20
+ @wheres = @wheres.clone
21
+ @values = @values.clone
22
+ end
23
+
24
+ def hash
25
+ [@relation, @wheres, @values, @orders, @limit, @offset, @key].hash
26
+ end
27
+
28
+ def eql?(other)
29
+ self.class == other.class &&
30
+ self.relation == other.relation &&
31
+ self.wheres == other.wheres &&
32
+ self.values == other.values &&
33
+ self.orders == other.orders &&
34
+ self.limit == other.limit &&
35
+ self.offset == other.offset &&
36
+ self.key == other.key
37
+ end
38
+ alias :== :eql?
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Values < Arel::Nodes::Binary
6
+ alias :expressions :left
7
+ alias :expressions= :left=
8
+ alias :columns :right
9
+ alias :columns= :right=
10
+
11
+ def initialize(exprs, columns = [])
12
+ super
13
+ end
14
+ end
15
+ end
16
+ end