activerecord 5.0.7.2 → 6.0.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 (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +844 -1944
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +9 -7
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +18 -14
  10. data/lib/active_record/associations/alias_tracker.rb +24 -34
  11. data/lib/active_record/associations/association.rb +113 -55
  12. data/lib/active_record/associations/association_scope.rb +102 -96
  13. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +18 -25
  16. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  17. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
  19. data/lib/active_record/associations/builder/has_many.rb +4 -0
  20. data/lib/active_record/associations/builder/has_one.rb +37 -1
  21. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  22. data/lib/active_record/associations/collection_association.rb +93 -254
  23. data/lib/active_record/associations/collection_proxy.rb +159 -122
  24. data/lib/active_record/associations/foreign_association.rb +9 -0
  25. data/lib/active_record/associations/has_many_association.rb +23 -30
  26. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  27. data/lib/active_record/associations/has_one_association.rb +59 -54
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +152 -177
  33. data/lib/active_record/associations/preloader/association.rb +101 -97
  34. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  35. data/lib/active_record/associations/preloader.rb +94 -103
  36. data/lib/active_record/associations/singular_association.rb +12 -45
  37. data/lib/active_record/associations/through_association.rb +27 -15
  38. data/lib/active_record/associations.rb +1603 -1592
  39. data/lib/active_record/attribute_assignment.rb +54 -61
  40. data/lib/active_record/attribute_decorators.rb +38 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
  42. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  43. data/lib/active_record/attribute_methods/primary_key.rb +85 -92
  44. data/lib/active_record/attribute_methods/query.rb +4 -3
  45. data/lib/active_record/attribute_methods/read.rb +20 -49
  46. data/lib/active_record/attribute_methods/serialization.rb +29 -7
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
  48. data/lib/active_record/attribute_methods/write.rb +34 -33
  49. data/lib/active_record/attribute_methods.rb +66 -106
  50. data/lib/active_record/attributes.rb +38 -25
  51. data/lib/active_record/autosave_association.rb +58 -39
  52. data/lib/active_record/base.rb +27 -24
  53. data/lib/active_record/callbacks.rb +64 -35
  54. data/lib/active_record/coders/json.rb +2 -0
  55. data/lib/active_record/coders/yaml_column.rb +34 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
  69. data/lib/active_record/connection_adapters/column.rb +41 -13
  70. data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  99. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
  117. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
  127. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  128. data/lib/active_record/connection_handling.rb +143 -40
  129. data/lib/active_record/core.rb +207 -160
  130. data/lib/active_record/counter_cache.rb +60 -28
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -87
  137. data/lib/active_record/enum.rb +67 -23
  138. data/lib/active_record/errors.rb +114 -18
  139. data/lib/active_record/explain.rb +4 -4
  140. data/lib/active_record/explain_registry.rb +3 -1
  141. data/lib/active_record/explain_subscriber.rb +9 -4
  142. data/lib/active_record/fixture_set/file.rb +13 -8
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +194 -504
  148. data/lib/active_record/gem_version.rb +5 -3
  149. data/lib/active_record/inheritance.rb +150 -99
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +116 -25
  152. data/lib/active_record/internal_metadata.rb +16 -19
  153. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  154. data/lib/active_record/locking/optimistic.rb +85 -86
  155. data/lib/active_record/locking/pessimistic.rb +18 -6
  156. data/lib/active_record/log_subscriber.rb +48 -29
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  159. data/lib/active_record/middleware/database_selector.rb +74 -0
  160. data/lib/active_record/migration/command_recorder.rb +134 -100
  161. data/lib/active_record/migration/compatibility.rb +174 -56
  162. data/lib/active_record/migration/join_table.rb +8 -7
  163. data/lib/active_record/migration.rb +369 -302
  164. data/lib/active_record/model_schema.rb +160 -127
  165. data/lib/active_record/nested_attributes.rb +213 -202
  166. data/lib/active_record/no_touching.rb +12 -3
  167. data/lib/active_record/null_relation.rb +12 -34
  168. data/lib/active_record/persistence.rb +446 -77
  169. data/lib/active_record/query_cache.rb +13 -12
  170. data/lib/active_record/querying.rb +37 -24
  171. data/lib/active_record/railtie.rb +128 -36
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +2 -0
  174. data/lib/active_record/railties/controller_runtime.rb +34 -33
  175. data/lib/active_record/railties/databases.rake +312 -177
  176. data/lib/active_record/readonly_attributes.rb +5 -4
  177. data/lib/active_record/reflection.rb +214 -254
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  179. data/lib/active_record/relation/batches.rb +98 -52
  180. data/lib/active_record/relation/calculations.rb +212 -173
  181. data/lib/active_record/relation/delegation.rb +73 -69
  182. data/lib/active_record/relation/finder_methods.rb +207 -247
  183. data/lib/active_record/relation/from_clause.rb +6 -8
  184. data/lib/active_record/relation/merger.rb +82 -61
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  192. data/lib/active_record/relation/predicate_builder.rb +83 -105
  193. data/lib/active_record/relation/query_attribute.rb +33 -2
  194. data/lib/active_record/relation/query_methods.rb +488 -332
  195. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  196. data/lib/active_record/relation/spawn_methods.rb +8 -8
  197. data/lib/active_record/relation/where_clause.rb +111 -96
  198. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  199. data/lib/active_record/relation.rb +443 -318
  200. data/lib/active_record/result.rb +69 -40
  201. data/lib/active_record/runtime_registry.rb +5 -3
  202. data/lib/active_record/sanitization.rb +83 -99
  203. data/lib/active_record/schema.rb +7 -14
  204. data/lib/active_record/schema_dumper.rb +71 -69
  205. data/lib/active_record/schema_migration.rb +16 -6
  206. data/lib/active_record/scoping/default.rb +92 -95
  207. data/lib/active_record/scoping/named.rb +51 -26
  208. data/lib/active_record/scoping.rb +20 -20
  209. data/lib/active_record/secure_token.rb +4 -2
  210. data/lib/active_record/serialization.rb +2 -0
  211. data/lib/active_record/statement_cache.rb +63 -28
  212. data/lib/active_record/store.rb +121 -41
  213. data/lib/active_record/suppressor.rb +6 -3
  214. data/lib/active_record/table_metadata.rb +39 -18
  215. data/lib/active_record/tasks/database_tasks.rb +271 -81
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +243 -0
  221. data/lib/active_record/timestamp.rb +70 -36
  222. data/lib/active_record/touch_later.rb +8 -6
  223. data/lib/active_record/transactions.rb +141 -157
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  226. data/lib/active_record/type/date.rb +2 -0
  227. data/lib/active_record/type/date_time.rb +2 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  230. data/lib/active_record/type/internal/timezone.rb +2 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +16 -9
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +12 -1
  235. data/lib/active_record/type/type_map.rb +14 -17
  236. data/lib/active_record/type/unsigned_integer.rb +16 -0
  237. data/lib/active_record/type.rb +23 -18
  238. data/lib/active_record/type_caster/connection.rb +17 -12
  239. data/lib/active_record/type_caster/map.rb +5 -4
  240. data/lib/active_record/type_caster.rb +4 -2
  241. data/lib/active_record/validations/absence.rb +2 -0
  242. data/lib/active_record/validations/associated.rb +3 -2
  243. data/lib/active_record/validations/length.rb +2 -0
  244. data/lib/active_record/validations/presence.rb +4 -2
  245. data/lib/active_record/validations/uniqueness.rb +29 -42
  246. data/lib/active_record/validations.rb +7 -5
  247. data/lib/active_record/version.rb +3 -1
  248. data/lib/active_record.rb +37 -22
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +256 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +203 -0
  315. data/lib/arel/visitors/dot.rb +296 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +156 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +158 -0
  321. data/lib/arel/visitors/oracle12.rb +65 -0
  322. data/lib/arel/visitors/postgresql.rb +109 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +888 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors/where_sql.rb +22 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +62 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
  332. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
  334. data/lib/rails/generators/active_record/migration.rb +17 -3
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record.rb +7 -5
  338. metadata +138 -52
  339. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  340. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  341. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  343. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  344. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  345. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  346. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  349. data/lib/active_record/attribute_set/builder.rb +0 -132
  350. data/lib/active_record/attribute_set.rb +0 -110
  351. data/lib/active_record/collection_cache_key.rb +0 -50
  352. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  353. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  354. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  355. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  356. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  357. data/lib/active_record/type/internal/abstract_json.rb +0 -33
  358. /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  359. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,21 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  module Associations
3
5
  class JoinDependency # :nodoc:
4
- autoload :JoinBase, 'active_record/associations/join_dependency/join_base'
5
- autoload :JoinAssociation, 'active_record/associations/join_dependency/join_association'
6
+ autoload :JoinBase, "active_record/associations/join_dependency/join_base"
7
+ autoload :JoinAssociation, "active_record/associations/join_dependency/join_association"
6
8
 
7
9
  class Aliases # :nodoc:
8
10
  def initialize(tables)
9
11
  @tables = tables
10
- @alias_cache = tables.each_with_object({}) { |table,h|
11
- h[table.node] = table.columns.each_with_object({}) { |column,i|
12
+ @alias_cache = tables.each_with_object({}) { |table, h|
13
+ h[table.node] = table.columns.each_with_object({}) { |column, i|
12
14
  i[column.name] = column.alias
13
15
  }
14
16
  }
15
- @name_and_alias_cache = tables.each_with_object({}) { |table,h|
16
- h[table.node] = table.columns.map { |column|
17
- [column.name, column.alias]
18
- }
17
+ @columns_cache = tables.each_with_object({}) { |table, h|
18
+ h[table.node] = table.columns
19
19
  }
20
20
  end
21
21
 
@@ -23,30 +23,23 @@ module ActiveRecord
23
23
  @tables.flat_map(&:column_aliases)
24
24
  end
25
25
 
26
- # An array of [column_name, alias] pairs for the table
27
26
  def column_aliases(node)
28
- @name_and_alias_cache[node]
27
+ @columns_cache[node]
29
28
  end
30
29
 
31
30
  def column_alias(node, column)
32
31
  @alias_cache[node][column]
33
32
  end
34
33
 
35
- class Table < Struct.new(:node, :columns) # :nodoc:
36
- def table
37
- Arel::Nodes::TableAlias.new node.table, node.aliased_table_name
38
- end
39
-
34
+ Table = Struct.new(:node, :columns) do # :nodoc:
40
35
  def column_aliases
41
- t = table
36
+ t = node.table
42
37
  columns.map { |column| t[column.name].as Arel.sql column.alias }
43
38
  end
44
39
  end
45
40
  Column = Struct.new(:name, :alias)
46
41
  end
47
42
 
48
- attr_reader :alias_tracker, :base_klass, :join_root
49
-
50
43
  def self.make_tree(associations)
51
44
  hash = {}
52
45
  walk_tree associations, hash
@@ -62,7 +55,7 @@ module ActiveRecord
62
55
  walk_tree assoc, hash
63
56
  end
64
57
  when Hash
65
- associations.each do |k,v|
58
+ associations.each do |k, v|
66
59
  cache = hash[k] ||= {}
67
60
  walk_tree v, cache
68
61
  end
@@ -71,69 +64,37 @@ module ActiveRecord
71
64
  end
72
65
  end
73
66
 
74
- # base is the base class on which operation is taking place.
75
- # associations is the list of associations which are joined using hash, symbol or array.
76
- # joins is the list of all string join commands and arel nodes.
77
- #
78
- # Example :
79
- #
80
- # class Physician < ActiveRecord::Base
81
- # has_many :appointments
82
- # has_many :patients, through: :appointments
83
- # end
84
- #
85
- # If I execute `@physician.patients.to_a` then
86
- # base # => Physician
87
- # associations # => []
88
- # joins # => [#<Arel::Nodes::InnerJoin: ...]
89
- #
90
- # However if I execute `Physician.joins(:appointments).to_a` then
91
- # base # => Physician
92
- # associations # => [:appointments]
93
- # joins # => []
94
- #
95
- def initialize(base, associations, joins)
96
- @alias_tracker = AliasTracker.create_with_joins(base.connection, base.table_name, joins, base.type_caster)
67
+ def initialize(base, table, associations, join_type)
97
68
  tree = self.class.make_tree associations
98
- @join_root = JoinBase.new base, build(tree, base)
99
- @join_root.children.each { |child| construct_tables! @join_root, child }
69
+ @join_root = JoinBase.new(base, table, build(tree, base))
70
+ @join_type = join_type
71
+ end
72
+
73
+ def base_klass
74
+ join_root.base_klass
100
75
  end
101
76
 
102
77
  def reflections
103
78
  join_root.drop(1).map!(&:reflection)
104
79
  end
105
80
 
106
- def join_constraints(outer_joins, join_type)
107
- joins = join_root.children.flat_map { |child|
81
+ def join_constraints(joins_to_add, alias_tracker)
82
+ @alias_tracker = alias_tracker
108
83
 
109
- if join_type == Arel::Nodes::OuterJoin
110
- make_left_outer_joins join_root, child
111
- else
112
- make_inner_joins join_root, child
113
- end
114
- }
84
+ construct_tables!(join_root)
85
+ joins = make_join_constraints(join_root, join_type)
115
86
 
116
- joins.concat outer_joins.flat_map { |oj|
87
+ joins.concat joins_to_add.flat_map { |oj|
88
+ construct_tables!(oj.join_root)
117
89
  if join_root.match? oj.join_root
118
- walk join_root, oj.join_root
90
+ walk(join_root, oj.join_root, oj.join_type)
119
91
  else
120
- oj.join_root.children.flat_map { |child|
121
- make_outer_joins oj.join_root, child
122
- }
92
+ make_join_constraints(oj.join_root, oj.join_type)
123
93
  end
124
94
  }
125
95
  end
126
96
 
127
- def aliases
128
- Aliases.new join_root.each_with_index.map { |join_part,i|
129
- columns = join_part.column_names.each_with_index.map { |column_name,j|
130
- Aliases::Column.new column_name, "t#{i}_r#{j}"
131
- }
132
- Aliases::Table.new(join_part, columns)
133
- }
134
- end
135
-
136
- def instantiate(result_set, aliases)
97
+ def instantiate(result_set, &block)
137
98
  primary_key = aliases.column_alias(join_root, join_root.primary_key)
138
99
 
139
100
  seen = Hash.new { |i, object_id|
@@ -142,9 +103,19 @@ module ActiveRecord
142
103
  }
143
104
  }
144
105
 
145
- model_cache = Hash.new { |h,klass| h[klass] = {} }
106
+ model_cache = Hash.new { |h, klass| h[klass] = {} }
146
107
  parents = model_cache[join_root]
147
- column_aliases = aliases.column_aliases join_root
108
+
109
+ column_aliases = aliases.column_aliases(join_root)
110
+ column_names = explicit_selections(column_aliases, result_set)
111
+
112
+ if column_names.empty?
113
+ column_types = {}
114
+ else
115
+ column_types = result_set.column_types
116
+ column_types = column_types.slice(*column_names) unless column_types.empty?
117
+ column_aliases += column_names.map! { |name| Aliases::Column.new(name, name) }
118
+ end
148
119
 
149
120
  message_bus = ActiveSupport::Notifications.instrumenter
150
121
 
@@ -153,152 +124,156 @@ module ActiveRecord
153
124
  class_name: join_root.base_klass.name
154
125
  }
155
126
 
156
- message_bus.instrument('instantiation.active_record', payload) do
127
+ message_bus.instrument("instantiation.active_record", payload) do
157
128
  result_set.each { |row_hash|
158
129
  parent_key = primary_key ? row_hash[primary_key] : row_hash
159
- parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases)
160
- construct(parent, join_root, row_hash, result_set, seen, model_cache, aliases)
130
+ parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases, column_types, &block)
131
+ construct(parent, join_root, row_hash, seen, model_cache)
161
132
  }
162
133
  end
163
134
 
164
135
  parents.values
165
136
  end
166
137
 
167
- private
168
-
169
- def make_constraints(parent, child, tables, join_type)
170
- chain = child.reflection.chain
171
- foreign_table = parent.table
172
- foreign_klass = parent.base_klass
173
- child.join_constraints(foreign_table, foreign_klass, child, join_type, tables, child.reflection.scope_chain, chain)
138
+ def apply_column_aliases(relation)
139
+ relation._select!(-> { aliases.columns })
174
140
  end
175
141
 
176
- def make_outer_joins(parent, child)
177
- tables = table_aliases_for(parent, child)
178
- join_type = Arel::Nodes::OuterJoin
179
- info = make_constraints parent, child, tables, join_type
142
+ protected
143
+ attr_reader :join_root, :join_type
180
144
 
181
- [info] + child.children.flat_map { |c| make_outer_joins(child, c) }
182
- end
145
+ private
146
+ attr_reader :alias_tracker
183
147
 
184
- def make_left_outer_joins(parent, child)
185
- tables = child.tables
186
- join_type = Arel::Nodes::OuterJoin
187
- info = make_constraints parent, child, tables, join_type
148
+ def explicit_selections(root_column_aliases, result_set)
149
+ root_names = root_column_aliases.map(&:name).to_set
150
+ result_set.columns.each_with_object([]) do |name, result|
151
+ result << name unless /\At\d+_r\d+\z/.match?(name) || root_names.include?(name)
152
+ end
153
+ end
188
154
 
189
- [info] + child.children.flat_map { |c| make_left_outer_joins(child, c) }
190
- end
155
+ def aliases
156
+ @aliases ||= Aliases.new join_root.each_with_index.map { |join_part, i|
157
+ columns = join_part.column_names.each_with_index.map { |column_name, j|
158
+ Aliases::Column.new column_name, "t#{i}_r#{j}"
159
+ }
160
+ Aliases::Table.new(join_part, columns)
161
+ }
162
+ end
191
163
 
192
- def make_inner_joins(parent, child)
193
- tables = child.tables
194
- join_type = Arel::Nodes::InnerJoin
195
- info = make_constraints parent, child, tables, join_type
164
+ def construct_tables!(join_root)
165
+ join_root.each_children do |parent, child|
166
+ child.tables = table_aliases_for(parent, child)
167
+ end
168
+ end
196
169
 
197
- [info] + child.children.flat_map { |c| make_inner_joins(child, c) }
198
- end
170
+ def make_join_constraints(join_root, join_type)
171
+ join_root.children.flat_map do |child|
172
+ make_constraints(join_root, child, join_type)
173
+ end
174
+ end
199
175
 
200
- def table_aliases_for(parent, node)
201
- node.reflection.chain.map { |reflection|
202
- alias_tracker.aliased_table_for(
203
- reflection.table_name,
204
- table_alias_for(reflection, parent, reflection != node.reflection)
205
- )
206
- }
207
- end
176
+ def make_constraints(parent, child, join_type)
177
+ foreign_table = parent.table
178
+ foreign_klass = parent.base_klass
179
+ joins = child.join_constraints(foreign_table, foreign_klass, join_type, alias_tracker)
180
+ joins.concat child.children.flat_map { |c| make_constraints(child, c, join_type) }
181
+ end
208
182
 
209
- def construct_tables!(parent, node)
210
- node.tables = table_aliases_for(parent, node)
211
- node.children.each { |child| construct_tables! node, child }
212
- end
183
+ def table_aliases_for(parent, node)
184
+ node.reflection.chain.map { |reflection|
185
+ alias_tracker.aliased_table_for(
186
+ reflection.table_name,
187
+ table_alias_for(reflection, parent, reflection != node.reflection),
188
+ reflection.klass.type_caster
189
+ )
190
+ }
191
+ end
213
192
 
214
- def table_alias_for(reflection, parent, join)
215
- name = "#{reflection.plural_name}_#{parent.table_name}"
216
- name << "_join" if join
217
- name
218
- end
193
+ def table_alias_for(reflection, parent, join)
194
+ name = reflection.alias_candidate(parent.table_name)
195
+ join ? "#{name}_join" : name
196
+ end
219
197
 
220
- def walk(left, right)
221
- intersection, missing = right.children.map { |node1|
222
- [left.children.find { |node2| node1.match? node2 }, node1]
223
- }.partition(&:first)
198
+ def walk(left, right, join_type)
199
+ intersection, missing = right.children.map { |node1|
200
+ [left.children.find { |node2| node1.match? node2 }, node1]
201
+ }.partition(&:first)
224
202
 
225
- ojs = missing.flat_map { |_,n| make_outer_joins left, n }
226
- intersection.flat_map { |l,r| walk l, r }.concat ojs
227
- end
203
+ joins = intersection.flat_map { |l, r| r.table = l.table; walk(l, r, join_type) }
204
+ joins.concat missing.flat_map { |_, n| make_constraints(left, n, join_type) }
205
+ end
228
206
 
229
- def find_reflection(klass, name)
230
- klass._reflect_on_association(name) or
231
- raise ConfigurationError, "Can't join '#{ klass.name }' to association named '#{ name }'; perhaps you misspelled it?"
232
- end
207
+ def find_reflection(klass, name)
208
+ klass._reflect_on_association(name) ||
209
+ raise(ConfigurationError, "Can't join '#{klass.name}' to association named '#{name}'; perhaps you misspelled it?")
210
+ end
233
211
 
234
- def build(associations, base_klass)
235
- associations.map do |name, right|
236
- reflection = find_reflection base_klass, name
237
- reflection.check_validity!
238
- reflection.check_eager_loadable!
212
+ def build(associations, base_klass)
213
+ associations.map do |name, right|
214
+ reflection = find_reflection base_klass, name
215
+ reflection.check_validity!
216
+ reflection.check_eager_loadable!
239
217
 
240
- if reflection.polymorphic?
241
- raise EagerLoadPolymorphicError.new(reflection)
242
- end
218
+ if reflection.polymorphic?
219
+ raise EagerLoadPolymorphicError.new(reflection)
220
+ end
243
221
 
244
- JoinAssociation.new reflection, build(right, reflection.klass)
222
+ JoinAssociation.new(reflection, build(right, reflection.klass))
223
+ end
245
224
  end
246
- end
247
225
 
248
- def construct(ar_parent, parent, row, rs, seen, model_cache, aliases)
249
- return if ar_parent.nil?
250
-
251
- parent.children.each do |node|
252
- if node.reflection.collection?
253
- other = ar_parent.association(node.reflection.name)
254
- other.loaded!
255
- elsif ar_parent.association_cached?(node.reflection.name)
256
- model = ar_parent.association(node.reflection.name).target
257
- construct(model, node, row, rs, seen, model_cache, aliases)
258
- next
259
- end
226
+ def construct(ar_parent, parent, row, seen, model_cache)
227
+ return if ar_parent.nil?
228
+
229
+ parent.children.each do |node|
230
+ if node.reflection.collection?
231
+ other = ar_parent.association(node.reflection.name)
232
+ other.loaded!
233
+ elsif ar_parent.association_cached?(node.reflection.name)
234
+ model = ar_parent.association(node.reflection.name).target
235
+ construct(model, node, row, seen, model_cache)
236
+ next
237
+ end
260
238
 
261
- key = aliases.column_alias(node, node.primary_key)
262
- id = row[key]
263
- if id.nil?
264
- nil_association = ar_parent.association(node.reflection.name)
265
- nil_association.loaded!
266
- next
267
- end
239
+ key = aliases.column_alias(node, node.primary_key)
240
+ id = row[key]
241
+ if id.nil?
242
+ nil_association = ar_parent.association(node.reflection.name)
243
+ nil_association.loaded!
244
+ next
245
+ end
268
246
 
269
- model = seen[ar_parent.object_id][node.base_klass][id]
247
+ model = seen[ar_parent.object_id][node][id]
270
248
 
271
- if model
272
- construct(model, node, row, rs, seen, model_cache, aliases)
273
- else
274
- model = construct_model(ar_parent, node, row, model_cache, id, aliases)
249
+ if model
250
+ construct(model, node, row, seen, model_cache)
251
+ else
252
+ model = construct_model(ar_parent, node, row, model_cache, id)
275
253
 
276
- if node.reflection.scope_for(node.base_klass).readonly_value
277
- model.readonly!
254
+ seen[ar_parent.object_id][node][id] = model
255
+ construct(model, node, row, seen, model_cache)
278
256
  end
279
-
280
- seen[ar_parent.object_id][node.base_klass][id] = model
281
- construct(model, node, row, rs, seen, model_cache, aliases)
282
257
  end
283
258
  end
284
- end
285
259
 
286
- def construct_model(record, node, row, model_cache, id, aliases)
287
- other = record.association(node.reflection.name)
260
+ def construct_model(record, node, row, model_cache, id)
261
+ other = record.association(node.reflection.name)
262
+
263
+ model = model_cache[node][id] ||=
264
+ node.instantiate(row, aliases.column_aliases(node)) do |m|
265
+ other.set_inverse_instance(m)
266
+ end
288
267
 
289
- model = model_cache[node][id] ||=
290
- node.instantiate(row, aliases.column_aliases(node)) do |m|
291
- other.set_inverse_instance(m)
268
+ if node.reflection.collection?
269
+ other.target.push(model)
270
+ else
271
+ other.target = model
292
272
  end
293
273
 
294
- if node.reflection.collection?
295
- other.target.push(model)
296
- else
297
- other.target = model
274
+ model.readonly! if node.readonly?
275
+ model
298
276
  end
299
-
300
- model
301
- end
302
277
  end
303
278
  end
304
279
  end