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
data/lib/arel/math.rb ADDED
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Math
5
+ def *(other)
6
+ Arel::Nodes::Multiplication.new(self, other)
7
+ end
8
+
9
+ def +(other)
10
+ Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new(self, other))
11
+ end
12
+
13
+ def -(other)
14
+ Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
15
+ end
16
+
17
+ def /(other)
18
+ Arel::Nodes::Division.new(self, other)
19
+ end
20
+
21
+ def &(other)
22
+ Arel::Nodes::Grouping.new(Arel::Nodes::BitwiseAnd.new(self, other))
23
+ end
24
+
25
+ def |(other)
26
+ Arel::Nodes::Grouping.new(Arel::Nodes::BitwiseOr.new(self, other))
27
+ end
28
+
29
+ def ^(other)
30
+ Arel::Nodes::Grouping.new(Arel::Nodes::BitwiseXor.new(self, other))
31
+ end
32
+
33
+ def <<(other)
34
+ Arel::Nodes::Grouping.new(Arel::Nodes::BitwiseShiftLeft.new(self, other))
35
+ end
36
+
37
+ def >>(other)
38
+ Arel::Nodes::Grouping.new(Arel::Nodes::BitwiseShiftRight.new(self, other))
39
+ end
40
+
41
+ def ~@
42
+ Arel::Nodes::BitwiseNot.new(self)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class And < Arel::Nodes::NodeExpression
6
+ attr_reader :children
7
+
8
+ def initialize(children)
9
+ super()
10
+ @children = children
11
+ end
12
+
13
+ def left
14
+ children.first
15
+ end
16
+
17
+ def right
18
+ children[1]
19
+ end
20
+
21
+ def hash
22
+ children.hash
23
+ end
24
+
25
+ def eql?(other)
26
+ self.class == other.class &&
27
+ self.children == other.children
28
+ end
29
+ alias :== :eql?
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Ascending < Ordering
6
+ def reverse
7
+ Descending.new(expr)
8
+ end
9
+
10
+ def direction
11
+ :asc
12
+ end
13
+
14
+ def ascending?
15
+ true
16
+ end
17
+
18
+ def descending?
19
+ false
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Binary < Arel::Nodes::NodeExpression
6
+ attr_accessor :left, :right
7
+
8
+ def initialize(left, right)
9
+ super()
10
+ @left = left
11
+ @right = right
12
+ end
13
+
14
+ def initialize_copy(other)
15
+ super
16
+ @left = @left.clone if @left
17
+ @right = @right.clone if @right
18
+ end
19
+
20
+ def hash
21
+ [self.class, @left, @right].hash
22
+ end
23
+
24
+ def eql?(other)
25
+ self.class == other.class &&
26
+ self.left == other.left &&
27
+ self.right == other.right
28
+ end
29
+ alias :== :eql?
30
+ end
31
+
32
+ module FetchAttribute
33
+ def fetch_attribute
34
+ if left.is_a?(Arel::Attributes::Attribute)
35
+ yield left
36
+ elsif right.is_a?(Arel::Attributes::Attribute)
37
+ yield right
38
+ end
39
+ end
40
+ end
41
+
42
+ class Between < Binary; include FetchAttribute; end
43
+
44
+ class GreaterThan < Binary
45
+ include FetchAttribute
46
+
47
+ def invert
48
+ Arel::Nodes::LessThanOrEqual.new(left, right)
49
+ end
50
+ end
51
+
52
+ class GreaterThanOrEqual < Binary
53
+ include FetchAttribute
54
+
55
+ def invert
56
+ Arel::Nodes::LessThan.new(left, right)
57
+ end
58
+ end
59
+
60
+ class LessThan < Binary
61
+ include FetchAttribute
62
+
63
+ def invert
64
+ Arel::Nodes::GreaterThanOrEqual.new(left, right)
65
+ end
66
+ end
67
+
68
+ class LessThanOrEqual < Binary
69
+ include FetchAttribute
70
+
71
+ def invert
72
+ Arel::Nodes::GreaterThan.new(left, right)
73
+ end
74
+ end
75
+
76
+ class IsDistinctFrom < Binary
77
+ include FetchAttribute
78
+
79
+ def invert
80
+ Arel::Nodes::IsNotDistinctFrom.new(left, right)
81
+ end
82
+ end
83
+
84
+ class IsNotDistinctFrom < Binary
85
+ include FetchAttribute
86
+
87
+ def invert
88
+ Arel::Nodes::IsDistinctFrom.new(left, right)
89
+ end
90
+ end
91
+
92
+ class NotEqual < Binary
93
+ include FetchAttribute
94
+
95
+ def invert
96
+ Arel::Nodes::Equality.new(left, right)
97
+ end
98
+ end
99
+
100
+ class NotIn < Binary
101
+ include FetchAttribute
102
+
103
+ def invert
104
+ Arel::Nodes::In.new(left, right)
105
+ end
106
+ end
107
+
108
+ class Or < Binary
109
+ def fetch_attribute(&block)
110
+ left.fetch_attribute(&block) && right.fetch_attribute(&block)
111
+ end
112
+ end
113
+
114
+ %w{
115
+ As
116
+ Assignment
117
+ Join
118
+ Union
119
+ UnionAll
120
+ Intersect
121
+ Except
122
+ }.each do |name|
123
+ const_set name, Class.new(Binary)
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class BindParam < Node
6
+ attr_reader :value
7
+
8
+ def initialize(value)
9
+ @value = value
10
+ super()
11
+ end
12
+
13
+ def hash
14
+ [self.class, self.value].hash
15
+ end
16
+
17
+ def eql?(other)
18
+ other.is_a?(BindParam) &&
19
+ value == other.value
20
+ end
21
+ alias :== :eql?
22
+
23
+ def nil?
24
+ value.nil?
25
+ end
26
+
27
+ def value_before_type_cast
28
+ if value.respond_to?(:value_before_type_cast)
29
+ value.value_before_type_cast
30
+ else
31
+ value
32
+ end
33
+ end
34
+
35
+ def infinite?
36
+ value.respond_to?(:infinite?) && value.infinite?
37
+ end
38
+
39
+ def unboundable?
40
+ value.respond_to?(:unboundable?) && value.unboundable?
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Case < Arel::Nodes::NodeExpression
6
+ attr_accessor :case, :conditions, :default
7
+
8
+ def initialize(expression = nil, default = nil)
9
+ @case = expression
10
+ @conditions = []
11
+ @default = default
12
+ end
13
+
14
+ def when(condition, expression = nil)
15
+ @conditions << When.new(Nodes.build_quoted(condition), expression)
16
+ self
17
+ end
18
+
19
+ def then(expression)
20
+ @conditions.last.right = Nodes.build_quoted(expression)
21
+ self
22
+ end
23
+
24
+ def else(expression)
25
+ @default = Else.new Nodes.build_quoted(expression)
26
+ self
27
+ end
28
+
29
+ def initialize_copy(other)
30
+ super
31
+ @case = @case.clone if @case
32
+ @conditions = @conditions.map { |x| x.clone }
33
+ @default = @default.clone if @default
34
+ end
35
+
36
+ def hash
37
+ [@case, @conditions, @default].hash
38
+ end
39
+
40
+ def eql?(other)
41
+ self.class == other.class &&
42
+ self.case == other.case &&
43
+ self.conditions == other.conditions &&
44
+ self.default == other.default
45
+ end
46
+ alias :== :eql?
47
+ end
48
+
49
+ class When < Binary # :nodoc:
50
+ end
51
+
52
+ class Else < Unary # :nodoc:
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Casted < Arel::Nodes::NodeExpression # :nodoc:
6
+ attr_reader :value, :attribute
7
+ alias :value_before_type_cast :value
8
+
9
+ def initialize(value, attribute)
10
+ @value = value
11
+ @attribute = attribute
12
+ super()
13
+ end
14
+
15
+ def nil?; value.nil?; end
16
+
17
+ def value_for_database
18
+ if attribute.able_to_type_cast?
19
+ attribute.type_cast_for_database(value)
20
+ else
21
+ value
22
+ end
23
+ end
24
+
25
+ def hash
26
+ [self.class, value, attribute].hash
27
+ end
28
+
29
+ def eql?(other)
30
+ self.class == other.class &&
31
+ self.value == other.value &&
32
+ self.attribute == other.attribute
33
+ end
34
+ alias :== :eql?
35
+ end
36
+
37
+ class Quoted < Arel::Nodes::Unary # :nodoc:
38
+ alias :value_for_database :value
39
+ alias :value_before_type_cast :value
40
+
41
+ def nil?; value.nil?; end
42
+
43
+ def infinite?
44
+ value.respond_to?(:infinite?) && value.infinite?
45
+ end
46
+ end
47
+
48
+ def self.build_quoted(other, attribute = nil)
49
+ case other
50
+ when Arel::Nodes::Node, Arel::Attributes::Attribute, Arel::Table, Arel::Nodes::BindParam, Arel::SelectManager, Arel::Nodes::Quoted, Arel::Nodes::SqlLiteral
51
+ other
52
+ else
53
+ case attribute
54
+ when Arel::Attributes::Attribute
55
+ Casted.new other, attribute
56
+ else
57
+ Quoted.new other
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Comment < Arel::Nodes::Node
6
+ attr_reader :values
7
+
8
+ def initialize(values)
9
+ super()
10
+ @values = values
11
+ end
12
+
13
+ def initialize_copy(other)
14
+ super
15
+ @values = @values.clone
16
+ end
17
+
18
+ def hash
19
+ [@values].hash
20
+ end
21
+
22
+ def eql?(other)
23
+ self.class == other.class &&
24
+ self.values == other.values
25
+ end
26
+ alias :== :eql?
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Count < Arel::Nodes::Function
6
+ def initialize(expr, distinct = false, aliaz = nil)
7
+ super(expr, aliaz)
8
+ @distinct = distinct
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class DeleteStatement < Arel::Nodes::Node
6
+ attr_accessor :left, :right, :orders, :limit, :offset, :key
7
+
8
+ alias :relation :left
9
+ alias :relation= :left=
10
+ alias :wheres :right
11
+ alias :wheres= :right=
12
+
13
+ def initialize(relation = nil, wheres = [])
14
+ super()
15
+ @left = relation
16
+ @right = wheres
17
+ @orders = []
18
+ @limit = nil
19
+ @offset = nil
20
+ @key = nil
21
+ end
22
+
23
+ def initialize_copy(other)
24
+ super
25
+ @left = @left.clone if @left
26
+ @right = @right.clone if @right
27
+ end
28
+
29
+ def hash
30
+ [self.class, @left, @right, @orders, @limit, @offset, @key].hash
31
+ end
32
+
33
+ def eql?(other)
34
+ self.class == other.class &&
35
+ self.left == other.left &&
36
+ self.right == other.right &&
37
+ self.orders == other.orders &&
38
+ self.limit == other.limit &&
39
+ self.offset == other.offset &&
40
+ self.key == other.key
41
+ end
42
+ alias :== :eql?
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Descending < Ordering
6
+ def reverse
7
+ Ascending.new(expr)
8
+ end
9
+
10
+ def direction
11
+ :desc
12
+ end
13
+
14
+ def ascending?
15
+ false
16
+ end
17
+
18
+ def descending?
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Equality < Arel::Nodes::Binary
6
+ include FetchAttribute
7
+
8
+ def equality?; true; end
9
+
10
+ def invert
11
+ Arel::Nodes::NotEqual.new(left, right)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Extract < Arel::Nodes::Unary
6
+ attr_accessor :field
7
+
8
+ def initialize(expr, field)
9
+ super(expr)
10
+ @field = field
11
+ end
12
+
13
+ def hash
14
+ super ^ @field.hash
15
+ end
16
+
17
+ def eql?(other)
18
+ super &&
19
+ self.field == other.field
20
+ end
21
+ alias :== :eql?
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class False < 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,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class FullOuterJoin < Arel::Nodes::Join
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Function < Arel::Nodes::NodeExpression
6
+ include Arel::WindowPredications
7
+ attr_accessor :expressions, :alias, :distinct
8
+
9
+ def initialize(expr, aliaz = nil)
10
+ super()
11
+ @expressions = expr
12
+ @alias = aliaz && SqlLiteral.new(aliaz)
13
+ @distinct = false
14
+ end
15
+
16
+ def as(aliaz)
17
+ self.alias = SqlLiteral.new(aliaz)
18
+ self
19
+ end
20
+
21
+ def hash
22
+ [@expressions, @alias, @distinct].hash
23
+ end
24
+
25
+ def eql?(other)
26
+ self.class == other.class &&
27
+ self.expressions == other.expressions &&
28
+ self.alias == other.alias &&
29
+ self.distinct == other.distinct
30
+ end
31
+ alias :== :eql?
32
+ end
33
+
34
+ %w{
35
+ Sum
36
+ Exists
37
+ Max
38
+ Min
39
+ Avg
40
+ }.each do |name|
41
+ const_set(name, Class.new(Function))
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Grouping < Unary
6
+ def fetch_attribute(&block)
7
+ expr.fetch_attribute(&block)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class HomogeneousIn < Node
6
+ attr_reader :attribute, :values, :type
7
+
8
+ def initialize(values, attribute, type)
9
+ @values = values
10
+ @attribute = attribute
11
+ @type = type
12
+ end
13
+
14
+ def hash
15
+ ivars.hash
16
+ end
17
+
18
+ def eql?(other)
19
+ super || (self.class == other.class && self.ivars == other.ivars)
20
+ end
21
+ alias :== :eql?
22
+
23
+ def equality?
24
+ type == :in
25
+ end
26
+
27
+ def invert
28
+ Arel::Nodes::HomogeneousIn.new(values, attribute, type == :in ? :notin : :in)
29
+ end
30
+
31
+ def left
32
+ attribute
33
+ end
34
+
35
+ def right
36
+ attribute.quoted_array(values)
37
+ end
38
+
39
+ def table_name
40
+ attribute.relation.table_alias || attribute.relation.name
41
+ end
42
+
43
+ def column_name
44
+ attribute.name
45
+ end
46
+
47
+ def casted_values
48
+ type = attribute.type_caster
49
+
50
+ casted_values = values.map do |raw_value|
51
+ type.serialize(raw_value) if type.serializable?(raw_value)
52
+ end
53
+
54
+ casted_values.compact!
55
+ casted_values
56
+ end
57
+
58
+ def proc_for_binds
59
+ -> value { ActiveModel::Attribute.with_cast_value(attribute.name, value, attribute.type_caster) }
60
+ end
61
+
62
+ def fetch_attribute(&block)
63
+ if attribute
64
+ yield attribute
65
+ else
66
+ expr.fetch_attribute(&block)
67
+ end
68
+ end
69
+
70
+ protected
71
+ def ivars
72
+ [@attribute, @values, @type]
73
+ end
74
+ end
75
+ end
76
+ end