omg-activerecord 8.0.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +355 -0
  3. data/MIT-LICENSE +22 -0
  4. data/README.rdoc +219 -0
  5. data/examples/performance.rb +185 -0
  6. data/examples/simple.rb +15 -0
  7. data/lib/active_record/aggregations.rb +287 -0
  8. data/lib/active_record/association_relation.rb +50 -0
  9. data/lib/active_record/associations/alias_tracker.rb +90 -0
  10. data/lib/active_record/associations/association.rb +417 -0
  11. data/lib/active_record/associations/association_scope.rb +175 -0
  12. data/lib/active_record/associations/belongs_to_association.rb +163 -0
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
  14. data/lib/active_record/associations/builder/association.rb +170 -0
  15. data/lib/active_record/associations/builder/belongs_to.rb +160 -0
  16. data/lib/active_record/associations/builder/collection_association.rb +80 -0
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
  18. data/lib/active_record/associations/builder/has_many.rb +23 -0
  19. data/lib/active_record/associations/builder/has_one.rb +61 -0
  20. data/lib/active_record/associations/builder/singular_association.rb +48 -0
  21. data/lib/active_record/associations/collection_association.rb +535 -0
  22. data/lib/active_record/associations/collection_proxy.rb +1163 -0
  23. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  24. data/lib/active_record/associations/errors.rb +265 -0
  25. data/lib/active_record/associations/foreign_association.rb +40 -0
  26. data/lib/active_record/associations/has_many_association.rb +167 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +232 -0
  28. data/lib/active_record/associations/has_one_association.rb +142 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
  31. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  32. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  33. data/lib/active_record/associations/join_dependency.rb +301 -0
  34. data/lib/active_record/associations/nested_error.rb +47 -0
  35. data/lib/active_record/associations/preloader/association.rb +316 -0
  36. data/lib/active_record/associations/preloader/batch.rb +48 -0
  37. data/lib/active_record/associations/preloader/branch.rb +153 -0
  38. data/lib/active_record/associations/preloader/through_association.rb +150 -0
  39. data/lib/active_record/associations/preloader.rb +135 -0
  40. data/lib/active_record/associations/singular_association.rb +76 -0
  41. data/lib/active_record/associations/through_association.rb +132 -0
  42. data/lib/active_record/associations.rb +1897 -0
  43. data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
  44. data/lib/active_record/attribute_assignment.rb +82 -0
  45. data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
  46. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  47. data/lib/active_record/attribute_methods/dirty.rb +262 -0
  48. data/lib/active_record/attribute_methods/primary_key.rb +158 -0
  49. data/lib/active_record/attribute_methods/query.rb +50 -0
  50. data/lib/active_record/attribute_methods/read.rb +46 -0
  51. data/lib/active_record/attribute_methods/serialization.rb +232 -0
  52. data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
  53. data/lib/active_record/attribute_methods/write.rb +49 -0
  54. data/lib/active_record/attribute_methods.rb +542 -0
  55. data/lib/active_record/attributes.rb +307 -0
  56. data/lib/active_record/autosave_association.rb +586 -0
  57. data/lib/active_record/base.rb +338 -0
  58. data/lib/active_record/callbacks.rb +452 -0
  59. data/lib/active_record/coders/column_serializer.rb +61 -0
  60. data/lib/active_record/coders/json.rb +15 -0
  61. data/lib/active_record/coders/yaml_column.rb +95 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
  64. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
  65. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
  66. data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
  67. data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
  68. data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
  69. data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
  70. data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
  71. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
  72. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
  73. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
  74. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
  75. data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
  76. data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
  77. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
  78. data/lib/active_record/connection_adapters/column.rb +122 -0
  79. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  80. data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
  81. data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
  82. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  83. data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
  84. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
  85. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
  86. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
  87. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
  88. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  89. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
  90. data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
  91. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  92. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  93. data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
  94. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
  95. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  110. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
  112. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  113. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
  114. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
  115. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  116. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  117. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  118. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
  119. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
  120. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  121. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  122. data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
  123. data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
  124. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
  125. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
  126. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
  127. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
  128. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
  129. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  130. data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
  131. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
  132. data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
  133. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  134. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  135. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
  136. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  137. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
  138. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
  139. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
  140. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
  141. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
  142. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
  143. data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
  144. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
  145. data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
  146. data/lib/active_record/connection_adapters.rb +176 -0
  147. data/lib/active_record/connection_handling.rb +413 -0
  148. data/lib/active_record/core.rb +836 -0
  149. data/lib/active_record/counter_cache.rb +230 -0
  150. data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
  151. data/lib/active_record/database_configurations/database_config.rb +104 -0
  152. data/lib/active_record/database_configurations/hash_config.rb +172 -0
  153. data/lib/active_record/database_configurations/url_config.rb +78 -0
  154. data/lib/active_record/database_configurations.rb +309 -0
  155. data/lib/active_record/delegated_type.rb +289 -0
  156. data/lib/active_record/deprecator.rb +7 -0
  157. data/lib/active_record/destroy_association_async_job.rb +38 -0
  158. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  159. data/lib/active_record/dynamic_matchers.rb +121 -0
  160. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  161. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  162. data/lib/active_record/encryption/cipher.rb +53 -0
  163. data/lib/active_record/encryption/config.rb +70 -0
  164. data/lib/active_record/encryption/configurable.rb +60 -0
  165. data/lib/active_record/encryption/context.rb +42 -0
  166. data/lib/active_record/encryption/contexts.rb +76 -0
  167. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  168. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  169. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  170. data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
  171. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  172. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  173. data/lib/active_record/encryption/encryptor.rb +177 -0
  174. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  175. data/lib/active_record/encryption/errors.rb +15 -0
  176. data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
  177. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  178. data/lib/active_record/encryption/key.rb +28 -0
  179. data/lib/active_record/encryption/key_generator.rb +53 -0
  180. data/lib/active_record/encryption/key_provider.rb +46 -0
  181. data/lib/active_record/encryption/message.rb +33 -0
  182. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  183. data/lib/active_record/encryption/message_serializer.rb +96 -0
  184. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  185. data/lib/active_record/encryption/properties.rb +76 -0
  186. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  187. data/lib/active_record/encryption/scheme.rb +107 -0
  188. data/lib/active_record/encryption.rb +58 -0
  189. data/lib/active_record/enum.rb +424 -0
  190. data/lib/active_record/errors.rb +614 -0
  191. data/lib/active_record/explain.rb +63 -0
  192. data/lib/active_record/explain_registry.rb +37 -0
  193. data/lib/active_record/explain_subscriber.rb +34 -0
  194. data/lib/active_record/fixture_set/file.rb +89 -0
  195. data/lib/active_record/fixture_set/model_metadata.rb +42 -0
  196. data/lib/active_record/fixture_set/render_context.rb +19 -0
  197. data/lib/active_record/fixture_set/table_row.rb +208 -0
  198. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  199. data/lib/active_record/fixtures.rb +850 -0
  200. data/lib/active_record/future_result.rb +182 -0
  201. data/lib/active_record/gem_version.rb +17 -0
  202. data/lib/active_record/inheritance.rb +366 -0
  203. data/lib/active_record/insert_all.rb +328 -0
  204. data/lib/active_record/integration.rb +209 -0
  205. data/lib/active_record/internal_metadata.rb +164 -0
  206. data/lib/active_record/legacy_yaml_adapter.rb +15 -0
  207. data/lib/active_record/locale/en.yml +48 -0
  208. data/lib/active_record/locking/optimistic.rb +228 -0
  209. data/lib/active_record/locking/pessimistic.rb +102 -0
  210. data/lib/active_record/log_subscriber.rb +149 -0
  211. data/lib/active_record/marshalling.rb +56 -0
  212. data/lib/active_record/message_pack.rb +124 -0
  213. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  214. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  215. data/lib/active_record/middleware/database_selector.rb +87 -0
  216. data/lib/active_record/middleware/shard_selector.rb +62 -0
  217. data/lib/active_record/migration/command_recorder.rb +406 -0
  218. data/lib/active_record/migration/compatibility.rb +490 -0
  219. data/lib/active_record/migration/default_strategy.rb +22 -0
  220. data/lib/active_record/migration/execution_strategy.rb +19 -0
  221. data/lib/active_record/migration/join_table.rb +16 -0
  222. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  223. data/lib/active_record/migration.rb +1626 -0
  224. data/lib/active_record/model_schema.rb +635 -0
  225. data/lib/active_record/nested_attributes.rb +633 -0
  226. data/lib/active_record/no_touching.rb +65 -0
  227. data/lib/active_record/normalization.rb +163 -0
  228. data/lib/active_record/persistence.rb +968 -0
  229. data/lib/active_record/promise.rb +84 -0
  230. data/lib/active_record/query_cache.rb +56 -0
  231. data/lib/active_record/query_logs.rb +247 -0
  232. data/lib/active_record/query_logs_formatter.rb +30 -0
  233. data/lib/active_record/querying.rb +122 -0
  234. data/lib/active_record/railtie.rb +440 -0
  235. data/lib/active_record/railties/console_sandbox.rb +5 -0
  236. data/lib/active_record/railties/controller_runtime.rb +65 -0
  237. data/lib/active_record/railties/databases.rake +641 -0
  238. data/lib/active_record/railties/job_runtime.rb +23 -0
  239. data/lib/active_record/readonly_attributes.rb +66 -0
  240. data/lib/active_record/reflection.rb +1287 -0
  241. data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
  242. data/lib/active_record/relation/batches.rb +491 -0
  243. data/lib/active_record/relation/calculations.rb +679 -0
  244. data/lib/active_record/relation/delegation.rb +154 -0
  245. data/lib/active_record/relation/finder_methods.rb +661 -0
  246. data/lib/active_record/relation/from_clause.rb +30 -0
  247. data/lib/active_record/relation/merger.rb +192 -0
  248. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  249. data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
  250. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  251. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
  252. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  253. data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
  254. data/lib/active_record/relation/predicate_builder.rb +181 -0
  255. data/lib/active_record/relation/query_attribute.rb +68 -0
  256. data/lib/active_record/relation/query_methods.rb +2235 -0
  257. data/lib/active_record/relation/record_fetch_warning.rb +52 -0
  258. data/lib/active_record/relation/spawn_methods.rb +78 -0
  259. data/lib/active_record/relation/where_clause.rb +218 -0
  260. data/lib/active_record/relation.rb +1495 -0
  261. data/lib/active_record/result.rb +249 -0
  262. data/lib/active_record/runtime_registry.rb +82 -0
  263. data/lib/active_record/sanitization.rb +254 -0
  264. data/lib/active_record/schema.rb +77 -0
  265. data/lib/active_record/schema_dumper.rb +364 -0
  266. data/lib/active_record/schema_migration.rb +106 -0
  267. data/lib/active_record/scoping/default.rb +205 -0
  268. data/lib/active_record/scoping/named.rb +202 -0
  269. data/lib/active_record/scoping.rb +136 -0
  270. data/lib/active_record/secure_password.rb +60 -0
  271. data/lib/active_record/secure_token.rb +66 -0
  272. data/lib/active_record/serialization.rb +29 -0
  273. data/lib/active_record/signed_id.rb +137 -0
  274. data/lib/active_record/statement_cache.rb +164 -0
  275. data/lib/active_record/store.rb +299 -0
  276. data/lib/active_record/suppressor.rb +59 -0
  277. data/lib/active_record/table_metadata.rb +85 -0
  278. data/lib/active_record/tasks/database_tasks.rb +681 -0
  279. data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
  280. data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
  281. data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
  282. data/lib/active_record/test_databases.rb +24 -0
  283. data/lib/active_record/test_fixtures.rb +321 -0
  284. data/lib/active_record/testing/query_assertions.rb +121 -0
  285. data/lib/active_record/timestamp.rb +177 -0
  286. data/lib/active_record/token_for.rb +123 -0
  287. data/lib/active_record/touch_later.rb +70 -0
  288. data/lib/active_record/transaction.rb +132 -0
  289. data/lib/active_record/transactions.rb +523 -0
  290. data/lib/active_record/translation.rb +22 -0
  291. data/lib/active_record/type/adapter_specific_registry.rb +144 -0
  292. data/lib/active_record/type/date.rb +9 -0
  293. data/lib/active_record/type/date_time.rb +9 -0
  294. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  295. data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
  296. data/lib/active_record/type/internal/timezone.rb +22 -0
  297. data/lib/active_record/type/json.rb +30 -0
  298. data/lib/active_record/type/serialized.rb +76 -0
  299. data/lib/active_record/type/text.rb +11 -0
  300. data/lib/active_record/type/time.rb +35 -0
  301. data/lib/active_record/type/type_map.rb +58 -0
  302. data/lib/active_record/type/unsigned_integer.rb +16 -0
  303. data/lib/active_record/type.rb +83 -0
  304. data/lib/active_record/type_caster/connection.rb +33 -0
  305. data/lib/active_record/type_caster/map.rb +23 -0
  306. data/lib/active_record/type_caster.rb +9 -0
  307. data/lib/active_record/validations/absence.rb +25 -0
  308. data/lib/active_record/validations/associated.rb +65 -0
  309. data/lib/active_record/validations/length.rb +26 -0
  310. data/lib/active_record/validations/numericality.rb +36 -0
  311. data/lib/active_record/validations/presence.rb +45 -0
  312. data/lib/active_record/validations/uniqueness.rb +295 -0
  313. data/lib/active_record/validations.rb +101 -0
  314. data/lib/active_record/version.rb +10 -0
  315. data/lib/active_record.rb +616 -0
  316. data/lib/arel/alias_predication.rb +9 -0
  317. data/lib/arel/attributes/attribute.rb +33 -0
  318. data/lib/arel/collectors/bind.rb +31 -0
  319. data/lib/arel/collectors/composite.rb +46 -0
  320. data/lib/arel/collectors/plain_string.rb +20 -0
  321. data/lib/arel/collectors/sql_string.rb +27 -0
  322. data/lib/arel/collectors/substitute_binds.rb +35 -0
  323. data/lib/arel/crud.rb +48 -0
  324. data/lib/arel/delete_manager.rb +32 -0
  325. data/lib/arel/errors.rb +19 -0
  326. data/lib/arel/expressions.rb +29 -0
  327. data/lib/arel/factory_methods.rb +53 -0
  328. data/lib/arel/filter_predications.rb +9 -0
  329. data/lib/arel/insert_manager.rb +48 -0
  330. data/lib/arel/math.rb +45 -0
  331. data/lib/arel/nodes/ascending.rb +23 -0
  332. data/lib/arel/nodes/binary.rb +125 -0
  333. data/lib/arel/nodes/bind_param.rb +44 -0
  334. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  335. data/lib/arel/nodes/case.rb +55 -0
  336. data/lib/arel/nodes/casted.rb +62 -0
  337. data/lib/arel/nodes/comment.rb +29 -0
  338. data/lib/arel/nodes/count.rb +12 -0
  339. data/lib/arel/nodes/cte.rb +36 -0
  340. data/lib/arel/nodes/delete_statement.rb +44 -0
  341. data/lib/arel/nodes/descending.rb +23 -0
  342. data/lib/arel/nodes/equality.rb +15 -0
  343. data/lib/arel/nodes/extract.rb +24 -0
  344. data/lib/arel/nodes/false.rb +16 -0
  345. data/lib/arel/nodes/filter.rb +10 -0
  346. data/lib/arel/nodes/fragments.rb +35 -0
  347. data/lib/arel/nodes/full_outer_join.rb +8 -0
  348. data/lib/arel/nodes/function.rb +45 -0
  349. data/lib/arel/nodes/grouping.rb +11 -0
  350. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  351. data/lib/arel/nodes/in.rb +15 -0
  352. data/lib/arel/nodes/infix_operation.rb +92 -0
  353. data/lib/arel/nodes/inner_join.rb +8 -0
  354. data/lib/arel/nodes/insert_statement.rb +37 -0
  355. data/lib/arel/nodes/join_source.rb +20 -0
  356. data/lib/arel/nodes/leading_join.rb +8 -0
  357. data/lib/arel/nodes/matches.rb +18 -0
  358. data/lib/arel/nodes/named_function.rb +23 -0
  359. data/lib/arel/nodes/nary.rb +39 -0
  360. data/lib/arel/nodes/node.rb +161 -0
  361. data/lib/arel/nodes/node_expression.rb +13 -0
  362. data/lib/arel/nodes/ordering.rb +27 -0
  363. data/lib/arel/nodes/outer_join.rb +8 -0
  364. data/lib/arel/nodes/over.rb +15 -0
  365. data/lib/arel/nodes/regexp.rb +16 -0
  366. data/lib/arel/nodes/right_outer_join.rb +8 -0
  367. data/lib/arel/nodes/select_core.rb +67 -0
  368. data/lib/arel/nodes/select_statement.rb +41 -0
  369. data/lib/arel/nodes/sql_literal.rb +32 -0
  370. data/lib/arel/nodes/string_join.rb +11 -0
  371. data/lib/arel/nodes/table_alias.rb +35 -0
  372. data/lib/arel/nodes/terminal.rb +16 -0
  373. data/lib/arel/nodes/true.rb +16 -0
  374. data/lib/arel/nodes/unary.rb +44 -0
  375. data/lib/arel/nodes/unary_operation.rb +20 -0
  376. data/lib/arel/nodes/unqualified_column.rb +22 -0
  377. data/lib/arel/nodes/update_statement.rb +46 -0
  378. data/lib/arel/nodes/values_list.rb +9 -0
  379. data/lib/arel/nodes/window.rb +126 -0
  380. data/lib/arel/nodes/with.rb +11 -0
  381. data/lib/arel/nodes.rb +75 -0
  382. data/lib/arel/order_predications.rb +13 -0
  383. data/lib/arel/predications.rb +260 -0
  384. data/lib/arel/select_manager.rb +276 -0
  385. data/lib/arel/table.rb +121 -0
  386. data/lib/arel/tree_manager.rb +65 -0
  387. data/lib/arel/update_manager.rb +49 -0
  388. data/lib/arel/visitors/dot.rb +299 -0
  389. data/lib/arel/visitors/mysql.rb +111 -0
  390. data/lib/arel/visitors/postgresql.rb +99 -0
  391. data/lib/arel/visitors/sqlite.rb +38 -0
  392. data/lib/arel/visitors/to_sql.rb +1033 -0
  393. data/lib/arel/visitors/visitor.rb +45 -0
  394. data/lib/arel/visitors.rb +13 -0
  395. data/lib/arel/window_predications.rb +9 -0
  396. data/lib/arel.rb +73 -0
  397. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  398. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  399. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  400. data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
  401. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
  402. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  403. data/lib/rails/generators/active_record/migration.rb +54 -0
  404. data/lib/rails/generators/active_record/model/USAGE +113 -0
  405. data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
  406. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  407. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  408. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  409. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  410. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  411. data/lib/rails/generators/active_record.rb +19 -0
  412. metadata +505 -0
@@ -0,0 +1,182 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class FutureResult # :nodoc:
5
+ class Complete
6
+ attr_reader :result
7
+ delegate :empty?, :to_a, to: :result
8
+
9
+ def initialize(result)
10
+ @result = result
11
+ end
12
+
13
+ def pending?
14
+ false
15
+ end
16
+
17
+ def canceled?
18
+ false
19
+ end
20
+
21
+ def then(&block)
22
+ Promise::Complete.new(@result.then(&block))
23
+ end
24
+ end
25
+
26
+ class EventBuffer
27
+ def initialize(future_result, instrumenter)
28
+ @future_result = future_result
29
+ @instrumenter = instrumenter
30
+ @events = []
31
+ end
32
+
33
+ def instrument(name, payload = {}, &block)
34
+ event = @instrumenter.new_event(name, payload)
35
+ begin
36
+ event.record(&block)
37
+ ensure
38
+ @events << event
39
+ end
40
+ end
41
+
42
+ def flush
43
+ events, @events = @events, []
44
+ events.each do |event|
45
+ event.payload[:lock_wait] = @future_result.lock_wait
46
+ ActiveSupport::Notifications.publish_event(event)
47
+ end
48
+ end
49
+ end
50
+
51
+ Canceled = Class.new(ActiveRecordError)
52
+
53
+ def self.wrap(result)
54
+ case result
55
+ when self, Complete
56
+ result
57
+ else
58
+ Complete.new(result)
59
+ end
60
+ end
61
+
62
+ delegate :empty?, :to_a, to: :result
63
+
64
+ attr_reader :lock_wait
65
+
66
+ def initialize(pool, *args, **kwargs)
67
+ @mutex = Mutex.new
68
+
69
+ @session = nil
70
+ @pool = pool
71
+ @args = args
72
+ @kwargs = kwargs
73
+
74
+ @pending = true
75
+ @error = nil
76
+ @result = nil
77
+ @instrumenter = ActiveSupport::Notifications.instrumenter
78
+ @event_buffer = nil
79
+ end
80
+
81
+ def then(&block)
82
+ Promise.new(self, block)
83
+ end
84
+
85
+ def schedule!(session)
86
+ @session = session
87
+ @pool.schedule_query(self)
88
+ end
89
+
90
+ def execute!(connection)
91
+ execute_query(connection)
92
+ end
93
+
94
+ def cancel
95
+ @pending = false
96
+ @error = Canceled
97
+ self
98
+ end
99
+
100
+ def execute_or_skip
101
+ return unless pending?
102
+
103
+ @session.synchronize do
104
+ return unless pending?
105
+
106
+ @pool.with_connection do |connection|
107
+ return unless @mutex.try_lock
108
+ begin
109
+ if pending?
110
+ @event_buffer = EventBuffer.new(self, @instrumenter)
111
+ connection.with_instrumenter(@event_buffer) do
112
+ execute_query(connection, async: true)
113
+ end
114
+ end
115
+ ensure
116
+ @mutex.unlock
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ def result
123
+ execute_or_wait
124
+ @event_buffer&.flush
125
+
126
+ if canceled?
127
+ raise Canceled
128
+ elsif @error
129
+ raise @error
130
+ else
131
+ @result
132
+ end
133
+ end
134
+
135
+ def pending?
136
+ @pending && (!@session || @session.active?)
137
+ end
138
+
139
+ def canceled?
140
+ @session && !@session.active?
141
+ end
142
+
143
+ private
144
+ def execute_or_wait
145
+ if pending?
146
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)
147
+ @mutex.synchronize do
148
+ if pending?
149
+ @pool.with_connection do |connection|
150
+ execute_query(connection)
151
+ end
152
+ else
153
+ @lock_wait = (Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) - start)
154
+ end
155
+ end
156
+ else
157
+ @lock_wait = 0.0
158
+ end
159
+ end
160
+
161
+ def execute_query(connection, async: false)
162
+ @result = exec_query(connection, *@args, **@kwargs, async: async)
163
+ rescue => error
164
+ @error = error
165
+ ensure
166
+ @pending = false
167
+ end
168
+
169
+ def exec_query(connection, *args, **kwargs)
170
+ connection.raw_exec_query(*args, **kwargs)
171
+ end
172
+
173
+ class SelectAll < FutureResult # :nodoc:
174
+ private
175
+ def exec_query(*, **)
176
+ super
177
+ rescue ::RangeError
178
+ ActiveRecord::Result.empty
179
+ end
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ # Returns the currently loaded version of Active Record as a +Gem::Version+.
5
+ def self.gem_version
6
+ Gem::Version.new VERSION::STRING
7
+ end
8
+
9
+ module VERSION
10
+ MAJOR = 8
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = "alpha1"
14
+
15
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
+ end
17
+ end
@@ -0,0 +1,366 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/inflector"
4
+ require "active_support/core_ext/hash/indifferent_access"
5
+
6
+ module ActiveRecord
7
+ # = Single table inheritance
8
+ #
9
+ # Active Record allows inheritance by storing the name of the class in a column that by
10
+ # default is named "type" (can be changed by overwriting <tt>Base.inheritance_column</tt>).
11
+ # This means that an inheritance looking like this:
12
+ #
13
+ # class Company < ActiveRecord::Base; end
14
+ # class Firm < Company; end
15
+ # class Client < Company; end
16
+ # class PriorityClient < Client; end
17
+ #
18
+ # When you do <tt>Firm.create(name: "37signals")</tt>, this record will be saved in
19
+ # the companies table with type = "Firm". You can then fetch this row again using
20
+ # <tt>Company.where(name: '37signals').first</tt> and it will return a Firm object.
21
+ #
22
+ # Be aware that because the type column is an attribute on the record every new
23
+ # subclass will instantly be marked as dirty and the type column will be included
24
+ # in the list of changed attributes on the record. This is different from non
25
+ # Single Table Inheritance(STI) classes:
26
+ #
27
+ # Company.new.changed? # => false
28
+ # Firm.new.changed? # => true
29
+ # Firm.new.changes # => {"type"=>["","Firm"]}
30
+ #
31
+ # If you don't have a type column defined in your table, single-table inheritance won't
32
+ # be triggered. In that case, it'll work just like normal subclasses with no special magic
33
+ # for differentiating between them or reloading the right type with find.
34
+ #
35
+ # Note, all the attributes for all the cases are kept in the same table.
36
+ # Read more:
37
+ # * https://www.martinfowler.com/eaaCatalog/singleTableInheritance.html
38
+ #
39
+ module Inheritance
40
+ extend ActiveSupport::Concern
41
+
42
+ included do
43
+ class_attribute :store_full_class_name, instance_writer: false, default: true
44
+
45
+ # Determines whether to store the full constant name including namespace when using STI.
46
+ # This is true, by default.
47
+ class_attribute :store_full_sti_class, instance_writer: false, default: true
48
+
49
+ set_base_class
50
+ end
51
+
52
+ module ClassMethods
53
+ # Determines if one of the attributes passed in is the inheritance column,
54
+ # and if the inheritance column is attr accessible, it initializes an
55
+ # instance of the given subclass instead of the base class.
56
+ def new(attributes = nil, &block)
57
+ if abstract_class? || self == Base
58
+ raise NotImplementedError, "#{self} is an abstract class and cannot be instantiated."
59
+ end
60
+
61
+ if _has_attribute?(inheritance_column)
62
+ subclass = subclass_from_attributes(attributes)
63
+
64
+ if subclass.nil? && scope_attributes = current_scope&.scope_for_create
65
+ subclass = subclass_from_attributes(scope_attributes)
66
+ end
67
+
68
+ if subclass.nil? && base_class?
69
+ subclass = subclass_from_attributes(column_defaults)
70
+ end
71
+ end
72
+
73
+ if subclass && subclass != self
74
+ subclass.new(attributes, &block)
75
+ else
76
+ super
77
+ end
78
+ end
79
+
80
+ # Returns +true+ if this does not need STI type condition. Returns
81
+ # +false+ if STI type condition needs to be applied.
82
+ def descends_from_active_record?
83
+ if self == Base
84
+ false
85
+ elsif superclass.abstract_class?
86
+ superclass.descends_from_active_record?
87
+ else
88
+ superclass == Base || !columns_hash.include?(inheritance_column)
89
+ end
90
+ end
91
+
92
+ def finder_needs_type_condition? # :nodoc:
93
+ # This is like this because benchmarking justifies the strange :false stuff
94
+ :true == (@finder_needs_type_condition ||= descends_from_active_record? ? :false : :true)
95
+ end
96
+
97
+ # Returns the first class in the inheritance hierarchy that descends from either an
98
+ # abstract class or from <tt>ActiveRecord::Base</tt>.
99
+ #
100
+ # Consider the following behaviour:
101
+ #
102
+ # class ApplicationRecord < ActiveRecord::Base
103
+ # self.abstract_class = true
104
+ # end
105
+ # class Shape < ApplicationRecord
106
+ # self.abstract_class = true
107
+ # end
108
+ # Polygon = Class.new(Shape)
109
+ # Square = Class.new(Polygon)
110
+ #
111
+ # ApplicationRecord.base_class # => ApplicationRecord
112
+ # Shape.base_class # => Shape
113
+ # Polygon.base_class # => Polygon
114
+ # Square.base_class # => Polygon
115
+ attr_reader :base_class
116
+
117
+ # Returns whether the class is a base class.
118
+ # See #base_class for more information.
119
+ def base_class?
120
+ base_class == self
121
+ end
122
+
123
+ # Set this to +true+ if this is an abstract class (see
124
+ # <tt>abstract_class?</tt>).
125
+ # If you are using inheritance with Active Record and don't want a class
126
+ # to be considered as part of the STI hierarchy, you must set this to
127
+ # true.
128
+ # +ApplicationRecord+, for example, is generated as an abstract class.
129
+ #
130
+ # Consider the following default behavior:
131
+ #
132
+ # Shape = Class.new(ActiveRecord::Base)
133
+ # Polygon = Class.new(Shape)
134
+ # Square = Class.new(Polygon)
135
+ #
136
+ # Shape.table_name # => "shapes"
137
+ # Polygon.table_name # => "shapes"
138
+ # Square.table_name # => "shapes"
139
+ # Shape.create! # => #<Shape id: 1, type: nil>
140
+ # Polygon.create! # => #<Polygon id: 2, type: "Polygon">
141
+ # Square.create! # => #<Square id: 3, type: "Square">
142
+ #
143
+ # However, when using <tt>abstract_class</tt>, +Shape+ is omitted from
144
+ # the hierarchy:
145
+ #
146
+ # class Shape < ActiveRecord::Base
147
+ # self.abstract_class = true
148
+ # end
149
+ # Polygon = Class.new(Shape)
150
+ # Square = Class.new(Polygon)
151
+ #
152
+ # Shape.table_name # => nil
153
+ # Polygon.table_name # => "polygons"
154
+ # Square.table_name # => "polygons"
155
+ # Shape.create! # => NotImplementedError: Shape is an abstract class and cannot be instantiated.
156
+ # Polygon.create! # => #<Polygon id: 1, type: nil>
157
+ # Square.create! # => #<Square id: 2, type: "Square">
158
+ #
159
+ # Note that in the above example, to disallow the creation of a plain
160
+ # +Polygon+, you should use <tt>validates :type, presence: true</tt>,
161
+ # instead of setting it as an abstract class. This way, +Polygon+ will
162
+ # stay in the hierarchy, and Active Record will continue to correctly
163
+ # derive the table name.
164
+ attr_accessor :abstract_class
165
+
166
+ # Returns whether this class is an abstract class or not.
167
+ def abstract_class?
168
+ @abstract_class == true
169
+ end
170
+
171
+ # Sets the application record class for Active Record
172
+ #
173
+ # This is useful if your application uses a different class than
174
+ # ApplicationRecord for your primary abstract class. This class
175
+ # will share a database connection with Active Record. It is the class
176
+ # that connects to your primary database.
177
+ def primary_abstract_class
178
+ if ActiveRecord.application_record_class && ActiveRecord.application_record_class.name != name
179
+ raise ArgumentError, "The `primary_abstract_class` is already set to #{ActiveRecord.application_record_class.inspect}. There can only be one `primary_abstract_class` in an application."
180
+ end
181
+
182
+ self.abstract_class = true
183
+ ActiveRecord.application_record_class = self
184
+ end
185
+
186
+ # Returns the value to be stored in the inheritance column for STI.
187
+ def sti_name
188
+ store_full_sti_class && store_full_class_name ? name : name.demodulize
189
+ end
190
+
191
+ # Returns the class for the provided +type_name+.
192
+ #
193
+ # It is used to find the class correspondent to the value stored in the inheritance column.
194
+ def sti_class_for(type_name)
195
+ if store_full_sti_class && store_full_class_name
196
+ type_name.constantize
197
+ else
198
+ compute_type(type_name)
199
+ end
200
+ rescue NameError
201
+ raise SubclassNotFound,
202
+ "The single-table inheritance mechanism failed to locate the subclass: '#{type_name}'. " \
203
+ "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " \
204
+ "Please rename this column if you didn't intend it to be used for storing the inheritance class " \
205
+ "or overwrite #{name}.inheritance_column to use another column for that information. " \
206
+ "If you wish to disable single-table inheritance for #{name} set " \
207
+ "#{name}.inheritance_column to nil"
208
+ end
209
+
210
+ # Returns the value to be stored in the polymorphic type column for Polymorphic Associations.
211
+ def polymorphic_name
212
+ store_full_class_name ? base_class.name : base_class.name.demodulize
213
+ end
214
+
215
+ # Returns the class for the provided +name+.
216
+ #
217
+ # It is used to find the class correspondent to the value stored in the polymorphic type column.
218
+ def polymorphic_class_for(name)
219
+ if store_full_class_name
220
+ name.constantize
221
+ else
222
+ compute_type(name)
223
+ end
224
+ end
225
+
226
+ def dup # :nodoc:
227
+ # `initialize_dup` / `initialize_copy` don't work when defined
228
+ # in the `singleton_class`.
229
+ other = super
230
+ other.set_base_class
231
+ other
232
+ end
233
+
234
+ def initialize_clone(other) # :nodoc:
235
+ super
236
+ set_base_class
237
+ end
238
+
239
+ protected
240
+ # Returns the class type of the record using the current module as a prefix. So descendants of
241
+ # MyApp::Business::Account would appear as MyApp::Business::AccountSubclass.
242
+ def compute_type(type_name)
243
+ if type_name.start_with?("::")
244
+ # If the type is prefixed with a scope operator then we assume that
245
+ # the type_name is an absolute reference.
246
+ type_name.constantize
247
+ else
248
+ type_candidate = @_type_candidates_cache[type_name]
249
+ if type_candidate && type_constant = type_candidate.safe_constantize
250
+ return type_constant
251
+ end
252
+
253
+ # Build a list of candidates to search for
254
+ candidates = []
255
+ name.scan(/::|$/) { candidates.unshift "#{$`}::#{type_name}" }
256
+ candidates << type_name
257
+
258
+ candidates.each do |candidate|
259
+ constant = candidate.safe_constantize
260
+ if candidate == constant.to_s
261
+ @_type_candidates_cache[type_name] = candidate
262
+ return constant
263
+ end
264
+ end
265
+
266
+ raise NameError.new("uninitialized constant #{candidates.first}", candidates.first)
267
+ end
268
+ end
269
+
270
+ def set_base_class # :nodoc:
271
+ @base_class = if self == Base
272
+ self
273
+ else
274
+ unless self < Base
275
+ raise ActiveRecordError, "#{name} doesn't belong in a hierarchy descending from ActiveRecord"
276
+ end
277
+
278
+ if superclass == Base || superclass.abstract_class?
279
+ self
280
+ else
281
+ superclass.base_class
282
+ end
283
+ end
284
+ end
285
+
286
+ private
287
+ def inherited(subclass)
288
+ super
289
+ subclass.set_base_class
290
+ subclass.instance_variable_set(:@_type_candidates_cache, Concurrent::Map.new)
291
+ subclass.class_eval do
292
+ @finder_needs_type_condition = nil
293
+ end
294
+ end
295
+
296
+ # Called by +instantiate+ to decide which class to use for a new
297
+ # record instance. For single-table inheritance, we check the record
298
+ # for a +type+ column and return the corresponding class.
299
+ def discriminate_class_for_record(record)
300
+ if using_single_table_inheritance?(record)
301
+ find_sti_class(record[inheritance_column])
302
+ else
303
+ super
304
+ end
305
+ end
306
+
307
+ def using_single_table_inheritance?(record)
308
+ record[inheritance_column].present? && _has_attribute?(inheritance_column)
309
+ end
310
+
311
+ def find_sti_class(type_name)
312
+ type_name = base_class.type_for_attribute(inheritance_column).cast(type_name)
313
+ subclass = sti_class_for(type_name)
314
+
315
+ unless subclass == self || descendants.include?(subclass)
316
+ raise SubclassNotFound, "Invalid single-table inheritance type: #{subclass.name} is not a subclass of #{name}"
317
+ end
318
+
319
+ subclass
320
+ end
321
+
322
+ def type_condition(table = arel_table)
323
+ sti_column = table[inheritance_column]
324
+ sti_names = ([self] + descendants).map(&:sti_name)
325
+
326
+ predicate_builder.build(sti_column, sti_names)
327
+ end
328
+
329
+ # Detect the subclass from the inheritance column of attrs. If the inheritance column value
330
+ # is not self or a valid subclass, raises ActiveRecord::SubclassNotFound
331
+ def subclass_from_attributes(attrs)
332
+ attrs = attrs.to_h if attrs.respond_to?(:permitted?)
333
+ if attrs.is_a?(Hash)
334
+ subclass_name = attrs[inheritance_column] || attrs[inheritance_column.to_sym]
335
+
336
+ if subclass_name.present?
337
+ find_sti_class(subclass_name)
338
+ end
339
+ end
340
+ end
341
+ end
342
+
343
+ def initialize_dup(other)
344
+ super
345
+ ensure_proper_type
346
+ end
347
+
348
+ private
349
+ def initialize_internals_callback
350
+ super
351
+ ensure_proper_type
352
+ end
353
+
354
+ # Sets the attribute used for single table inheritance to this class name if this is not the
355
+ # ActiveRecord::Base descendant.
356
+ # Considering the hierarchy Reply < Message < ActiveRecord::Base, this makes it possible to
357
+ # do Reply.new without having to set <tt>Reply[Reply.inheritance_column] = "Reply"</tt> yourself.
358
+ # No such attribute would be set for objects of the Message class in that example.
359
+ def ensure_proper_type
360
+ klass = self.class
361
+ if klass.finder_needs_type_condition?
362
+ _write_attribute(klass.inheritance_column, klass.sti_name)
363
+ end
364
+ end
365
+ end
366
+ end