activerecord 5.2.8 → 7.0.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1393 -587
- data/MIT-LICENSE +3 -1
- data/README.rdoc +7 -5
- data/examples/performance.rb +1 -1
- data/lib/active_record/aggregations.rb +10 -9
- data/lib/active_record/association_relation.rb +22 -12
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +122 -47
- data/lib/active_record/associations/association_scope.rb +24 -24
- data/lib/active_record/associations/belongs_to_association.rb +67 -49
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +16 -7
- data/lib/active_record/associations/builder/association.rb +52 -23
- data/lib/active_record/associations/builder/belongs_to.rb +44 -61
- data/lib/active_record/associations/builder/collection_association.rb +17 -19
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
- data/lib/active_record/associations/builder/has_many.rb +10 -3
- data/lib/active_record/associations/builder/has_one.rb +35 -3
- data/lib/active_record/associations/builder/singular_association.rb +5 -3
- data/lib/active_record/associations/collection_association.rb +59 -50
- data/lib/active_record/associations/collection_proxy.rb +32 -23
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +27 -14
- data/lib/active_record/associations/has_many_through_association.rb +26 -19
- data/lib/active_record/associations/has_one_association.rb +52 -37
- data/lib/active_record/associations/has_one_through_association.rb +6 -6
- data/lib/active_record/associations/join_dependency/join_association.rb +44 -22
- data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +97 -62
- data/lib/active_record/associations/preloader/association.rb +220 -60
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +147 -0
- data/lib/active_record/associations/preloader/through_association.rb +85 -40
- data/lib/active_record/associations/preloader.rb +44 -105
- data/lib/active_record/associations/singular_association.rb +9 -17
- data/lib/active_record/associations/through_association.rb +4 -4
- data/lib/active_record/associations.rb +207 -66
- data/lib/active_record/asynchronous_queries_tracker.rb +60 -0
- data/lib/active_record/attribute_assignment.rb +17 -19
- data/lib/active_record/attribute_methods/before_type_cast.rb +19 -8
- data/lib/active_record/attribute_methods/dirty.rb +141 -47
- data/lib/active_record/attribute_methods/primary_key.rb +22 -27
- data/lib/active_record/attribute_methods/query.rb +6 -10
- data/lib/active_record/attribute_methods/read.rb +15 -55
- data/lib/active_record/attribute_methods/serialization.rb +77 -18
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +16 -18
- data/lib/active_record/attribute_methods/write.rb +18 -37
- data/lib/active_record/attribute_methods.rb +90 -153
- data/lib/active_record/attributes.rb +38 -12
- data/lib/active_record/autosave_association.rb +50 -50
- data/lib/active_record/base.rb +23 -18
- data/lib/active_record/callbacks.rb +159 -44
- data/lib/active_record/coders/yaml_column.rb +12 -3
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +292 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +209 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +76 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +92 -464
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +5 -51
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +209 -164
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +38 -22
- data/lib/active_record/connection_adapters/abstract/quoting.rb +103 -82
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +140 -110
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +236 -94
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +16 -5
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +456 -159
- data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -78
- data/lib/active_record/connection_adapters/abstract_adapter.rb +367 -162
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +311 -327
- data/lib/active_record/connection_adapters/column.rb +33 -11
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +113 -45
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +71 -5
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +25 -8
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +143 -19
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +63 -22
- data/lib/active_record/connection_adapters/pool_config.rb +73 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +53 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +56 -63
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +10 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +15 -2
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +54 -16
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +26 -12
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +4 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +89 -52
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +34 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +39 -4
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +128 -91
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +25 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +149 -113
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +386 -182
- data/lib/active_record/connection_adapters/schema_cache.rb +161 -22
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +17 -6
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +152 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +65 -18
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +92 -26
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +251 -204
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_adapters.rb +53 -0
- data/lib/active_record/connection_handling.rb +292 -38
- data/lib/active_record/core.rb +385 -158
- data/lib/active_record/counter_cache.rb +8 -30
- data/lib/active_record/database_configurations/connection_url_resolver.rb +100 -0
- data/lib/active_record/database_configurations/database_config.rb +83 -0
- data/lib/active_record/database_configurations/hash_config.rb +154 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/database_configurations.rb +256 -0
- data/lib/active_record/delegated_type.rb +250 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +4 -5
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +98 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +44 -0
- data/lib/active_record/encryption/configurable.rb +61 -0
- data/lib/active_record/encryption/context.rb +35 -0
- data/lib/active_record/encryption/contexts.rb +72 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +12 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +208 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +140 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +155 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +160 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +42 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_serializer.rb +90 -0
- data/lib/active_record/encryption/null_encryptor.rb +21 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +24 -0
- data/lib/active_record/encryption/scheme.rb +99 -0
- data/lib/active_record/encryption.rb +55 -0
- data/lib/active_record/enum.rb +130 -51
- data/lib/active_record/errors.rb +129 -23
- data/lib/active_record/explain.rb +10 -6
- data/lib/active_record/explain_registry.rb +11 -6
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +22 -15
- data/lib/active_record/fixture_set/model_metadata.rb +32 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +187 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +206 -490
- data/lib/active_record/future_result.rb +139 -0
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +104 -37
- data/lib/active_record/insert_all.rb +278 -0
- data/lib/active_record/integration.rb +69 -18
- data/lib/active_record/internal_metadata.rb +24 -9
- data/lib/active_record/legacy_yaml_adapter.rb +3 -36
- data/lib/active_record/locking/optimistic.rb +41 -26
- data/lib/active_record/locking/pessimistic.rb +18 -8
- data/lib/active_record/log_subscriber.rb +46 -35
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
- data/lib/active_record/middleware/database_selector.rb +82 -0
- data/lib/active_record/middleware/shard_selector.rb +60 -0
- data/lib/active_record/migration/command_recorder.rb +96 -44
- data/lib/active_record/migration/compatibility.rb +246 -64
- data/lib/active_record/migration/join_table.rb +1 -2
- data/lib/active_record/migration.rb +266 -187
- data/lib/active_record/model_schema.rb +165 -52
- data/lib/active_record/nested_attributes.rb +17 -19
- data/lib/active_record/no_touching.rb +11 -4
- data/lib/active_record/null_relation.rb +2 -7
- data/lib/active_record/persistence.rb +467 -92
- data/lib/active_record/query_cache.rb +21 -4
- data/lib/active_record/query_logs.rb +138 -0
- data/lib/active_record/querying.rb +51 -24
- data/lib/active_record/railtie.rb +224 -57
- data/lib/active_record/railties/console_sandbox.rb +2 -4
- data/lib/active_record/railties/controller_runtime.rb +31 -36
- data/lib/active_record/railties/databases.rake +369 -101
- data/lib/active_record/readonly_attributes.rb +15 -0
- data/lib/active_record/reflection.rb +170 -137
- data/lib/active_record/relation/batches/batch_enumerator.rb +44 -14
- data/lib/active_record/relation/batches.rb +46 -37
- data/lib/active_record/relation/calculations.rb +168 -96
- data/lib/active_record/relation/delegation.rb +37 -52
- data/lib/active_record/relation/finder_methods.rb +79 -58
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +50 -51
- data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +11 -10
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +58 -46
- data/lib/active_record/relation/query_attribute.rb +9 -10
- data/lib/active_record/relation/query_methods.rb +685 -208
- data/lib/active_record/relation/record_fetch_warning.rb +9 -11
- data/lib/active_record/relation/spawn_methods.rb +10 -10
- data/lib/active_record/relation/where_clause.rb +108 -64
- data/lib/active_record/relation.rb +515 -151
- data/lib/active_record/result.rb +78 -42
- data/lib/active_record/runtime_registry.rb +9 -13
- data/lib/active_record/sanitization.rb +29 -44
- data/lib/active_record/schema.rb +37 -31
- data/lib/active_record/schema_dumper.rb +74 -23
- data/lib/active_record/schema_migration.rb +7 -9
- data/lib/active_record/scoping/default.rb +62 -17
- data/lib/active_record/scoping/named.rb +17 -32
- data/lib/active_record/scoping.rb +70 -41
- data/lib/active_record/secure_token.rb +16 -8
- data/lib/active_record/serialization.rb +6 -4
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +49 -6
- data/lib/active_record/store.rb +88 -9
- data/lib/active_record/suppressor.rb +13 -17
- data/lib/active_record/table_metadata.rb +42 -43
- data/lib/active_record/tasks/database_tasks.rb +352 -94
- data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
- data/lib/active_record/tasks/postgresql_database_tasks.rb +41 -39
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +287 -0
- data/lib/active_record/timestamp.rb +44 -34
- data/lib/active_record/touch_later.rb +23 -22
- data/lib/active_record/transactions.rb +67 -128
- data/lib/active_record/translation.rb +3 -3
- data/lib/active_record/type/adapter_specific_registry.rb +34 -19
- data/lib/active_record/type/hash_lookup_type_map.rb +34 -2
- data/lib/active_record/type/internal/timezone.rb +2 -2
- data/lib/active_record/type/serialized.rb +7 -4
- data/lib/active_record/type/time.rb +10 -0
- data/lib/active_record/type/type_map.rb +17 -21
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type.rb +9 -5
- data/lib/active_record/type_caster/connection.rb +15 -15
- data/lib/active_record/type_caster/map.rb +8 -8
- data/lib/active_record/validations/associated.rb +2 -3
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +39 -31
- data/lib/active_record/validations.rb +4 -3
- data/lib/active_record.rb +209 -32
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +33 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +48 -0
- data/lib/arel/delete_manager.rb +32 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +48 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +44 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +45 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +76 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +46 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +71 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +258 -0
- data/lib/arel/select_manager.rb +276 -0
- data/lib/arel/table.rb +117 -0
- data/lib/arel/tree_manager.rb +60 -0
- data/lib/arel/update_manager.rb +48 -0
- data/lib/arel/visitors/dot.rb +298 -0
- data/lib/arel/visitors/mysql.rb +99 -0
- data/lib/arel/visitors/postgresql.rb +110 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +955 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +55 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
- data/lib/rails/generators/active_record/migration.rb +19 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +2 -2
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- metadata +162 -32
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/collection_cache_key.rb +0 -53
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
- data/lib/active_record/relation/where_clause_factory.rb +0 -34
data/lib/active_record.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright (c) 2004-
|
4
|
+
# Copyright (c) 2004-2022 David Heinemeier Hansson
|
5
5
|
#
|
6
6
|
# Permission is hereby granted, free of charge, to any person obtaining
|
7
7
|
# a copy of this software and associated documentation files (the
|
@@ -31,31 +31,34 @@ require "yaml"
|
|
31
31
|
|
32
32
|
require "active_record/version"
|
33
33
|
require "active_model/attribute_set"
|
34
|
+
require "active_record/errors"
|
34
35
|
|
35
36
|
module ActiveRecord
|
36
37
|
extend ActiveSupport::Autoload
|
37
38
|
|
38
39
|
autoload :Base
|
39
40
|
autoload :Callbacks
|
40
|
-
autoload :Core
|
41
41
|
autoload :ConnectionHandling
|
42
|
+
autoload :Core
|
42
43
|
autoload :CounterCache
|
44
|
+
autoload :DelegatedType
|
45
|
+
autoload :DestroyAssociationAsyncJob
|
43
46
|
autoload :DynamicMatchers
|
47
|
+
autoload :Encryption
|
44
48
|
autoload :Enum
|
45
|
-
autoload :InternalMetadata
|
46
49
|
autoload :Explain
|
47
50
|
autoload :Inheritance
|
48
51
|
autoload :Integration
|
52
|
+
autoload :InternalMetadata
|
49
53
|
autoload :Migration
|
50
54
|
autoload :Migrator, "active_record/migration"
|
51
55
|
autoload :ModelSchema
|
52
56
|
autoload :NestedAttributes
|
53
57
|
autoload :NoTouching
|
54
|
-
autoload :TouchLater
|
55
58
|
autoload :Persistence
|
56
59
|
autoload :QueryCache
|
57
60
|
autoload :Querying
|
58
|
-
autoload :
|
61
|
+
autoload :QueryLogs
|
59
62
|
autoload :ReadonlyAttributes
|
60
63
|
autoload :RecordInvalid, "active_record/validations"
|
61
64
|
autoload :Reflection
|
@@ -65,32 +68,37 @@ module ActiveRecord
|
|
65
68
|
autoload :SchemaDumper
|
66
69
|
autoload :SchemaMigration
|
67
70
|
autoload :Scoping
|
71
|
+
autoload :SecureToken
|
68
72
|
autoload :Serialization
|
69
|
-
autoload :
|
73
|
+
autoload :SignedId
|
70
74
|
autoload :Store
|
71
75
|
autoload :Suppressor
|
76
|
+
autoload :TestDatabases
|
77
|
+
autoload :TestFixtures, "active_record/fixtures"
|
72
78
|
autoload :Timestamp
|
79
|
+
autoload :TouchLater
|
73
80
|
autoload :Transactions
|
74
81
|
autoload :Translation
|
75
82
|
autoload :Validations
|
76
|
-
autoload :SecureToken
|
77
83
|
|
78
84
|
eager_autoload do
|
79
|
-
autoload :ActiveRecordError, "active_record/errors"
|
80
|
-
autoload :ConnectionNotEstablished, "active_record/errors"
|
81
|
-
autoload :ConnectionAdapters, "active_record/connection_adapters/abstract_adapter"
|
82
|
-
|
83
85
|
autoload :Aggregations
|
86
|
+
autoload :AssociationRelation
|
84
87
|
autoload :Associations
|
88
|
+
autoload :AsynchronousQueriesTracker
|
85
89
|
autoload :AttributeAssignment
|
86
90
|
autoload :AttributeMethods
|
87
91
|
autoload :AutosaveAssociation
|
88
|
-
|
92
|
+
autoload :ConnectionAdapters
|
93
|
+
autoload :DisableJoinsAssociationRelation
|
94
|
+
autoload :FutureResult
|
89
95
|
autoload :LegacyYamlAdapter
|
90
|
-
|
91
|
-
autoload :Relation
|
92
|
-
autoload :AssociationRelation
|
93
96
|
autoload :NullRelation
|
97
|
+
autoload :Relation
|
98
|
+
autoload :Result
|
99
|
+
autoload :StatementCache
|
100
|
+
autoload :TableMetadata
|
101
|
+
autoload :Type
|
94
102
|
|
95
103
|
autoload_under "relation" do
|
96
104
|
autoload :QueryMethods
|
@@ -101,15 +109,11 @@ module ActiveRecord
|
|
101
109
|
autoload :Batches
|
102
110
|
autoload :Delegation
|
103
111
|
end
|
104
|
-
|
105
|
-
autoload :Result
|
106
|
-
autoload :TableMetadata
|
107
|
-
autoload :Type
|
108
112
|
end
|
109
113
|
|
110
114
|
module Coders
|
111
|
-
autoload :YAMLColumn, "active_record/coders/yaml_column"
|
112
115
|
autoload :JSON, "active_record/coders/json"
|
116
|
+
autoload :YAMLColumn, "active_record/coders/yaml_column"
|
113
117
|
end
|
114
118
|
|
115
119
|
module AttributeMethods
|
@@ -121,9 +125,9 @@ module ActiveRecord
|
|
121
125
|
autoload :PrimaryKey
|
122
126
|
autoload :Query
|
123
127
|
autoload :Read
|
128
|
+
autoload :Serialization
|
124
129
|
autoload :TimeZoneConversion
|
125
130
|
autoload :Write
|
126
|
-
autoload :Serialization
|
127
131
|
end
|
128
132
|
end
|
129
133
|
|
@@ -136,34 +140,205 @@ module ActiveRecord
|
|
136
140
|
end
|
137
141
|
end
|
138
142
|
|
139
|
-
module
|
143
|
+
module Scoping
|
140
144
|
extend ActiveSupport::Autoload
|
141
145
|
|
142
146
|
eager_autoload do
|
143
|
-
autoload :
|
147
|
+
autoload :Default
|
148
|
+
autoload :Named
|
144
149
|
end
|
145
150
|
end
|
146
151
|
|
147
|
-
module
|
152
|
+
module Middleware
|
148
153
|
extend ActiveSupport::Autoload
|
149
154
|
|
150
|
-
|
151
|
-
|
152
|
-
autoload :Default
|
153
|
-
end
|
155
|
+
autoload :DatabaseSelector
|
156
|
+
autoload :ShardSelector
|
154
157
|
end
|
155
158
|
|
156
159
|
module Tasks
|
157
160
|
extend ActiveSupport::Autoload
|
158
161
|
|
159
162
|
autoload :DatabaseTasks
|
160
|
-
autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
|
161
163
|
autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
|
162
|
-
autoload :PostgreSQLDatabaseTasks,
|
163
|
-
|
164
|
+
autoload :PostgreSQLDatabaseTasks, "active_record/tasks/postgresql_database_tasks"
|
165
|
+
autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
|
164
166
|
end
|
165
167
|
|
166
|
-
|
168
|
+
# Lazily load the schema cache. This option will load the schema cache
|
169
|
+
# when a connection is established rather than on boot. If set,
|
170
|
+
# +config.active_record.use_schema_cache_dump+ will be set to false.
|
171
|
+
singleton_class.attr_accessor :lazily_load_schema_cache
|
172
|
+
self.lazily_load_schema_cache = false
|
173
|
+
|
174
|
+
# A list of tables or regex's to match tables to ignore when
|
175
|
+
# dumping the schema cache. For example if this is set to +[/^_/]+
|
176
|
+
# the schema cache will not dump tables named with an underscore.
|
177
|
+
singleton_class.attr_accessor :schema_cache_ignored_tables
|
178
|
+
self.schema_cache_ignored_tables = []
|
179
|
+
|
180
|
+
singleton_class.attr_accessor :legacy_connection_handling
|
181
|
+
self.legacy_connection_handling = true
|
182
|
+
|
183
|
+
singleton_class.attr_reader :default_timezone
|
184
|
+
|
185
|
+
# Determines whether to use Time.utc (using :utc) or Time.local (using :local) when pulling
|
186
|
+
# dates and times from the database. This is set to :utc by default.
|
187
|
+
def self.default_timezone=(default_timezone)
|
188
|
+
unless %i(local utc).include?(default_timezone)
|
189
|
+
raise ArgumentError, "default_timezone must be either :utc (default) or :local."
|
190
|
+
end
|
191
|
+
|
192
|
+
@default_timezone = default_timezone
|
193
|
+
end
|
194
|
+
|
195
|
+
self.default_timezone = :utc
|
196
|
+
|
197
|
+
singleton_class.attr_accessor :writing_role
|
198
|
+
self.writing_role = :writing
|
199
|
+
|
200
|
+
singleton_class.attr_accessor :reading_role
|
201
|
+
self.reading_role = :reading
|
202
|
+
|
203
|
+
# Sets the async_query_executor for an application. By default the thread pool executor
|
204
|
+
# set to +nil+ which will not run queries in the background. Applications must configure
|
205
|
+
# a thread pool executor to use this feature. Options are:
|
206
|
+
#
|
207
|
+
# * nil - Does not initialize a thread pool executor. Any async calls will be
|
208
|
+
# run in the foreground.
|
209
|
+
# * :global_thread_pool - Initializes a single +Concurrent::ThreadPoolExecutor+
|
210
|
+
# that uses the +async_query_concurrency+ for the +max_threads+ value.
|
211
|
+
# * :multi_thread_pool - Initializes a +Concurrent::ThreadPoolExecutor+ for each
|
212
|
+
# database connection. The initializer values are defined in the configuration hash.
|
213
|
+
singleton_class.attr_accessor :async_query_executor
|
214
|
+
self.async_query_executor = nil
|
215
|
+
|
216
|
+
def self.global_thread_pool_async_query_executor # :nodoc:
|
217
|
+
concurrency = global_executor_concurrency || 4
|
218
|
+
@global_thread_pool_async_query_executor ||= Concurrent::ThreadPoolExecutor.new(
|
219
|
+
min_threads: 0,
|
220
|
+
max_threads: concurrency,
|
221
|
+
max_queue: concurrency * 4,
|
222
|
+
fallback_policy: :caller_runs
|
223
|
+
)
|
224
|
+
end
|
225
|
+
|
226
|
+
# Set the +global_executor_concurrency+. This configuration value can only be used
|
227
|
+
# with the global thread pool async query executor.
|
228
|
+
def self.global_executor_concurrency=(global_executor_concurrency)
|
229
|
+
if self.async_query_executor.nil? || self.async_query_executor == :multi_thread_pool
|
230
|
+
raise ArgumentError, "`global_executor_concurrency` cannot be set when using the executor is nil or set to multi_thead_pool. For multiple thread pools, please set the concurrency in your database configuration."
|
231
|
+
end
|
232
|
+
|
233
|
+
@global_executor_concurrency = global_executor_concurrency
|
234
|
+
end
|
235
|
+
|
236
|
+
def self.global_executor_concurrency # :nodoc:
|
237
|
+
@global_executor_concurrency ||= nil
|
238
|
+
end
|
239
|
+
|
240
|
+
singleton_class.attr_accessor :index_nested_attribute_errors
|
241
|
+
self.index_nested_attribute_errors = false
|
242
|
+
|
243
|
+
##
|
244
|
+
# :singleton-method:
|
245
|
+
#
|
246
|
+
# Specifies if the methods calling database queries should be logged below
|
247
|
+
# their relevant queries. Defaults to false.
|
248
|
+
singleton_class.attr_accessor :verbose_query_logs
|
249
|
+
self.verbose_query_logs = false
|
250
|
+
|
251
|
+
##
|
252
|
+
# :singleton-method:
|
253
|
+
#
|
254
|
+
# Specifies the names of the queues used by background jobs.
|
255
|
+
singleton_class.attr_accessor :queues
|
256
|
+
self.queues = {}
|
257
|
+
|
258
|
+
singleton_class.attr_accessor :maintain_test_schema
|
259
|
+
self.maintain_test_schema = nil
|
260
|
+
|
261
|
+
##
|
262
|
+
# :singleton-method:
|
263
|
+
# Specify a threshold for the size of query result sets. If the number of
|
264
|
+
# records in the set exceeds the threshold, a warning is logged. This can
|
265
|
+
# be used to identify queries which load thousands of records and
|
266
|
+
# potentially cause memory bloat.
|
267
|
+
singleton_class.attr_accessor :warn_on_records_fetched_greater_than
|
268
|
+
self.warn_on_records_fetched_greater_than = false
|
269
|
+
|
270
|
+
singleton_class.attr_accessor :application_record_class
|
271
|
+
self.application_record_class = nil
|
272
|
+
|
273
|
+
##
|
274
|
+
# :singleton-method:
|
275
|
+
# Set the application to log or raise when an association violates strict loading.
|
276
|
+
# Defaults to :raise.
|
277
|
+
singleton_class.attr_accessor :action_on_strict_loading_violation
|
278
|
+
self.action_on_strict_loading_violation = :raise
|
279
|
+
|
280
|
+
##
|
281
|
+
# :singleton-method:
|
282
|
+
# Specifies the format to use when dumping the database schema with Rails'
|
283
|
+
# Rakefile. If :sql, the schema is dumped as (potentially database-
|
284
|
+
# specific) SQL statements. If :ruby, the schema is dumped as an
|
285
|
+
# ActiveRecord::Schema file which can be loaded into any database that
|
286
|
+
# supports migrations. Use :ruby if you want to have different database
|
287
|
+
# adapters for, e.g., your development and test environments.
|
288
|
+
singleton_class.attr_accessor :schema_format
|
289
|
+
self.schema_format = :ruby
|
290
|
+
|
291
|
+
##
|
292
|
+
# :singleton-method:
|
293
|
+
# Specifies if an error should be raised if the query has an order being
|
294
|
+
# ignored when doing batch queries. Useful in applications where the
|
295
|
+
# scope being ignored is error-worthy, rather than a warning.
|
296
|
+
singleton_class.attr_accessor :error_on_ignored_order
|
297
|
+
self.error_on_ignored_order = false
|
298
|
+
|
299
|
+
##
|
300
|
+
# :singleton-method:
|
301
|
+
# Specify whether or not to use timestamps for migration versions
|
302
|
+
singleton_class.attr_accessor :timestamped_migrations
|
303
|
+
self.timestamped_migrations = true
|
304
|
+
|
305
|
+
##
|
306
|
+
# :singleton-method:
|
307
|
+
# Specify whether schema dump should happen at the end of the
|
308
|
+
# bin/rails db:migrate command. This is true by default, which is useful for the
|
309
|
+
# development environment. This should ideally be false in the production
|
310
|
+
# environment where dumping schema is rarely needed.
|
311
|
+
singleton_class.attr_accessor :dump_schema_after_migration
|
312
|
+
self.dump_schema_after_migration = true
|
313
|
+
|
314
|
+
##
|
315
|
+
# :singleton-method:
|
316
|
+
# Specifies which database schemas to dump when calling db:schema:dump.
|
317
|
+
# If the value is :schema_search_path (the default), any schemas listed in
|
318
|
+
# schema_search_path are dumped. Use :all to dump all schemas regardless
|
319
|
+
# of schema_search_path, or a string of comma separated schemas for a
|
320
|
+
# custom list.
|
321
|
+
singleton_class.attr_accessor :dump_schemas
|
322
|
+
self.dump_schemas = :schema_search_path
|
323
|
+
|
324
|
+
##
|
325
|
+
# :singleton-method:
|
326
|
+
# Show a warning when Rails couldn't parse your database.yml
|
327
|
+
# for multiple databases.
|
328
|
+
singleton_class.attr_accessor :suppress_multiple_database_warning
|
329
|
+
self.suppress_multiple_database_warning = false
|
330
|
+
|
331
|
+
##
|
332
|
+
# :singleton-method:
|
333
|
+
# If true, Rails will verify all foreign keys in the database after loading fixtures.
|
334
|
+
# An error will be raised if there are any foreign key violations, indicating incorrectly
|
335
|
+
# written fixtures.
|
336
|
+
# Supported by PostgreSQL and SQLite.
|
337
|
+
singleton_class.attr_accessor :verify_foreign_keys_for_fixtures
|
338
|
+
self.verify_foreign_keys_for_fixtures = false
|
339
|
+
|
340
|
+
singleton_class.attr_accessor :query_transformers
|
341
|
+
self.query_transformers = []
|
167
342
|
|
168
343
|
def self.eager_load!
|
169
344
|
super
|
@@ -172,6 +347,7 @@ module ActiveRecord
|
|
172
347
|
ActiveRecord::Associations.eager_load!
|
173
348
|
ActiveRecord::AttributeMethods.eager_load!
|
174
349
|
ActiveRecord::ConnectionAdapters.eager_load!
|
350
|
+
ActiveRecord::Encryption.eager_load!
|
175
351
|
end
|
176
352
|
end
|
177
353
|
|
@@ -186,3 +362,4 @@ end
|
|
186
362
|
YAML.load_tags["!ruby/object:ActiveRecord::AttributeSet"] = "ActiveModel::AttributeSet"
|
187
363
|
YAML.load_tags["!ruby/object:ActiveRecord::Attribute::FromDatabase"] = "ActiveModel::Attribute::FromDatabase"
|
188
364
|
YAML.load_tags["!ruby/object:ActiveRecord::LazyAttributeHash"] = "ActiveModel::LazyAttributeHash"
|
365
|
+
YAML.load_tags["!ruby/object:ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString"] = "ActiveRecord::Type::String"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
module Attributes
|
5
|
+
class Attribute < Struct.new :relation, :name
|
6
|
+
include Arel::Expressions
|
7
|
+
include Arel::Predications
|
8
|
+
include Arel::AliasPredication
|
9
|
+
include Arel::OrderPredications
|
10
|
+
include Arel::Math
|
11
|
+
|
12
|
+
def type_caster
|
13
|
+
relation.type_for_attribute(name)
|
14
|
+
end
|
15
|
+
|
16
|
+
###
|
17
|
+
# Create a node for lowering this attribute
|
18
|
+
def lower
|
19
|
+
relation.lower self
|
20
|
+
end
|
21
|
+
|
22
|
+
def type_cast_for_database(value)
|
23
|
+
relation.type_cast_for_database(name, value)
|
24
|
+
end
|
25
|
+
|
26
|
+
def able_to_type_cast?
|
27
|
+
relation.able_to_type_cast?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Attribute = Attributes::Attribute
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
module Collectors
|
5
|
+
class Bind
|
6
|
+
def initialize
|
7
|
+
@binds = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def <<(str)
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_bind(bind)
|
15
|
+
@binds << bind
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_binds(binds, proc_for_binds = nil)
|
20
|
+
@binds.concat proc_for_binds ? binds.map(&proc_for_binds) : binds
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def value
|
25
|
+
@binds
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
module Collectors
|
5
|
+
class Composite
|
6
|
+
attr_accessor :preparable
|
7
|
+
|
8
|
+
def initialize(left, right)
|
9
|
+
@left = left
|
10
|
+
@right = right
|
11
|
+
end
|
12
|
+
|
13
|
+
def <<(str)
|
14
|
+
left << str
|
15
|
+
right << str
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_bind(bind, &block)
|
20
|
+
left.add_bind bind, &block
|
21
|
+
right.add_bind bind, &block
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_binds(binds, proc_for_binds = nil, &block)
|
26
|
+
left.add_binds(binds, proc_for_binds, &block)
|
27
|
+
right.add_binds(binds, proc_for_binds, &block)
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def value
|
32
|
+
[left.value, right.value]
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
attr_reader :left, :right
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "arel/collectors/plain_string"
|
4
|
+
|
5
|
+
module Arel # :nodoc: all
|
6
|
+
module Collectors
|
7
|
+
class SQLString < PlainString
|
8
|
+
attr_accessor :preparable
|
9
|
+
|
10
|
+
def initialize(*)
|
11
|
+
super
|
12
|
+
@bind_index = 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_bind(bind)
|
16
|
+
self << yield(@bind_index)
|
17
|
+
@bind_index += 1
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_binds(binds, proc_for_binds = nil, &block)
|
22
|
+
self << (@bind_index...@bind_index += binds.size).map(&block).join(", ")
|
23
|
+
self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
module Collectors
|
5
|
+
class SubstituteBinds
|
6
|
+
attr_accessor :preparable
|
7
|
+
|
8
|
+
def initialize(quoter, delegate_collector)
|
9
|
+
@quoter = quoter
|
10
|
+
@delegate = delegate_collector
|
11
|
+
end
|
12
|
+
|
13
|
+
def <<(str)
|
14
|
+
delegate << str
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_bind(bind)
|
19
|
+
bind = bind.value_for_database if bind.respond_to?(:value_for_database)
|
20
|
+
self << quoter.quote(bind)
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_binds(binds, proc_for_binds = nil)
|
24
|
+
self << binds.map { |bind| quoter.quote(bind) }.join(", ")
|
25
|
+
end
|
26
|
+
|
27
|
+
def value
|
28
|
+
delegate.value
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
attr_reader :quoter, :delegate
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/arel/crud.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
###
|
5
|
+
# FIXME hopefully we can remove this
|
6
|
+
module Crud
|
7
|
+
def compile_insert(values)
|
8
|
+
im = create_insert
|
9
|
+
im.insert values
|
10
|
+
im
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_insert
|
14
|
+
InsertManager.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def compile_update(
|
18
|
+
values,
|
19
|
+
key = nil,
|
20
|
+
having_clause = nil,
|
21
|
+
group_values_columns = []
|
22
|
+
)
|
23
|
+
um = UpdateManager.new(source)
|
24
|
+
um.set(values)
|
25
|
+
um.take(limit)
|
26
|
+
um.offset(offset)
|
27
|
+
um.order(*orders)
|
28
|
+
um.wheres = constraints
|
29
|
+
um.key = key
|
30
|
+
|
31
|
+
um.group(group_values_columns) unless group_values_columns.empty?
|
32
|
+
um.having(having_clause) unless having_clause.nil?
|
33
|
+
um
|
34
|
+
end
|
35
|
+
|
36
|
+
def compile_delete(key = nil, having_clause = nil, group_values_columns = [])
|
37
|
+
dm = DeleteManager.new(source)
|
38
|
+
dm.take(limit)
|
39
|
+
dm.offset(offset)
|
40
|
+
dm.order(*orders)
|
41
|
+
dm.wheres = constraints
|
42
|
+
dm.key = key
|
43
|
+
dm.group(group_values_columns) unless group_values_columns.empty?
|
44
|
+
dm.having(having_clause) unless having_clause.nil?
|
45
|
+
dm
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
class DeleteManager < Arel::TreeManager
|
5
|
+
include TreeManager::StatementMethods
|
6
|
+
|
7
|
+
def initialize(table = nil)
|
8
|
+
@ast = Nodes::DeleteStatement.new(table)
|
9
|
+
end
|
10
|
+
|
11
|
+
def from(relation)
|
12
|
+
@ast.relation = relation
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def group(columns)
|
17
|
+
columns.each do |column|
|
18
|
+
column = Nodes::SqlLiteral.new(column) if String === column
|
19
|
+
column = Nodes::SqlLiteral.new(column.to_s) if Symbol === column
|
20
|
+
|
21
|
+
@ast.groups.push Nodes::Group.new column
|
22
|
+
end
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def having(expr)
|
28
|
+
@ast.havings << expr
|
29
|
+
self
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/arel/errors.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arel # :nodoc: all
|
4
|
+
module Expressions
|
5
|
+
def count(distinct = false)
|
6
|
+
Nodes::Count.new [self], distinct
|
7
|
+
end
|
8
|
+
|
9
|
+
def sum
|
10
|
+
Nodes::Sum.new [self]
|
11
|
+
end
|
12
|
+
|
13
|
+
def maximum
|
14
|
+
Nodes::Max.new [self]
|
15
|
+
end
|
16
|
+
|
17
|
+
def minimum
|
18
|
+
Nodes::Min.new [self]
|
19
|
+
end
|
20
|
+
|
21
|
+
def average
|
22
|
+
Nodes::Avg.new [self]
|
23
|
+
end
|
24
|
+
|
25
|
+
def extract(field)
|
26
|
+
Nodes::Extract.new [self], field
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|