activerecord 5.2.8.1 → 6.1.6.1

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1255 -596
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +7 -5
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record/aggregations.rb +9 -8
  7. data/lib/active_record/association_relation.rb +30 -10
  8. data/lib/active_record/associations/alias_tracker.rb +19 -16
  9. data/lib/active_record/associations/association.rb +100 -41
  10. data/lib/active_record/associations/association_scope.rb +23 -21
  11. data/lib/active_record/associations/belongs_to_association.rb +55 -48
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -6
  13. data/lib/active_record/associations/builder/association.rb +45 -22
  14. data/lib/active_record/associations/builder/belongs_to.rb +29 -59
  15. data/lib/active_record/associations/builder/collection_association.rb +8 -17
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
  17. data/lib/active_record/associations/builder/has_many.rb +8 -2
  18. data/lib/active_record/associations/builder/has_one.rb +33 -2
  19. data/lib/active_record/associations/builder/singular_association.rb +3 -1
  20. data/lib/active_record/associations/collection_association.rb +44 -34
  21. data/lib/active_record/associations/collection_proxy.rb +25 -21
  22. data/lib/active_record/associations/foreign_association.rb +20 -0
  23. data/lib/active_record/associations/has_many_association.rb +26 -13
  24. data/lib/active_record/associations/has_many_through_association.rb +24 -18
  25. data/lib/active_record/associations/has_one_association.rb +43 -31
  26. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  27. data/lib/active_record/associations/join_dependency/join_association.rb +44 -22
  28. data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
  29. data/lib/active_record/associations/join_dependency.rb +91 -60
  30. data/lib/active_record/associations/preloader/association.rb +69 -43
  31. data/lib/active_record/associations/preloader/through_association.rb +49 -40
  32. data/lib/active_record/associations/preloader.rb +47 -34
  33. data/lib/active_record/associations/singular_association.rb +3 -17
  34. data/lib/active_record/associations/through_association.rb +1 -1
  35. data/lib/active_record/associations.rb +137 -25
  36. data/lib/active_record/attribute_assignment.rb +17 -19
  37. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -7
  38. data/lib/active_record/attribute_methods/dirty.rb +101 -40
  39. data/lib/active_record/attribute_methods/primary_key.rb +20 -25
  40. data/lib/active_record/attribute_methods/query.rb +4 -8
  41. data/lib/active_record/attribute_methods/read.rb +14 -56
  42. data/lib/active_record/attribute_methods/serialization.rb +12 -7
  43. data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
  44. data/lib/active_record/attribute_methods/write.rb +18 -34
  45. data/lib/active_record/attribute_methods.rb +81 -143
  46. data/lib/active_record/attributes.rb +46 -9
  47. data/lib/active_record/autosave_association.rb +57 -42
  48. data/lib/active_record/base.rb +4 -17
  49. data/lib/active_record/callbacks.rb +158 -43
  50. data/lib/active_record/coders/yaml_column.rb +1 -2
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +272 -130
  52. data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -36
  53. data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -146
  54. data/lib/active_record/connection_adapters/abstract/query_cache.rb +18 -14
  55. data/lib/active_record/connection_adapters/abstract/quoting.rb +98 -47
  56. data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
  57. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -110
  58. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +211 -90
  59. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -4
  60. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +385 -144
  61. data/lib/active_record/connection_adapters/abstract/transaction.rb +167 -69
  62. data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -99
  63. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +243 -275
  64. data/lib/active_record/connection_adapters/column.rb +30 -12
  65. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  66. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  67. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  68. data/lib/active_record/connection_adapters/mysql/database_statements.rb +88 -32
  69. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
  70. data/lib/active_record/connection_adapters/mysql/quoting.rb +59 -7
  71. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
  72. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
  73. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +18 -7
  74. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +142 -19
  75. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
  76. data/lib/active_record/connection_adapters/mysql2_adapter.rb +53 -18
  77. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  78. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  79. data/lib/active_record/connection_adapters/postgresql/column.rb +37 -28
  80. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +40 -54
  81. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
  82. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  83. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
  84. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
  85. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +10 -2
  86. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  87. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
  90. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
  93. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
  94. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  95. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  96. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
  97. data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
  99. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
  100. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
  101. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
  102. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  103. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
  104. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
  105. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  106. data/lib/active_record/connection_adapters/postgresql_adapter.rb +224 -120
  107. data/lib/active_record/connection_adapters/schema_cache.rb +159 -21
  108. data/lib/active_record/connection_adapters/sql_type_metadata.rb +17 -6
  109. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +146 -0
  110. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
  111. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
  112. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
  113. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +174 -186
  114. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  115. data/lib/active_record/connection_adapters.rb +52 -0
  116. data/lib/active_record/connection_handling.rb +293 -33
  117. data/lib/active_record/core.rb +333 -98
  118. data/lib/active_record/counter_cache.rb +8 -30
  119. data/lib/active_record/database_configurations/connection_url_resolver.rb +99 -0
  120. data/lib/active_record/database_configurations/database_config.rb +80 -0
  121. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  122. data/lib/active_record/database_configurations/url_config.rb +53 -0
  123. data/lib/active_record/database_configurations.rb +273 -0
  124. data/lib/active_record/delegated_type.rb +209 -0
  125. data/lib/active_record/destroy_association_async_job.rb +36 -0
  126. data/lib/active_record/dynamic_matchers.rb +3 -4
  127. data/lib/active_record/enum.rb +108 -36
  128. data/lib/active_record/errors.rb +62 -19
  129. data/lib/active_record/explain.rb +10 -6
  130. data/lib/active_record/explain_subscriber.rb +1 -1
  131. data/lib/active_record/fixture_set/file.rb +10 -17
  132. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  133. data/lib/active_record/fixture_set/render_context.rb +17 -0
  134. data/lib/active_record/fixture_set/table_row.rb +152 -0
  135. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  136. data/lib/active_record/fixtures.rb +200 -481
  137. data/lib/active_record/gem_version.rb +3 -3
  138. data/lib/active_record/inheritance.rb +53 -24
  139. data/lib/active_record/insert_all.rb +212 -0
  140. data/lib/active_record/integration.rb +67 -17
  141. data/lib/active_record/internal_metadata.rb +28 -9
  142. data/lib/active_record/legacy_yaml_adapter.rb +7 -3
  143. data/lib/active_record/locking/optimistic.rb +37 -23
  144. data/lib/active_record/locking/pessimistic.rb +9 -5
  145. data/lib/active_record/log_subscriber.rb +35 -35
  146. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  147. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  148. data/lib/active_record/middleware/database_selector.rb +77 -0
  149. data/lib/active_record/migration/command_recorder.rb +96 -44
  150. data/lib/active_record/migration/compatibility.rb +145 -64
  151. data/lib/active_record/migration/join_table.rb +0 -1
  152. data/lib/active_record/migration.rb +206 -157
  153. data/lib/active_record/model_schema.rb +148 -22
  154. data/lib/active_record/nested_attributes.rb +4 -7
  155. data/lib/active_record/no_touching.rb +8 -1
  156. data/lib/active_record/null_relation.rb +0 -1
  157. data/lib/active_record/persistence.rb +267 -59
  158. data/lib/active_record/query_cache.rb +21 -4
  159. data/lib/active_record/querying.rb +40 -23
  160. data/lib/active_record/railtie.rb +116 -59
  161. data/lib/active_record/railties/console_sandbox.rb +2 -4
  162. data/lib/active_record/railties/controller_runtime.rb +30 -35
  163. data/lib/active_record/railties/databases.rake +411 -80
  164. data/lib/active_record/readonly_attributes.rb +4 -0
  165. data/lib/active_record/reflection.rb +109 -93
  166. data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
  167. data/lib/active_record/relation/batches.rb +44 -35
  168. data/lib/active_record/relation/calculations.rb +157 -90
  169. data/lib/active_record/relation/delegation.rb +35 -50
  170. data/lib/active_record/relation/finder_methods.rb +64 -39
  171. data/lib/active_record/relation/from_clause.rb +5 -1
  172. data/lib/active_record/relation/merger.rb +32 -40
  173. data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
  174. data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
  175. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  176. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +11 -10
  177. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  178. data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
  179. data/lib/active_record/relation/predicate_builder.rb +62 -45
  180. data/lib/active_record/relation/query_attribute.rb +13 -8
  181. data/lib/active_record/relation/query_methods.rb +476 -187
  182. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  183. data/lib/active_record/relation/spawn_methods.rb +9 -9
  184. data/lib/active_record/relation/where_clause.rb +115 -62
  185. data/lib/active_record/relation.rb +379 -115
  186. data/lib/active_record/result.rb +64 -38
  187. data/lib/active_record/runtime_registry.rb +2 -2
  188. data/lib/active_record/sanitization.rb +22 -41
  189. data/lib/active_record/schema.rb +2 -11
  190. data/lib/active_record/schema_dumper.rb +54 -9
  191. data/lib/active_record/schema_migration.rb +7 -9
  192. data/lib/active_record/scoping/default.rb +4 -8
  193. data/lib/active_record/scoping/named.rb +17 -24
  194. data/lib/active_record/scoping.rb +8 -9
  195. data/lib/active_record/secure_token.rb +16 -8
  196. data/lib/active_record/serialization.rb +5 -3
  197. data/lib/active_record/signed_id.rb +116 -0
  198. data/lib/active_record/statement_cache.rb +49 -6
  199. data/lib/active_record/store.rb +88 -9
  200. data/lib/active_record/suppressor.rb +2 -2
  201. data/lib/active_record/table_metadata.rb +42 -43
  202. data/lib/active_record/tasks/database_tasks.rb +277 -81
  203. data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
  204. data/lib/active_record/tasks/postgresql_database_tasks.rb +27 -32
  205. data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
  206. data/lib/active_record/test_databases.rb +24 -0
  207. data/lib/active_record/test_fixtures.rb +287 -0
  208. data/lib/active_record/timestamp.rb +43 -32
  209. data/lib/active_record/touch_later.rb +23 -22
  210. data/lib/active_record/transactions.rb +62 -118
  211. data/lib/active_record/translation.rb +1 -1
  212. data/lib/active_record/type/adapter_specific_registry.rb +3 -13
  213. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  214. data/lib/active_record/type/serialized.rb +6 -3
  215. data/lib/active_record/type/time.rb +10 -0
  216. data/lib/active_record/type/type_map.rb +0 -1
  217. data/lib/active_record/type/unsigned_integer.rb +0 -1
  218. data/lib/active_record/type.rb +10 -5
  219. data/lib/active_record/type_caster/connection.rb +15 -15
  220. data/lib/active_record/type_caster/map.rb +8 -8
  221. data/lib/active_record/validations/associated.rb +1 -2
  222. data/lib/active_record/validations/numericality.rb +35 -0
  223. data/lib/active_record/validations/uniqueness.rb +38 -30
  224. data/lib/active_record/validations.rb +4 -3
  225. data/lib/active_record.rb +13 -12
  226. data/lib/arel/alias_predication.rb +9 -0
  227. data/lib/arel/attributes/attribute.rb +41 -0
  228. data/lib/arel/collectors/bind.rb +29 -0
  229. data/lib/arel/collectors/composite.rb +39 -0
  230. data/lib/arel/collectors/plain_string.rb +20 -0
  231. data/lib/arel/collectors/sql_string.rb +27 -0
  232. data/lib/arel/collectors/substitute_binds.rb +35 -0
  233. data/lib/arel/crud.rb +42 -0
  234. data/lib/arel/delete_manager.rb +18 -0
  235. data/lib/arel/errors.rb +9 -0
  236. data/lib/arel/expressions.rb +29 -0
  237. data/lib/arel/factory_methods.rb +49 -0
  238. data/lib/arel/insert_manager.rb +49 -0
  239. data/lib/arel/math.rb +45 -0
  240. data/lib/arel/nodes/and.rb +32 -0
  241. data/lib/arel/nodes/ascending.rb +23 -0
  242. data/lib/arel/nodes/binary.rb +126 -0
  243. data/lib/arel/nodes/bind_param.rb +44 -0
  244. data/lib/arel/nodes/case.rb +55 -0
  245. data/lib/arel/nodes/casted.rb +62 -0
  246. data/lib/arel/nodes/comment.rb +29 -0
  247. data/lib/arel/nodes/count.rb +12 -0
  248. data/lib/arel/nodes/delete_statement.rb +45 -0
  249. data/lib/arel/nodes/descending.rb +23 -0
  250. data/lib/arel/nodes/equality.rb +15 -0
  251. data/lib/arel/nodes/extract.rb +24 -0
  252. data/lib/arel/nodes/false.rb +16 -0
  253. data/lib/arel/nodes/full_outer_join.rb +8 -0
  254. data/lib/arel/nodes/function.rb +44 -0
  255. data/lib/arel/nodes/grouping.rb +11 -0
  256. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  257. data/lib/arel/nodes/in.rb +15 -0
  258. data/lib/arel/nodes/infix_operation.rb +92 -0
  259. data/lib/arel/nodes/inner_join.rb +8 -0
  260. data/lib/arel/nodes/insert_statement.rb +37 -0
  261. data/lib/arel/nodes/join_source.rb +20 -0
  262. data/lib/arel/nodes/matches.rb +18 -0
  263. data/lib/arel/nodes/named_function.rb +23 -0
  264. data/lib/arel/nodes/node.rb +51 -0
  265. data/lib/arel/nodes/node_expression.rb +13 -0
  266. data/lib/arel/nodes/ordering.rb +27 -0
  267. data/lib/arel/nodes/outer_join.rb +8 -0
  268. data/lib/arel/nodes/over.rb +15 -0
  269. data/lib/arel/nodes/regexp.rb +16 -0
  270. data/lib/arel/nodes/right_outer_join.rb +8 -0
  271. data/lib/arel/nodes/select_core.rb +67 -0
  272. data/lib/arel/nodes/select_statement.rb +41 -0
  273. data/lib/arel/nodes/sql_literal.rb +19 -0
  274. data/lib/arel/nodes/string_join.rb +11 -0
  275. data/lib/arel/nodes/table_alias.rb +31 -0
  276. data/lib/arel/nodes/terminal.rb +16 -0
  277. data/lib/arel/nodes/true.rb +16 -0
  278. data/lib/arel/nodes/unary.rb +44 -0
  279. data/lib/arel/nodes/unary_operation.rb +20 -0
  280. data/lib/arel/nodes/unqualified_column.rb +22 -0
  281. data/lib/arel/nodes/update_statement.rb +41 -0
  282. data/lib/arel/nodes/values_list.rb +9 -0
  283. data/lib/arel/nodes/window.rb +126 -0
  284. data/lib/arel/nodes/with.rb +11 -0
  285. data/lib/arel/nodes.rb +70 -0
  286. data/lib/arel/order_predications.rb +13 -0
  287. data/lib/arel/predications.rb +250 -0
  288. data/lib/arel/select_manager.rb +270 -0
  289. data/lib/arel/table.rb +118 -0
  290. data/lib/arel/tree_manager.rb +72 -0
  291. data/lib/arel/update_manager.rb +34 -0
  292. data/lib/arel/visitors/dot.rb +308 -0
  293. data/lib/arel/visitors/mysql.rb +93 -0
  294. data/lib/arel/visitors/postgresql.rb +120 -0
  295. data/lib/arel/visitors/sqlite.rb +38 -0
  296. data/lib/arel/visitors/to_sql.rb +899 -0
  297. data/lib/arel/visitors/visitor.rb +45 -0
  298. data/lib/arel/visitors.rb +13 -0
  299. data/lib/arel/window_predications.rb +9 -0
  300. data/lib/arel.rb +54 -0
  301. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  302. data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
  303. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
  304. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
  305. data/lib/rails/generators/active_record/migration.rb +19 -2
  306. data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
  307. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  308. data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
  309. metadata +116 -30
  310. data/lib/active_record/attribute_decorators.rb +0 -90
  311. data/lib/active_record/collection_cache_key.rb +0 -53
  312. data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
  313. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
  314. data/lib/active_record/define_callbacks.rb +0 -22
  315. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
  316. data/lib/active_record/relation/where_clause_factory.rb +0 -34
@@ -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,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class ValuesList < Unary
6
+ alias :rows :expr
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Window < Arel::Nodes::Node
6
+ attr_accessor :orders, :framing, :partitions
7
+
8
+ def initialize
9
+ @orders = []
10
+ @partitions = []
11
+ @framing = nil
12
+ end
13
+
14
+ def order(*expr)
15
+ # FIXME: We SHOULD NOT be converting these to SqlLiteral automatically
16
+ @orders.concat expr.map { |x|
17
+ String === x || Symbol === x ? Nodes::SqlLiteral.new(x.to_s) : x
18
+ }
19
+ self
20
+ end
21
+
22
+ def partition(*expr)
23
+ # FIXME: We SHOULD NOT be converting these to SqlLiteral automatically
24
+ @partitions.concat expr.map { |x|
25
+ String === x || Symbol === x ? Nodes::SqlLiteral.new(x.to_s) : x
26
+ }
27
+ self
28
+ end
29
+
30
+ def frame(expr)
31
+ @framing = expr
32
+ end
33
+
34
+ def rows(expr = nil)
35
+ if @framing
36
+ Rows.new(expr)
37
+ else
38
+ frame(Rows.new(expr))
39
+ end
40
+ end
41
+
42
+ def range(expr = nil)
43
+ if @framing
44
+ Range.new(expr)
45
+ else
46
+ frame(Range.new(expr))
47
+ end
48
+ end
49
+
50
+ def initialize_copy(other)
51
+ super
52
+ @orders = @orders.map { |x| x.clone }
53
+ end
54
+
55
+ def hash
56
+ [@orders, @framing].hash
57
+ end
58
+
59
+ def eql?(other)
60
+ self.class == other.class &&
61
+ self.orders == other.orders &&
62
+ self.framing == other.framing &&
63
+ self.partitions == other.partitions
64
+ end
65
+ alias :== :eql?
66
+ end
67
+
68
+ class NamedWindow < Window
69
+ attr_accessor :name
70
+
71
+ def initialize(name)
72
+ super()
73
+ @name = name
74
+ end
75
+
76
+ def initialize_copy(other)
77
+ super
78
+ @name = other.name.clone
79
+ end
80
+
81
+ def hash
82
+ super ^ @name.hash
83
+ end
84
+
85
+ def eql?(other)
86
+ super && self.name == other.name
87
+ end
88
+ alias :== :eql?
89
+ end
90
+
91
+ class Rows < Unary
92
+ def initialize(expr = nil)
93
+ super(expr)
94
+ end
95
+ end
96
+
97
+ class Range < Unary
98
+ def initialize(expr = nil)
99
+ super(expr)
100
+ end
101
+ end
102
+
103
+ class CurrentRow < Node
104
+ def hash
105
+ self.class.hash
106
+ end
107
+
108
+ def eql?(other)
109
+ self.class == other.class
110
+ end
111
+ alias :== :eql?
112
+ end
113
+
114
+ class Preceding < Unary
115
+ def initialize(expr = nil)
116
+ super(expr)
117
+ end
118
+ end
119
+
120
+ class Following < Unary
121
+ def initialize(expr = nil)
122
+ super(expr)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class With < Arel::Nodes::Unary
6
+ alias children expr
7
+ end
8
+
9
+ class WithRecursive < With; end
10
+ end
11
+ end
data/lib/arel/nodes.rb ADDED
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ # node
4
+ require "arel/nodes/node"
5
+ require "arel/nodes/node_expression"
6
+ require "arel/nodes/select_statement"
7
+ require "arel/nodes/select_core"
8
+ require "arel/nodes/insert_statement"
9
+ require "arel/nodes/update_statement"
10
+ require "arel/nodes/bind_param"
11
+
12
+ # terminal
13
+
14
+ require "arel/nodes/terminal"
15
+ require "arel/nodes/true"
16
+ require "arel/nodes/false"
17
+
18
+ # unary
19
+ require "arel/nodes/unary"
20
+ require "arel/nodes/grouping"
21
+ require "arel/nodes/homogeneous_in"
22
+ require "arel/nodes/ordering"
23
+ require "arel/nodes/ascending"
24
+ require "arel/nodes/descending"
25
+ require "arel/nodes/unqualified_column"
26
+ require "arel/nodes/with"
27
+
28
+ # binary
29
+ require "arel/nodes/binary"
30
+ require "arel/nodes/equality"
31
+ require "arel/nodes/in"
32
+ require "arel/nodes/join_source"
33
+ require "arel/nodes/delete_statement"
34
+ require "arel/nodes/table_alias"
35
+ require "arel/nodes/infix_operation"
36
+ require "arel/nodes/unary_operation"
37
+ require "arel/nodes/over"
38
+ require "arel/nodes/matches"
39
+ require "arel/nodes/regexp"
40
+
41
+ # nary
42
+ require "arel/nodes/and"
43
+
44
+ # function
45
+ # FIXME: Function + Alias can be rewritten as a Function and Alias node.
46
+ # We should make Function a Unary node and deprecate the use of "aliaz"
47
+ require "arel/nodes/function"
48
+ require "arel/nodes/count"
49
+ require "arel/nodes/extract"
50
+ require "arel/nodes/values_list"
51
+ require "arel/nodes/named_function"
52
+
53
+ # windows
54
+ require "arel/nodes/window"
55
+
56
+ # conditional expressions
57
+ require "arel/nodes/case"
58
+
59
+ # joins
60
+ require "arel/nodes/full_outer_join"
61
+ require "arel/nodes/inner_join"
62
+ require "arel/nodes/outer_join"
63
+ require "arel/nodes/right_outer_join"
64
+ require "arel/nodes/string_join"
65
+
66
+ require "arel/nodes/comment"
67
+
68
+ require "arel/nodes/sql_literal"
69
+
70
+ require "arel/nodes/casted"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module OrderPredications
5
+ def asc
6
+ Nodes::Ascending.new self
7
+ end
8
+
9
+ def desc
10
+ Nodes::Descending.new self
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,250 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Predications
5
+ def not_eq(other)
6
+ Nodes::NotEqual.new self, quoted_node(other)
7
+ end
8
+
9
+ def not_eq_any(others)
10
+ grouping_any :not_eq, others
11
+ end
12
+
13
+ def not_eq_all(others)
14
+ grouping_all :not_eq, others
15
+ end
16
+
17
+ def eq(other)
18
+ Nodes::Equality.new self, quoted_node(other)
19
+ end
20
+
21
+ def is_not_distinct_from(other)
22
+ Nodes::IsNotDistinctFrom.new self, quoted_node(other)
23
+ end
24
+
25
+ def is_distinct_from(other)
26
+ Nodes::IsDistinctFrom.new self, quoted_node(other)
27
+ end
28
+
29
+ def eq_any(others)
30
+ grouping_any :eq, others
31
+ end
32
+
33
+ def eq_all(others)
34
+ grouping_all :eq, quoted_array(others)
35
+ end
36
+
37
+ def between(other)
38
+ if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1
39
+ self.in([])
40
+ elsif open_ended?(other.begin)
41
+ if open_ended?(other.end)
42
+ not_in([])
43
+ elsif other.exclude_end?
44
+ lt(other.end)
45
+ else
46
+ lteq(other.end)
47
+ end
48
+ elsif open_ended?(other.end)
49
+ gteq(other.begin)
50
+ elsif other.exclude_end?
51
+ gteq(other.begin).and(lt(other.end))
52
+ else
53
+ left = quoted_node(other.begin)
54
+ right = quoted_node(other.end)
55
+ Nodes::Between.new(self, left.and(right))
56
+ end
57
+ end
58
+
59
+ def in(other)
60
+ case other
61
+ when Arel::SelectManager
62
+ Arel::Nodes::In.new(self, other.ast)
63
+ when Enumerable
64
+ Nodes::In.new self, quoted_array(other)
65
+ else
66
+ Nodes::In.new self, quoted_node(other)
67
+ end
68
+ end
69
+
70
+ def in_any(others)
71
+ grouping_any :in, others
72
+ end
73
+
74
+ def in_all(others)
75
+ grouping_all :in, others
76
+ end
77
+
78
+ def not_between(other)
79
+ if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1
80
+ not_in([])
81
+ elsif open_ended?(other.begin)
82
+ if open_ended?(other.end)
83
+ self.in([])
84
+ elsif other.exclude_end?
85
+ gteq(other.end)
86
+ else
87
+ gt(other.end)
88
+ end
89
+ elsif open_ended?(other.end)
90
+ lt(other.begin)
91
+ else
92
+ left = lt(other.begin)
93
+ right = if other.exclude_end?
94
+ gteq(other.end)
95
+ else
96
+ gt(other.end)
97
+ end
98
+ left.or(right)
99
+ end
100
+ end
101
+
102
+ def not_in(other)
103
+ case other
104
+ when Arel::SelectManager
105
+ Arel::Nodes::NotIn.new(self, other.ast)
106
+ when Enumerable
107
+ Nodes::NotIn.new self, quoted_array(other)
108
+ else
109
+ Nodes::NotIn.new self, quoted_node(other)
110
+ end
111
+ end
112
+
113
+ def not_in_any(others)
114
+ grouping_any :not_in, others
115
+ end
116
+
117
+ def not_in_all(others)
118
+ grouping_all :not_in, others
119
+ end
120
+
121
+ def matches(other, escape = nil, case_sensitive = false)
122
+ Nodes::Matches.new self, quoted_node(other), escape, case_sensitive
123
+ end
124
+
125
+ def matches_regexp(other, case_sensitive = true)
126
+ Nodes::Regexp.new self, quoted_node(other), case_sensitive
127
+ end
128
+
129
+ def matches_any(others, escape = nil, case_sensitive = false)
130
+ grouping_any :matches, others, escape, case_sensitive
131
+ end
132
+
133
+ def matches_all(others, escape = nil, case_sensitive = false)
134
+ grouping_all :matches, others, escape, case_sensitive
135
+ end
136
+
137
+ def does_not_match(other, escape = nil, case_sensitive = false)
138
+ Nodes::DoesNotMatch.new self, quoted_node(other), escape, case_sensitive
139
+ end
140
+
141
+ def does_not_match_regexp(other, case_sensitive = true)
142
+ Nodes::NotRegexp.new self, quoted_node(other), case_sensitive
143
+ end
144
+
145
+ def does_not_match_any(others, escape = nil)
146
+ grouping_any :does_not_match, others, escape
147
+ end
148
+
149
+ def does_not_match_all(others, escape = nil)
150
+ grouping_all :does_not_match, others, escape
151
+ end
152
+
153
+ def gteq(right)
154
+ Nodes::GreaterThanOrEqual.new self, quoted_node(right)
155
+ end
156
+
157
+ def gteq_any(others)
158
+ grouping_any :gteq, others
159
+ end
160
+
161
+ def gteq_all(others)
162
+ grouping_all :gteq, others
163
+ end
164
+
165
+ def gt(right)
166
+ Nodes::GreaterThan.new self, quoted_node(right)
167
+ end
168
+
169
+ def gt_any(others)
170
+ grouping_any :gt, others
171
+ end
172
+
173
+ def gt_all(others)
174
+ grouping_all :gt, others
175
+ end
176
+
177
+ def lt(right)
178
+ Nodes::LessThan.new self, quoted_node(right)
179
+ end
180
+
181
+ def lt_any(others)
182
+ grouping_any :lt, others
183
+ end
184
+
185
+ def lt_all(others)
186
+ grouping_all :lt, others
187
+ end
188
+
189
+ def lteq(right)
190
+ Nodes::LessThanOrEqual.new self, quoted_node(right)
191
+ end
192
+
193
+ def lteq_any(others)
194
+ grouping_any :lteq, others
195
+ end
196
+
197
+ def lteq_all(others)
198
+ grouping_all :lteq, others
199
+ end
200
+
201
+ def when(right)
202
+ Nodes::Case.new(self).when quoted_node(right)
203
+ end
204
+
205
+ def concat(other)
206
+ Nodes::Concat.new self, other
207
+ end
208
+
209
+ def contains(other)
210
+ Arel::Nodes::Contains.new self, quoted_node(other)
211
+ end
212
+
213
+ def overlaps(other)
214
+ Arel::Nodes::Overlaps.new self, quoted_node(other)
215
+ end
216
+
217
+ def quoted_array(others)
218
+ others.map { |v| quoted_node(v) }
219
+ end
220
+
221
+ private
222
+ def grouping_any(method_id, others, *extras)
223
+ nodes = others.map { |expr| send(method_id, expr, *extras) }
224
+ Nodes::Grouping.new nodes.inject { |memo, node|
225
+ Nodes::Or.new(memo, node)
226
+ }
227
+ end
228
+
229
+ def grouping_all(method_id, others, *extras)
230
+ nodes = others.map { |expr| send(method_id, expr, *extras) }
231
+ Nodes::Grouping.new Nodes::And.new(nodes)
232
+ end
233
+
234
+ def quoted_node(other)
235
+ Nodes.build_quoted(other, self)
236
+ end
237
+
238
+ def infinity?(value)
239
+ value.respond_to?(:infinite?) && value.infinite?
240
+ end
241
+
242
+ def unboundable?(value)
243
+ value.respond_to?(:unboundable?) && value.unboundable?
244
+ end
245
+
246
+ def open_ended?(value)
247
+ value.nil? || infinity?(value) || unboundable?(value)
248
+ end
249
+ end
250
+ end