activerecord 5.0.6 → 6.0.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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +638 -2023
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +8 -6
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/aggregations.rb +249 -246
  8. data/lib/active_record/association_relation.rb +24 -13
  9. data/lib/active_record/associations/alias_tracker.rb +24 -33
  10. data/lib/active_record/associations/association.rb +119 -56
  11. data/lib/active_record/associations/association_scope.rb +94 -94
  12. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  14. data/lib/active_record/associations/builder/association.rb +18 -25
  15. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  16. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +42 -61
  18. data/lib/active_record/associations/builder/has_many.rb +4 -0
  19. data/lib/active_record/associations/builder/has_one.rb +37 -1
  20. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  21. data/lib/active_record/associations/collection_association.rb +80 -252
  22. data/lib/active_record/associations/collection_proxy.rb +158 -121
  23. data/lib/active_record/associations/foreign_association.rb +9 -0
  24. data/lib/active_record/associations/has_many_association.rb +23 -29
  25. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  26. data/lib/active_record/associations/has_one_association.rb +59 -54
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +38 -90
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +12 -12
  31. data/lib/active_record/associations/join_dependency.rb +134 -176
  32. data/lib/active_record/associations/preloader/association.rb +84 -125
  33. data/lib/active_record/associations/preloader/through_association.rb +82 -75
  34. data/lib/active_record/associations/preloader.rb +90 -102
  35. data/lib/active_record/associations/singular_association.rb +12 -45
  36. data/lib/active_record/associations/through_association.rb +26 -14
  37. data/lib/active_record/associations.rb +1603 -1592
  38. data/lib/active_record/attribute_assignment.rb +54 -60
  39. data/lib/active_record/attribute_decorators.rb +38 -15
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -7
  41. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  42. data/lib/active_record/attribute_methods/primary_key.rb +86 -91
  43. data/lib/active_record/attribute_methods/query.rb +4 -3
  44. data/lib/active_record/attribute_methods/read.rb +21 -49
  45. data/lib/active_record/attribute_methods/serialization.rb +30 -7
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -64
  47. data/lib/active_record/attribute_methods/write.rb +35 -33
  48. data/lib/active_record/attribute_methods.rb +66 -106
  49. data/lib/active_record/attributes.rb +38 -24
  50. data/lib/active_record/autosave_association.rb +53 -32
  51. data/lib/active_record/base.rb +27 -24
  52. data/lib/active_record/callbacks.rb +63 -33
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -11
  55. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +553 -321
  56. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  57. data/lib/active_record/connection_adapters/abstract/database_statements.rb +213 -94
  58. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -28
  59. data/lib/active_record/connection_adapters/abstract/quoting.rb +119 -75
  60. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  61. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -27
  62. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +207 -126
  63. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  64. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +369 -199
  65. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
  66. data/lib/active_record/connection_adapters/abstract_adapter.rb +363 -202
  67. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +405 -551
  68. data/lib/active_record/connection_adapters/column.rb +41 -13
  69. data/lib/active_record/connection_adapters/connection_specification.rb +172 -138
  70. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  71. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  72. data/lib/active_record/connection_adapters/mysql/database_statements.rb +143 -49
  73. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -22
  74. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  75. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +50 -45
  76. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  77. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  78. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  79. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  80. data/lib/active_record/connection_adapters/mysql2_adapter.rb +49 -30
  81. data/lib/active_record/connection_adapters/postgresql/column.rb +22 -7
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +60 -54
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -10
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +4 -2
  91. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  92. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -3
  93. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -17
  94. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  96. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  98. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  99. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +31 -9
  100. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +34 -30
  101. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  102. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  103. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +9 -4
  104. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  107. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  108. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
  109. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  110. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  111. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +35 -32
  112. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +380 -300
  113. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  114. data/lib/active_record/connection_adapters/postgresql/utils.rb +10 -6
  115. data/lib/active_record/connection_adapters/postgresql_adapter.rb +382 -275
  116. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  117. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  118. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +74 -19
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +254 -262
  126. data/lib/active_record/connection_adapters/statement_pool.rb +9 -7
  127. data/lib/active_record/connection_handling.rb +159 -40
  128. data/lib/active_record/core.rb +202 -162
  129. data/lib/active_record/counter_cache.rb +57 -28
  130. data/lib/active_record/database_configurations/database_config.rb +37 -0
  131. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  132. data/lib/active_record/database_configurations/url_config.rb +79 -0
  133. data/lib/active_record/database_configurations.rb +233 -0
  134. data/lib/active_record/define_callbacks.rb +22 -0
  135. data/lib/active_record/dynamic_matchers.rb +87 -86
  136. data/lib/active_record/enum.rb +60 -23
  137. data/lib/active_record/errors.rb +114 -18
  138. data/lib/active_record/explain.rb +4 -3
  139. data/lib/active_record/explain_registry.rb +3 -1
  140. data/lib/active_record/explain_subscriber.rb +9 -4
  141. data/lib/active_record/fixture_set/file.rb +13 -8
  142. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  143. data/lib/active_record/fixture_set/render_context.rb +17 -0
  144. data/lib/active_record/fixture_set/table_row.rb +153 -0
  145. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  146. data/lib/active_record/fixtures.rb +195 -502
  147. data/lib/active_record/gem_version.rb +4 -2
  148. data/lib/active_record/inheritance.rb +151 -97
  149. data/lib/active_record/insert_all.rb +179 -0
  150. data/lib/active_record/integration.rb +116 -25
  151. data/lib/active_record/internal_metadata.rb +15 -18
  152. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  153. data/lib/active_record/locking/optimistic.rb +78 -87
  154. data/lib/active_record/locking/pessimistic.rb +18 -6
  155. data/lib/active_record/log_subscriber.rb +48 -29
  156. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  157. data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
  158. data/lib/active_record/middleware/database_selector.rb +75 -0
  159. data/lib/active_record/migration/command_recorder.rb +143 -97
  160. data/lib/active_record/migration/compatibility.rb +174 -56
  161. data/lib/active_record/migration/join_table.rb +8 -6
  162. data/lib/active_record/migration.rb +367 -300
  163. data/lib/active_record/model_schema.rb +145 -139
  164. data/lib/active_record/nested_attributes.rb +214 -201
  165. data/lib/active_record/no_touching.rb +10 -1
  166. data/lib/active_record/null_relation.rb +13 -34
  167. data/lib/active_record/persistence.rb +442 -72
  168. data/lib/active_record/query_cache.rb +15 -14
  169. data/lib/active_record/querying.rb +36 -23
  170. data/lib/active_record/railtie.rb +128 -36
  171. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  172. data/lib/active_record/railties/console_sandbox.rb +2 -0
  173. data/lib/active_record/railties/controller_runtime.rb +34 -33
  174. data/lib/active_record/railties/databases.rake +309 -177
  175. data/lib/active_record/readonly_attributes.rb +5 -4
  176. data/lib/active_record/reflection.rb +211 -249
  177. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  178. data/lib/active_record/relation/batches.rb +99 -52
  179. data/lib/active_record/relation/calculations.rb +211 -172
  180. data/lib/active_record/relation/delegation.rb +67 -65
  181. data/lib/active_record/relation/finder_methods.rb +208 -247
  182. data/lib/active_record/relation/from_clause.rb +2 -8
  183. data/lib/active_record/relation/merger.rb +78 -61
  184. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  185. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  186. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  187. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  188. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  189. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  190. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  191. data/lib/active_record/relation/predicate_builder.rb +86 -104
  192. data/lib/active_record/relation/query_attribute.rb +33 -2
  193. data/lib/active_record/relation/query_methods.rb +458 -329
  194. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  195. data/lib/active_record/relation/spawn_methods.rb +8 -7
  196. data/lib/active_record/relation/where_clause.rb +111 -95
  197. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  198. data/lib/active_record/relation.rb +429 -318
  199. data/lib/active_record/result.rb +69 -39
  200. data/lib/active_record/runtime_registry.rb +5 -3
  201. data/lib/active_record/sanitization.rb +83 -99
  202. data/lib/active_record/schema.rb +7 -14
  203. data/lib/active_record/schema_dumper.rb +71 -69
  204. data/lib/active_record/schema_migration.rb +15 -5
  205. data/lib/active_record/scoping/default.rb +93 -95
  206. data/lib/active_record/scoping/named.rb +45 -25
  207. data/lib/active_record/scoping.rb +20 -19
  208. data/lib/active_record/secure_token.rb +4 -2
  209. data/lib/active_record/serialization.rb +2 -0
  210. data/lib/active_record/statement_cache.rb +63 -28
  211. data/lib/active_record/store.rb +121 -41
  212. data/lib/active_record/suppressor.rb +4 -1
  213. data/lib/active_record/table_metadata.rb +26 -20
  214. data/lib/active_record/tasks/database_tasks.rb +276 -85
  215. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -90
  216. data/lib/active_record/tasks/postgresql_database_tasks.rb +78 -47
  217. data/lib/active_record/tasks/sqlite_database_tasks.rb +34 -16
  218. data/lib/active_record/test_databases.rb +23 -0
  219. data/lib/active_record/test_fixtures.rb +224 -0
  220. data/lib/active_record/timestamp.rb +70 -35
  221. data/lib/active_record/touch_later.rb +7 -4
  222. data/lib/active_record/transactions.rb +133 -149
  223. data/lib/active_record/translation.rb +3 -1
  224. data/lib/active_record/type/adapter_specific_registry.rb +44 -45
  225. data/lib/active_record/type/date.rb +2 -0
  226. data/lib/active_record/type/date_time.rb +2 -0
  227. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  228. data/lib/active_record/type/hash_lookup_type_map.rb +5 -3
  229. data/lib/active_record/type/internal/timezone.rb +2 -0
  230. data/lib/active_record/type/json.rb +30 -0
  231. data/lib/active_record/type/serialized.rb +16 -8
  232. data/lib/active_record/type/text.rb +11 -0
  233. data/lib/active_record/type/time.rb +2 -1
  234. data/lib/active_record/type/type_map.rb +13 -15
  235. data/lib/active_record/type/unsigned_integer.rb +17 -0
  236. data/lib/active_record/type.rb +23 -17
  237. data/lib/active_record/type_caster/connection.rb +17 -12
  238. data/lib/active_record/type_caster/map.rb +5 -4
  239. data/lib/active_record/type_caster.rb +4 -2
  240. data/lib/active_record/validations/absence.rb +2 -0
  241. data/lib/active_record/validations/associated.rb +3 -1
  242. data/lib/active_record/validations/length.rb +2 -0
  243. data/lib/active_record/validations/presence.rb +4 -2
  244. data/lib/active_record/validations/uniqueness.rb +29 -42
  245. data/lib/active_record/validations.rb +7 -4
  246. data/lib/active_record/version.rb +3 -1
  247. data/lib/active_record.rb +36 -22
  248. data/lib/arel/alias_predication.rb +9 -0
  249. data/lib/arel/attributes/attribute.rb +37 -0
  250. data/lib/arel/attributes.rb +22 -0
  251. data/lib/arel/collectors/bind.rb +24 -0
  252. data/lib/arel/collectors/composite.rb +31 -0
  253. data/lib/arel/collectors/plain_string.rb +20 -0
  254. data/lib/arel/collectors/sql_string.rb +20 -0
  255. data/lib/arel/collectors/substitute_binds.rb +28 -0
  256. data/lib/arel/crud.rb +42 -0
  257. data/lib/arel/delete_manager.rb +18 -0
  258. data/lib/arel/errors.rb +9 -0
  259. data/lib/arel/expressions.rb +29 -0
  260. data/lib/arel/factory_methods.rb +49 -0
  261. data/lib/arel/insert_manager.rb +49 -0
  262. data/lib/arel/math.rb +45 -0
  263. data/lib/arel/nodes/and.rb +32 -0
  264. data/lib/arel/nodes/ascending.rb +23 -0
  265. data/lib/arel/nodes/binary.rb +52 -0
  266. data/lib/arel/nodes/bind_param.rb +36 -0
  267. data/lib/arel/nodes/case.rb +55 -0
  268. data/lib/arel/nodes/casted.rb +50 -0
  269. data/lib/arel/nodes/comment.rb +29 -0
  270. data/lib/arel/nodes/count.rb +12 -0
  271. data/lib/arel/nodes/delete_statement.rb +45 -0
  272. data/lib/arel/nodes/descending.rb +23 -0
  273. data/lib/arel/nodes/equality.rb +18 -0
  274. data/lib/arel/nodes/extract.rb +24 -0
  275. data/lib/arel/nodes/false.rb +16 -0
  276. data/lib/arel/nodes/full_outer_join.rb +8 -0
  277. data/lib/arel/nodes/function.rb +44 -0
  278. data/lib/arel/nodes/grouping.rb +8 -0
  279. data/lib/arel/nodes/in.rb +8 -0
  280. data/lib/arel/nodes/infix_operation.rb +80 -0
  281. data/lib/arel/nodes/inner_join.rb +8 -0
  282. data/lib/arel/nodes/insert_statement.rb +37 -0
  283. data/lib/arel/nodes/join_source.rb +20 -0
  284. data/lib/arel/nodes/matches.rb +18 -0
  285. data/lib/arel/nodes/named_function.rb +23 -0
  286. data/lib/arel/nodes/node.rb +50 -0
  287. data/lib/arel/nodes/node_expression.rb +13 -0
  288. data/lib/arel/nodes/outer_join.rb +8 -0
  289. data/lib/arel/nodes/over.rb +15 -0
  290. data/lib/arel/nodes/regexp.rb +16 -0
  291. data/lib/arel/nodes/right_outer_join.rb +8 -0
  292. data/lib/arel/nodes/select_core.rb +67 -0
  293. data/lib/arel/nodes/select_statement.rb +41 -0
  294. data/lib/arel/nodes/sql_literal.rb +16 -0
  295. data/lib/arel/nodes/string_join.rb +11 -0
  296. data/lib/arel/nodes/table_alias.rb +27 -0
  297. data/lib/arel/nodes/terminal.rb +16 -0
  298. data/lib/arel/nodes/true.rb +16 -0
  299. data/lib/arel/nodes/unary.rb +45 -0
  300. data/lib/arel/nodes/unary_operation.rb +20 -0
  301. data/lib/arel/nodes/unqualified_column.rb +22 -0
  302. data/lib/arel/nodes/update_statement.rb +41 -0
  303. data/lib/arel/nodes/values_list.rb +9 -0
  304. data/lib/arel/nodes/window.rb +126 -0
  305. data/lib/arel/nodes/with.rb +11 -0
  306. data/lib/arel/nodes.rb +68 -0
  307. data/lib/arel/order_predications.rb +13 -0
  308. data/lib/arel/predications.rb +257 -0
  309. data/lib/arel/select_manager.rb +271 -0
  310. data/lib/arel/table.rb +110 -0
  311. data/lib/arel/tree_manager.rb +72 -0
  312. data/lib/arel/update_manager.rb +34 -0
  313. data/lib/arel/visitors/depth_first.rb +204 -0
  314. data/lib/arel/visitors/dot.rb +297 -0
  315. data/lib/arel/visitors/ibm_db.rb +34 -0
  316. data/lib/arel/visitors/informix.rb +62 -0
  317. data/lib/arel/visitors/mssql.rb +157 -0
  318. data/lib/arel/visitors/mysql.rb +83 -0
  319. data/lib/arel/visitors/oracle.rb +159 -0
  320. data/lib/arel/visitors/oracle12.rb +66 -0
  321. data/lib/arel/visitors/postgresql.rb +110 -0
  322. data/lib/arel/visitors/sqlite.rb +39 -0
  323. data/lib/arel/visitors/to_sql.rb +889 -0
  324. data/lib/arel/visitors/visitor.rb +46 -0
  325. data/lib/arel/visitors/where_sql.rb +23 -0
  326. data/lib/arel/visitors.rb +20 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/arel.rb +58 -0
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  330. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -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 -2
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -29
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  338. data/lib/rails/generators/active_record.rb +7 -5
  339. metadata +133 -50
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  347. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  348. data/lib/active_record/attribute.rb +0 -213
  349. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  350. data/lib/active_record/attribute_set/builder.rb +0 -130
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/collection_cache_key.rb +0 -50
  353. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  354. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  355. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  356. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  357. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  358. data/lib/active_record/type/internal/abstract_json.rb +0 -33
@@ -1,213 +0,0 @@
1
- module ActiveRecord
2
- class Attribute # :nodoc:
3
- class << self
4
- def from_database(name, value, type)
5
- FromDatabase.new(name, value, type)
6
- end
7
-
8
- def from_user(name, value, type, original_attribute = nil)
9
- FromUser.new(name, value, type, original_attribute)
10
- end
11
-
12
- def with_cast_value(name, value, type)
13
- WithCastValue.new(name, value, type)
14
- end
15
-
16
- def null(name)
17
- Null.new(name)
18
- end
19
-
20
- def uninitialized(name, type)
21
- Uninitialized.new(name, type)
22
- end
23
- end
24
-
25
- attr_reader :name, :value_before_type_cast, :type
26
-
27
- # This method should not be called directly.
28
- # Use #from_database or #from_user
29
- def initialize(name, value_before_type_cast, type, original_attribute = nil)
30
- @name = name
31
- @value_before_type_cast = value_before_type_cast
32
- @type = type
33
- @original_attribute = original_attribute
34
- end
35
-
36
- def value
37
- # `defined?` is cheaper than `||=` when we get back falsy values
38
- @value = type_cast(value_before_type_cast) unless defined?(@value)
39
- @value
40
- end
41
-
42
- def original_value
43
- if assigned?
44
- original_attribute.original_value
45
- else
46
- type_cast(value_before_type_cast)
47
- end
48
- end
49
-
50
- def value_for_database
51
- type.serialize(value)
52
- end
53
-
54
- def changed?
55
- changed_from_assignment? || changed_in_place?
56
- end
57
-
58
- def changed_in_place?
59
- has_been_read? && type.changed_in_place?(original_value_for_database, value)
60
- end
61
-
62
- def forgetting_assignment
63
- with_value_from_database(value_for_database)
64
- end
65
-
66
- def with_value_from_user(value)
67
- type.assert_valid_value(value)
68
- self.class.from_user(name, value, type, original_attribute || self)
69
- end
70
-
71
- def with_value_from_database(value)
72
- self.class.from_database(name, value, type)
73
- end
74
-
75
- def with_cast_value(value)
76
- self.class.with_cast_value(name, value, type)
77
- end
78
-
79
- def with_type(type)
80
- self.class.new(name, value_before_type_cast, type, original_attribute)
81
- end
82
-
83
- def type_cast(*)
84
- raise NotImplementedError
85
- end
86
-
87
- def initialized?
88
- true
89
- end
90
-
91
- def came_from_user?
92
- false
93
- end
94
-
95
- def has_been_read?
96
- defined?(@value)
97
- end
98
-
99
- def ==(other)
100
- self.class == other.class &&
101
- name == other.name &&
102
- value_before_type_cast == other.value_before_type_cast &&
103
- type == other.type
104
- end
105
- alias eql? ==
106
-
107
- def hash
108
- [self.class, name, value_before_type_cast, type].hash
109
- end
110
-
111
- protected
112
-
113
- attr_reader :original_attribute
114
- alias_method :assigned?, :original_attribute
115
-
116
- def initialize_dup(other)
117
- if defined?(@value) && @value.duplicable?
118
- @value = @value.dup
119
- end
120
- end
121
-
122
- def changed_from_assignment?
123
- assigned? && type.changed?(original_value, value, value_before_type_cast)
124
- end
125
-
126
- def original_value_for_database
127
- if assigned?
128
- original_attribute.original_value_for_database
129
- else
130
- _original_value_for_database
131
- end
132
- end
133
-
134
- def _original_value_for_database
135
- type.serialize(original_value)
136
- end
137
-
138
- class FromDatabase < Attribute # :nodoc:
139
- def type_cast(value)
140
- type.deserialize(value)
141
- end
142
-
143
- def _original_value_for_database
144
- value_before_type_cast
145
- end
146
- end
147
-
148
- class FromUser < Attribute # :nodoc:
149
- def type_cast(value)
150
- type.cast(value)
151
- end
152
-
153
- def came_from_user?
154
- true
155
- end
156
- end
157
-
158
- class WithCastValue < Attribute # :nodoc:
159
- def type_cast(value)
160
- value
161
- end
162
-
163
- def changed_in_place?
164
- false
165
- end
166
- end
167
-
168
- class Null < Attribute # :nodoc:
169
- def initialize(name)
170
- super(name, nil, Type::Value.new)
171
- end
172
-
173
- def type_cast(*)
174
- nil
175
- end
176
-
177
- def with_type(type)
178
- self.class.with_cast_value(name, nil, type)
179
- end
180
-
181
- def with_value_from_database(value)
182
- raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{name}`"
183
- end
184
- alias_method :with_value_from_user, :with_value_from_database
185
- end
186
-
187
- class Uninitialized < Attribute # :nodoc:
188
- UNINITIALIZED_ORIGINAL_VALUE = Object.new
189
-
190
- def initialize(name, type)
191
- super(name, nil, type)
192
- end
193
-
194
- def value
195
- if block_given?
196
- yield name
197
- end
198
- end
199
-
200
- def original_value
201
- UNINITIALIZED_ORIGINAL_VALUE
202
- end
203
-
204
- def value_for_database
205
- end
206
-
207
- def initialized?
208
- false
209
- end
210
- end
211
- private_constant :FromDatabase, :FromUser, :Null, :Uninitialized, :WithCastValue
212
- end
213
- end
@@ -1,70 +0,0 @@
1
- module ActiveRecord
2
- class AttributeMutationTracker # :nodoc:
3
- def initialize(attributes)
4
- @attributes = attributes
5
- end
6
-
7
- def changed_values
8
- attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
9
- if changed?(attr_name)
10
- result[attr_name] = attributes[attr_name].original_value
11
- end
12
- end
13
- end
14
-
15
- def changes
16
- attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result|
17
- if changed?(attr_name)
18
- result[attr_name] = [attributes[attr_name].original_value, attributes.fetch_value(attr_name)]
19
- end
20
- end
21
- end
22
-
23
- def changed?(attr_name)
24
- attr_name = attr_name.to_s
25
- attributes[attr_name].changed?
26
- end
27
-
28
- def changed_in_place?(attr_name)
29
- attributes[attr_name].changed_in_place?
30
- end
31
-
32
- def forget_change(attr_name)
33
- attr_name = attr_name.to_s
34
- attributes[attr_name] = attributes[attr_name].forgetting_assignment
35
- end
36
-
37
- protected
38
-
39
- attr_reader :attributes
40
-
41
- private
42
-
43
- def attr_names
44
- attributes.keys
45
- end
46
- end
47
-
48
- class NullMutationTracker # :nodoc:
49
- include Singleton
50
-
51
- def changed_values
52
- {}
53
- end
54
-
55
- def changes
56
- {}
57
- end
58
-
59
- def changed?(*)
60
- false
61
- end
62
-
63
- def changed_in_place?(*)
64
- false
65
- end
66
-
67
- def forget_change(*)
68
- end
69
- end
70
- end
@@ -1,130 +0,0 @@
1
- require 'active_record/attribute'
2
-
3
- module ActiveRecord
4
- class AttributeSet # :nodoc:
5
- class Builder # :nodoc:
6
- attr_reader :types, :always_initialized, :default
7
-
8
- def initialize(types, always_initialized = nil, &default)
9
- @types = types
10
- @always_initialized = always_initialized
11
- @default = default
12
- end
13
-
14
- def build_from_database(values = {}, additional_types = {})
15
- if always_initialized && !values.key?(always_initialized)
16
- values[always_initialized] = nil
17
- end
18
-
19
- attributes = LazyAttributeHash.new(types, values, additional_types, &default)
20
- AttributeSet.new(attributes)
21
- end
22
- end
23
- end
24
-
25
- class LazyAttributeHash # :nodoc:
26
- delegate :transform_values, :each_key, :fetch, to: :materialize
27
-
28
- def initialize(types, values, additional_types, &default)
29
- @types = types
30
- @values = values
31
- @additional_types = additional_types
32
- @materialized = false
33
- @delegate_hash = {}
34
- @default = default || proc {}
35
- end
36
-
37
- def key?(key)
38
- delegate_hash.key?(key) || values.key?(key) || types.key?(key)
39
- end
40
-
41
- def [](key)
42
- delegate_hash[key] || assign_default_value(key)
43
- end
44
-
45
- def []=(key, value)
46
- if frozen?
47
- raise RuntimeError, "Can't modify frozen hash"
48
- end
49
- delegate_hash[key] = value
50
- end
51
-
52
- def deep_dup
53
- dup.tap do |copy|
54
- copy.instance_variable_set(:@delegate_hash, delegate_hash.transform_values(&:dup))
55
- end
56
- end
57
-
58
- def initialize_dup(_)
59
- @delegate_hash = Hash[delegate_hash]
60
- super
61
- end
62
-
63
- def select
64
- keys = types.keys | values.keys | delegate_hash.keys
65
- keys.each_with_object({}) do |key, hash|
66
- attribute = self[key]
67
- if yield(key, attribute)
68
- hash[key] = attribute
69
- end
70
- end
71
- end
72
-
73
- def ==(other)
74
- if other.is_a?(LazyAttributeHash)
75
- materialize == other.materialize
76
- else
77
- materialize == other
78
- end
79
- end
80
-
81
- def marshal_dump
82
- materialize
83
- end
84
-
85
- def marshal_load(delegate_hash)
86
- @delegate_hash = delegate_hash
87
- @types = {}
88
- @values = {}
89
- @additional_types = {}
90
- @materialized = true
91
- end
92
-
93
- def encode_with(coder)
94
- coder["delegate_hash"] = materialize
95
- end
96
-
97
- def init_with(coder)
98
- marshal_load(coder["delegate_hash"])
99
- end
100
-
101
- protected
102
-
103
- attr_reader :types, :values, :additional_types, :delegate_hash, :default
104
-
105
- def materialize
106
- unless @materialized
107
- values.each_key { |key| self[key] }
108
- types.each_key { |key| self[key] }
109
- unless frozen?
110
- @materialized = true
111
- end
112
- end
113
- delegate_hash
114
- end
115
-
116
- private
117
-
118
- def assign_default_value(name)
119
- type = additional_types.fetch(name, types[name])
120
- value_present = true
121
- value = values.fetch(name) { value_present = false }
122
-
123
- if value_present
124
- delegate_hash[name] = Attribute.from_database(name, value, type)
125
- elsif types.key?(name)
126
- delegate_hash[name] = default.call(name) || Attribute.uninitialized(name, type)
127
- end
128
- end
129
- end
130
- end
@@ -1,110 +0,0 @@
1
- require 'active_record/attribute_set/builder'
2
-
3
- module ActiveRecord
4
- class AttributeSet # :nodoc:
5
- delegate :fetch, to: :attributes
6
-
7
- def initialize(attributes)
8
- @attributes = attributes
9
- end
10
-
11
- def [](name)
12
- attributes[name] || Attribute.null(name)
13
- end
14
-
15
- def []=(name, value)
16
- attributes[name] = value
17
- end
18
-
19
- def values_before_type_cast
20
- attributes.transform_values(&:value_before_type_cast)
21
- end
22
-
23
- def to_hash
24
- initialized_attributes.transform_values(&:value)
25
- end
26
- alias_method :to_h, :to_hash
27
-
28
- def key?(name)
29
- attributes.key?(name) && self[name].initialized?
30
- end
31
-
32
- def keys
33
- attributes.each_key.select { |name| self[name].initialized? }
34
- end
35
-
36
- if defined?(JRUBY_VERSION)
37
- # This form is significantly faster on JRuby, and this is one of our biggest hotspots.
38
- # https://github.com/jruby/jruby/pull/2562
39
- def fetch_value(name, &block)
40
- self[name].value(&block)
41
- end
42
- else
43
- def fetch_value(name)
44
- self[name].value { |n| yield n if block_given? }
45
- end
46
- end
47
-
48
- def write_from_database(name, value)
49
- attributes[name] = self[name].with_value_from_database(value)
50
- end
51
-
52
- def write_from_user(name, value)
53
- attributes[name] = self[name].with_value_from_user(value)
54
- end
55
-
56
- def write_cast_value(name, value)
57
- attributes[name] = self[name].with_cast_value(value)
58
- end
59
-
60
- def freeze
61
- @attributes.freeze
62
- super
63
- end
64
-
65
- def deep_dup
66
- dup.tap do |copy|
67
- copy.instance_variable_set(:@attributes, attributes.deep_dup)
68
- end
69
- end
70
-
71
- def initialize_dup(_)
72
- @attributes = attributes.dup
73
- super
74
- end
75
-
76
- def initialize_clone(_)
77
- @attributes = attributes.clone
78
- super
79
- end
80
-
81
- def reset(key)
82
- if key?(key)
83
- write_from_database(key, nil)
84
- end
85
- end
86
-
87
- def accessed
88
- attributes.select { |_, attr| attr.has_been_read? }.keys
89
- end
90
-
91
- def map(&block)
92
- new_attributes = attributes.transform_values(&block)
93
- AttributeSet.new(new_attributes)
94
- end
95
-
96
- def ==(other)
97
- attributes == other.attributes
98
- end
99
-
100
- protected
101
-
102
- attr_reader :attributes
103
-
104
- private
105
-
106
- def initialized_attributes
107
- attributes.select { |_, attr| attr.initialized? }
108
- end
109
- end
110
- end
@@ -1,50 +0,0 @@
1
- module ActiveRecord
2
- module CollectionCacheKey
3
-
4
- def collection_cache_key(collection = all, timestamp_column = :updated_at) # :nodoc:
5
- query_signature = Digest::MD5.hexdigest(collection.to_sql)
6
- key = "#{collection.model_name.cache_key}/query-#{query_signature}"
7
-
8
- if collection.loaded?
9
- size = collection.size
10
- if size > 0
11
- timestamp = collection.max_by(&timestamp_column)._read_attribute(timestamp_column)
12
- end
13
- else
14
- column_type = type_for_attribute(timestamp_column.to_s)
15
- column = "#{connection.quote_table_name(collection.table_name)}.#{connection.quote_column_name(timestamp_column)}"
16
- select_values = "COUNT(*) AS #{connection.quote_column_name("size")}, MAX(%s) AS timestamp"
17
-
18
- if collection.limit_value || collection.offset_value
19
- query = collection.spawn
20
- query.select_values = [column]
21
- subquery_alias = "subquery_for_cache_key"
22
- subquery_column = "#{subquery_alias}.#{timestamp_column}"
23
- subquery = query.arel.as(subquery_alias)
24
- arel = Arel::SelectManager.new(query.engine).project(select_values % subquery_column).from(subquery)
25
- else
26
- query = collection.unscope(:order)
27
- query.select_values = [select_values % column]
28
- arel = query.arel
29
- end
30
-
31
- result = connection.select_one(arel, nil, query.bound_attributes)
32
-
33
- if result.blank?
34
- size = 0
35
- timestamp = nil
36
- else
37
- size = result["size"]
38
- timestamp = column_type.deserialize(result["timestamp"])
39
- end
40
-
41
- end
42
-
43
- if timestamp
44
- "#{key}-#{size}-#{timestamp.utc.to_s(cache_timestamp_format)}"
45
- else
46
- "#{key}-#{size}"
47
- end
48
- end
49
- end
50
- end
@@ -1,50 +0,0 @@
1
- module ActiveRecord
2
- Point = Struct.new(:x, :y)
3
-
4
- module ConnectionAdapters
5
- module PostgreSQL
6
- module OID # :nodoc:
7
- class Rails51Point < Type::Value # :nodoc:
8
- include Type::Helpers::Mutable
9
-
10
- def type
11
- :point
12
- end
13
-
14
- def cast(value)
15
- case value
16
- when ::String
17
- if value[0] == '(' && value[-1] == ')'
18
- value = value[1...-1]
19
- end
20
- x, y = value.split(",")
21
- build_point(x, y)
22
- when ::Array
23
- build_point(*value)
24
- else
25
- value
26
- end
27
- end
28
-
29
- def serialize(value)
30
- if value.is_a?(ActiveRecord::Point)
31
- "(#{number_for_point(value.x)},#{number_for_point(value.y)})"
32
- else
33
- super
34
- end
35
- end
36
-
37
- private
38
-
39
- def number_for_point(number)
40
- number.to_s.gsub(/\.0$/, '')
41
- end
42
-
43
- def build_point(x, y)
44
- ActiveRecord::Point.new(Float(x), Float(y))
45
- end
46
- end
47
- end
48
- end
49
- end
50
- end
@@ -1,16 +0,0 @@
1
- #FIXME Remove if ArJdbcMysql will give.
2
- module ArJdbcMySQL #:nodoc:
3
- class Error < StandardError #:nodoc:
4
- attr_accessor :error_number, :sql_state
5
-
6
- def initialize msg
7
- super
8
- @error_number = nil
9
- @sql_state = nil
10
- end
11
-
12
- # Mysql gem compatibility
13
- alias_method :errno, :error_number
14
- alias_method :error, :message
15
- end
16
- end