activerecord 5.0.7.2 → 6.1.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 (363) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +829 -2015
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +11 -9
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record.rb +37 -29
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +30 -18
  10. data/lib/active_record/associations.rb +1714 -1596
  11. data/lib/active_record/associations/alias_tracker.rb +36 -42
  12. data/lib/active_record/associations/association.rb +143 -68
  13. data/lib/active_record/associations/association_scope.rb +98 -94
  14. data/lib/active_record/associations/belongs_to_association.rb +76 -46
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  16. data/lib/active_record/associations/builder/association.rb +27 -28
  17. data/lib/active_record/associations/builder/belongs_to.rb +52 -60
  18. data/lib/active_record/associations/builder/collection_association.rb +12 -22
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +40 -62
  20. data/lib/active_record/associations/builder/has_many.rb +10 -2
  21. data/lib/active_record/associations/builder/has_one.rb +35 -2
  22. data/lib/active_record/associations/builder/singular_association.rb +5 -1
  23. data/lib/active_record/associations/collection_association.rb +104 -259
  24. data/lib/active_record/associations/collection_proxy.rb +169 -125
  25. data/lib/active_record/associations/foreign_association.rb +22 -0
  26. data/lib/active_record/associations/has_many_association.rb +46 -31
  27. data/lib/active_record/associations/has_many_through_association.rb +66 -46
  28. data/lib/active_record/associations/has_one_association.rb +71 -52
  29. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  30. data/lib/active_record/associations/join_dependency.rb +169 -180
  31. data/lib/active_record/associations/join_dependency/join_association.rb +53 -79
  32. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  33. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  34. data/lib/active_record/associations/preloader.rb +97 -104
  35. data/lib/active_record/associations/preloader/association.rb +109 -97
  36. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  37. data/lib/active_record/associations/singular_association.rb +12 -45
  38. data/lib/active_record/associations/through_association.rb +27 -15
  39. data/lib/active_record/attribute_assignment.rb +55 -60
  40. data/lib/active_record/attribute_methods.rb +111 -141
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +17 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +172 -112
  43. data/lib/active_record/attribute_methods/primary_key.rb +88 -91
  44. data/lib/active_record/attribute_methods/query.rb +6 -8
  45. data/lib/active_record/attribute_methods/read.rb +18 -50
  46. data/lib/active_record/attribute_methods/serialization.rb +38 -10
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +38 -66
  48. data/lib/active_record/attribute_methods/write.rb +25 -32
  49. data/lib/active_record/attributes.rb +69 -31
  50. data/lib/active_record/autosave_association.rb +102 -66
  51. data/lib/active_record/base.rb +16 -25
  52. data/lib/active_record/callbacks.rb +202 -43
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +11 -12
  55. data/lib/active_record/connection_adapters.rb +50 -0
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +661 -375
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +14 -38
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +269 -105
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +54 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +137 -93
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +155 -113
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +328 -162
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +591 -259
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +229 -91
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +392 -244
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +457 -582
  69. data/lib/active_record/connection_adapters/column.rb +55 -13
  70. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  71. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +135 -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 +79 -49
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +66 -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 +20 -12
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +74 -37
  82. data/lib/active_record/connection_adapters/pool_config.rb +63 -0
  83. data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
  84. data/lib/active_record/connection_adapters/postgresql/column.rb +39 -28
  85. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -101
  86. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  87. data/lib/active_record/connection_adapters/postgresql/oid.rb +26 -21
  88. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  90. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +6 -6
  93. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +14 -4
  95. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  96. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  97. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  98. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  104. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  106. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  107. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  109. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  110. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  112. data/lib/active_record/connection_adapters/postgresql/quoting.rb +98 -38
  113. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +21 -27
  114. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  116. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  117. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +426 -324
  118. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +32 -23
  119. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  120. data/lib/active_record/connection_adapters/postgresql_adapter.rb +418 -293
  121. data/lib/active_record/connection_adapters/schema_cache.rb +135 -18
  122. data/lib/active_record/connection_adapters/sql_type_metadata.rb +22 -7
  123. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
  124. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  125. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  126. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -6
  127. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  128. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  129. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  130. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +282 -290
  131. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  132. data/lib/active_record/connection_handling.rb +287 -45
  133. data/lib/active_record/core.rb +385 -181
  134. data/lib/active_record/counter_cache.rb +60 -28
  135. data/lib/active_record/database_configurations.rb +272 -0
  136. data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
  137. data/lib/active_record/database_configurations/database_config.rb +80 -0
  138. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  139. data/lib/active_record/database_configurations/url_config.rb +53 -0
  140. data/lib/active_record/delegated_type.rb +209 -0
  141. data/lib/active_record/destroy_association_async_job.rb +36 -0
  142. data/lib/active_record/dynamic_matchers.rb +87 -87
  143. data/lib/active_record/enum.rb +122 -47
  144. data/lib/active_record/errors.rb +153 -22
  145. data/lib/active_record/explain.rb +13 -8
  146. data/lib/active_record/explain_registry.rb +3 -1
  147. data/lib/active_record/explain_subscriber.rb +9 -4
  148. data/lib/active_record/fixture_set/file.rb +20 -22
  149. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  150. data/lib/active_record/fixture_set/render_context.rb +17 -0
  151. data/lib/active_record/fixture_set/table_row.rb +152 -0
  152. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  153. data/lib/active_record/fixtures.rb +246 -507
  154. data/lib/active_record/gem_version.rb +6 -4
  155. data/lib/active_record/inheritance.rb +168 -95
  156. data/lib/active_record/insert_all.rb +208 -0
  157. data/lib/active_record/integration.rb +114 -25
  158. data/lib/active_record/internal_metadata.rb +30 -24
  159. data/lib/active_record/legacy_yaml_adapter.rb +11 -5
  160. data/lib/active_record/locking/optimistic.rb +81 -85
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +68 -31
  163. data/lib/active_record/middleware/database_selector.rb +77 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  166. data/lib/active_record/migration.rb +439 -342
  167. data/lib/active_record/migration/command_recorder.rb +152 -98
  168. data/lib/active_record/migration/compatibility.rb +229 -60
  169. data/lib/active_record/migration/join_table.rb +8 -7
  170. data/lib/active_record/model_schema.rb +230 -122
  171. data/lib/active_record/nested_attributes.rb +213 -203
  172. data/lib/active_record/no_touching.rb +11 -2
  173. data/lib/active_record/null_relation.rb +12 -34
  174. data/lib/active_record/persistence.rb +471 -97
  175. data/lib/active_record/query_cache.rb +23 -12
  176. data/lib/active_record/querying.rb +43 -25
  177. data/lib/active_record/railtie.rb +155 -43
  178. data/lib/active_record/railties/console_sandbox.rb +2 -0
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +507 -195
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +245 -269
  183. data/lib/active_record/relation.rb +475 -324
  184. data/lib/active_record/relation/batches.rb +125 -72
  185. data/lib/active_record/relation/batches/batch_enumerator.rb +28 -10
  186. data/lib/active_record/relation/calculations.rb +267 -171
  187. data/lib/active_record/relation/delegation.rb +73 -69
  188. data/lib/active_record/relation/finder_methods.rb +238 -248
  189. data/lib/active_record/relation/from_clause.rb +7 -9
  190. data/lib/active_record/relation/merger.rb +95 -77
  191. data/lib/active_record/relation/predicate_builder.rb +109 -110
  192. data/lib/active_record/relation/predicate_builder/array_handler.rb +22 -17
  193. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  194. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  195. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +55 -0
  196. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  197. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  198. data/lib/active_record/relation/query_attribute.rb +33 -2
  199. data/lib/active_record/relation/query_methods.rb +654 -374
  200. data/lib/active_record/relation/record_fetch_warning.rb +8 -6
  201. data/lib/active_record/relation/spawn_methods.rb +15 -14
  202. data/lib/active_record/relation/where_clause.rb +171 -109
  203. data/lib/active_record/result.rb +88 -51
  204. data/lib/active_record/runtime_registry.rb +5 -3
  205. data/lib/active_record/sanitization.rb +73 -100
  206. data/lib/active_record/schema.rb +7 -14
  207. data/lib/active_record/schema_dumper.rb +101 -69
  208. data/lib/active_record/schema_migration.rb +16 -12
  209. data/lib/active_record/scoping.rb +20 -20
  210. data/lib/active_record/scoping/default.rb +92 -95
  211. data/lib/active_record/scoping/named.rb +39 -30
  212. data/lib/active_record/secure_token.rb +19 -9
  213. data/lib/active_record/serialization.rb +7 -3
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +80 -29
  216. data/lib/active_record/store.rb +122 -42
  217. data/lib/active_record/suppressor.rb +6 -3
  218. data/lib/active_record/table_metadata.rb +51 -39
  219. data/lib/active_record/tasks/database_tasks.rb +332 -115
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +66 -104
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +84 -56
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +40 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +246 -0
  225. data/lib/active_record/timestamp.rb +70 -38
  226. data/lib/active_record/touch_later.rb +26 -24
  227. data/lib/active_record/transactions.rb +121 -184
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type.rb +29 -17
  230. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  231. data/lib/active_record/type/date.rb +2 -0
  232. data/lib/active_record/type/date_time.rb +2 -0
  233. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  234. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  235. data/lib/active_record/type/internal/timezone.rb +2 -0
  236. data/lib/active_record/type/json.rb +30 -0
  237. data/lib/active_record/type/serialized.rb +20 -9
  238. data/lib/active_record/type/text.rb +11 -0
  239. data/lib/active_record/type/time.rb +12 -1
  240. data/lib/active_record/type/type_map.rb +14 -17
  241. data/lib/active_record/type/unsigned_integer.rb +16 -0
  242. data/lib/active_record/type_caster.rb +4 -2
  243. data/lib/active_record/type_caster/connection.rb +17 -13
  244. data/lib/active_record/type_caster/map.rb +10 -6
  245. data/lib/active_record/validations.rb +8 -5
  246. data/lib/active_record/validations/absence.rb +2 -0
  247. data/lib/active_record/validations/associated.rb +4 -3
  248. data/lib/active_record/validations/length.rb +2 -0
  249. data/lib/active_record/validations/numericality.rb +35 -0
  250. data/lib/active_record/validations/presence.rb +4 -2
  251. data/lib/active_record/validations/uniqueness.rb +52 -45
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/arel.rb +54 -0
  254. data/lib/arel/alias_predication.rb +9 -0
  255. data/lib/arel/attributes/attribute.rb +41 -0
  256. data/lib/arel/collectors/bind.rb +29 -0
  257. data/lib/arel/collectors/composite.rb +39 -0
  258. data/lib/arel/collectors/plain_string.rb +20 -0
  259. data/lib/arel/collectors/sql_string.rb +27 -0
  260. data/lib/arel/collectors/substitute_binds.rb +35 -0
  261. data/lib/arel/crud.rb +42 -0
  262. data/lib/arel/delete_manager.rb +18 -0
  263. data/lib/arel/errors.rb +9 -0
  264. data/lib/arel/expressions.rb +29 -0
  265. data/lib/arel/factory_methods.rb +49 -0
  266. data/lib/arel/insert_manager.rb +49 -0
  267. data/lib/arel/math.rb +45 -0
  268. data/lib/arel/nodes.rb +70 -0
  269. data/lib/arel/nodes/and.rb +32 -0
  270. data/lib/arel/nodes/ascending.rb +23 -0
  271. data/lib/arel/nodes/binary.rb +126 -0
  272. data/lib/arel/nodes/bind_param.rb +44 -0
  273. data/lib/arel/nodes/case.rb +55 -0
  274. data/lib/arel/nodes/casted.rb +62 -0
  275. data/lib/arel/nodes/comment.rb +29 -0
  276. data/lib/arel/nodes/count.rb +12 -0
  277. data/lib/arel/nodes/delete_statement.rb +45 -0
  278. data/lib/arel/nodes/descending.rb +23 -0
  279. data/lib/arel/nodes/equality.rb +15 -0
  280. data/lib/arel/nodes/extract.rb +24 -0
  281. data/lib/arel/nodes/false.rb +16 -0
  282. data/lib/arel/nodes/full_outer_join.rb +8 -0
  283. data/lib/arel/nodes/function.rb +44 -0
  284. data/lib/arel/nodes/grouping.rb +11 -0
  285. data/lib/arel/nodes/homogeneous_in.rb +72 -0
  286. data/lib/arel/nodes/in.rb +15 -0
  287. data/lib/arel/nodes/infix_operation.rb +92 -0
  288. data/lib/arel/nodes/inner_join.rb +8 -0
  289. data/lib/arel/nodes/insert_statement.rb +37 -0
  290. data/lib/arel/nodes/join_source.rb +20 -0
  291. data/lib/arel/nodes/matches.rb +18 -0
  292. data/lib/arel/nodes/named_function.rb +23 -0
  293. data/lib/arel/nodes/node.rb +51 -0
  294. data/lib/arel/nodes/node_expression.rb +13 -0
  295. data/lib/arel/nodes/ordering.rb +27 -0
  296. data/lib/arel/nodes/outer_join.rb +8 -0
  297. data/lib/arel/nodes/over.rb +15 -0
  298. data/lib/arel/nodes/regexp.rb +16 -0
  299. data/lib/arel/nodes/right_outer_join.rb +8 -0
  300. data/lib/arel/nodes/select_core.rb +67 -0
  301. data/lib/arel/nodes/select_statement.rb +41 -0
  302. data/lib/arel/nodes/sql_literal.rb +19 -0
  303. data/lib/arel/nodes/string_join.rb +11 -0
  304. data/lib/arel/nodes/table_alias.rb +31 -0
  305. data/lib/arel/nodes/terminal.rb +16 -0
  306. data/lib/arel/nodes/true.rb +16 -0
  307. data/lib/arel/nodes/unary.rb +44 -0
  308. data/lib/arel/nodes/unary_operation.rb +20 -0
  309. data/lib/arel/nodes/unqualified_column.rb +22 -0
  310. data/lib/arel/nodes/update_statement.rb +41 -0
  311. data/lib/arel/nodes/values_list.rb +9 -0
  312. data/lib/arel/nodes/window.rb +126 -0
  313. data/lib/arel/nodes/with.rb +11 -0
  314. data/lib/arel/order_predications.rb +13 -0
  315. data/lib/arel/predications.rb +250 -0
  316. data/lib/arel/select_manager.rb +270 -0
  317. data/lib/arel/table.rb +118 -0
  318. data/lib/arel/tree_manager.rb +72 -0
  319. data/lib/arel/update_manager.rb +34 -0
  320. data/lib/arel/visitors.rb +13 -0
  321. data/lib/arel/visitors/dot.rb +308 -0
  322. data/lib/arel/visitors/mysql.rb +93 -0
  323. data/lib/arel/visitors/postgresql.rb +120 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +899 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/rails/generators/active_record.rb +7 -5
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -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.rb +22 -3
  332. data/lib/rails/generators/active_record/migration/migration_generator.rb +38 -35
  333. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +3 -1
  334. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +7 -5
  335. data/lib/rails/generators/active_record/model/model_generator.rb +41 -25
  336. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  337. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  338. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  339. metadata +141 -57
  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.rb +0 -213
  348. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  349. data/lib/active_record/attribute_decorators.rb +0 -67
  350. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  351. data/lib/active_record/attribute_set.rb +0 -110
  352. data/lib/active_record/attribute_set/builder.rb +0 -132
  353. data/lib/active_record/collection_cache_key.rb +0 -50
  354. data/lib/active_record/connection_adapters/connection_specification.rb +0 -263
  355. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -22
  356. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  357. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  358. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  359. data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -17
  360. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  361. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  362. data/lib/active_record/relation/where_clause_factory.rb +0 -38
  363. data/lib/active_record/type/internal/abstract_json.rb +0 -33
data/lib/arel/table.rb ADDED
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ class Table
5
+ include Arel::Crud
6
+ include Arel::FactoryMethods
7
+ include Arel::AliasPredication
8
+
9
+ @engine = nil
10
+ class << self; attr_accessor :engine; end
11
+
12
+ attr_accessor :name, :table_alias
13
+
14
+ # TableAlias and Table both have a #table_name which is the name of the underlying table
15
+ alias :table_name :name
16
+
17
+ def initialize(name, as: nil, klass: nil, type_caster: klass&.type_caster)
18
+ @name = name.to_s
19
+ @klass = klass
20
+ @type_caster = type_caster
21
+
22
+ # Sometime AR sends an :as parameter to table, to let the table know
23
+ # that it is an Alias. We may want to override new, and return a
24
+ # TableAlias node?
25
+ if as.to_s == @name
26
+ as = nil
27
+ end
28
+ @table_alias = as
29
+ end
30
+
31
+ def alias(name = "#{self.name}_2")
32
+ Nodes::TableAlias.new(self, name)
33
+ end
34
+
35
+ def from
36
+ SelectManager.new(self)
37
+ end
38
+
39
+ def join(relation, klass = Nodes::InnerJoin)
40
+ return from unless relation
41
+
42
+ case relation
43
+ when String, Nodes::SqlLiteral
44
+ raise EmptyJoinError if relation.empty?
45
+ klass = Nodes::StringJoin
46
+ end
47
+
48
+ from.join(relation, klass)
49
+ end
50
+
51
+ def outer_join(relation)
52
+ join(relation, Nodes::OuterJoin)
53
+ end
54
+
55
+ def group(*columns)
56
+ from.group(*columns)
57
+ end
58
+
59
+ def order(*expr)
60
+ from.order(*expr)
61
+ end
62
+
63
+ def where(condition)
64
+ from.where condition
65
+ end
66
+
67
+ def project(*things)
68
+ from.project(*things)
69
+ end
70
+
71
+ def take(amount)
72
+ from.take amount
73
+ end
74
+
75
+ def skip(amount)
76
+ from.skip amount
77
+ end
78
+
79
+ def having(expr)
80
+ from.having expr
81
+ end
82
+
83
+ def [](name, table = self)
84
+ name = name.to_s if name.is_a?(Symbol)
85
+ name = @klass.attribute_aliases[name] || name if @klass
86
+ Attribute.new(table, name)
87
+ end
88
+
89
+ def hash
90
+ # Perf note: aliases and table alias is excluded from the hash
91
+ # aliases can have a loop back to this table breaking hashes in parent
92
+ # relations, for the vast majority of cases @name is unique to a query
93
+ @name.hash
94
+ end
95
+
96
+ def eql?(other)
97
+ self.class == other.class &&
98
+ self.name == other.name &&
99
+ self.table_alias == other.table_alias
100
+ end
101
+ alias :== :eql?
102
+
103
+ def type_cast_for_database(attr_name, value)
104
+ type_caster.type_cast_for_database(attr_name, value)
105
+ end
106
+
107
+ def type_for_attribute(name)
108
+ type_caster.type_for_attribute(name)
109
+ end
110
+
111
+ def able_to_type_cast?
112
+ !type_caster.nil?
113
+ end
114
+
115
+ private
116
+ attr_reader :type_caster
117
+ end
118
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ class TreeManager
5
+ include Arel::FactoryMethods
6
+
7
+ module StatementMethods
8
+ def take(limit)
9
+ @ast.limit = Nodes::Limit.new(Nodes.build_quoted(limit)) if limit
10
+ self
11
+ end
12
+
13
+ def offset(offset)
14
+ @ast.offset = Nodes::Offset.new(Nodes.build_quoted(offset)) if offset
15
+ self
16
+ end
17
+
18
+ def order(*expr)
19
+ @ast.orders = expr
20
+ self
21
+ end
22
+
23
+ def key=(key)
24
+ @ast.key = Nodes.build_quoted(key)
25
+ end
26
+
27
+ def key
28
+ @ast.key
29
+ end
30
+
31
+ def wheres=(exprs)
32
+ @ast.wheres = exprs
33
+ end
34
+
35
+ def where(expr)
36
+ @ast.wheres << expr
37
+ self
38
+ end
39
+ end
40
+
41
+ attr_reader :ast
42
+
43
+ def initialize
44
+ @ctx = nil
45
+ end
46
+
47
+ def to_dot
48
+ collector = Arel::Collectors::PlainString.new
49
+ collector = Visitors::Dot.new.accept @ast, collector
50
+ collector.value
51
+ end
52
+
53
+ def to_sql(engine = Table.engine)
54
+ collector = Arel::Collectors::SQLString.new
55
+ collector = engine.connection.visitor.accept @ast, collector
56
+ collector.value
57
+ end
58
+
59
+ def initialize_copy(other)
60
+ super
61
+ @ast = @ast.clone
62
+ end
63
+
64
+ def where(expr)
65
+ if Arel::TreeManager === expr
66
+ expr = expr.ast
67
+ end
68
+ @ctx.wheres << expr
69
+ self
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ class UpdateManager < Arel::TreeManager
5
+ include TreeManager::StatementMethods
6
+
7
+ def initialize
8
+ super
9
+ @ast = Nodes::UpdateStatement.new
10
+ @ctx = @ast
11
+ end
12
+
13
+ ###
14
+ # UPDATE +table+
15
+ def table(table)
16
+ @ast.relation = table
17
+ self
18
+ end
19
+
20
+ def set(values)
21
+ if String === values
22
+ @ast.values = [values]
23
+ else
24
+ @ast.values = values.map { |column, value|
25
+ Nodes::Assignment.new(
26
+ Nodes::UnqualifiedColumn.new(column),
27
+ value
28
+ )
29
+ }
30
+ end
31
+ self
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "arel/visitors/visitor"
4
+ require "arel/visitors/to_sql"
5
+ require "arel/visitors/sqlite"
6
+ require "arel/visitors/postgresql"
7
+ require "arel/visitors/mysql"
8
+ require "arel/visitors/dot"
9
+
10
+ module Arel # :nodoc: all
11
+ module Visitors
12
+ end
13
+ end
@@ -0,0 +1,308 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class Dot < Arel::Visitors::Visitor
6
+ class Node # :nodoc:
7
+ attr_accessor :name, :id, :fields
8
+
9
+ def initialize(name, id, fields = [])
10
+ @name = name
11
+ @id = id
12
+ @fields = fields
13
+ end
14
+ end
15
+
16
+ class Edge < Struct.new :name, :from, :to # :nodoc:
17
+ end
18
+
19
+ def initialize
20
+ super()
21
+ @nodes = []
22
+ @edges = []
23
+ @node_stack = []
24
+ @edge_stack = []
25
+ @seen = {}
26
+ end
27
+
28
+ def accept(object, collector)
29
+ visit object
30
+ collector << to_dot
31
+ end
32
+
33
+ private
34
+ def visit_Arel_Nodes_Ordering(o)
35
+ visit_edge o, "expr"
36
+ end
37
+
38
+ def visit_Arel_Nodes_TableAlias(o)
39
+ visit_edge o, "name"
40
+ visit_edge o, "relation"
41
+ end
42
+
43
+ def visit_Arel_Nodes_Count(o)
44
+ visit_edge o, "expressions"
45
+ visit_edge o, "distinct"
46
+ end
47
+
48
+ def visit_Arel_Nodes_ValuesList(o)
49
+ visit_edge o, "rows"
50
+ end
51
+
52
+ def visit_Arel_Nodes_StringJoin(o)
53
+ visit_edge o, "left"
54
+ end
55
+
56
+ def visit_Arel_Nodes_InnerJoin(o)
57
+ visit_edge o, "left"
58
+ visit_edge o, "right"
59
+ end
60
+ alias :visit_Arel_Nodes_FullOuterJoin :visit_Arel_Nodes_InnerJoin
61
+ alias :visit_Arel_Nodes_OuterJoin :visit_Arel_Nodes_InnerJoin
62
+ alias :visit_Arel_Nodes_RightOuterJoin :visit_Arel_Nodes_InnerJoin
63
+
64
+ def visit_Arel_Nodes_DeleteStatement(o)
65
+ visit_edge o, "relation"
66
+ visit_edge o, "wheres"
67
+ end
68
+
69
+ def unary(o)
70
+ visit_edge o, "expr"
71
+ end
72
+ alias :visit_Arel_Nodes_Group :unary
73
+ alias :visit_Arel_Nodes_Cube :unary
74
+ alias :visit_Arel_Nodes_RollUp :unary
75
+ alias :visit_Arel_Nodes_GroupingSet :unary
76
+ alias :visit_Arel_Nodes_GroupingElement :unary
77
+ alias :visit_Arel_Nodes_Grouping :unary
78
+ alias :visit_Arel_Nodes_Having :unary
79
+ alias :visit_Arel_Nodes_Limit :unary
80
+ alias :visit_Arel_Nodes_Not :unary
81
+ alias :visit_Arel_Nodes_Offset :unary
82
+ alias :visit_Arel_Nodes_On :unary
83
+ alias :visit_Arel_Nodes_UnqualifiedColumn :unary
84
+ alias :visit_Arel_Nodes_OptimizerHints :unary
85
+ alias :visit_Arel_Nodes_Preceding :unary
86
+ alias :visit_Arel_Nodes_Following :unary
87
+ alias :visit_Arel_Nodes_Rows :unary
88
+ alias :visit_Arel_Nodes_Range :unary
89
+
90
+ def window(o)
91
+ visit_edge o, "partitions"
92
+ visit_edge o, "orders"
93
+ visit_edge o, "framing"
94
+ end
95
+ alias :visit_Arel_Nodes_Window :window
96
+
97
+ def named_window(o)
98
+ visit_edge o, "partitions"
99
+ visit_edge o, "orders"
100
+ visit_edge o, "framing"
101
+ visit_edge o, "name"
102
+ end
103
+ alias :visit_Arel_Nodes_NamedWindow :named_window
104
+
105
+ def function(o)
106
+ visit_edge o, "expressions"
107
+ visit_edge o, "distinct"
108
+ visit_edge o, "alias"
109
+ end
110
+ alias :visit_Arel_Nodes_Exists :function
111
+ alias :visit_Arel_Nodes_Min :function
112
+ alias :visit_Arel_Nodes_Max :function
113
+ alias :visit_Arel_Nodes_Avg :function
114
+ alias :visit_Arel_Nodes_Sum :function
115
+
116
+ def extract(o)
117
+ visit_edge o, "expressions"
118
+ visit_edge o, "alias"
119
+ end
120
+ alias :visit_Arel_Nodes_Extract :extract
121
+
122
+ def visit_Arel_Nodes_NamedFunction(o)
123
+ visit_edge o, "name"
124
+ visit_edge o, "expressions"
125
+ visit_edge o, "distinct"
126
+ visit_edge o, "alias"
127
+ end
128
+
129
+ def visit_Arel_Nodes_InsertStatement(o)
130
+ visit_edge o, "relation"
131
+ visit_edge o, "columns"
132
+ visit_edge o, "values"
133
+ end
134
+
135
+ def visit_Arel_Nodes_SelectCore(o)
136
+ visit_edge o, "source"
137
+ visit_edge o, "projections"
138
+ visit_edge o, "wheres"
139
+ visit_edge o, "windows"
140
+ end
141
+
142
+ def visit_Arel_Nodes_SelectStatement(o)
143
+ visit_edge o, "cores"
144
+ visit_edge o, "limit"
145
+ visit_edge o, "orders"
146
+ visit_edge o, "offset"
147
+ end
148
+
149
+ def visit_Arel_Nodes_UpdateStatement(o)
150
+ visit_edge o, "relation"
151
+ visit_edge o, "wheres"
152
+ visit_edge o, "values"
153
+ end
154
+
155
+ def visit_Arel_Table(o)
156
+ visit_edge o, "name"
157
+ end
158
+
159
+ def visit_Arel_Nodes_Casted(o)
160
+ visit_edge o, "value"
161
+ visit_edge o, "attribute"
162
+ end
163
+
164
+ def visit_Arel_Nodes_HomogeneousIn(o)
165
+ visit_edge o, "values"
166
+ visit_edge o, "type"
167
+ visit_edge o, "attribute"
168
+ end
169
+
170
+ def visit_Arel_Attribute(o)
171
+ visit_edge o, "relation"
172
+ visit_edge o, "name"
173
+ end
174
+ alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
175
+ alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
176
+ alias :visit_Arel_Attributes_String :visit_Arel_Attribute
177
+ alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
178
+ alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
179
+ alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
180
+
181
+ def nary(o)
182
+ o.children.each_with_index do |x, i|
183
+ edge(i) { visit x }
184
+ end
185
+ end
186
+ alias :visit_Arel_Nodes_And :nary
187
+
188
+ def binary(o)
189
+ visit_edge o, "left"
190
+ visit_edge o, "right"
191
+ end
192
+ alias :visit_Arel_Nodes_As :binary
193
+ alias :visit_Arel_Nodes_Assignment :binary
194
+ alias :visit_Arel_Nodes_Between :binary
195
+ alias :visit_Arel_Nodes_Concat :binary
196
+ alias :visit_Arel_Nodes_DoesNotMatch :binary
197
+ alias :visit_Arel_Nodes_Equality :binary
198
+ alias :visit_Arel_Nodes_GreaterThan :binary
199
+ alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
200
+ alias :visit_Arel_Nodes_In :binary
201
+ alias :visit_Arel_Nodes_JoinSource :binary
202
+ alias :visit_Arel_Nodes_LessThan :binary
203
+ alias :visit_Arel_Nodes_LessThanOrEqual :binary
204
+ alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
205
+ alias :visit_Arel_Nodes_IsDistinctFrom :binary
206
+ alias :visit_Arel_Nodes_Matches :binary
207
+ alias :visit_Arel_Nodes_NotEqual :binary
208
+ alias :visit_Arel_Nodes_NotIn :binary
209
+ alias :visit_Arel_Nodes_Or :binary
210
+ alias :visit_Arel_Nodes_Over :binary
211
+
212
+ def visit_String(o)
213
+ @node_stack.last.fields << o
214
+ end
215
+ alias :visit_Time :visit_String
216
+ alias :visit_Date :visit_String
217
+ alias :visit_DateTime :visit_String
218
+ alias :visit_NilClass :visit_String
219
+ alias :visit_TrueClass :visit_String
220
+ alias :visit_FalseClass :visit_String
221
+ alias :visit_Integer :visit_String
222
+ alias :visit_BigDecimal :visit_String
223
+ alias :visit_Float :visit_String
224
+ alias :visit_Symbol :visit_String
225
+ alias :visit_Arel_Nodes_SqlLiteral :visit_String
226
+
227
+ def visit_Arel_Nodes_BindParam(o)
228
+ edge("value") { visit o.value }
229
+ end
230
+
231
+ def visit_ActiveModel_Attribute(o)
232
+ edge("value_before_type_cast") { visit o.value_before_type_cast }
233
+ end
234
+
235
+ def visit_Hash(o)
236
+ o.each_with_index do |pair, i|
237
+ edge("pair_#{i}") { visit pair }
238
+ end
239
+ end
240
+
241
+ def visit_Array(o)
242
+ o.each_with_index do |x, i|
243
+ edge(i) { visit x }
244
+ end
245
+ end
246
+ alias :visit_Set :visit_Array
247
+
248
+ def visit_Arel_Nodes_Comment(o)
249
+ visit_edge(o, "values")
250
+ end
251
+
252
+ def visit_edge(o, method)
253
+ edge(method) { visit o.send(method) }
254
+ end
255
+
256
+ def visit(o)
257
+ if node = @seen[o.object_id]
258
+ @edge_stack.last.to = node
259
+ return
260
+ end
261
+
262
+ node = Node.new(o.class.name, o.object_id)
263
+ @seen[node.id] = node
264
+ @nodes << node
265
+ with_node node do
266
+ super
267
+ end
268
+ end
269
+
270
+ def edge(name)
271
+ edge = Edge.new(name, @node_stack.last)
272
+ @edge_stack.push edge
273
+ @edges << edge
274
+ yield
275
+ @edge_stack.pop
276
+ end
277
+
278
+ def with_node(node)
279
+ if edge = @edge_stack.last
280
+ edge.to = node
281
+ end
282
+
283
+ @node_stack.push node
284
+ yield
285
+ @node_stack.pop
286
+ end
287
+
288
+ def quote(string)
289
+ string.to_s.gsub('"', '\"')
290
+ end
291
+
292
+ def to_dot
293
+ "digraph \"Arel\" {\nnode [width=0.375,height=0.25,shape=record];\n" +
294
+ @nodes.map { |node|
295
+ label = "<f0>#{node.name}"
296
+
297
+ node.fields.each_with_index do |field, i|
298
+ label += "|<f#{i + 1}>#{quote field}"
299
+ end
300
+
301
+ "#{node.id} [label=\"#{label}\"];"
302
+ }.join("\n") + "\n" + @edges.map { |edge|
303
+ "#{edge.from.id} -> #{edge.to.id} [label=\"#{edge.name}\"];"
304
+ }.join("\n") + "\n}"
305
+ end
306
+ end
307
+ end
308
+ end