hare-orm 0.9.0__py3-none-any.whl
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.
- hare/__init__.py +47 -0
- hare/__main__.py +8 -0
- hare/classes/__init__.py +1 -0
- hare/classes/class_path.py +50 -0
- hare/classes/class_property.py +18 -0
- hare/classes/comparable_values.py +113 -0
- hare/classes/constants.py +11 -0
- hare/classes/declared_subclass.py +26 -0
- hare/classes/lazy_exports.py +56 -0
- hare/classes/shown_value_repr.py +21 -0
- hare/classes/value_descriptions.py +81 -0
- hare/cli/__init__.py +3 -0
- hare/cli/__main__.py +7 -0
- hare/cli/arg_parser_builder.py +344 -0
- hare/cli/commands/__init__.py +0 -0
- hare/cli/commands/database_shell_commands.py +56 -0
- hare/cli/commands/distributed_recovery_commands.py +86 -0
- hare/cli/commands/interactive_rename_questions.py +30 -0
- hare/cli/commands/migration_commands.py +579 -0
- hare/cli/commands/schema_commands.py +123 -0
- hare/cli/commands/stub_commands.py +52 -0
- hare/cli/config_locator.py +37 -0
- hare/cli/constants.py +24 -0
- hare/cli/context/__init__.py +9 -0
- hare/cli/context/cli_context.py +17 -0
- hare/cli/context/command_context.py +108 -0
- hare/cli/exceptions.py +9 -0
- hare/cli/hare_cli.py +111 -0
- hare/cli/output/__init__.py +1 -0
- hare/cli/output/output_formatter.py +145 -0
- hare/cli/output/terminal_colors.py +89 -0
- hare/cli/plugins/__init__.py +16 -0
- hare/cli/plugins/cli_command.py +43 -0
- hare/cli/plugins/cli_command_registry.py +144 -0
- hare/cli/plugins/loaded_cli_command.py +13 -0
- hare/cli/shell_launcher.py +95 -0
- hare/contrib/__init__.py +0 -0
- hare/contrib/application_lifecycle.py +157 -0
- hare/contrib/factories/__init__.py +39 -0
- hare/contrib/factories/constants.py +21 -0
- hare/contrib/factories/factory_reference.py +27 -0
- hare/contrib/factories/field_declarations/__init__.py +1 -0
- hare/contrib/factories/field_declarations/declaration.py +19 -0
- hare/contrib/factories/field_declarations/faker.py +49 -0
- hare/contrib/factories/field_declarations/iterator.py +36 -0
- hare/contrib/factories/field_declarations/lazy_attribute.py +35 -0
- hare/contrib/factories/field_declarations/lazy_function.py +22 -0
- hare/contrib/factories/field_declarations/many_to_many.py +40 -0
- hare/contrib/factories/field_declarations/post_declaration.py +22 -0
- hare/contrib/factories/field_declarations/related_factory.py +37 -0
- hare/contrib/factories/field_declarations/sequence.py +22 -0
- hare/contrib/factories/field_declarations/sub_factory.py +30 -0
- hare/contrib/factories/model_factory.py +284 -0
- hare/contrib/factories/trait.py +23 -0
- hare/contrib/frameworks/__init__.py +14 -0
- hare/contrib/frameworks/constants.py +45 -0
- hare/contrib/frameworks/error_answers.py +93 -0
- hare/contrib/frameworks/exceptions.py +19 -0
- hare/contrib/frameworks/fastapi/__init__.py +12 -0
- hare/contrib/frameworks/fastapi/constants.py +4 -0
- hare/contrib/frameworks/fastapi/hare_exception_handlers.py +103 -0
- hare/contrib/frameworks/fastapi/hare_fast_api.py +139 -0
- hare/contrib/frameworks/fastapi/middleware/__init__.py +7 -0
- hare/contrib/frameworks/fastapi/middleware/request_state_reset_middleware.py +27 -0
- hare/contrib/frameworks/fastapi/middleware/transaction_failing_handler.py +31 -0
- hare/contrib/frameworks/fastapi/middleware/transaction_middleware.py +72 -0
- hare/contrib/frameworks/fastapi/request_query_dependency.py +88 -0
- hare/contrib/frameworks/hare_lifecycle.py +50 -0
- hare/contrib/frameworks/health_routes.py +101 -0
- hare/contrib/frameworks/litestar/__init__.py +14 -0
- hare/contrib/frameworks/litestar/constants.py +18 -0
- hare/contrib/frameworks/litestar/hare_dto.py +194 -0
- hare/contrib/frameworks/litestar/hare_exception_handlers.py +77 -0
- hare/contrib/frameworks/litestar/hare_plugin.py +181 -0
- hare/contrib/frameworks/litestar/hare_transfer_function_factory.py +38 -0
- hare/contrib/frameworks/litestar/middleware/__init__.py +7 -0
- hare/contrib/frameworks/litestar/middleware/request_state_reset_middleware.py +23 -0
- hare/contrib/frameworks/litestar/middleware/transaction_middleware.py +35 -0
- hare/contrib/frameworks/litestar/request_query_di_plugin.py +96 -0
- hare/contrib/frameworks/pages/__init__.py +22 -0
- hare/contrib/frameworks/pages/cursor_page_schema.py +25 -0
- hare/contrib/frameworks/pages/page_schema.py +25 -0
- hare/contrib/frameworks/pages/scroll_page_schema.py +23 -0
- hare/contrib/frameworks/parameter_annotation.py +110 -0
- hare/contrib/frameworks/request_state.py +16 -0
- hare/contrib/frameworks/request_transaction.py +186 -0
- hare/contrib/frameworks/robyn/__init__.py +13 -0
- hare/contrib/frameworks/robyn/application/__init__.py +11 -0
- hare/contrib/frameworks/robyn/application/hare_robyn.py +199 -0
- hare/contrib/frameworks/robyn/application/hare_sub_router.py +50 -0
- hare/contrib/frameworks/robyn/constants.py +32 -0
- hare/contrib/frameworks/robyn/hare_exception_handlers.py +128 -0
- hare/contrib/frameworks/robyn/hare_open_api.py +91 -0
- hare/contrib/frameworks/robyn/route_handler.py +198 -0
- hare/contrib/mypy/__init__.py +11 -0
- hare/contrib/mypy/annotation_types.py +170 -0
- hare/contrib/mypy/constants.py +83 -0
- hare/contrib/mypy/enums.py +18 -0
- hare/contrib/mypy/field_names_check.py +222 -0
- hare/contrib/mypy/filter_arguments_check.py +129 -0
- hare/contrib/mypy/hare_mypy_plugin.py +166 -0
- hare/contrib/mypy/instance_attribute_types.py +137 -0
- hare/contrib/mypy/model_registry.py +127 -0
- hare/contrib/mypy/mypy_types.py +383 -0
- hare/contrib/mypy/queryset_extension_methods.py +109 -0
- hare/contrib/mypy/values_row_types.py +146 -0
- hare/contrib/mypy/write_arguments_check.py +159 -0
- hare/contrib/notify/__init__.py +5 -0
- hare/contrib/notify/constants.py +14 -0
- hare/contrib/notify/notification_listener.py +317 -0
- hare/contrib/opentelemetry/__init__.py +16 -0
- hare/contrib/opentelemetry/constants.py +31 -0
- hare/contrib/opentelemetry/open_telemetry_instrumentor.py +60 -0
- hare/contrib/opentelemetry/pool_metric_instruments.py +210 -0
- hare/contrib/opentelemetry/query_spans.py +69 -0
- hare/contrib/outbox/__init__.py +65 -0
- hare/contrib/outbox/broker_arguments.py +40 -0
- hare/contrib/outbox/brokers/__init__.py +1 -0
- hare/contrib/outbox/brokers/rabbitmq_connection.py +55 -0
- hare/contrib/outbox/brokers/redis_connection.py +42 -0
- hare/contrib/outbox/capture/__init__.py +6 -0
- hare/contrib/outbox/capture/change_capture.py +366 -0
- hare/contrib/outbox/capture/change_extension.py +22 -0
- hare/contrib/outbox/capture/constants.py +19 -0
- hare/contrib/outbox/constants.py +31 -0
- hare/contrib/outbox/deliveries/__init__.py +22 -0
- hare/contrib/outbox/deliveries/callable_delivery.py +44 -0
- hare/contrib/outbox/deliveries/constants.py +19 -0
- hare/contrib/outbox/deliveries/kafka_delivery.py +124 -0
- hare/contrib/outbox/deliveries/outbox_delivery.py +106 -0
- hare/contrib/outbox/deliveries/rabbitmq_delivery.py +63 -0
- hare/contrib/outbox/deliveries/redis_streams_delivery.py +110 -0
- hare/contrib/outbox/deliveries/topic_router.py +103 -0
- hare/contrib/outbox/deliveries/webhook_delivery.py +106 -0
- hare/contrib/outbox/exceptions.py +7 -0
- hare/contrib/outbox/outbox_event.py +362 -0
- hare/contrib/outbox/outbox_json_encoding.py +87 -0
- hare/contrib/outbox/relay/__init__.py +7 -0
- hare/contrib/outbox/relay/constants.py +41 -0
- hare/contrib/outbox/relay/declarations.py +76 -0
- hare/contrib/outbox/relay/outbox_backlog.py +18 -0
- hare/contrib/outbox/relay/outbox_relay.py +646 -0
- hare/contrib/outbox/wakeups/__init__.py +20 -0
- hare/contrib/outbox/wakeups/constants.py +20 -0
- hare/contrib/outbox/wakeups/in_process_wakeup.py +17 -0
- hare/contrib/outbox/wakeups/kafka_wakeup.py +123 -0
- hare/contrib/outbox/wakeups/listen_notify_wakeup.py +75 -0
- hare/contrib/outbox/wakeups/outbox_wakeup.py +202 -0
- hare/contrib/outbox/wakeups/rabbitmq_wakeup.py +64 -0
- hare/contrib/outbox/wakeups/redis_wakeup.py +53 -0
- hare/contrib/pydantic/__init__.py +12 -0
- hare/contrib/pydantic/constants.py +41 -0
- hare/contrib/pydantic/creation/__init__.py +1 -0
- hare/contrib/pydantic/creation/computed_field_schemas.py +77 -0
- hare/contrib/pydantic/creation/data_field_schemas.py +230 -0
- hare/contrib/pydantic/creation/field_descriptions.py +17 -0
- hare/contrib/pydantic/creation/field_map.py +138 -0
- hare/contrib/pydantic/creation/generic_foreign_key_schemas.py +136 -0
- hare/contrib/pydantic/creation/generic_foreign_key_tag_reader.py +35 -0
- hare/contrib/pydantic/creation/model_annotations.py +44 -0
- hare/contrib/pydantic/creation/pydantic_creators.py +163 -0
- hare/contrib/pydantic/creation/pydantic_meta_reading.py +134 -0
- hare/contrib/pydantic/creation/pydantic_model_creator.py +434 -0
- hare/contrib/pydantic/creation/relation_field_schemas.py +269 -0
- hare/contrib/pydantic/descriptions/__init__.py +5 -0
- hare/contrib/pydantic/descriptions/computed_field_description.py +12 -0
- hare/contrib/pydantic/descriptions/model_description.py +69 -0
- hare/contrib/pydantic/descriptions/pydantic_meta_data.py +144 -0
- hare/contrib/pydantic/enums.py +12 -0
- hare/contrib/pydantic/models/__init__.py +9 -0
- hare/contrib/pydantic/models/pydantic_list_model.py +34 -0
- hare/contrib/pydantic/models/pydantic_model.py +292 -0
- hare/contrib/pytest/__init__.py +17 -0
- hare/contrib/pytest/constants.py +26 -0
- hare/contrib/pytest/hare_fixtures.py +112 -0
- hare/contrib/pytest/missing_pytest_asyncio_fixtures.py +34 -0
- hare/contrib/pytest/plugin.py +49 -0
- hare/contrib/repeated_queries/__init__.py +19 -0
- hare/contrib/repeated_queries/constants.py +10 -0
- hare/contrib/repeated_queries/repeated_query_collection.py +116 -0
- hare/contrib/repeated_queries/repeated_query_detector.py +227 -0
- hare/contrib/repeated_queries/repeated_query_entry.py +20 -0
- hare/contrib/repeated_queries/repeated_query_report.py +31 -0
- hare/contrib/repeated_queries/shape_stats.py +18 -0
- hare/contrib/request_query/__init__.py +71 -0
- hare/contrib/request_query/bounds/__init__.py +6 -0
- hare/contrib/request_query/bounds/constants.py +4 -0
- hare/contrib/request_query/bounds/lookup_pair_bounds.py +40 -0
- hare/contrib/request_query/bounds/parameter_bounds.py +41 -0
- hare/contrib/request_query/bounds/range_bounds.py +30 -0
- hare/contrib/request_query/constants.py +45 -0
- hare/contrib/request_query/declaration/__init__.py +6 -0
- hare/contrib/request_query/declaration/constants.py +19 -0
- hare/contrib/request_query/declaration/declaration_builder.py +515 -0
- hare/contrib/request_query/declaration/filter_declaration.py +25 -0
- hare/contrib/request_query/declaration/filter_parameter_builder.py +201 -0
- hare/contrib/request_query/declaration/parameter_filter.py +17 -0
- hare/contrib/request_query/declaration/request_query_declaration.py +138 -0
- hare/contrib/request_query/declaration/request_query_parameters.py +54 -0
- hare/contrib/request_query/declaration/request_query_registry.py +90 -0
- hare/contrib/request_query/descriptions/__init__.py +11 -0
- hare/contrib/request_query/descriptions/constants.py +11 -0
- hare/contrib/request_query/descriptions/parameter_choice.py +17 -0
- hare/contrib/request_query/descriptions/parameter_describer.py +240 -0
- hare/contrib/request_query/descriptions/parameter_description.py +66 -0
- hare/contrib/request_query/descriptions/relation_description.py +30 -0
- hare/contrib/request_query/enums.py +69 -0
- hare/contrib/request_query/exceptions.py +52 -0
- hare/contrib/request_query/options/__init__.py +33 -0
- hare/contrib/request_query/options/constants.py +25 -0
- hare/contrib/request_query/options/deleted_config.py +90 -0
- hare/contrib/request_query/options/fields_config.py +55 -0
- hare/contrib/request_query/options/filter.py +34 -0
- hare/contrib/request_query/options/filter_field.py +81 -0
- hare/contrib/request_query/options/in_path.py +12 -0
- hare/contrib/request_query/options/include_config.py +56 -0
- hare/contrib/request_query/options/latest_versions.py +71 -0
- hare/contrib/request_query/options/no_filter.py +11 -0
- hare/contrib/request_query/options/ordering_config.py +81 -0
- hare/contrib/request_query/options/parameter_field.py +27 -0
- hare/contrib/request_query/options/request_option.py +152 -0
- hare/contrib/request_query/options/search_config.py +83 -0
- hare/contrib/request_query/paginations/__init__.py +1 -0
- hare/contrib/request_query/paginations/base_offset_pagination.py +78 -0
- hare/contrib/request_query/paginations/constants.py +17 -0
- hare/contrib/request_query/paginations/cursor.py +83 -0
- hare/contrib/request_query/paginations/cursor_pagination.py +184 -0
- hare/contrib/request_query/paginations/offset_pagination.py +31 -0
- hare/contrib/request_query/paginations/pagination.py +120 -0
- hare/contrib/request_query/paginations/scroll_pagination.py +31 -0
- hare/contrib/request_query/request_query.py +1259 -0
- hare/contrib/request_query/results/__init__.py +11 -0
- hare/contrib/request_query/results/cursor_page.py +25 -0
- hare/contrib/request_query/results/page.py +25 -0
- hare/contrib/request_query/results/scroll_page.py +23 -0
- hare/contrib/request_query/row_changes.py +80 -0
- hare/contrib/request_query/types/__init__.py +15 -0
- hare/contrib/request_query/types/comma_separated.py +46 -0
- hare/contrib/request_query/types/constants.py +16 -0
- hare/contrib/request_query/types/generic_target.py +87 -0
- hare/contrib/request_query/types/key_columns.py +60 -0
- hare/contrib/request_query/types/text_parameter.py +18 -0
- hare/contrib/request_query/value_annotation.py +216 -0
- hare/contrib/request_query/value_counter.py +115 -0
- hare/contrib/request_query/value_target.py +50 -0
- hare/contrib/taskiq/__init__.py +15 -0
- hare/contrib/taskiq/constants.py +23 -0
- hare/contrib/taskiq/hare_taskiq.py +76 -0
- hare/contrib/taskiq/hare_taskiq_middleware.py +195 -0
- hare/contrib/taskiq/running_task.py +29 -0
- hare/contrib/taskiq/task_tenant_labels.py +102 -0
- hare/contrib/taskiq/taskiq_delivery.py +117 -0
- hare/contrib/test/__init__.py +39 -0
- hare/contrib/test/conditions/__init__.py +10 -0
- hare/contrib/test/conditions/condition.py +11 -0
- hare/contrib/test/conditions/in_condition.py +21 -0
- hare/contrib/test/conditions/not_eq.py +18 -0
- hare/contrib/test/conditions/not_in.py +21 -0
- hare/contrib/test/constants.py +18 -0
- hare/contrib/test/databases/__init__.py +1 -0
- hare/contrib/test/databases/kept_test_schema.py +51 -0
- hare/contrib/test/databases/model_truncation.py +128 -0
- hare/contrib/test/databases/reusable_test_databases.py +244 -0
- hare/contrib/test/databases/rollback_isolation.py +149 -0
- hare/contrib/test/databases/temporary_databases.py +118 -0
- hare/contrib/test/exceptions.py +5 -0
- hare/contrib/test/features/__init__.py +1 -0
- hare/contrib/test/features/feature_conditions.py +65 -0
- hare/contrib/test/features/feature_requirements.py +84 -0
- hare/contrib/test/isolated_contexts.py +144 -0
- hare/contrib/test/queries/__init__.py +1 -0
- hare/contrib/test/queries/query_counter.py +35 -0
- hare/contrib/test/queries/query_counting.py +59 -0
- hare/contrib/versioning/__init__.py +7 -0
- hare/contrib/versioning/constants.py +5 -0
- hare/contrib/versioning/versioned_model.py +139 -0
- hare/core/__init__.py +4 -0
- hare/core/apps/__init__.py +8 -0
- hare/core/apps/apps.py +693 -0
- hare/core/apps/cross_connection_checks.py +76 -0
- hare/core/apps/model_connection_checks.py +199 -0
- hare/core/apps/model_discovery.py +142 -0
- hare/core/apps/relation_linking.py +773 -0
- hare/core/apps/swappable_models.py +118 -0
- hare/core/apps/table_names.py +39 -0
- hare/core/caching/__init__.py +1 -0
- hare/core/caching/cache.py +426 -0
- hare/core/caching/caches.py +58 -0
- hare/core/caching/constants.py +13 -0
- hare/core/caching/declarations.py +8 -0
- hare/core/caching/forgettable_cache.py +16 -0
- hare/core/caching/model_cache.py +138 -0
- hare/core/config/__init__.py +25 -0
- hare/core/config/app_config.py +64 -0
- hare/core/config/cli_config.py +38 -0
- hare/core/config/config_secrets.py +101 -0
- hare/core/config/config_section.py +37 -0
- hare/core/config/connection_config.py +69 -0
- hare/core/config/constants.py +17 -0
- hare/core/config/db_url_config.py +24 -0
- hare/core/config/hare_config.py +407 -0
- hare/core/config/migration_safety_config.py +54 -0
- hare/core/config/migrations_config.py +72 -0
- hare/core/connections/__init__.py +1 -0
- hare/core/connections/connection_handler.py +457 -0
- hare/core/connections/connection_token.py +36 -0
- hare/core/connections/connections.py +133 -0
- hare/core/constants.py +40 -0
- hare/core/hare.py +205 -0
- hare/core/hare_context.py +854 -0
- hare/core/hare_meta.py +18 -0
- hare/core/log.py +6 -0
- hare/core/registries.py +22 -0
- hare/core/routing/__init__.py +5 -0
- hare/core/routing/connection_router.py +109 -0
- hare/core/routing/primary_reads.py +42 -0
- hare/core/routing/routing.py +28 -0
- hare/core/routing/written_connections.py +63 -0
- hare/ddl/__init__.py +57 -0
- hare/ddl/conditions/__init__.py +1 -0
- hare/ddl/conditions/constraint_condition.py +154 -0
- hare/ddl/conditions/exclusive_arc_condition.py +80 -0
- hare/ddl/conditions/tenant_condition.py +48 -0
- hare/ddl/conditions/trigger_condition.py +44 -0
- hare/ddl/constants.py +68 -0
- hare/ddl/constraints/__init__.py +7 -0
- hare/ddl/constraints/check_constraint.py +38 -0
- hare/ddl/constraints/exclusion_constraint.py +116 -0
- hare/ddl/constraints/foreign_key_constraint.py +39 -0
- hare/ddl/constraints/unique_constraint.py +150 -0
- hare/ddl/ddl_term_sql.py +45 -0
- hare/ddl/declared_names.py +47 -0
- hare/ddl/enums.py +117 -0
- hare/ddl/expressions/__init__.py +0 -0
- hare/ddl/expressions/declared_expressions.py +102 -0
- hare/ddl/expressions/expression_field_renaming.py +150 -0
- hare/ddl/generated_names.py +87 -0
- hare/ddl/indexes/__init__.py +11 -0
- hare/ddl/indexes/index.py +531 -0
- hare/ddl/indexes/ordered_index_key.py +27 -0
- hare/ddl/indexes/partial_index.py +75 -0
- hare/ddl/raw_sql_term.py +44 -0
- hare/ddl/schema_objects/__init__.py +12 -0
- hare/ddl/schema_objects/database_function.py +91 -0
- hare/ddl/schema_objects/database_sequence.py +87 -0
- hare/ddl/schema_objects/dictionary.py +69 -0
- hare/ddl/schema_objects/enum_type.py +24 -0
- hare/ddl/schema_objects/materialized_view.py +52 -0
- hare/ddl/schema_objects/named_schema_object.py +24 -0
- hare/ddl/schema_objects/trigger.py +151 -0
- hare/ddl/schema_objects/view.py +132 -0
- hare/ddl/security/__init__.py +8 -0
- hare/ddl/security/grant.py +106 -0
- hare/ddl/security/policy.py +92 -0
- hare/ddl/table_options.py +364 -0
- hare/dialects/__init__.py +0 -0
- hare/dialects/base/__init__.py +0 -0
- hare/dialects/base/clauses/__init__.py +1 -0
- hare/dialects/base/clauses/enums.py +37 -0
- hare/dialects/base/clauses/limit_returning_conflict_query_clauses.py +194 -0
- hare/dialects/base/clauses/merge_when_sql.py +24 -0
- hare/dialects/base/clauses/query_clauses.py +636 -0
- hare/dialects/base/client/__init__.py +16 -0
- hare/dialects/base/client/connect_failure_reports.py +49 -0
- hare/dialects/base/client/connection_ping.py +48 -0
- hare/dialects/base/client/connection_wrapper.py +126 -0
- hare/dialects/base/client/constants.py +41 -0
- hare/dialects/base/client/database_client.py +1187 -0
- hare/dialects/base/client/declarations.py +37 -0
- hare/dialects/base/client/driver_statement_log_filter.py +33 -0
- hare/dialects/base/client/password_provider.py +144 -0
- hare/dialects/base/client/pool/__init__.py +1 -0
- hare/dialects/base/client/pool/pool_connection_wrapper.py +37 -0
- hare/dialects/base/client/pool/pool_statistics.py +84 -0
- hare/dialects/base/client/pool/pool_timeouts.py +48 -0
- hare/dialects/base/client/transaction_client.py +621 -0
- hare/dialects/base/client/transaction_lifecycle/__init__.py +1 -0
- hare/dialects/base/client/transaction_lifecycle/pending_statements.py +74 -0
- hare/dialects/base/client/transaction_lifecycle/transaction_callbacks.py +128 -0
- hare/dialects/base/client/transaction_lifecycle/transaction_ending.py +360 -0
- hare/dialects/base/connection/__init__.py +1 -0
- hare/dialects/base/connection/connection_option.py +142 -0
- hare/dialects/base/connection/connection_options.py +69 -0
- hare/dialects/base/connection/constants.py +27 -0
- hare/dialects/base/connection/db_url_config_generator.py +194 -0
- hare/dialects/base/connection/driver.py +136 -0
- hare/dialects/base/constants.py +72 -0
- hare/dialects/base/dialect.py +360 -0
- hare/dialects/base/features.py +369 -0
- hare/dialects/base/literals/__init__.py +1 -0
- hare/dialects/base/literals/constants.py +12 -0
- hare/dialects/base/literals/sql_literals.py +254 -0
- hare/dialects/base/lookups/__init__.py +1 -0
- hare/dialects/base/lookups/filter_operators.py +171 -0
- hare/dialects/base/migration_safety/__init__.py +12 -0
- hare/dialects/base/migration_safety/add_field_backfill_rule.py +37 -0
- hare/dialects/base/migration_safety/alter_field_rewrite_rule.py +39 -0
- hare/dialects/base/migration_safety/constants.py +4 -0
- hare/dialects/base/migration_safety/delete_model_rule.py +33 -0
- hare/dialects/base/migration_safety/migration_safety_rule.py +45 -0
- hare/dialects/base/migration_safety/migration_safety_rules.py +72 -0
- hare/dialects/base/migration_safety/remove_field_rule.py +31 -0
- hare/dialects/base/migration_safety/rename_field_rule.py +41 -0
- hare/dialects/base/migration_safety/rename_model_rule.py +42 -0
- hare/dialects/base/migration_safety/run_sql_rule.py +27 -0
- hare/dialects/base/migration_safety/schema_change_with_run_python_rule.py +49 -0
- hare/dialects/base/parameters/__init__.py +1 -0
- hare/dialects/base/parameters/large_in_list.py +147 -0
- hare/dialects/base/parameters/sql_parameters.py +185 -0
- hare/dialects/base/renderers/__init__.py +7 -0
- hare/dialects/base/renderers/checked_term_renderers.py +61 -0
- hare/dialects/base/renderers/json_renderers.py +60 -0
- hare/dialects/base/renderers/term_renderers.py +508 -0
- hare/dialects/base/results/__init__.py +9 -0
- hare/dialects/base/results/described_result.py +22 -0
- hare/dialects/base/results/statement_result.py +53 -0
- hare/dialects/base/schema/__init__.py +0 -0
- hare/dialects/base/schema/base_schema_editor.py +1139 -0
- hare/dialects/base/schema/columns/__init__.py +1 -0
- hare/dialects/base/schema/columns/column_backfill.py +347 -0
- hare/dialects/base/schema/columns/column_conversion_check.py +51 -0
- hare/dialects/base/schema/columns/column_definitions.py +473 -0
- hare/dialects/base/schema/columns/column_narrowing_check.py +178 -0
- hare/dialects/base/schema/columns/column_renames.py +77 -0
- hare/dialects/base/schema/columns/column_type_changes.py +140 -0
- hare/dialects/base/schema/constants.py +30 -0
- hare/dialects/base/schema/constraints/__init__.py +1 -0
- hare/dialects/base/schema/constraints/constraint_names.py +45 -0
- hare/dialects/base/schema/constraints/constraint_statements.py +262 -0
- hare/dialects/base/schema/data/__init__.py +9 -0
- hare/dialects/base/schema/data/model_sql_data.py +41 -0
- hare/dialects/base/schema/data/referencing_key_columns.py +24 -0
- hare/dialects/base/schema/indexes/__init__.py +1 -0
- hare/dialects/base/schema/indexes/generated_index_names.py +180 -0
- hare/dialects/base/schema/indexes/index_statements.py +397 -0
- hare/dialects/base/schema/relations/__init__.py +1 -0
- hare/dialects/base/schema/relations/foreign_key_rebuild.py +480 -0
- hare/dialects/base/schema/relations/many_to_many_through_tables.py +285 -0
- hare/dialects/base/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/base/schema/runtime_statements/table_clearing.py +54 -0
- hare/dialects/base/schema/runtime_statements/table_locks.py +34 -0
- hare/dialects/base/schema/runtime_statements/tenant_conditions.py +71 -0
- hare/dialects/base/schema/schema_editor_part.py +34 -0
- hare/dialects/base/schema/schema_objects/__init__.py +1 -0
- hare/dialects/base/schema/schema_objects/database_functions.py +74 -0
- hare/dialects/base/schema/schema_objects/dictionaries.py +75 -0
- hare/dialects/base/schema/schema_objects/enum_types.py +88 -0
- hare/dialects/base/schema/schema_objects/extensions.py +69 -0
- hare/dialects/base/schema/schema_objects/grants.py +49 -0
- hare/dialects/base/schema/schema_objects/materialized_views.py +111 -0
- hare/dialects/base/schema/schema_objects/row_level_security_policies.py +82 -0
- hare/dialects/base/schema/schema_objects/schemas.py +65 -0
- hare/dialects/base/schema/schema_objects/sequences.py +95 -0
- hare/dialects/base/schema/schema_objects/views.py +81 -0
- hare/dialects/base/schema/shadow/__init__.py +0 -0
- hare/dialects/base/schema/shadow/shadow_database.py +77 -0
- hare/dialects/base/schema/tables/__init__.py +1 -0
- hare/dialects/base/schema/tables/table_comments.py +92 -0
- hare/dialects/base/schema/tables/table_creation.py +742 -0
- hare/dialects/base/schema/tables/table_partitions.py +78 -0
- hare/dialects/base/schema/tables/table_rebuild.py +268 -0
- hare/dialects/base/schema/triggers/__init__.py +1 -0
- hare/dialects/base/schema/triggers/trigger_statements.py +85 -0
- hare/dialects/base/search/__init__.py +1 -0
- hare/dialects/base/search/text_search.py +135 -0
- hare/dialects/base/sql_dialect.py +23 -0
- hare/dialects/base/transactions/__init__.py +1 -0
- hare/dialects/base/transactions/constants.py +5 -0
- hare/dialects/base/transactions/contexts/__init__.py +1 -0
- hare/dialects/base/transactions/contexts/joined_transaction_context.py +36 -0
- hare/dialects/base/transactions/contexts/nested_transaction_context.py +149 -0
- hare/dialects/base/transactions/contexts/non_transactional_context.py +32 -0
- hare/dialects/base/transactions/contexts/top_level_transaction_context.py +79 -0
- hare/dialects/base/transactions/contexts/transaction_context.py +148 -0
- hare/dialects/base/transactions/savepoints/__init__.py +1 -0
- hare/dialects/base/transactions/savepoints/nested_savepoint_lock.py +152 -0
- hare/dialects/base/transactions/savepoints/savepoint_span.py +51 -0
- hare/dialects/base/transactions/transaction_callback.py +32 -0
- hare/dialects/base/transactions/transaction_statements.py +128 -0
- hare/dialects/base/transactions/two_phase_commit.py +134 -0
- hare/dialects/base/types/__init__.py +9 -0
- hare/dialects/base/types/type_mapping.py +63 -0
- hare/dialects/base/types/type_registry.py +395 -0
- hare/dialects/clickhouse/__init__.py +1 -0
- hare/dialects/clickhouse/clauses/__init__.py +1 -0
- hare/dialects/clickhouse/clauses/clickhouse_query_clauses.py +475 -0
- hare/dialects/clickhouse/clauses/constants.py +42 -0
- hare/dialects/clickhouse/clickhouse_dialect.py +260 -0
- hare/dialects/clickhouse/clickhouse_introspector.py +414 -0
- hare/dialects/clickhouse/clickhouse_table_options.py +727 -0
- hare/dialects/clickhouse/client/__init__.py +1 -0
- hare/dialects/clickhouse/client/clickhouse_client.py +913 -0
- hare/dialects/clickhouse/client/clickhouse_connection.py +30 -0
- hare/dialects/clickhouse/client/clickhouse_error_codes.py +26 -0
- hare/dialects/clickhouse/client/clickhouse_external_sets.py +109 -0
- hare/dialects/clickhouse/client/clickhouse_query_templates.py +79 -0
- hare/dialects/clickhouse/client/clickhouse_statement_result.py +15 -0
- hare/dialects/clickhouse/client/clickhouse_streamed_row.py +52 -0
- hare/dialects/clickhouse/client/clickhouse_transaction_client.py +188 -0
- hare/dialects/clickhouse/client/constants.py +211 -0
- hare/dialects/clickhouse/client/declarations.py +47 -0
- hare/dialects/clickhouse/cluster/__init__.py +0 -0
- hare/dialects/clickhouse/cluster/clickhouse_cluster.py +162 -0
- hare/dialects/clickhouse/cluster/clickhouse_cluster_statements.py +154 -0
- hare/dialects/clickhouse/cluster/constants.py +82 -0
- hare/dialects/clickhouse/connection/__init__.py +1 -0
- hare/dialects/clickhouse/connection/clickhouse_driver.py +40 -0
- hare/dialects/clickhouse/constants.py +226 -0
- hare/dialects/clickhouse/drivers/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/clickhouse_connect_driver.py +43 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_client.py +390 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_dynamic_type.py +76 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_totals_query.py +70 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_transaction_client.py +56 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_whole_response_query.py +127 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_json_compact_values.py +96 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/constants.py +60 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/clickhouse_driver_driver.py +48 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_client.py +361 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_client_info.py +70 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_column_types.py +104 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_connections.py +189 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_decompressors.py +48 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_dynamic_column.py +51 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_library_client.py +239 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_library_connection.py +16 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_map_columns.py +49 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_moment_columns.py +85 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_query_result.py +24 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_row_stream.py +127 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_service_block_stream.py +95 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_settings.py +62 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_transaction_client.py +23 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_tuple_columns.py +38 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_variant_column.py +76 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/constants.py +133 -0
- hare/dialects/clickhouse/drivers/clickhouse_shared_variant_values.py +878 -0
- hare/dialects/clickhouse/drivers/constants.py +143 -0
- hare/dialects/clickhouse/enums.py +38 -0
- hare/dialects/clickhouse/fields/__init__.py +43 -0
- hare/dialects/clickhouse/fields/clickhouse_date_field.py +32 -0
- hare/dialects/clickhouse/fields/clickhouse_datetime_field.py +162 -0
- hare/dialects/clickhouse/fields/clickhouse_integer_field.py +20 -0
- hare/dialects/clickhouse/fields/constants.py +31 -0
- hare/dialects/clickhouse/fields/declarations.py +81 -0
- hare/dialects/clickhouse/fields/dynamic_field.py +122 -0
- hare/dialects/clickhouse/fields/fixed_string_field.py +81 -0
- hare/dialects/clickhouse/fields/float32_field.py +39 -0
- hare/dialects/clickhouse/fields/low_cardinality_field.py +72 -0
- hare/dialects/clickhouse/fields/variant_field.py +174 -0
- hare/dialects/clickhouse/functions/__init__.py +39 -0
- hare/dialects/clickhouse/functions/aggregates/__init__.py +37 -0
- hare/dialects/clickhouse/functions/aggregates/arg_extremum.py +23 -0
- hare/dialects/clickhouse/functions/aggregates/declarations.py +120 -0
- hare/dialects/clickhouse/functions/aggregates/group_array.py +48 -0
- hare/dialects/clickhouse/functions/aggregates/median.py +18 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_aggregate.py +48 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_aggregate_function.py +45 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_analytic_function.py +27 -0
- hare/dialects/clickhouse/functions/aggregates/quantile.py +74 -0
- hare/dialects/clickhouse/functions/aggregates/quantiles.py +58 -0
- hare/dialects/clickhouse/functions/aggregates/top_k.py +44 -0
- hare/dialects/clickhouse/functions/dict_get.py +199 -0
- hare/dialects/clickhouse/indexes/__init__.py +19 -0
- hare/dialects/clickhouse/indexes/bloom_filter_index.py +49 -0
- hare/dialects/clickhouse/indexes/clickhouse_index.py +145 -0
- hare/dialects/clickhouse/indexes/constants.py +14 -0
- hare/dialects/clickhouse/indexes/min_max_index.py +22 -0
- hare/dialects/clickhouse/indexes/ngram_bloom_filter_index.py +43 -0
- hare/dialects/clickhouse/indexes/set_index.py +35 -0
- hare/dialects/clickhouse/indexes/token_bloom_filter_index.py +60 -0
- hare/dialects/clickhouse/introspection/__init__.py +0 -0
- hare/dialects/clickhouse/introspection/clickhouse_check_constraints.py +40 -0
- hare/dialects/clickhouse/introspection/clickhouse_observed_table_options.py +280 -0
- hare/dialects/clickhouse/introspection/clickhouse_sql_parts.py +302 -0
- hare/dialects/clickhouse/introspection/clickhouse_type_parser.py +276 -0
- hare/dialects/clickhouse/introspection/constants.py +69 -0
- hare/dialects/clickhouse/keeper/__init__.py +0 -0
- hare/dialects/clickhouse/keeper/clickhouse_migration_lock.py +114 -0
- hare/dialects/clickhouse/keeper/constants.py +38 -0
- hare/dialects/clickhouse/keeper/keeper_codec.py +152 -0
- hare/dialects/clickhouse/keeper/keeper_session.py +213 -0
- hare/dialects/clickhouse/literals/__init__.py +1 -0
- hare/dialects/clickhouse/literals/clickhouse_literals.py +362 -0
- hare/dialects/clickhouse/lookups/__init__.py +0 -0
- hare/dialects/clickhouse/lookups/clickhouse_array_elements_key.py +32 -0
- hare/dialects/clickhouse/lookups/clickhouse_filter_operators.py +49 -0
- hare/dialects/clickhouse/lookups/clickhouse_global_lookups.py +129 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_equality.py +78 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_key_existence.py +38 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_lookups.py +57 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_path_lookups.py +102 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_value_text.py +24 -0
- hare/dialects/clickhouse/lookups/clickhouse_typed_value_lookups.py +213 -0
- hare/dialects/clickhouse/lookups/constants.py +67 -0
- hare/dialects/clickhouse/lookups/declarations.py +14 -0
- hare/dialects/clickhouse/lookups/global_contains_criterion.py +15 -0
- hare/dialects/clickhouse/lookups/in_list/__init__.py +0 -0
- hare/dialects/clickhouse/lookups/in_list/clickhouse_large_in_list.py +95 -0
- hare/dialects/clickhouse/lookups/in_list/clickhouse_value_set_values.py +45 -0
- hare/dialects/clickhouse/migration_safety/__init__.py +9 -0
- hare/dialects/clickhouse/migration_safety/clickhouse_migration_safety_rules.py +34 -0
- hare/dialects/clickhouse/migration_safety/constants.py +10 -0
- hare/dialects/clickhouse/parameters/__init__.py +1 -0
- hare/dialects/clickhouse/parameters/clickhouse_parameters.py +42 -0
- hare/dialects/clickhouse/query/__init__.py +1 -0
- hare/dialects/clickhouse/query/clickhouse_dialect_variants.py +31 -0
- hare/dialects/clickhouse/query/clickhouse_queryset_methods.py +356 -0
- hare/dialects/clickhouse/query/clickhouse_sql_context.py +47 -0
- hare/dialects/clickhouse/query/clickhouse_totals.py +34 -0
- hare/dialects/clickhouse/query/constants.py +24 -0
- hare/dialects/clickhouse/query/declarations.py +21 -0
- hare/dialects/clickhouse/query/totals_result.py +21 -0
- hare/dialects/clickhouse/renderers/__init__.py +1 -0
- hare/dialects/clickhouse/renderers/clickhouse_aggregate_renderers.py +124 -0
- hare/dialects/clickhouse/renderers/clickhouse_assigned_enum_number.py +30 -0
- hare/dialects/clickhouse/renderers/clickhouse_cast_renderers.py +49 -0
- hare/dialects/clickhouse/renderers/clickhouse_checked_integer_result.py +34 -0
- hare/dialects/clickhouse/renderers/clickhouse_condition_renderers.py +27 -0
- hare/dialects/clickhouse/renderers/clickhouse_container_renderers.py +129 -0
- hare/dialects/clickhouse/renderers/clickhouse_json_renderers.py +105 -0
- hare/dialects/clickhouse/renderers/clickhouse_json_texts.py +34 -0
- hare/dialects/clickhouse/renderers/clickhouse_number_renderers.py +76 -0
- hare/dialects/clickhouse/renderers/clickhouse_renderers.py +339 -0
- hare/dialects/clickhouse/renderers/clickhouse_temporal_renderers.py +262 -0
- hare/dialects/clickhouse/renderers/clickhouse_text_renderers.py +117 -0
- hare/dialects/clickhouse/renderers/clickhouse_value_casts.py +115 -0
- hare/dialects/clickhouse/renderers/clickhouse_window_renderers.py +72 -0
- hare/dialects/clickhouse/renderers/constants.py +341 -0
- hare/dialects/clickhouse/schema/__init__.py +1 -0
- hare/dialects/clickhouse/schema/columns/__init__.py +1 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_backfill.py +106 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_conversion_check.py +173 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_definitions.py +62 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_narrowing_check.py +109 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_renames.py +45 -0
- hare/dialects/clickhouse/schema/constants.py +201 -0
- hare/dialects/clickhouse/schema/declarations.py +95 -0
- hare/dialects/clickhouse/schema/indexes/__init__.py +0 -0
- hare/dialects/clickhouse/schema/indexes/clickhouse_index_statements.py +60 -0
- hare/dialects/clickhouse/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/clickhouse/schema/runtime_statements/clickhouse_table_clearing.py +19 -0
- hare/dialects/clickhouse/schema/schema_objects/__init__.py +0 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_dictionaries.py +169 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_materialized_views.py +221 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_schemas.py +69 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_views.py +59 -0
- hare/dialects/clickhouse/schema/shadow/__init__.py +0 -0
- hare/dialects/clickhouse/schema/shadow/clickhouse_shadow_database.py +155 -0
- hare/dialects/clickhouse/schema/tables/__init__.py +1 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_comments.py +43 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_creation.py +50 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_partitions.py +160 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_rebuild.py +227 -0
- hare/dialects/clickhouse/schema_objects/__init__.py +5 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_dictionary.py +118 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_materialized_view.py +159 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_projection.py +204 -0
- hare/dialects/clickhouse/server_versions.py +5 -0
- hare/dialects/clickhouse/spatial/__init__.py +0 -0
- hare/dialects/clickhouse/spatial/clickhouse_geometry_values.py +208 -0
- hare/dialects/clickhouse/spatial/clickhouse_spatial_renderers.py +265 -0
- hare/dialects/clickhouse/spatial/constants.py +66 -0
- hare/dialects/clickhouse/transactions/__init__.py +0 -0
- hare/dialects/clickhouse/transactions/clickhouse_transaction_statements.py +19 -0
- hare/dialects/clickhouse/types/__init__.py +1 -0
- hare/dialects/clickhouse/types/clickhouse_address_values.py +35 -0
- hare/dialects/clickhouse/types/clickhouse_binary_values.py +58 -0
- hare/dialects/clickhouse/types/clickhouse_container_values.py +267 -0
- hare/dialects/clickhouse/types/clickhouse_dynamic_values.py +307 -0
- hare/dialects/clickhouse/types/clickhouse_enum_types.py +232 -0
- hare/dialects/clickhouse/types/clickhouse_json_values.py +202 -0
- hare/dialects/clickhouse/types/clickhouse_low_cardinality_values.py +95 -0
- hare/dialects/clickhouse/types/clickhouse_nullable_types.py +27 -0
- hare/dialects/clickhouse/types/clickhouse_type_names.py +128 -0
- hare/dialects/clickhouse/types/clickhouse_types.py +258 -0
- hare/dialects/clickhouse/types/clickhouse_variant_values.py +128 -0
- hare/dialects/clickhouse/types/constants.py +139 -0
- hare/dialects/clickhouse/types/declarations.py +23 -0
- hare/dialects/constants.py +32 -0
- hare/dialects/dialect_registry.py +340 -0
- hare/dialects/enums.py +34 -0
- hare/dialects/postgresql/__init__.py +0 -0
- hare/dialects/postgresql/clauses/__init__.py +1 -0
- hare/dialects/postgresql/clauses/constants.py +44 -0
- hare/dialects/postgresql/clauses/postgresql_query_clauses.py +114 -0
- hare/dialects/postgresql/client/__init__.py +10 -0
- hare/dialects/postgresql/client/constants.py +328 -0
- hare/dialects/postgresql/client/postgresql_client.py +1224 -0
- hare/dialects/postgresql/client/postgresql_connect_errors.py +66 -0
- hare/dialects/postgresql/client/postgresql_transaction_client.py +80 -0
- hare/dialects/postgresql/client/reusable_test_schemas.py +197 -0
- hare/dialects/postgresql/client/transaction_pooler.py +137 -0
- hare/dialects/postgresql/connection/__init__.py +1 -0
- hare/dialects/postgresql/connection/constants.py +11 -0
- hare/dialects/postgresql/connection/postgresql_driver.py +99 -0
- hare/dialects/postgresql/constants.py +862 -0
- hare/dialects/postgresql/drivers/__init__.py +0 -0
- hare/dialects/postgresql/drivers/asyncpg/__init__.py +0 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_date_codec.py +81 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_driver.py +37 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_extension_type_codecs.py +78 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_hstore_codec.py +84 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_interval_codec.py +72 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_timestamp_codec.py +74 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_timestamptz_codec.py +88 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_tsvector_codec.py +264 -0
- hare/dialects/postgresql/drivers/asyncpg/client/__init__.py +9 -0
- hare/dialects/postgresql/drivers/asyncpg/client/asyncpg_client.py +738 -0
- hare/dialects/postgresql/drivers/asyncpg/client/asyncpg_transaction_client.py +197 -0
- hare/dialects/postgresql/drivers/asyncpg/constants.py +150 -0
- hare/dialects/postgresql/drivers/asyncpg/pre_epoch_local_zone.py +27 -0
- hare/dialects/postgresql/drivers/constants.py +22 -0
- hare/dialects/postgresql/drivers/rust_pg/__init__.py +0 -0
- hare/dialects/postgresql/drivers/rust_pg/client/__init__.py +9 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_client.py +461 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_transaction_client.py +306 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_transaction_connection_wrapper.py +53 -0
- hare/dialects/postgresql/drivers/rust_pg/constants.py +43 -0
- hare/dialects/postgresql/drivers/rust_pg/rust_pg_driver.py +66 -0
- hare/dialects/postgresql/enums.py +99 -0
- hare/dialects/postgresql/fields/__init__.py +68 -0
- hare/dialects/postgresql/fields/citext_field.py +42 -0
- hare/dialects/postgresql/fields/constants.py +115 -0
- hare/dialects/postgresql/fields/fixed_char_field.py +23 -0
- hare/dialects/postgresql/fields/hstore/__init__.py +5 -0
- hare/dialects/postgresql/fields/hstore/h_store_field.py +105 -0
- hare/dialects/postgresql/fields/hstore/h_store_text.py +86 -0
- hare/dialects/postgresql/fields/interval_field.py +31 -0
- hare/dialects/postgresql/fields/ltree_field.py +98 -0
- hare/dialects/postgresql/fields/multiranges/__init__.py +19 -0
- hare/dialects/postgresql/fields/multiranges/declarations.py +55 -0
- hare/dialects/postgresql/fields/multiranges/multi_range_field.py +326 -0
- hare/dialects/postgresql/fields/naive_datetime_field.py +74 -0
- hare/dialects/postgresql/fields/naive_time_field.py +64 -0
- hare/dialects/postgresql/fields/native_enum/__init__.py +5 -0
- hare/dialects/postgresql/fields/native_enum/native_enum_field.py +23 -0
- hare/dialects/postgresql/fields/native_enum/native_enum_field_instance.py +87 -0
- hare/dialects/postgresql/fields/network/__init__.py +7 -0
- hare/dialects/postgresql/fields/network/cidr_field.py +24 -0
- hare/dialects/postgresql/fields/network/inet_field.py +25 -0
- hare/dialects/postgresql/fields/network/mac_address_field.py +59 -0
- hare/dialects/postgresql/fields/network/network_field.py +80 -0
- hare/dialects/postgresql/fields/postgis_field.py +206 -0
- hare/dialects/postgresql/fields/ranges/__init__.py +19 -0
- hare/dialects/postgresql/fields/ranges/date_range_field.py +48 -0
- hare/dialects/postgresql/fields/ranges/date_time_range_field.py +153 -0
- hare/dialects/postgresql/fields/ranges/decimal_range_field.py +42 -0
- hare/dialects/postgresql/fields/ranges/declarations.py +15 -0
- hare/dialects/postgresql/fields/ranges/int_range_field.py +60 -0
- hare/dialects/postgresql/fields/ranges/range.py +26 -0
- hare/dialects/postgresql/fields/ranges/range_field.py +349 -0
- hare/dialects/postgresql/fields/ts_vector_field.py +143 -0
- hare/dialects/postgresql/functions/__init__.py +72 -0
- hare/dialects/postgresql/functions/aggregates/__init__.py +21 -0
- hare/dialects/postgresql/functions/aggregates/declarations.py +67 -0
- hare/dialects/postgresql/functions/aggregates/jsonb_agg.py +35 -0
- hare/dialects/postgresql/functions/aggregates/jsonb_agg_field.py +29 -0
- hare/dialects/postgresql/functions/aggregates/range_agg.py +22 -0
- hare/dialects/postgresql/functions/aggregates/string_agg.py +101 -0
- hare/dialects/postgresql/functions/aggregates/string_agg_function.py +13 -0
- hare/dialects/postgresql/functions/array/__init__.py +13 -0
- hare/dialects/postgresql/functions/array/any_value.py +13 -0
- hare/dialects/postgresql/functions/array/array_slice.py +28 -0
- hare/dialects/postgresql/functions/array/array_subquery.py +62 -0
- hare/dialects/postgresql/functions/array/array_subscript.py +66 -0
- hare/dialects/postgresql/functions/constants.py +8 -0
- hare/dialects/postgresql/functions/ltree/__init__.py +7 -0
- hare/dialects/postgresql/functions/ltree/subpath.py +54 -0
- hare/dialects/postgresql/functions/random_uuid.py +26 -0
- hare/dialects/postgresql/functions/spatial/__init__.py +9 -0
- hare/dialects/postgresql/functions/spatial/st_distance.py +63 -0
- hare/dialects/postgresql/functions/spatial/std_within.py +46 -0
- hare/dialects/postgresql/functions/statistics/__init__.py +31 -0
- hare/dialects/postgresql/functions/statistics/covar_pop.py +49 -0
- hare/dialects/postgresql/functions/statistics/declarations.py +84 -0
- hare/dialects/postgresql/functions/statistics/regr_count.py +21 -0
- hare/dialects/postgresql/functions/statistics/statistic_pair_aggregate.py +55 -0
- hare/dialects/postgresql/functions/transaction_now.py +27 -0
- hare/dialects/postgresql/functions/trigram/__init__.py +21 -0
- hare/dialects/postgresql/functions/trigram/declarations.py +53 -0
- hare/dialects/postgresql/functions/trigram/trigram_function.py +61 -0
- hare/dialects/postgresql/functions/trigram/trigram_word_similarity.py +19 -0
- hare/dialects/postgresql/indexes/__init__.py +25 -0
- hare/dialects/postgresql/indexes/constants.py +16 -0
- hare/dialects/postgresql/indexes/declarations.py +36 -0
- hare/dialects/postgresql/indexes/hnsw_index.py +63 -0
- hare/dialects/postgresql/indexes/ivfflat_index.py +37 -0
- hare/dialects/postgresql/indexes/postgresql_index.py +112 -0
- hare/dialects/postgresql/introspection/__init__.py +0 -0
- hare/dialects/postgresql/introspection/postgresql_array_literals.py +101 -0
- hare/dialects/postgresql/introspection/postgresql_definitions.py +193 -0
- hare/dialects/postgresql/introspection/postgresql_inspected_schema_objects.py +196 -0
- hare/dialects/postgresql/introspection/postgresql_object_parts.py +102 -0
- hare/dialects/postgresql/literals/__init__.py +1 -0
- hare/dialects/postgresql/literals/postgresql_literals.py +99 -0
- hare/dialects/postgresql/lookups/__init__.py +0 -0
- hare/dialects/postgresql/lookups/array/__init__.py +5 -0
- hare/dialects/postgresql/lookups/array/array_length.py +26 -0
- hare/dialects/postgresql/lookups/constants.py +44 -0
- hare/dialects/postgresql/lookups/hstore/__init__.py +11 -0
- hare/dialects/postgresql/lookups/hstore/h_store_value_term.py +18 -0
- hare/dialects/postgresql/lookups/hstore/postgresql_h_store_field_lookups.py +75 -0
- hare/dialects/postgresql/lookups/hstore/postgresql_h_store_lookups.py +38 -0
- hare/dialects/postgresql/lookups/in_list/__init__.py +11 -0
- hare/dialects/postgresql/lookups/in_list/array_parameter.py +104 -0
- hare/dialects/postgresql/lookups/in_list/postgresql_large_in_list.py +78 -0
- hare/dialects/postgresql/lookups/in_list/unnest_row_values.py +32 -0
- hare/dialects/postgresql/lookups/json/__init__.py +9 -0
- hare/dialects/postgresql/lookups/json/postgresql_json_filter_guards.py +111 -0
- hare/dialects/postgresql/lookups/json/postgresql_json_lookups.py +59 -0
- hare/dialects/postgresql/lookups/ltree/__init__.py +9 -0
- hare/dialects/postgresql/lookups/ltree/postgresql_ltree_field_lookups.py +54 -0
- hare/dialects/postgresql/lookups/ltree/postgresql_ltree_lookups.py +35 -0
- hare/dialects/postgresql/lookups/multiranges/__init__.py +9 -0
- hare/dialects/postgresql/lookups/multiranges/postgresql_multi_range_field_lookups.py +50 -0
- hare/dialects/postgresql/lookups/network/__init__.py +1 -0
- hare/dialects/postgresql/lookups/network/postgresql_network_field_lookups.py +46 -0
- hare/dialects/postgresql/lookups/network/postgresql_network_lookups.py +35 -0
- hare/dialects/postgresql/lookups/postgresql_filter_operators.py +96 -0
- hare/dialects/postgresql/lookups/postgresql_regex_lookups.py +22 -0
- hare/dialects/postgresql/lookups/postgresql_value_encoders.py +163 -0
- hare/dialects/postgresql/lookups/ranges/__init__.py +9 -0
- hare/dialects/postgresql/lookups/ranges/postgresql_range_field_lookups.py +49 -0
- hare/dialects/postgresql/lookups/ranges/postgresql_range_lookups.py +49 -0
- hare/dialects/postgresql/lookups/trigram/__init__.py +1 -0
- hare/dialects/postgresql/lookups/trigram/postgresql_trigram_lookups.py +69 -0
- hare/dialects/postgresql/lookups/trigram/trigram_operator_term.py +16 -0
- hare/dialects/postgresql/lookups/unaccent_transform.py +39 -0
- hare/dialects/postgresql/migration_safety/__init__.py +9 -0
- hare/dialects/postgresql/migration_safety/check_constraint_validation_rule.py +36 -0
- hare/dialects/postgresql/migration_safety/constants.py +18 -0
- hare/dialects/postgresql/migration_safety/foreign_key_validation_rule.py +74 -0
- hare/dialects/postgresql/migration_safety/index_without_concurrently_rule.py +45 -0
- hare/dialects/postgresql/migration_safety/postgresql_migration_safety_rules.py +59 -0
- hare/dialects/postgresql/migration_safety/set_not_null_rule.py +47 -0
- hare/dialects/postgresql/migration_safety/unique_constraint_index_rule.py +65 -0
- hare/dialects/postgresql/migration_safety/volatile_default_rule.py +40 -0
- hare/dialects/postgresql/parameters/__init__.py +1 -0
- hare/dialects/postgresql/parameters/constants.py +83 -0
- hare/dialects/postgresql/parameters/postgresql_parameters.py +86 -0
- hare/dialects/postgresql/partitioning/__init__.py +23 -0
- hare/dialects/postgresql/partitioning/constants.py +56 -0
- hare/dialects/postgresql/partitioning/explicit_partitioning.py +97 -0
- hare/dialects/postgresql/partitioning/hash_partitioning.py +50 -0
- hare/dialects/postgresql/partitioning/list_partitioning.py +55 -0
- hare/dialects/postgresql/partitioning/observed_partitioning.py +205 -0
- hare/dialects/postgresql/partitioning/partitioning.py +280 -0
- hare/dialects/postgresql/partitioning/partitions/__init__.py +1 -0
- hare/dialects/postgresql/partitioning/partitions/default_partition.py +30 -0
- hare/dialects/postgresql/partitioning/partitions/list_partition.py +36 -0
- hare/dialects/postgresql/partitioning/partitions/partition.py +46 -0
- hare/dialects/postgresql/partitioning/partitions/range_partition.py +94 -0
- hare/dialects/postgresql/partitioning/range_partitioning.py +60 -0
- hare/dialects/postgresql/postgresql_dialect.py +207 -0
- hare/dialects/postgresql/postgresql_introspector.py +1055 -0
- hare/dialects/postgresql/postgresql_table_options.py +165 -0
- hare/dialects/postgresql/query/__init__.py +7 -0
- hare/dialects/postgresql/query/declarations.py +13 -0
- hare/dialects/postgresql/renderers/__init__.py +7 -0
- hare/dialects/postgresql/renderers/constants.py +43 -0
- hare/dialects/postgresql/renderers/postgresql_container_renderers.py +90 -0
- hare/dialects/postgresql/renderers/postgresql_defaults.py +88 -0
- hare/dialects/postgresql/renderers/postgresql_json_renderers.py +57 -0
- hare/dialects/postgresql/renderers/postgresql_number_renderers.py +58 -0
- hare/dialects/postgresql/renderers/postgresql_renderers.py +82 -0
- hare/dialects/postgresql/renderers/postgresql_temporal_renderers.py +179 -0
- hare/dialects/postgresql/renderers/postgresql_text_renderers.py +67 -0
- hare/dialects/postgresql/request_query/__init__.py +8 -0
- hare/dialects/postgresql/request_query/declarations.py +17 -0
- hare/dialects/postgresql/schema/__init__.py +0 -0
- hare/dialects/postgresql/schema/columns/__init__.py +1 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_backfill.py +13 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_narrowing_check.py +42 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_type_changes.py +129 -0
- hare/dialects/postgresql/schema/constants.py +384 -0
- hare/dialects/postgresql/schema/constraints/__init__.py +1 -0
- hare/dialects/postgresql/schema/constraints/postgresql_constraint_statements.py +119 -0
- hare/dialects/postgresql/schema/indexes/__init__.py +1 -0
- hare/dialects/postgresql/schema/indexes/postgresql_index_statements.py +24 -0
- hare/dialects/postgresql/schema/postgresql_schema_editor.py +280 -0
- hare/dialects/postgresql/schema/relations/__init__.py +1 -0
- hare/dialects/postgresql/schema/relations/postgresql_foreign_key_rebuild.py +230 -0
- hare/dialects/postgresql/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_foreign_key_deferral.py +109 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_table_clearing.py +80 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_table_locks.py +27 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_tenant_conditions.py +34 -0
- hare/dialects/postgresql/schema/schema_objects/__init__.py +1 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_database_functions.py +95 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_enum_types.py +130 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_extensions.py +35 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_grants.py +89 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_materialized_views.py +107 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_row_level_security_policies.py +125 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_schemas.py +51 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_sequences.py +132 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_views.py +53 -0
- hare/dialects/postgresql/schema/shadow/__init__.py +0 -0
- hare/dialects/postgresql/schema/shadow/postgresql_shadow_database.py +78 -0
- hare/dialects/postgresql/schema/tables/__init__.py +1 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_comments.py +74 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_partitions.py +229 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_rebuild.py +118 -0
- hare/dialects/postgresql/schema/triggers/__init__.py +1 -0
- hare/dialects/postgresql/schema/triggers/postgresql_trigger_statements.py +141 -0
- hare/dialects/postgresql/search/__init__.py +8 -0
- hare/dialects/postgresql/search/constants.py +43 -0
- hare/dialects/postgresql/search/criterion/__init__.py +14 -0
- hare/dialects/postgresql/search/criterion/declarations.py +14 -0
- hare/dialects/postgresql/search/criterion/search_criterion.py +62 -0
- hare/dialects/postgresql/search/criterion/ts_query_function.py +20 -0
- hare/dialects/postgresql/search/criterion/ts_query_invert.py +32 -0
- hare/dialects/postgresql/search/enums.py +12 -0
- hare/dialects/postgresql/search/functions/__init__.py +9 -0
- hare/dialects/postgresql/search/functions/plain_to_ts_query.py +18 -0
- hare/dialects/postgresql/search/functions/to_ts_vector.py +20 -0
- hare/dialects/postgresql/search/lexemes/__init__.py +1 -0
- hare/dialects/postgresql/search/lexemes/combined_lexeme.py +35 -0
- hare/dialects/postgresql/search/lexemes/lexeme.py +77 -0
- hare/dialects/postgresql/search/lexemes/lexeme_combinable.py +59 -0
- hare/dialects/postgresql/search/postgresql_text_search.py +237 -0
- hare/dialects/postgresql/search/ts_vector_expression_reader.py +106 -0
- hare/dialects/postgresql/server_versions.py +26 -0
- hare/dialects/postgresql/spatial/__init__.py +7 -0
- hare/dialects/postgresql/spatial/constants.py +118 -0
- hare/dialects/postgresql/spatial/postgresql_spatial_renderers.py +102 -0
- hare/dialects/postgresql/transactions/__init__.py +1 -0
- hare/dialects/postgresql/transactions/constants.py +21 -0
- hare/dialects/postgresql/transactions/postgresql_transaction_statements.py +40 -0
- hare/dialects/postgresql/transactions/postgresql_two_phase_commit.py +87 -0
- hare/dialects/postgresql/types/__init__.py +1 -0
- hare/dialects/postgresql/types/postgresql_container_values.py +104 -0
- hare/dialects/postgresql/types/postgresql_types.py +213 -0
- hare/dialects/postgresql/validators/__init__.py +15 -0
- hare/dialects/postgresql/validators/keys_validator.py +32 -0
- hare/dialects/postgresql/validators/range_bound_validator.py +33 -0
- hare/dialects/postgresql/validators/range_max_value_validator.py +17 -0
- hare/dialects/postgresql/validators/range_min_value_validator.py +17 -0
- hare/dialects/postgresql/vectors/__init__.py +1 -0
- hare/dialects/postgresql/vectors/constants.py +13 -0
- hare/dialects/postgresql/vectors/postgresql_vector_renderers.py +40 -0
- hare/dialects/postgresql/vectors/postgresql_vector_values.py +94 -0
- hare/dialects/sqlite/__init__.py +0 -0
- hare/dialects/sqlite/clauses/__init__.py +1 -0
- hare/dialects/sqlite/clauses/constants.py +7 -0
- hare/dialects/sqlite/clauses/sqlite_query_clauses.py +100 -0
- hare/dialects/sqlite/client/__init__.py +12 -0
- hare/dialects/sqlite/client/constants.py +103 -0
- hare/dialects/sqlite/client/declarations.py +27 -0
- hare/dialects/sqlite/client/sqlite_client.py +507 -0
- hare/dialects/sqlite/client/sqlite_migration_lock.py +76 -0
- hare/dialects/sqlite/client/sqlite_transaction_client.py +160 -0
- hare/dialects/sqlite/connection/__init__.py +1 -0
- hare/dialects/sqlite/connection/constants.py +7 -0
- hare/dialects/sqlite/connection/sqlite_driver.py +59 -0
- hare/dialects/sqlite/constants.py +451 -0
- hare/dialects/sqlite/drivers/__init__.py +1 -0
- hare/dialects/sqlite/drivers/aiosqlite/__init__.py +1 -0
- hare/dialects/sqlite/drivers/aiosqlite/aiosqlite_driver.py +41 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/__init__.py +23 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_client.py +428 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_client_with_regexp_support.py +16 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_connection_wrapper.py +62 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_statement_timeout_connection_wrapper.py +53 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_transaction_client.py +176 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_transaction_connection_wrapper.py +23 -0
- hare/dialects/sqlite/drivers/aiosqlite/constants.py +11 -0
- hare/dialects/sqlite/drivers/constants.py +19 -0
- hare/dialects/sqlite/enums.py +37 -0
- hare/dialects/sqlite/exceptions.py +10 -0
- hare/dialects/sqlite/functions/__init__.py +0 -0
- hare/dialects/sqlite/functions/comparison/__init__.py +11 -0
- hare/dialects/sqlite/functions/comparison/sqlite_cast.py +204 -0
- hare/dialects/sqlite/functions/comparison/sqlite_greatest_least.py +63 -0
- hare/dialects/sqlite/functions/constants.py +102 -0
- hare/dialects/sqlite/functions/datetime/__init__.py +13 -0
- hare/dialects/sqlite/functions/datetime/date_truncation.py +115 -0
- hare/dialects/sqlite/functions/datetime/sqlite_date_part_extraction.py +77 -0
- hare/dialects/sqlite/functions/datetime/sqlite_date_timestamp.py +48 -0
- hare/dialects/sqlite/functions/datetime/sqlite_local_now.py +54 -0
- hare/dialects/sqlite/functions/datetime/temporal_arithmetic_functions.py +147 -0
- hare/dialects/sqlite/functions/decimal/__init__.py +1 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_arithmetic.py +152 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_average.py +23 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_collation.py +125 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_comparand.py +23 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_operation.py +33 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_round.py +50 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_storage.py +77 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_sum.py +62 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_text.py +22 -0
- hare/dialects/sqlite/functions/decimal/sqlite_stored_decimal.py +29 -0
- hare/dialects/sqlite/functions/json/__init__.py +9 -0
- hare/dialects/sqlite/functions/json/sqlite_json_datetime.py +124 -0
- hare/dialects/sqlite/functions/json/sqlite_json_path.py +116 -0
- hare/dialects/sqlite/functions/regex/__init__.py +5 -0
- hare/dialects/sqlite/functions/regex/sqlite_posix_regex.py +102 -0
- hare/dialects/sqlite/functions/regex/sqlite_regex_criterion.py +18 -0
- hare/dialects/sqlite/functions/sqlite_checked_integer.py +15 -0
- hare/dialects/sqlite/functions/sqlite_collation.py +51 -0
- hare/dialects/sqlite/functions/sqlite_connection_function.py +17 -0
- hare/dialects/sqlite/functions/sqlite_function_errors.py +45 -0
- hare/dialects/sqlite/functions/sqlite_integer_range.py +48 -0
- hare/dialects/sqlite/functions/sqlite_math_functions.py +233 -0
- hare/dialects/sqlite/functions/sqlite_native_functions.py +12 -0
- hare/dialects/sqlite/functions/sqlite_sort_keys.py +58 -0
- hare/dialects/sqlite/functions/statistics/__init__.py +19 -0
- hare/dialects/sqlite/functions/statistics/declarations.py +31 -0
- hare/dialects/sqlite/functions/statistics/sqlite_statistic.py +118 -0
- hare/dialects/sqlite/functions/statistics/sqlite_statistics.py +51 -0
- hare/dialects/sqlite/functions/text/__init__.py +1 -0
- hare/dialects/sqlite/functions/text/sqlite_text_functions.py +140 -0
- hare/dialects/sqlite/indexes/__init__.py +7 -0
- hare/dialects/sqlite/indexes/constants.py +45 -0
- hare/dialects/sqlite/indexes/full_text_index.py +228 -0
- hare/dialects/sqlite/indexes/separate_table_index.py +105 -0
- hare/dialects/sqlite/indexes/spatialite_index.py +228 -0
- hare/dialects/sqlite/literals/__init__.py +1 -0
- hare/dialects/sqlite/literals/sqlite_literals.py +51 -0
- hare/dialects/sqlite/lookups/__init__.py +0 -0
- hare/dialects/sqlite/lookups/constants.py +18 -0
- hare/dialects/sqlite/lookups/in_list/__init__.py +11 -0
- hare/dialects/sqlite/lookups/in_list/json_array_row_values.py +39 -0
- hare/dialects/sqlite/lookups/in_list/json_array_values.py +116 -0
- hare/dialects/sqlite/lookups/in_list/sqlite_large_in_list.py +96 -0
- hare/dialects/sqlite/lookups/json/__init__.py +1 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_filter_guards.py +128 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_lookups.py +51 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_path_lookups.py +56 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_type_criterion.py +13 -0
- hare/dialects/sqlite/lookups/sqlite_filter_operators.py +89 -0
- hare/dialects/sqlite/migration_safety/__init__.py +9 -0
- hare/dialects/sqlite/migration_safety/sqlite_migration_safety_rules.py +32 -0
- hare/dialects/sqlite/parameters/__init__.py +1 -0
- hare/dialects/sqlite/parameters/constants.py +11 -0
- hare/dialects/sqlite/parameters/sqlite_parameter_adapters.py +61 -0
- hare/dialects/sqlite/parameters/sqlite_parameters.py +27 -0
- hare/dialects/sqlite/query/__init__.py +7 -0
- hare/dialects/sqlite/query/declarations.py +13 -0
- hare/dialects/sqlite/renderers/__init__.py +7 -0
- hare/dialects/sqlite/renderers/constants.py +43 -0
- hare/dialects/sqlite/renderers/sqlite_defaults.py +84 -0
- hare/dialects/sqlite/renderers/sqlite_json_renderers.py +142 -0
- hare/dialects/sqlite/renderers/sqlite_number_renderers.py +137 -0
- hare/dialects/sqlite/renderers/sqlite_renderers.py +235 -0
- hare/dialects/sqlite/renderers/sqlite_temporal_renderers.py +138 -0
- hare/dialects/sqlite/renderers/sqlite_text_renderers.py +60 -0
- hare/dialects/sqlite/request_query/__init__.py +8 -0
- hare/dialects/sqlite/request_query/declarations.py +16 -0
- hare/dialects/sqlite/schema/__init__.py +0 -0
- hare/dialects/sqlite/schema/columns/__init__.py +1 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_backfill.py +29 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_conversion_check.py +181 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_narrowing_check.py +24 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_type_changes.py +148 -0
- hare/dialects/sqlite/schema/constants.py +108 -0
- hare/dialects/sqlite/schema/constraints/__init__.py +1 -0
- hare/dialects/sqlite/schema/constraints/sqlite_constraint_statements.py +32 -0
- hare/dialects/sqlite/schema/indexes/__init__.py +1 -0
- hare/dialects/sqlite/schema/indexes/sqlite_generated_index_names.py +61 -0
- hare/dialects/sqlite/schema/indexes/sqlite_index_statements.py +78 -0
- hare/dialects/sqlite/schema/relations/__init__.py +1 -0
- hare/dialects/sqlite/schema/relations/sqlite_foreign_key_rebuild.py +100 -0
- hare/dialects/sqlite/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_foreign_key_deferral.py +87 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_table_clearing.py +39 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_tenant_conditions.py +21 -0
- hare/dialects/sqlite/schema/shadow/__init__.py +0 -0
- hare/dialects/sqlite/schema/shadow/sqlite_shadow_database.py +36 -0
- hare/dialects/sqlite/schema/sqlite_schema_editor.py +492 -0
- hare/dialects/sqlite/schema/tables/__init__.py +1 -0
- hare/dialects/sqlite/schema/tables/sqlite_table_comments.py +32 -0
- hare/dialects/sqlite/schema/tables/sqlite_table_rebuild.py +164 -0
- hare/dialects/sqlite/schema/triggers/__init__.py +1 -0
- hare/dialects/sqlite/schema/triggers/sqlite_trigger_statements.py +70 -0
- hare/dialects/sqlite/search/__init__.py +8 -0
- hare/dialects/sqlite/search/constants.py +33 -0
- hare/dialects/sqlite/search/sqlite_full_text_query.py +137 -0
- hare/dialects/sqlite/search/sqlite_search_renderers.py +33 -0
- hare/dialects/sqlite/search/sqlite_text_search.py +308 -0
- hare/dialects/sqlite/search/terms/__init__.py +1 -0
- hare/dialects/sqlite/search/terms/full_text_headline.py +56 -0
- hare/dialects/sqlite/search/terms/full_text_match.py +73 -0
- hare/dialects/sqlite/search/terms/full_text_query.py +42 -0
- hare/dialects/sqlite/search/terms/full_text_query_combination.py +82 -0
- hare/dialects/sqlite/search/terms/full_text_rank.py +34 -0
- hare/dialects/sqlite/search/terms/full_text_row_value.py +104 -0
- hare/dialects/sqlite/server_versions.py +17 -0
- hare/dialects/sqlite/spatial/__init__.py +0 -0
- hare/dialects/sqlite/spatial/constants.py +173 -0
- hare/dialects/sqlite/spatial/spatialite_blob_reader.py +166 -0
- hare/dialects/sqlite/spatial/spatialite_blob_writer.py +105 -0
- hare/dialects/sqlite/spatial/sqlite_geometry_values.py +75 -0
- hare/dialects/sqlite/spatial/sqlite_spatial_extension.py +116 -0
- hare/dialects/sqlite/spatial/sqlite_spatial_renderers.py +202 -0
- hare/dialects/sqlite/sqlite_dialect.py +138 -0
- hare/dialects/sqlite/sqlite_introspector.py +1025 -0
- hare/dialects/sqlite/sqlite_table_options.py +92 -0
- hare/dialects/sqlite/table_option_constants.py +15 -0
- hare/dialects/sqlite/transactions/__init__.py +1 -0
- hare/dialects/sqlite/transactions/constants.py +10 -0
- hare/dialects/sqlite/transactions/sqlite_transaction_statements.py +19 -0
- hare/dialects/sqlite/types/__init__.py +1 -0
- hare/dialects/sqlite/types/sqlite_types.py +87 -0
- hare/dialects/sqlite/vectors/__init__.py +1 -0
- hare/dialects/sqlite/vectors/constants.py +16 -0
- hare/dialects/sqlite/vectors/sqlite_vector_extension.py +112 -0
- hare/dialects/sqlite/vectors/sqlite_vector_renderers.py +55 -0
- hare/dialects/sqlite/vectors/sqlite_vector_values.py +113 -0
- hare/exceptions.py +397 -0
- hare/fields/__init__.py +133 -0
- hare/fields/composite_primary_key.py +40 -0
- hare/fields/constants.py +120 -0
- hare/fields/data/__init__.py +3 -0
- hare/fields/data/binary_field.py +62 -0
- hare/fields/data/boolean_field.py +57 -0
- hare/fields/data/choices/__init__.py +16 -0
- hare/fields/data/choices/char_enum_field.py +27 -0
- hare/fields/data/choices/char_enum_field_instance.py +117 -0
- hare/fields/data/choices/int_enum_field.py +23 -0
- hare/fields/data/choices/int_enum_field_instance.py +102 -0
- hare/fields/data/constants.py +122 -0
- hare/fields/data/containers/__init__.py +10 -0
- hare/fields/data/containers/array_field.py +152 -0
- hare/fields/data/containers/constants.py +25 -0
- hare/fields/data/containers/container_field.py +342 -0
- hare/fields/data/containers/declarations.py +13 -0
- hare/fields/data/containers/map_field.py +165 -0
- hare/fields/data/containers/nested_field.py +47 -0
- hare/fields/data/containers/tuple_field.py +177 -0
- hare/fields/data/json/__init__.py +7 -0
- hare/fields/data/json/json_codec.py +152 -0
- hare/fields/data/json/json_field.py +387 -0
- hare/fields/data/json/json_path_field.py +77 -0
- hare/fields/data/json/json_text_field.py +13 -0
- hare/fields/data/network/__init__.py +8 -0
- hare/fields/data/network/constants.py +6 -0
- hare/fields/data/network/ip_address_field.py +109 -0
- hare/fields/data/network/ipv4_address_field.py +26 -0
- hare/fields/data/numeric/__init__.py +23 -0
- hare/fields/data/numeric/big_int_field.py +22 -0
- hare/fields/data/numeric/decimal_field.py +187 -0
- hare/fields/data/numeric/float_field.py +83 -0
- hare/fields/data/numeric/int_field.py +239 -0
- hare/fields/data/numeric/positive_big_int_field.py +19 -0
- hare/fields/data/numeric/positive_int_field.py +19 -0
- hare/fields/data/numeric/positive_small_int_field.py +19 -0
- hare/fields/data/numeric/small_int_field.py +22 -0
- hare/fields/data/temporal/__init__.py +11 -0
- hare/fields/data/temporal/date_field.py +87 -0
- hare/fields/data/temporal/datetime_field.py +384 -0
- hare/fields/data/temporal/parse_datetime.py +17 -0
- hare/fields/data/temporal/temporal_values.py +119 -0
- hare/fields/data/temporal/time_delta_field.py +111 -0
- hare/fields/data/temporal/time_field.py +193 -0
- hare/fields/data/text/__init__.py +20 -0
- hare/fields/data/text/char_field.py +78 -0
- hare/fields/data/text/email_field.py +76 -0
- hare/fields/data/text/phone_field.py +114 -0
- hare/fields/data/text/slug_field.py +52 -0
- hare/fields/data/text/text_field.py +33 -0
- hare/fields/data/text/text_values.py +39 -0
- hare/fields/data/text/url_field.py +62 -0
- hare/fields/data/uuid_field.py +82 -0
- hare/fields/database_default.py +28 -0
- hare/fields/db_default_not_set.py +36 -0
- hare/fields/db_defaults/__init__.py +13 -0
- hare/fields/db_defaults/now.py +108 -0
- hare/fields/db_defaults/random_hex.py +30 -0
- hare/fields/db_defaults/sql_default.py +95 -0
- hare/fields/db_defaults/uuid_v7.py +36 -0
- hare/fields/encrypted/__init__.py +7 -0
- hare/fields/encrypted/blind_index_field.py +49 -0
- hare/fields/encrypted/constants.py +41 -0
- hare/fields/encrypted/encrypted_field_base.py +143 -0
- hare/fields/encrypted/encrypted_json_field.py +238 -0
- hare/fields/encrypted/encrypted_text_field.py +130 -0
- hare/fields/encrypted/field_encryption.py +267 -0
- hare/fields/enums.py +91 -0
- hare/fields/field.py +1231 -0
- hare/fields/field_meta.py +16 -0
- hare/fields/generated_field.py +211 -0
- hare/fields/narrowing/__init__.py +7 -0
- hare/fields/narrowing/decimal_digits_limit.py +11 -0
- hare/fields/narrowing/enum_values_limit.py +32 -0
- hare/fields/narrowing/integer_range_limit.py +13 -0
- hare/fields/narrowing/narrowing_limit.py +8 -0
- hare/fields/narrowing/text_length_limit.py +13 -0
- hare/fields/registrations/__init__.py +1 -0
- hare/fields/registrations/registered_lookup.py +29 -0
- hare/fields/registrations/registered_transform.py +22 -0
- hare/fields/relations/__init__.py +3 -0
- hare/fields/relations/constants.py +10 -0
- hare/fields/relations/declarations.py +5 -0
- hare/fields/relations/fields/__init__.py +35 -0
- hare/fields/relations/fields/backward_foreign_key_relation.py +46 -0
- hare/fields/relations/fields/declarations.py +21 -0
- hare/fields/relations/fields/foreign_key_field.py +89 -0
- hare/fields/relations/fields/foreign_key_field_instance.py +124 -0
- hare/fields/relations/fields/generic_foreign_key_field.py +56 -0
- hare/fields/relations/fields/generic_foreign_key_field_instance.py +455 -0
- hare/fields/relations/fields/many_to_many_field.py +60 -0
- hare/fields/relations/fields/many_to_many_field_instance.py +126 -0
- hare/fields/relations/fields/one_to_one_field.py +89 -0
- hare/fields/relations/fields/one_to_one_field_instance.py +45 -0
- hare/fields/relations/fields/relational_field.py +153 -0
- hare/fields/relations/inherited_relation.py +30 -0
- hare/fields/relations/relation_accessors.py +271 -0
- hare/fields/relations/relation_values.py +106 -0
- hare/fields/relations/swappable_model_reference.py +60 -0
- hare/fields/validators/__init__.py +63 -0
- hare/fields/validators/exceptions.py +52 -0
- hare/fields/validators/formats/__init__.py +1 -0
- hare/fields/validators/formats/comma_separated_integer_list_validator.py +22 -0
- hare/fields/validators/formats/domain_name_validator.py +74 -0
- hare/fields/validators/formats/e164_phone_validator.py +32 -0
- hare/fields/validators/formats/email_validator.py +87 -0
- hare/fields/validators/formats/ipv46_validator.py +28 -0
- hare/fields/validators/formats/ipv4_validator.py +23 -0
- hare/fields/validators/formats/ipv6_validator.py +23 -0
- hare/fields/validators/formats/regex_validator.py +38 -0
- hare/fields/validators/formats/slug_validator.py +36 -0
- hare/fields/validators/formats/url_validator.py +95 -0
- hare/fields/validators/limits/__init__.py +1 -0
- hare/fields/validators/limits/length_validator.py +17 -0
- hare/fields/validators/limits/max_digits_validator.py +58 -0
- hare/fields/validators/limits/max_length_validator.py +20 -0
- hare/fields/validators/limits/max_value_validator.py +19 -0
- hare/fields/validators/limits/min_length_validator.py +20 -0
- hare/fields/validators/limits/min_value_validator.py +19 -0
- hare/fields/validators/limits/numeric_validator.py +19 -0
- hare/fields/validators/validator.py +34 -0
- hare/gis/__init__.py +52 -0
- hare/gis/aggregates/__init__.py +5 -0
- hare/gis/aggregates/declarations.py +42 -0
- hare/gis/aggregates/spatial_aggregate.py +57 -0
- hare/gis/constants.py +126 -0
- hare/gis/enums.py +74 -0
- hare/gis/fields/__init__.py +23 -0
- hare/gis/fields/declarations.py +61 -0
- hare/gis/fields/extent_field.py +60 -0
- hare/gis/fields/geometry_field.py +239 -0
- hare/gis/fields/made_line_field.py +86 -0
- hare/gis/functions/__init__.py +53 -0
- hare/gis/functions/buffer.py +29 -0
- hare/gis/functions/constants.py +17 -0
- hare/gis/functions/declarations.py +188 -0
- hare/gis/functions/simplify.py +29 -0
- hare/gis/functions/spatial_function.py +115 -0
- hare/gis/functions/transform.py +41 -0
- hare/gis/geometries/__init__.py +19 -0
- hare/gis/geometries/declarations.py +38 -0
- hare/gis/geometries/geometry.py +297 -0
- hare/gis/geometries/geometry_collection.py +62 -0
- hare/gis/geometries/line_string.py +46 -0
- hare/gis/geometries/multi_geometry.py +75 -0
- hare/gis/geometries/point.py +65 -0
- hare/gis/geometries/polygon.py +89 -0
- hare/gis/lookups/__init__.py +3 -0
- hare/gis/lookups/spatial_field_lookups.py +219 -0
- hare/gis/readers/__init__.py +11 -0
- hare/gis/readers/constants.py +15 -0
- hare/gis/readers/ewkb_reader.py +148 -0
- hare/gis/readers/geo_json_reader.py +54 -0
- hare/gis/readers/wkt_reader.py +226 -0
- hare/gis/spatial_features.py +57 -0
- hare/gis/terms/__init__.py +11 -0
- hare/gis/terms/geometry_value.py +33 -0
- hare/gis/terms/spatial_aggregate_function.py +30 -0
- hare/gis/terms/spatial_function_term.py +39 -0
- hare/gis/terms/spatial_relation_term.py +39 -0
- hare/health/__init__.py +19 -0
- hare/health/constants.py +32 -0
- hare/health/criteria/__init__.py +27 -0
- hare/health/criteria/acquire_wait_time.py +35 -0
- hare/health/criteria/all_of.py +38 -0
- hare/health/criteria/declarations.py +33 -0
- hare/health/criteria/health_criterion.py +87 -0
- hare/health/criteria/ping_failed.py +27 -0
- hare/health/criteria/ping_latency.py +29 -0
- hare/health/criteria/pool_count_criterion.py +37 -0
- hare/health/criteria/pool_saturation.py +35 -0
- hare/health/criteria/waiting_requests.py +33 -0
- hare/health/declarations.py +83 -0
- hare/health/enums.py +14 -0
- hare/health/health_check.py +240 -0
- hare/health/health_report.py +65 -0
- hare/inspectdb/__init__.py +38 -0
- hare/inspectdb/constants.py +60 -0
- hare/inspectdb/exceptions.py +72 -0
- hare/inspectdb/generation/__init__.py +1 -0
- hare/inspectdb/generation/column_type_mapper.py +113 -0
- hare/inspectdb/generation/declarations.py +34 -0
- hare/inspectdb/generation/inspected_model.py +35 -0
- hare/inspectdb/generation/inspected_model_builder.py +1174 -0
- hare/inspectdb/generation/many_to_many_tables.py +91 -0
- hare/inspectdb/generation/model_factory.py +88 -0
- hare/inspectdb/generation/model_naming.py +75 -0
- hare/inspectdb/generation/model_source_builder.py +148 -0
- hare/inspectdb/introspection/__init__.py +28 -0
- hare/inspectdb/introspection/column_info.py +67 -0
- hare/inspectdb/introspection/composite_foreign_key_info.py +27 -0
- hare/inspectdb/introspection/database_catalog.py +252 -0
- hare/inspectdb/introspection/enums.py +26 -0
- hare/inspectdb/introspection/foreign_key_info.py +25 -0
- hare/inspectdb/introspection/index_info.py +265 -0
- hare/inspectdb/introspection/inspected_field_specification.py +47 -0
- hare/inspectdb/introspection/schema_introspector.py +564 -0
- hare/inspectdb/introspection/schema_part.py +103 -0
- hare/inspectdb/introspection/table_info.py +112 -0
- hare/inspectdb/introspection/table_parts.py +101 -0
- hare/inspectdb/schema_inspector.py +224 -0
- hare/instrumentation/__init__.py +31 -0
- hare/instrumentation/capture/__init__.py +9 -0
- hare/instrumentation/capture/capture_needs.py +54 -0
- hare/instrumentation/capture/captured_change.py +38 -0
- hare/instrumentation/capture/captured_write.py +223 -0
- hare/instrumentation/capture/change_capturing.py +496 -0
- hare/instrumentation/capture/change_sink.py +57 -0
- hare/instrumentation/change_events.py +246 -0
- hare/instrumentation/constants.py +41 -0
- hare/instrumentation/declarations.py +196 -0
- hare/instrumentation/enums.py +35 -0
- hare/instrumentation/observers/__init__.py +1 -0
- hare/instrumentation/observers/observer.py +56 -0
- hare/instrumentation/observers/observer_dispatch.py +197 -0
- hare/instrumentation/observers/observer_set.py +138 -0
- hare/instrumentation/observers/observers.py +368 -0
- hare/instrumentation/pools/__init__.py +1 -0
- hare/instrumentation/pools/duration_records.py +50 -0
- hare/instrumentation/pools/pool_metrics.py +50 -0
- hare/instrumentation/pools/pool_registry.py +49 -0
- hare/instrumentation/queries/__init__.py +1 -0
- hare/instrumentation/queries/query_tags.py +133 -0
- hare/instrumentation/queries/query_wrapper.py +37 -0
- hare/lazy_loading/__init__.py +1 -0
- hare/lazy_loading/lazy_pattern.py +45 -0
- hare/lazy_loading/pydantic_classes.py +96 -0
- hare/migrations/__init__.py +90 -0
- hare/migrations/api/__init__.py +24 -0
- hare/migrations/api/checkmigrations.py +55 -0
- hare/migrations/api/makemigrations.py +78 -0
- hare/migrations/api/migrate.py +47 -0
- hare/migrations/api/migration_request_parser.py +86 -0
- hare/migrations/api/plan.py +39 -0
- hare/migrations/api/sqlmigrate.py +51 -0
- hare/migrations/api/squashmigrations.py +51 -0
- hare/migrations/autodetection/__init__.py +4 -0
- hare/migrations/autodetection/constants.py +49 -0
- hare/migrations/autodetection/diffs/__init__.py +1 -0
- hare/migrations/autodetection/diffs/constraint_diff.py +48 -0
- hare/migrations/autodetection/diffs/declarations.py +73 -0
- hare/migrations/autodetection/diffs/declared_schema_object_diff.py +47 -0
- hare/migrations/autodetection/diffs/grant_diff.py +24 -0
- hare/migrations/autodetection/diffs/index_diff.py +73 -0
- hare/migrations/autodetection/diffs/materialized_view_diff.py +44 -0
- hare/migrations/autodetection/diffs/partition_diff.py +99 -0
- hare/migrations/autodetection/diffs/schema_object_diff.py +153 -0
- hare/migrations/autodetection/diffs/state_field_diff.py +566 -0
- hare/migrations/autodetection/diffs/state_model_diff.py +355 -0
- hare/migrations/autodetection/diffs/trigger_diff.py +31 -0
- hare/migrations/autodetection/diffs/view_diff.py +24 -0
- hare/migrations/autodetection/field_comparable_values.py +20 -0
- hare/migrations/autodetection/migration_autodetector.py +337 -0
- hare/migrations/autodetection/migration_splitter.py +151 -0
- hare/migrations/autodetection/operation_generator.py +1115 -0
- hare/migrations/autodetection/operation_sorter.py +213 -0
- hare/migrations/autodetection/rename_questions.py +98 -0
- hare/migrations/autodetection/required_extensions.py +118 -0
- hare/migrations/autodetection/schema_object_operations.py +150 -0
- hare/migrations/autodetection/split_migration.py +24 -0
- hare/migrations/autodetection/state_signatures.py +192 -0
- hare/migrations/constants.py +109 -0
- hare/migrations/drift/__init__.py +13 -0
- hare/migrations/drift/column_mismatch.py +14 -0
- hare/migrations/drift/constants.py +43 -0
- hare/migrations/drift/detect_drift.py +40 -0
- hare/migrations/drift/detect_drift_for_alias.py +87 -0
- hare/migrations/drift/drift_result.py +22 -0
- hare/migrations/drift/shadow/__init__.py +0 -0
- hare/migrations/drift/shadow/column_field_names.py +26 -0
- hare/migrations/drift/shadow/schema_comparison.py +557 -0
- hare/migrations/drift/shadow/shadow_drift.py +318 -0
- hare/migrations/drift/shadow/shadow_state.py +83 -0
- hare/migrations/exceptions.py +69 -0
- hare/migrations/execution/__init__.py +3 -0
- hare/migrations/execution/connections_plan.py +192 -0
- hare/migrations/execution/constants.py +4 -0
- hare/migrations/execution/executor/__init__.py +11 -0
- hare/migrations/execution/executor/migration_executor.py +640 -0
- hare/migrations/execution/executor/migration_target.py +9 -0
- hare/migrations/execution/executor/plan_step.py +30 -0
- hare/migrations/execution/migration_runner.py +304 -0
- hare/migrations/execution/swappable_setting_check.py +161 -0
- hare/migrations/loading/__init__.py +4 -0
- hare/migrations/loading/graph/__init__.py +13 -0
- hare/migrations/loading/graph/dummy_node.py +22 -0
- hare/migrations/loading/graph/migration_graph.py +235 -0
- hare/migrations/loading/graph/migration_key.py +14 -0
- hare/migrations/loading/graph/node.py +40 -0
- hare/migrations/loading/migration_loader.py +256 -0
- hare/migrations/loading/migrations_modules.py +207 -0
- hare/migrations/loading/recorder/__init__.py +9 -0
- hare/migrations/loading/recorder/migration_recorder.py +130 -0
- hare/migrations/loading/recorder/noop_recorder.py +26 -0
- hare/migrations/making/__init__.py +1 -0
- hare/migrations/making/declared_attribute_values.py +27 -0
- hare/migrations/making/migration_changes.py +27 -0
- hare/migrations/making/migration_checks.py +115 -0
- hare/migrations/making/migration_maker.py +291 -0
- hare/migrations/making/migration_optimizer.py +70 -0
- hare/migrations/making/migration_squasher.py +193 -0
- hare/migrations/making/squashed_migration.py +24 -0
- hare/migrations/migration.py +341 -0
- hare/migrations/operations/__init__.py +132 -0
- hare/migrations/operations/columns/__init__.py +11 -0
- hare/migrations/operations/columns/alter_column_not_null_safe.py +140 -0
- hare/migrations/operations/columns/backfill_column.py +118 -0
- hare/migrations/operations/constants.py +20 -0
- hare/migrations/operations/constraints/__init__.py +15 -0
- hare/migrations/operations/constraints/add_constraint.py +129 -0
- hare/migrations/operations/constraints/declarations.py +13 -0
- hare/migrations/operations/constraints/rename_constraint.py +21 -0
- hare/migrations/operations/constraints/validate_constraint.py +66 -0
- hare/migrations/operations/database_functions/__init__.py +10 -0
- hare/migrations/operations/database_functions/add_function.py +28 -0
- hare/migrations/operations/database_functions/alter_function.py +30 -0
- hare/migrations/operations/database_functions/remove_function.py +20 -0
- hare/migrations/operations/database_functions/rename_function.py +21 -0
- hare/migrations/operations/declared_uniqueness_checks.py +76 -0
- hare/migrations/operations/dependencies/__init__.py +1 -0
- hare/migrations/operations/dependencies/operation_dependency.py +89 -0
- hare/migrations/operations/dependencies/relation_dependencies.py +157 -0
- hare/migrations/operations/dictionaries/__init__.py +10 -0
- hare/migrations/operations/dictionaries/add_dictionary.py +28 -0
- hare/migrations/operations/dictionaries/alter_dictionary.py +29 -0
- hare/migrations/operations/dictionaries/remove_dictionary.py +20 -0
- hare/migrations/operations/dictionaries/rename_dictionary.py +21 -0
- hare/migrations/operations/enum_types/__init__.py +7 -0
- hare/migrations/operations/enum_types/alter_enum_type.py +64 -0
- hare/migrations/operations/enum_types/create_enum_type.py +57 -0
- hare/migrations/operations/enum_types/drop_enum_type.py +66 -0
- hare/migrations/operations/enum_types/enum_type_operation.py +35 -0
- hare/migrations/operations/enums.py +24 -0
- hare/migrations/operations/extensions/__init__.py +15 -0
- hare/migrations/operations/extensions/create_collation.py +82 -0
- hare/migrations/operations/extensions/create_extension.py +47 -0
- hare/migrations/operations/extensions/remove_collation.py +35 -0
- hare/migrations/operations/extensions/remove_extension.py +40 -0
- hare/migrations/operations/fields/__init__.py +11 -0
- hare/migrations/operations/fields/add_field.py +135 -0
- hare/migrations/operations/fields/alter_field.py +128 -0
- hare/migrations/operations/fields/field_add_remove_operation.py +41 -0
- hare/migrations/operations/fields/field_like.py +14 -0
- hare/migrations/operations/fields/remove_field.py +326 -0
- hare/migrations/operations/fields/rename_field.py +725 -0
- hare/migrations/operations/grants/__init__.py +8 -0
- hare/migrations/operations/grants/add_grant.py +31 -0
- hare/migrations/operations/grants/remove_grant.py +35 -0
- hare/migrations/operations/hare_operation.py +174 -0
- hare/migrations/operations/indexes/__init__.py +13 -0
- hare/migrations/operations/indexes/add_index.py +42 -0
- hare/migrations/operations/indexes/declarations.py +12 -0
- hare/migrations/operations/indexes/remove_index.py +36 -0
- hare/migrations/operations/materialized_views/__init__.py +17 -0
- hare/migrations/operations/materialized_views/add_materialized_view.py +37 -0
- hare/migrations/operations/materialized_views/alter_materialized_view.py +32 -0
- hare/migrations/operations/materialized_views/refresh_materialized_view.py +57 -0
- hare/migrations/operations/materialized_views/remove_materialized_view.py +28 -0
- hare/migrations/operations/materialized_views/rename_materialized_view.py +23 -0
- hare/migrations/operations/model_bound_operation.py +95 -0
- hare/migrations/operations/models/__init__.py +12 -0
- hare/migrations/operations/models/alter_model_options.py +158 -0
- hare/migrations/operations/models/alter_model_schema.py +114 -0
- hare/migrations/operations/models/alter_model_table.py +65 -0
- hare/migrations/operations/models/create_model.py +407 -0
- hare/migrations/operations/models/delete_model.py +122 -0
- hare/migrations/operations/models/model_table_operation.py +45 -0
- hare/migrations/operations/models/rename_model.py +165 -0
- hare/migrations/operations/models/table_renaming_operation.py +101 -0
- hare/migrations/operations/operation.py +252 -0
- hare/migrations/operations/partitions/__init__.py +11 -0
- hare/migrations/operations/partitions/add_partition.py +36 -0
- hare/migrations/operations/partitions/partition_operation.py +93 -0
- hare/migrations/operations/partitions/remove_partition.py +36 -0
- hare/migrations/operations/policies/__init__.py +11 -0
- hare/migrations/operations/policies/add_policy.py +28 -0
- hare/migrations/operations/policies/alter_policy.py +30 -0
- hare/migrations/operations/policies/alter_row_level_security.py +90 -0
- hare/migrations/operations/policies/remove_policy.py +21 -0
- hare/migrations/operations/policies/rename_policy.py +21 -0
- hare/migrations/operations/schema_objects/__init__.py +11 -0
- hare/migrations/operations/schema_objects/add_schema_object.py +103 -0
- hare/migrations/operations/schema_objects/alter_schema_object.py +89 -0
- hare/migrations/operations/schema_objects/object_types/__init__.py +1 -0
- hare/migrations/operations/schema_objects/object_types/constraint_object_type.py +98 -0
- hare/migrations/operations/schema_objects/object_types/dictionary_object_type.py +51 -0
- hare/migrations/operations/schema_objects/object_types/function_object_type.py +55 -0
- hare/migrations/operations/schema_objects/object_types/grant_object_type.py +71 -0
- hare/migrations/operations/schema_objects/object_types/index_object_type.py +140 -0
- hare/migrations/operations/schema_objects/object_types/materialized_view_object_type.py +63 -0
- hare/migrations/operations/schema_objects/object_types/policy_object_type.py +53 -0
- hare/migrations/operations/schema_objects/object_types/schema_object_type.py +234 -0
- hare/migrations/operations/schema_objects/object_types/sequence_object_type.py +54 -0
- hare/migrations/operations/schema_objects/object_types/trigger_object_type.py +46 -0
- hare/migrations/operations/schema_objects/object_types/view_object_type.py +60 -0
- hare/migrations/operations/schema_objects/remove_schema_object.py +105 -0
- hare/migrations/operations/schema_objects/rename_schema_object.py +116 -0
- hare/migrations/operations/schemas/__init__.py +11 -0
- hare/migrations/operations/schemas/create_schema.py +45 -0
- hare/migrations/operations/schemas/drop_schema.py +40 -0
- hare/migrations/operations/sequences/__init__.py +10 -0
- hare/migrations/operations/sequences/add_sequence.py +28 -0
- hare/migrations/operations/sequences/alter_sequence.py +29 -0
- hare/migrations/operations/sequences/remove_sequence.py +20 -0
- hare/migrations/operations/sequences/rename_sequence.py +21 -0
- hare/migrations/operations/special/__init__.py +16 -0
- hare/migrations/operations/special/run_python.py +82 -0
- hare/migrations/operations/special/run_sql.py +107 -0
- hare/migrations/operations/special/separate_database_and_state.py +95 -0
- hare/migrations/operations/special/synchronize_key_series.py +51 -0
- hare/migrations/operations/triggers/__init__.py +15 -0
- hare/migrations/operations/triggers/add_trigger.py +28 -0
- hare/migrations/operations/triggers/alter_trigger.py +28 -0
- hare/migrations/operations/triggers/remove_trigger.py +20 -0
- hare/migrations/operations/triggers/rename_trigger.py +21 -0
- hare/migrations/operations/views/__init__.py +10 -0
- hare/migrations/operations/views/add_view.py +29 -0
- hare/migrations/operations/views/alter_view.py +29 -0
- hare/migrations/operations/views/remove_view.py +20 -0
- hare/migrations/operations/views/rename_view.py +21 -0
- hare/migrations/reports/__init__.py +12 -0
- hare/migrations/reports/operation_effect.py +28 -0
- hare/migrations/reports/operation_plan.py +23 -0
- hare/migrations/runtime_enums.py +88 -0
- hare/migrations/safety/__init__.py +16 -0
- hare/migrations/safety/enums.py +37 -0
- hare/migrations/safety/migration_risk.py +33 -0
- hare/migrations/safety/migration_safety_checker.py +250 -0
- hare/migrations/safety/migration_safety_context.py +142 -0
- hare/migrations/state/__init__.py +11 -0
- hare/migrations/state/model_state.py +359 -0
- hare/migrations/state/state.py +297 -0
- hare/migrations/state/state_apps.py +315 -0
- hare/migrations/state/state_rendering.py +222 -0
- hare/migrations/swappable_dependency.py +36 -0
- hare/migrations/writer/__init__.py +9 -0
- hare/migrations/writer/constants.py +28 -0
- hare/migrations/writer/import_manager.py +106 -0
- hare/migrations/writer/migration_writer.py +986 -0
- hare/models/__init__.py +20 -0
- hare/models/class_building/__init__.py +1 -0
- hare/models/class_building/abstract_meta_inheritance.py +116 -0
- hare/models/class_building/blind_indexes.py +54 -0
- hare/models/class_building/constants.py +61 -0
- hare/models/class_building/extension_model_options.py +20 -0
- hare/models/class_building/field_comments.py +131 -0
- hare/models/class_building/generic_foreign_keys.py +287 -0
- hare/models/class_building/instance_constructors.py +110 -0
- hare/models/class_building/lazy_relation_fields.py +140 -0
- hare/models/class_building/model_definition_checks.py +710 -0
- hare/models/class_building/model_field_collection.py +185 -0
- hare/models/class_building/model_managers.py +62 -0
- hare/models/class_building/primary_key_declaration.py +204 -0
- hare/models/class_building/schema_object_declarations.py +106 -0
- hare/models/constants.py +75 -0
- hare/models/deletion/__init__.py +0 -0
- hare/models/deletion/cascade/__init__.py +1 -0
- hare/models/deletion/cascade/cascade_deletion.py +818 -0
- hare/models/deletion/cascade/cascade_restore.py +150 -0
- hare/models/deletion/cascade/deletion_collector.py +646 -0
- hare/models/deletion/cascade/deletion_graph.py +418 -0
- hare/models/deletion/cascade/deletion_plan.py +94 -0
- hare/models/deletion/cascade/protect_constraint_deferral.py +91 -0
- hare/models/deletion/cascade/related_rows.py +417 -0
- hare/models/deletion/cascade/tenant_schema_visits.py +96 -0
- hare/models/deletion/constants.py +29 -0
- hare/models/deletion/instance_deletion.py +288 -0
- hare/models/deletion/preview/__init__.py +1 -0
- hare/models/deletion/preview/delete_preview.py +93 -0
- hare/models/deletion/preview/delete_preview_builder.py +431 -0
- hare/models/deletion/soft_deletion.py +207 -0
- hare/models/enums.py +76 -0
- hare/models/instances/__init__.py +1 -0
- hare/models/instances/dirty_fields.py +99 -0
- hare/models/instances/field_snapshot.py +116 -0
- hare/models/instances/instance_connections.py +61 -0
- hare/models/instances/instance_copies.py +46 -0
- hare/models/instances/instance_initialization.py +323 -0
- hare/models/instances/instance_refresh.py +158 -0
- hare/models/instances/instance_saving.py +512 -0
- hare/models/meta_info.py +1143 -0
- hare/models/model.py +935 -0
- hare/models/model_meta.py +255 -0
- hare/models/tenancy/__init__.py +1 -0
- hare/models/tenancy/constants.py +16 -0
- hare/models/tenancy/tenancy.py +363 -0
- hare/models/tenancy/tenant_row_level_security.py +76 -0
- hare/models/tenancy/tenant_schemas.py +232 -0
- hare/models/uniqueness/__init__.py +0 -0
- hare/models/uniqueness/declared_uniqueness.py +99 -0
- hare/models/write/__init__.py +3 -0
- hare/models/write/generated_keys.py +97 -0
- hare/models/write/insert/__init__.py +1 -0
- hare/models/write/insert/insert_conflict.py +88 -0
- hare/models/write/insert/insert_statement.py +155 -0
- hare/models/write/instance_capture.py +173 -0
- hare/models/write/instance_values.py +126 -0
- hare/models/write/instance_writer.py +949 -0
- hare/models/write/returned_values.py +98 -0
- hare/models/write/rollback_restores.py +213 -0
- hare/models/write/rules/__init__.py +2 -0
- hare/models/write/rules/constants.py +65 -0
- hare/models/write/rules/enums.py +18 -0
- hare/models/write/rules/relation_key_values.py +50 -0
- hare/models/write/rules/row_write_rules.py +635 -0
- hare/models/write/rules/tenant_write_rules.py +300 -0
- hare/models/write/rules/written_instances.py +37 -0
- hare/models/write/rules/written_target_checks.py +63 -0
- hare/models/write/update/__init__.py +1 -0
- hare/models/write/update/expression_assignment.py +162 -0
- hare/models/write/update/update_parameter_slot.py +43 -0
- hare/models/write/write_steps.py +98 -0
- hare/native/__init__.py +1 -0
- hare/native/native_modules.py +19 -0
- hare/numbers/__init__.py +1 -0
- hare/numbers/finite_numbers.py +27 -0
- hare/py.typed +0 -0
- hare/query/__init__.py +0 -0
- hare/query/constants.py +41 -0
- hare/query/enums.py +129 -0
- hare/query/expressions/__init__.py +63 -0
- hare/query/expressions/aggregate.py +442 -0
- hare/query/expressions/aggregate_paths/__init__.py +9 -0
- hare/query/expressions/aggregate_paths/aggregate_crossing.py +20 -0
- hare/query/expressions/aggregate_paths/aggregated_multi_valued_paths.py +581 -0
- hare/query/expressions/aggregate_paths/constants.py +10 -0
- hare/query/expressions/arithmetic/__init__.py +1 -0
- hare/query/expressions/arithmetic/arithmetic_operators.py +57 -0
- hare/query/expressions/arithmetic/combinable_expression.py +47 -0
- hare/query/expressions/arithmetic/combined_expression.py +614 -0
- hare/query/expressions/arithmetic/constants.py +37 -0
- hare/query/expressions/case/__init__.py +1 -0
- hare/query/expressions/case/case.py +230 -0
- hare/query/expressions/case/case_branch_value.py +14 -0
- hare/query/expressions/case/when.py +167 -0
- hare/query/expressions/compatibility/__init__.py +9 -0
- hare/query/expressions/compatibility/constants.py +107 -0
- hare/query/expressions/compatibility/output_field_compatibility.py +248 -0
- hare/query/expressions/compatibility/result_branch.py +46 -0
- hare/query/expressions/conditions/__init__.py +1 -0
- hare/query/expressions/conditions/q.py +525 -0
- hare/query/expressions/conditions/query_modifier.py +90 -0
- hare/query/expressions/constants.py +120 -0
- hare/query/expressions/declarations.py +12 -0
- hare/query/expressions/enums.py +39 -0
- hare/query/expressions/expression.py +129 -0
- hare/query/expressions/expression_context.py +63 -0
- hare/query/expressions/expression_result.py +41 -0
- hare/query/expressions/f.py +212 -0
- hare/query/expressions/frames/__init__.py +12 -0
- hare/query/expressions/frames/constants.py +14 -0
- hare/query/expressions/frames/declarations.py +22 -0
- hare/query/expressions/frames/window_frame.py +126 -0
- hare/query/expressions/function.py +490 -0
- hare/query/expressions/joins/__init__.py +1 -0
- hare/query/expressions/joins/array_join.py +147 -0
- hare/query/expressions/joins/array_join_element.py +27 -0
- hare/query/expressions/joins/asof_join.py +263 -0
- hare/query/expressions/joins/filtered_relation.py +338 -0
- hare/query/expressions/joins/json_table.py +147 -0
- hare/query/expressions/joins/json_table_column.py +21 -0
- hare/query/expressions/joins/lateral.py +88 -0
- hare/query/expressions/joins/merge_source_row.py +44 -0
- hare/query/expressions/joins/named_columns.py +43 -0
- hare/query/expressions/joins/named_join.py +204 -0
- hare/query/expressions/numeric/__init__.py +11 -0
- hare/query/expressions/numeric/numeric_type.py +18 -0
- hare/query/expressions/numeric/numeric_typing.py +216 -0
- hare/query/expressions/numeric/unrounded_decimal_field.py +16 -0
- hare/query/expressions/ordering.py +55 -0
- hare/query/expressions/raw_sql.py +168 -0
- hare/query/expressions/subqueries/__init__.py +1 -0
- hare/query/expressions/subqueries/cte_rows.py +46 -0
- hare/query/expressions/subqueries/declarations.py +8 -0
- hare/query/expressions/subqueries/exists.py +181 -0
- hare/query/expressions/subqueries/outer_reference.py +157 -0
- hare/query/expressions/subqueries/outer_scope.py +74 -0
- hare/query/expressions/subqueries/recursive_rows.py +177 -0
- hare/query/expressions/subqueries/subquery.py +236 -0
- hare/query/expressions/temporal/__init__.py +9 -0
- hare/query/expressions/temporal/constants.py +43 -0
- hare/query/expressions/temporal/temporal_arithmetic.py +254 -0
- hare/query/expressions/temporal/temporal_operand.py +25 -0
- hare/query/expressions/term_expression.py +28 -0
- hare/query/expressions/value.py +259 -0
- hare/query/expressions/value_references/__init__.py +49 -0
- hare/query/expressions/value_references/array_value_reference.py +41 -0
- hare/query/expressions/value_references/composite_key_value_reference.py +61 -0
- hare/query/expressions/value_references/cursor_value_reference.py +41 -0
- hare/query/expressions/value_references/encoded_value_reference.py +43 -0
- hare/query/expressions/value_references/expression_arguments.py +181 -0
- hare/query/expressions/value_references/like_value_reference.py +46 -0
- hare/query/expressions/value_references/list_parameter_value_reference.py +65 -0
- hare/query/expressions/value_references/list_value_reference.py +55 -0
- hare/query/expressions/value_references/literal_value_reference.py +38 -0
- hare/query/expressions/value_references/open_range_value_reference.py +53 -0
- hare/query/expressions/value_references/range_value_reference.py +49 -0
- hare/query/expressions/value_references/rebuilt_criterion_value_reference.py +93 -0
- hare/query/expressions/value_references/related_key_value_reference.py +67 -0
- hare/query/expressions/value_references/related_value_reference.py +33 -0
- hare/query/expressions/value_references/row_list_value_reference.py +67 -0
- hare/query/expressions/value_references/scalar_value_reference.py +41 -0
- hare/query/expressions/value_references/value_reference_types.py +65 -0
- hare/query/expressions/value_references/write_value_reference.py +41 -0
- hare/query/expressions/window.py +220 -0
- hare/query/filters/__init__.py +21 -0
- hare/query/filters/constants.py +89 -0
- hare/query/filters/lookups/__init__.py +1 -0
- hare/query/filters/lookups/annotation_container_lookups.py +40 -0
- hare/query/filters/lookups/constants.py +60 -0
- hare/query/filters/lookups/containers/__init__.py +3 -0
- hare/query/filters/lookups/containers/container_field_lookups.py +78 -0
- hare/query/filters/lookups/containers/container_lookups.py +80 -0
- hare/query/filters/lookups/containers/container_value_encoders.py +94 -0
- hare/query/filters/lookups/date_part_lookups.py +292 -0
- hare/query/filters/lookups/dialect_implemented_operators.py +39 -0
- hare/query/filters/lookups/field_lookup.py +59 -0
- hare/query/filters/lookups/field_lookups.py +289 -0
- hare/query/filters/lookups/field_transforms.py +98 -0
- hare/query/filters/lookups/json/__init__.py +1 -0
- hare/query/filters/lookups/json/json_filter_guards.py +412 -0
- hare/query/filters/lookups/json/json_filter_parser.py +82 -0
- hare/query/filters/lookups/json/json_lookups.py +67 -0
- hare/query/filters/lookups/json/json_path_lookups.py +184 -0
- hare/query/filters/lookups/lookups.py +371 -0
- hare/query/filters/lookups/value_encoders.py +246 -0
- hare/query/filters/resolution/__init__.py +1 -0
- hare/query/filters/resolution/annotation_filters.py +280 -0
- hare/query/filters/resolution/composite_key_filters.py +439 -0
- hare/query/filters/resolution/filter_kwargs.py +704 -0
- hare/query/filters/resolution/filter_values.py +565 -0
- hare/query/filters/resolution/json_path_filters.py +157 -0
- hare/query/filters/resolution/lookup_support.py +84 -0
- hare/query/filters/resolution/relation_filters.py +510 -0
- hare/query/filters/resolution/sensitive_filter_keys.py +91 -0
- hare/query/filters/resolution/to_many_filters.py +436 -0
- hare/query/functions/__init__.py +185 -0
- hare/query/functions/aggregates/__init__.py +9 -0
- hare/query/functions/aggregates/array_agg.py +48 -0
- hare/query/functions/aggregates/avg.py +59 -0
- hare/query/functions/aggregates/constants.py +5 -0
- hare/query/functions/aggregates/count.py +81 -0
- hare/query/functions/aggregates/declarations.py +51 -0
- hare/query/functions/aggregates/statistic_aggregate.py +67 -0
- hare/query/functions/aggregates/sum.py +55 -0
- hare/query/functions/comparison/__init__.py +9 -0
- hare/query/functions/comparison/cast.py +121 -0
- hare/query/functions/comparison/coalesce.py +140 -0
- hare/query/functions/comparison/collate.py +45 -0
- hare/query/functions/comparison/declarations.py +21 -0
- hare/query/functions/comparison/function_arguments.py +70 -0
- hare/query/functions/comparison/greatest_least_function.py +108 -0
- hare/query/functions/comparison/null_if.py +78 -0
- hare/query/functions/containers/__init__.py +7 -0
- hare/query/functions/containers/array_item.py +69 -0
- hare/query/functions/datetime/__init__.py +55 -0
- hare/query/functions/datetime/date_function_source.py +31 -0
- hare/query/functions/datetime/declarations.py +193 -0
- hare/query/functions/datetime/extract.py +97 -0
- hare/query/functions/datetime/now.py +26 -0
- hare/query/functions/datetime/trunc.py +124 -0
- hare/query/functions/json/__init__.py +6 -0
- hare/query/functions/json/json_array.py +34 -0
- hare/query/functions/json/json_object.py +161 -0
- hare/query/functions/math/__init__.py +53 -0
- hare/query/functions/math/declarations.py +192 -0
- hare/query/functions/math/enums.py +16 -0
- hare/query/functions/math/math_function.py +110 -0
- hare/query/functions/math/mod.py +52 -0
- hare/query/functions/math/pi.py +21 -0
- hare/query/functions/math/random.py +22 -0
- hare/query/functions/math/round.py +85 -0
- hare/query/functions/text/__init__.py +55 -0
- hare/query/functions/text/concat.py +99 -0
- hare/query/functions/text/declarations.py +197 -0
- hare/query/functions/text/l_pad.py +17 -0
- hare/query/functions/text/length.py +38 -0
- hare/query/functions/text/r_pad.py +17 -0
- hare/query/functions/text/replace.py +17 -0
- hare/query/functions/text/text_function.py +114 -0
- hare/query/functions/window/__init__.py +45 -0
- hare/query/functions/window/aggregate_window_function.py +43 -0
- hare/query/functions/window/avg.py +23 -0
- hare/query/functions/window/constants.py +3 -0
- hare/query/functions/window/count.py +54 -0
- hare/query/functions/window/declarations.py +153 -0
- hare/query/functions/window/distribution_window_function.py +21 -0
- hare/query/functions/window/field_window_function.py +149 -0
- hare/query/functions/window/n_tile.py +41 -0
- hare/query/functions/window/nth_value.py +54 -0
- hare/query/functions/window/offset_window_function.py +85 -0
- hare/query/functions/window/rank_like_window_function.py +21 -0
- hare/query/functions/window/statistic_window_function.py +44 -0
- hare/query/functions/window/sum.py +23 -0
- hare/query/functions/window/window_function.py +134 -0
- hare/query/generic_foreign_keys/__init__.py +3 -0
- hare/query/generic_foreign_keys/constants.py +21 -0
- hare/query/generic_foreign_keys/generic_foreign_key_filters.py +251 -0
- hare/query/generic_foreign_keys/generic_foreign_key_paths.py +183 -0
- hare/query/generic_foreign_keys/generic_foreign_key_types.py +94 -0
- hare/query/grouping/__init__.py +14 -0
- hare/query/grouping/declarations.py +21 -0
- hare/query/grouping/grouping.py +60 -0
- hare/query/grouping/grouping_set.py +67 -0
- hare/query/grouping/grouping_sets.py +55 -0
- hare/query/key_columns.py +297 -0
- hare/query/lookup_info/__init__.py +12 -0
- hare/query/lookup_info/declarations.py +27 -0
- hare/query/lookup_info/lookup_info.py +89 -0
- hare/query/lookup_info/lookup_info_builder.py +807 -0
- hare/query/lookup_info/lookup_path.py +94 -0
- hare/query/lookup_info/lookup_paths.py +415 -0
- hare/query/lookup_info/ordering_info.py +43 -0
- hare/query/lookup_info/value_paths.py +135 -0
- hare/query/managers/__init__.py +1 -0
- hare/query/managers/base_manager.py +20 -0
- hare/query/managers/manager.py +130 -0
- hare/query/plans/__init__.py +4 -0
- hare/query/plans/call_signatures/__init__.py +1 -0
- hare/query/plans/call_signatures/call_signature_plans.py +318 -0
- hare/query/plans/call_signatures/call_signature_runs.py +466 -0
- hare/query/plans/constants.py +37 -0
- hare/query/plans/description/__init__.py +11 -0
- hare/query/plans/description/declared_plan_parts.py +7 -0
- hare/query/plans/description/filter_plan_descriptions.py +229 -0
- hare/query/plans/description/hashable_values.py +22 -0
- hare/query/plans/description/plan_context.py +33 -0
- hare/query/plans/description/plan_describer_compiler.py +355 -0
- hare/query/plans/description/plan_description.py +66 -0
- hare/query/plans/description/plan_parts.py +150 -0
- hare/query/plans/description/plannable.py +69 -0
- hare/query/plans/description/term_plan_descriptions.py +92 -0
- hare/query/plans/enums.py +97 -0
- hare/query/plans/plan_origins.py +99 -0
- hare/query/plans/recording/__init__.py +1 -0
- hare/query/plans/recording/plan_recording.py +100 -0
- hare/query/plans/recording/scope_value_source.py +67 -0
- hare/query/plans/statement/__init__.py +1 -0
- hare/query/plans/statement/declared_plan_slots.py +11 -0
- hare/query/plans/statement/query_key_compiler.py +171 -0
- hare/query/plans/statement/raw_sql_plan.py +47 -0
- hare/query/plans/statement/statement_plan.py +522 -0
- hare/query/plans/statement/statement_plan_descriptions.py +451 -0
- hare/query/plans/statement/statement_plan_runs.py +306 -0
- hare/query/plans/statement/statement_plans.py +128 -0
- hare/query/query_connection.py +110 -0
- hare/query/queryset/__init__.py +19 -0
- hare/query/queryset/annotation_access_tracker.py +20 -0
- hare/query/queryset/arguments/__init__.py +1 -0
- hare/query/queryset/arguments/annotation_arguments.py +215 -0
- hare/query/queryset/arguments/collection_arguments.py +29 -0
- hare/query/queryset/arguments/filter_arguments.py +260 -0
- hare/query/queryset/arguments/ordering_arguments.py +242 -0
- hare/query/queryset/arguments/values_arguments.py +145 -0
- hare/query/queryset/combination/__init__.py +1 -0
- hare/query/queryset/combination/combination.py +58 -0
- hare/query/queryset/combination/queryset_combination.py +109 -0
- hare/query/queryset/concrete_field_paths.py +109 -0
- hare/query/queryset/constants.py +83 -0
- hare/query/queryset/date_lists.py +74 -0
- hare/query/queryset/declarations.py +7 -0
- hare/query/queryset/extensions/__init__.py +9 -0
- hare/query/queryset/extensions/query_set_extension.py +78 -0
- hare/query/queryset/extensions/query_set_extension_call.py +19 -0
- hare/query/queryset/extensions/query_set_extension_query.py +146 -0
- hare/query/queryset/extensions/query_set_extensions.py +247 -0
- hare/query/queryset/lazy_relation_names.py +33 -0
- hare/query/queryset/model_query.py +79 -0
- hare/query/queryset/objects_by_key.py +79 -0
- hare/query/queryset/options/__init__.py +1 -0
- hare/query/queryset/options/query_option.py +42 -0
- hare/query/queryset/options/query_options.py +313 -0
- hare/query/queryset/pending_calls/__init__.py +1 -0
- hare/query/queryset/pending_calls/calls_before_setup.py +185 -0
- hare/query/queryset/pending_calls/pending_filter_calls.py +144 -0
- hare/query/queryset/query_specification.py +1088 -0
- hare/query/queryset/queryset.py +2527 -0
- hare/query/queryset/relations/__init__.py +3 -0
- hare/query/queryset/relations/linked_many_to_many_relation.py +41 -0
- hare/query/queryset/relations/many_to_many/__init__.py +1 -0
- hare/query/queryset/relations/many_to_many/linked_keys.py +147 -0
- hare/query/queryset/relations/many_to_many/linked_rows_queries.py +175 -0
- hare/query/queryset/relations/many_to_many/many_to_many_members.py +173 -0
- hare/query/queryset/relations/many_to_many/many_to_many_scope_checks.py +332 -0
- hare/query/queryset/relations/many_to_many/through_defaults.py +244 -0
- hare/query/queryset/relations/many_to_many/through_row_inserting.py +516 -0
- hare/query/queryset/relations/many_to_many/through_row_unlinking.py +333 -0
- hare/query/queryset/relations/many_to_many/through_rows.py +185 -0
- hare/query/queryset/relations/many_to_many_relation.py +382 -0
- hare/query/queryset/relations/related_queryset/__init__.py +9 -0
- hare/query/queryset/relations/related_queryset/related_query_set.py +366 -0
- hare/query/queryset/relations/related_queryset/related_rows_iterator.py +42 -0
- hare/query/queryset/relations/related_queryset/relation_rows.py +73 -0
- hare/query/queryset/relations/related_queryset/unsaved_owner_condition.py +37 -0
- hare/query/queryset/relations/reverse_relation.py +474 -0
- hare/query/queryset/row_multiplication.py +151 -0
- hare/query/queryset/schema_object_calls.py +45 -0
- hare/query/queryset/selection/__init__.py +1 -0
- hare/query/queryset/selection/statement_selection.py +217 -0
- hare/query/queryset/selection/values_selection.py +65 -0
- hare/query/queryset/single_rows/__init__.py +1 -0
- hare/query/queryset/single_rows/get_exception_argument.py +7 -0
- hare/query/queryset/single_rows/get_exceptions.py +91 -0
- hare/query/queryset/single_rows/none_awaitable_type.py +21 -0
- hare/query/queryset/single_rows/query_set_single.py +49 -0
- hare/query/queryset/single_rows/single_row.py +103 -0
- hare/query/queryset/specification_copying.py +123 -0
- hare/query/queryset/table_sample.py +60 -0
- hare/query/raw_sql/__init__.py +6 -0
- hare/query/raw_sql/execute_sql.py +71 -0
- hare/query/raw_sql/sql_query_result.py +38 -0
- hare/query/relation_loading/__init__.py +14 -0
- hare/query/relation_loading/constants.py +8 -0
- hare/query/relation_loading/prefetching/__init__.py +1 -0
- hare/query/relation_loading/prefetching/declarations.py +32 -0
- hare/query/relation_loading/prefetching/direct_relation_prefetch.py +234 -0
- hare/query/relation_loading/prefetching/many_to_many_prefetch.py +496 -0
- hare/query/relation_loading/prefetching/prefetch.py +198 -0
- hare/query/relation_loading/prefetching/prefetch_checks.py +80 -0
- hare/query/relation_loading/prefetching/prefetch_related_objects.py +48 -0
- hare/query/relation_loading/prefetching/prefetch_request.py +30 -0
- hare/query/relation_loading/prefetching/prefetcher.py +200 -0
- hare/query/relation_loading/prefetching/related_rows_fetch.py +116 -0
- hare/query/relation_loading/prefetching/reverse_relation_prefetch.py +201 -0
- hare/query/relation_loading/prefetching/sliced_prefetch.py +165 -0
- hare/query/relation_loading/select.py +26 -0
- hare/query/rows/__init__.py +3 -0
- hare/query/rows/constants.py +33 -0
- hare/query/rows/enums.py +81 -0
- hare/query/rows/model_rows/__init__.py +1 -0
- hare/query/rows/model_rows/combined_model_rows.py +254 -0
- hare/query/rows/model_rows/model_columns.py +210 -0
- hare/query/rows/model_rows/model_rows.py +462 -0
- hare/query/rows/native/__init__.py +1 -0
- hare/query/rows/native/enums.py +12 -0
- hare/query/rows/native/field_codecs.py +450 -0
- hare/query/rows/native/hydrate_accelerator.py +264 -0
- hare/query/rows/native/hydration_layout.py +114 -0
- hare/query/rows/values_rows/__init__.py +1 -0
- hare/query/rows/values_rows/combined_values_rows.py +133 -0
- hare/query/rows/values_rows/dict_rows.py +92 -0
- hare/query/rows/values_rows/flat_rows.py +33 -0
- hare/query/rows/values_rows/named_rows.py +52 -0
- hare/query/rows/values_rows/tuple_rows.py +128 -0
- hare/query/rows/values_rows/value_field.py +26 -0
- hare/query/rows/values_rows/values_rows.py +175 -0
- hare/query/scopes/__init__.py +21 -0
- hare/query/scopes/constants.py +14 -0
- hare/query/scopes/manager_scope.py +51 -0
- hare/query/scopes/row_scope.py +46 -0
- hare/query/scopes/row_scopes.py +281 -0
- hare/query/scopes/row_visibility.py +89 -0
- hare/query/scopes/scope_join_conditions.py +273 -0
- hare/query/scopes/soft_delete_scope.py +17 -0
- hare/query/scopes/tenants/__init__.py +1 -0
- hare/query/scopes/tenants/all_tenants.py +11 -0
- hare/query/scopes/tenants/model_tenants.py +79 -0
- hare/query/scopes/tenants/tenant_scope.py +70 -0
- hare/query/scopes/tenants/tenant_values.py +52 -0
- hare/query/statements/__init__.py +30 -0
- hare/query/statements/awaitable_query.py +709 -0
- hare/query/statements/building/__init__.py +1 -0
- hare/query/statements/building/keyset_bounds.py +179 -0
- hare/query/statements/building/query_annotations.py +350 -0
- hare/query/statements/building/query_conditions.py +244 -0
- hare/query/statements/building/query_ctes.py +70 -0
- hare/query/statements/building/query_grouping.py +347 -0
- hare/query/statements/building/query_joins.py +282 -0
- hare/query/statements/building/query_ordering.py +275 -0
- hare/query/statements/building/row_locks.py +216 -0
- hare/query/statements/constants.py +111 -0
- hare/query/statements/select/__init__.py +4 -0
- hare/query/statements/select/combined/__init__.py +1 -0
- hare/query/statements/select/combined/combined_branches.py +380 -0
- hare/query/statements/select/combined/combined_derived_queries.py +220 -0
- hare/query/statements/select/combined/combined_plan_descriptions.py +43 -0
- hare/query/statements/select/combined_query.py +354 -0
- hare/query/statements/select/model_rows/__init__.py +1 -0
- hare/query/statements/select/model_rows/instance_hydration.py +162 -0
- hare/query/statements/select/model_rows/model_rows_plan_descriptions.py +108 -0
- hare/query/statements/select/model_rows/only_defer_fields.py +243 -0
- hare/query/statements/select/model_rows/select_related_joins.py +112 -0
- hare/query/statements/select/model_rows_query.py +416 -0
- hare/query/statements/select/raw_sql_query.py +151 -0
- hare/query/statements/select/rows_query.py +210 -0
- hare/query/statements/select/select_query.py +110 -0
- hare/query/statements/select/values/__init__.py +1 -0
- hare/query/statements/select/values/constants.py +9 -0
- hare/query/statements/select/values/values_distinct.py +41 -0
- hare/query/statements/select/values/values_grouping.py +118 -0
- hare/query/statements/select/values/values_output.py +298 -0
- hare/query/statements/select/values/values_reading.py +26 -0
- hare/query/statements/select/values/window_filter_wrapping.py +91 -0
- hare/query/statements/select/values_query.py +754 -0
- hare/query/statements/summary/__init__.py +3 -0
- hare/query/statements/summary/aggregate_query.py +732 -0
- hare/query/statements/summary/contains_query.py +66 -0
- hare/query/statements/summary/count_query.py +117 -0
- hare/query/statements/summary/exists_query.py +151 -0
- hare/query/statements/summary/rows_summary_query.py +187 -0
- hare/query/statements/write/__init__.py +3 -0
- hare/query/statements/write/bulk/__init__.py +1 -0
- hare/query/statements/write/bulk/bulk_objects.py +61 -0
- hare/query/statements/write/bulk/bulk_update_checks.py +92 -0
- hare/query/statements/write/bulk/bulk_update_query.py +1012 -0
- hare/query/statements/write/bulk/bulk_write_batches.py +368 -0
- hare/query/statements/write/bulk/create/__init__.py +1 -0
- hare/query/statements/write/bulk/create/bulk_create_query.py +936 -0
- hare/query/statements/write/bulk/create/bulk_create_reports.py +316 -0
- hare/query/statements/write/bulk/create/conflict_clause.py +137 -0
- hare/query/statements/write/bulk/create/copy_insert.py +143 -0
- hare/query/statements/write/bulk/create/default_rows_insert.py +85 -0
- hare/query/statements/write/bulk/create/inline_insert.py +93 -0
- hare/query/statements/write/bulk/create/multi_row_insert.py +277 -0
- hare/query/statements/write/bulk/create/returned_rows_matching.py +136 -0
- hare/query/statements/write/bulk/create/template_insert.py +185 -0
- hare/query/statements/write/bulk/declarations.py +61 -0
- hare/query/statements/write/create_or_update.py +193 -0
- hare/query/statements/write/declarations.py +26 -0
- hare/query/statements/write/delete_query.py +402 -0
- hare/query/statements/write/insert_from_query.py +373 -0
- hare/query/statements/write/matching_rows_query.py +268 -0
- hare/query/statements/write/merge/__init__.py +1 -0
- hare/query/statements/write/merge/merge_query.py +818 -0
- hare/query/statements/write/merge/merge_when.py +87 -0
- hare/query/statements/write/restore_query.py +105 -0
- hare/query/statements/write/returning/__init__.py +1 -0
- hare/query/statements/write/returning/delete_returning_query.py +154 -0
- hare/query/statements/write/returning/returned_rows.py +246 -0
- hare/query/statements/write/returning/update_returning_query.py +120 -0
- hare/query/statements/write/update_query.py +851 -0
- hare/search/__init__.py +29 -0
- hare/search/constants.py +22 -0
- hare/search/enums.py +26 -0
- hare/search/query/__init__.py +8 -0
- hare/search/query/combined_search_query.py +46 -0
- hare/search/query/declarations.py +9 -0
- hare/search/query/search_query.py +75 -0
- hare/search/query/search_query_combinable.py +40 -0
- hare/search/search_arguments.py +79 -0
- hare/search/search_features.py +35 -0
- hare/search/search_headline.py +186 -0
- hare/search/search_rank.py +144 -0
- hare/search/types.py +16 -0
- hare/search/vector/__init__.py +7 -0
- hare/search/vector/combined_search_vector.py +32 -0
- hare/search/vector/search_vector.py +77 -0
- hare/search/vector/search_vector_combinable.py +30 -0
- hare/sql/__init__.py +71 -0
- hare/sql/analytics/__init__.py +17 -0
- hare/sql/analytics/count.py +13 -0
- hare/sql/analytics/current_row.py +10 -0
- hare/sql/analytics/declarations.py +15 -0
- hare/sql/analytics/row_number.py +13 -0
- hare/sql/builder/__init__.py +29 -0
- hare/sql/builder/joins/__init__.py +16 -0
- hare/sql/builder/joins/join.py +71 -0
- hare/sql/builder/joins/join_on.py +73 -0
- hare/sql/builder/joins/joiner.py +38 -0
- hare/sql/builder/queries/__init__.py +17 -0
- hare/sql/builder/queries/constants.py +5 -0
- hare/sql/builder/queries/correlated_subqueries.py +583 -0
- hare/sql/builder/queries/pagination_sql.py +19 -0
- hare/sql/builder/queries/query.py +109 -0
- hare/sql/builder/queries/query_builder.py +1090 -0
- hare/sql/builder/queries/query_sql_rendering.py +407 -0
- hare/sql/builder/queries/set_operation_query.py +203 -0
- hare/sql/builder/returned_value.py +19 -0
- hare/sql/builder/tables/__init__.py +22 -0
- hare/sql/builder/tables/aliased_query.py +33 -0
- hare/sql/builder/tables/array_join_source.py +39 -0
- hare/sql/builder/tables/asof_join_source.py +29 -0
- hare/sql/builder/tables/cte.py +18 -0
- hare/sql/builder/tables/database.py +12 -0
- hare/sql/builder/tables/json_table_query.py +76 -0
- hare/sql/builder/tables/lateral_query.py +26 -0
- hare/sql/builder/tables/schema.py +42 -0
- hare/sql/builder/tables/selectable.py +83 -0
- hare/sql/builder/tables/table.py +170 -0
- hare/sql/builder_methods.py +56 -0
- hare/sql/constants.py +87 -0
- hare/sql/enums.py +211 -0
- hare/sql/exceptions.py +31 -0
- hare/sql/functions/__init__.py +81 -0
- hare/sql/functions/address_text.py +18 -0
- hare/sql/functions/cast.py +19 -0
- hare/sql/functions/cast_to.py +38 -0
- hare/sql/functions/coalesce.py +13 -0
- hare/sql/functions/count.py +14 -0
- hare/sql/functions/datetime/__init__.py +1 -0
- hare/sql/functions/datetime/date.py +16 -0
- hare/sql/functions/datetime/date_as_timestamp.py +23 -0
- hare/sql/functions/datetime/date_trunc.py +65 -0
- hare/sql/functions/datetime/datetime_as_text.py +16 -0
- hare/sql/functions/datetime/datetime_cast.py +68 -0
- hare/sql/functions/datetime/extract.py +92 -0
- hare/sql/functions/datetime/now.py +14 -0
- hare/sql/functions/datetime/temporal_difference.py +26 -0
- hare/sql/functions/datetime/temporal_shift.py +38 -0
- hare/sql/functions/datetime/timestamp_comparand.py +18 -0
- hare/sql/functions/declarations.py +19 -0
- hare/sql/functions/distinct_option_function.py +33 -0
- hare/sql/functions/greatest_least.py +25 -0
- hare/sql/functions/grouping_function.py +13 -0
- hare/sql/functions/json/__init__.py +1 -0
- hare/sql/functions/json/json_array.py +14 -0
- hare/sql/functions/json/json_object.py +14 -0
- hare/sql/functions/json/json_sort_key.py +15 -0
- hare/sql/functions/json/json_value.py +19 -0
- hare/sql/functions/numeric_cast.py +16 -0
- hare/sql/functions/random_number.py +13 -0
- hare/sql/functions/round.py +20 -0
- hare/sql/functions/statistic.py +20 -0
- hare/sql/functions/std_dev.py +13 -0
- hare/sql/functions/text/__init__.py +1 -0
- hare/sql/functions/text/collate.py +61 -0
- hare/sql/functions/text/concat.py +18 -0
- hare/sql/functions/text/concat_function.py +53 -0
- hare/sql/functions/text/decimal_text_collate.py +16 -0
- hare/sql/functions/text/lower.py +12 -0
- hare/sql/functions/text/replace.py +12 -0
- hare/sql/functions/text/upper.py +12 -0
- hare/sql/identifiers.py +61 -0
- hare/sql/sql_context.py +155 -0
- hare/sql/terms/__init__.py +90 -0
- hare/sql/terms/arithmetic_expression.py +120 -0
- hare/sql/terms/array.py +109 -0
- hare/sql/terms/bracket.py +12 -0
- hare/sql/terms/case/__init__.py +1 -0
- hare/sql/terms/case/case.py +123 -0
- hare/sql/terms/case/when_then.py +11 -0
- hare/sql/terms/constants.py +5 -0
- hare/sql/terms/containers/__init__.py +35 -0
- hare/sql/terms/containers/array_element_term.py +58 -0
- hare/sql/terms/containers/array_slice_term.py +28 -0
- hare/sql/terms/containers/constants.py +6 -0
- hare/sql/terms/containers/container_function.py +22 -0
- hare/sql/terms/containers/container_literal.py +37 -0
- hare/sql/terms/containers/declarations.py +47 -0
- hare/sql/terms/containers/map_value_term.py +30 -0
- hare/sql/terms/containers/tuple_element_term.py +21 -0
- hare/sql/terms/criteria/__init__.py +37 -0
- hare/sql/terms/criteria/basic_criterion.py +92 -0
- hare/sql/terms/criteria/between_criterion.py +39 -0
- hare/sql/terms/criteria/complex_criterion.py +47 -0
- hare/sql/terms/criteria/contains_criterion.py +81 -0
- hare/sql/terms/criteria/criterion.py +87 -0
- hare/sql/terms/criteria/empty_criterion.py +38 -0
- hare/sql/terms/criteria/is_distinct_from_criterion.py +52 -0
- hare/sql/terms/criteria/is_not_true_criterion.py +49 -0
- hare/sql/terms/criteria/json_attribute_criterion.py +62 -0
- hare/sql/terms/criteria/like.py +56 -0
- hare/sql/terms/criteria/nested_criterion.py +78 -0
- hare/sql/terms/criteria/not_criterion.py +78 -0
- hare/sql/terms/criteria/null_criterion.py +47 -0
- hare/sql/terms/criteria/range_criterion.py +28 -0
- hare/sql/terms/criteria/true_criterion.py +13 -0
- hare/sql/terms/field.py +65 -0
- hare/sql/terms/functions/__init__.py +30 -0
- hare/sql/terms/functions/aggregate_function.py +119 -0
- hare/sql/terms/functions/analytic_function.py +107 -0
- hare/sql/terms/functions/custom_function.py +39 -0
- hare/sql/terms/functions/decimal_mod.py +27 -0
- hare/sql/terms/functions/float_mod.py +24 -0
- hare/sql/terms/functions/function.py +131 -0
- hare/sql/terms/functions/interval.py +110 -0
- hare/sql/terms/functions/mod.py +22 -0
- hare/sql/terms/functions/pow.py +11 -0
- hare/sql/terms/functions/window_frame_analytic_function.py +78 -0
- hare/sql/terms/grouping/__init__.py +14 -0
- hare/sql/terms/grouping/declarations.py +17 -0
- hare/sql/terms/grouping/grouping_element.py +42 -0
- hare/sql/terms/grouping/grouping_sets_element.py +46 -0
- hare/sql/terms/index.py +15 -0
- hare/sql/terms/infix_operator.py +34 -0
- hare/sql/terms/json.py +100 -0
- hare/sql/terms/negative.py +49 -0
- hare/sql/terms/node.py +135 -0
- hare/sql/terms/parameters/__init__.py +1 -0
- hare/sql/terms/parameters/list_parameter.py +33 -0
- hare/sql/terms/parameters/parameter.py +35 -0
- hare/sql/terms/parameters/parameterized_value_wrapper.py +19 -0
- hare/sql/terms/parameters/parameterizer.py +99 -0
- hare/sql/terms/parameters/query_parameters.py +74 -0
- hare/sql/terms/parameters/recording_parameterizer.py +27 -0
- hare/sql/terms/qualified_outer_field.py +58 -0
- hare/sql/terms/select_reference.py +80 -0
- hare/sql/terms/star.py +30 -0
- hare/sql/terms/subqueries/__init__.py +1 -0
- hare/sql/terms/subqueries/exists_term.py +111 -0
- hare/sql/terms/subqueries/outer_aggregate_term.py +51 -0
- hare/sql/terms/term.py +334 -0
- hare/sql/terms/term_identity_text.py +60 -0
- hare/sql/terms/tuple.py +52 -0
- hare/sql/terms/values/__init__.py +1 -0
- hare/sql/terms/values/literal_value.py +21 -0
- hare/sql/terms/values/null_value.py +10 -0
- hare/sql/terms/values/old_row_value.py +28 -0
- hare/sql/terms/values/row_value_list.py +15 -0
- hare/sql/terms/values/value_wrapper.py +129 -0
- hare/sql/types/__init__.py +1 -0
- hare/sql/types/sql_type.py +13 -0
- hare/sql/types/sql_types.py +17 -0
- hare/stubs/__init__.py +2 -0
- hare/stubs/constants.py +18 -0
- hare/stubs/model_stub.py +415 -0
- hare/stubs/module_stub.py +150 -0
- hare/stubs/stub_imports.py +91 -0
- hare/stubs/stub_writer.py +60 -0
- hare/stubs/value_type_text.py +98 -0
- hare/time/__init__.py +12 -0
- hare/time/constants.py +27 -0
- hare/time/system_clock.py +84 -0
- hare/time/timezone.py +534 -0
- hare/time/zone_info.py +13 -0
- hare/transactions/__init__.py +25 -0
- hare/transactions/atomic/__init__.py +1 -0
- hare/transactions/atomic/atomic.py +138 -0
- hare/transactions/atomic/atomic_attempt.py +62 -0
- hare/transactions/atomic/atomic_attempts.py +73 -0
- hare/transactions/constants.py +41 -0
- hare/transactions/distributed/__init__.py +9 -0
- hare/transactions/distributed/declarations.py +32 -0
- hare/transactions/distributed/distributed_coordinator.py +784 -0
- hare/transactions/distributed/distributed_transactions.py +26 -0
- hare/transactions/distributed/stale_prepared_transaction.py +23 -0
- hare/transactions/enums.py +31 -0
- hare/transactions/transaction_options.py +86 -0
- hare/transactions/transactions.py +228 -0
- hare/typing_info/__init__.py +3 -0
- hare/typing_info/bound_models.py +73 -0
- hare/typing_info/constants.py +13 -0
- hare/typing_info/declarations.py +44 -0
- hare/typing_info/filter_value_types.py +144 -0
- hare/vectors/__init__.py +18 -0
- hare/vectors/constants.py +10 -0
- hare/vectors/declarations.py +41 -0
- hare/vectors/enums.py +14 -0
- hare/vectors/terms/__init__.py +6 -0
- hare/vectors/terms/vector_distance_term.py +22 -0
- hare/vectors/terms/vector_literal.py +18 -0
- hare/vectors/vector_distance_expression.py +107 -0
- hare/vectors/vector_field.py +147 -0
- hare/warnings.py +13 -0
- hare_orm-0.9.0.dist-info/LICENSE +27 -0
- hare_orm-0.9.0.dist-info/METADATA +321 -0
- hare_orm-0.9.0.dist-info/NOTICE.md +96 -0
- hare_orm-0.9.0.dist-info/NOTICE.ru.md +98 -0
- hare_orm-0.9.0.dist-info/RECORD +2267 -0
- hare_orm-0.9.0.dist-info/WHEEL +4 -0
- hare_orm-0.9.0.dist-info/entry_points.txt +6 -0
|
@@ -0,0 +1,1115 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Collection, Iterable, Sequence
|
|
4
|
+
from copy import copy
|
|
5
|
+
from typing import Any, cast
|
|
6
|
+
|
|
7
|
+
from hare.core.apps.relation_linking import RelationLinking
|
|
8
|
+
from hare.ddl.schema_objects.enum_type import EnumType
|
|
9
|
+
from hare.dialects.dialect_registry import DialectRegistry
|
|
10
|
+
from hare.exceptions import ConfigurationError
|
|
11
|
+
from hare.fields.field import Field
|
|
12
|
+
from hare.fields.relations.fields.foreign_key_field_instance import ForeignKeyFieldInstance
|
|
13
|
+
from hare.fields.relations.fields.many_to_many_field_instance import ManyToManyFieldInstance
|
|
14
|
+
from hare.fields.relations.swappable_model_reference import SwappableModelReference
|
|
15
|
+
from hare.migrations.autodetection.constants import (
|
|
16
|
+
COLUMN_CHANGING_OPERATIONS,
|
|
17
|
+
MANY_TO_MANY_THROUGH_TABLE_SWAP_SUFFIX,
|
|
18
|
+
)
|
|
19
|
+
from hare.migrations.autodetection.diffs.state_model_diff import StateModelDiff
|
|
20
|
+
from hare.migrations.autodetection.operation_sorter import OperationSorter
|
|
21
|
+
from hare.migrations.autodetection.rename_questions import RenameQuestions
|
|
22
|
+
from hare.migrations.autodetection.required_extensions import RequiredExtensions
|
|
23
|
+
from hare.migrations.autodetection.schema_object_operations import SchemaObjectOperations
|
|
24
|
+
from hare.migrations.autodetection.state_signatures import StateSignatures
|
|
25
|
+
from hare.migrations.operations import (
|
|
26
|
+
AlterEnumType,
|
|
27
|
+
AlterField,
|
|
28
|
+
CreateEnumType,
|
|
29
|
+
CreateExtension,
|
|
30
|
+
CreateModel,
|
|
31
|
+
CreateSchema,
|
|
32
|
+
DeleteModel,
|
|
33
|
+
DropEnumType,
|
|
34
|
+
HareOperation,
|
|
35
|
+
RemoveField,
|
|
36
|
+
RenameField,
|
|
37
|
+
RenameModel,
|
|
38
|
+
)
|
|
39
|
+
from hare.migrations.operations.dependencies.operation_dependency import OperationDependency
|
|
40
|
+
from hare.migrations.operations.enums import DependencyType
|
|
41
|
+
from hare.migrations.operations.fields.field_like import FieldLike
|
|
42
|
+
from hare.migrations.operations.operation import Operation
|
|
43
|
+
from hare.migrations.state.model_state import ModelState
|
|
44
|
+
from hare.migrations.state.state import State
|
|
45
|
+
from hare.models.enums import ModelOption
|
|
46
|
+
|
|
47
|
+
ModelKey = tuple[str, str]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class OperationGenerator:
|
|
51
|
+
"""The migration operations leading from one migration state to another."""
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
old_state: State,
|
|
56
|
+
new_state: State,
|
|
57
|
+
connection_by_app: dict[str, str | None] | None = None,
|
|
58
|
+
rename_questions: RenameQuestions | None = None,
|
|
59
|
+
) -> None:
|
|
60
|
+
"""
|
|
61
|
+
Args:
|
|
62
|
+
old_state: The state the migration files on disk produce.
|
|
63
|
+
new_state: The state of the current models.
|
|
64
|
+
connection_by_app: Each app's default connection alias - a table of one app is the
|
|
65
|
+
same table as another app's only when both use the same connection.
|
|
66
|
+
rename_questions: The answers whether a removed field, model or app's model is renamed
|
|
67
|
+
or moved - none renamed without them.
|
|
68
|
+
"""
|
|
69
|
+
self.old_state = old_state
|
|
70
|
+
self.new_state = new_state
|
|
71
|
+
self.rename_questions = rename_questions or RenameQuestions()
|
|
72
|
+
# The diffs compare indexes by their resolved key expressions.
|
|
73
|
+
old_state.build_index_expressions()
|
|
74
|
+
new_state.build_index_expressions()
|
|
75
|
+
self.connection_by_app = connection_by_app or {}
|
|
76
|
+
#: Populated by generate() - (app, model) now in a selected app -> (app, model) it was
|
|
77
|
+
#: moved from, for every model moved between apps with its table kept as it is.
|
|
78
|
+
self.moved_models: dict[ModelKey, ModelKey] = {}
|
|
79
|
+
#: Populated by generate() - collects StateModelDiff.warnings (see StateFieldDiff's own
|
|
80
|
+
#: docstring for what these are) across every model diffed in this one generate() call.
|
|
81
|
+
self.warnings: list[str] = []
|
|
82
|
+
#: Populated by generate() - collects StateModelDiff.data_loss_warnings (see
|
|
83
|
+
#: StateFieldDiff's own docstring for what these are) across every model diffed in this
|
|
84
|
+
#: one generate() call.
|
|
85
|
+
self.data_loss_warnings: list[str] = []
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _filter_keys(keys: Iterable[ModelKey], app_labels: Sequence[str] | None) -> list[ModelKey]:
|
|
89
|
+
if app_labels is None:
|
|
90
|
+
return sorted(keys)
|
|
91
|
+
app_set = set(app_labels)
|
|
92
|
+
return sorted([key for key in keys if key[0] in app_set])
|
|
93
|
+
|
|
94
|
+
def _match_renamed_models(self, old_keys: list[ModelKey], new_keys: list[ModelKey]) -> dict[ModelKey, ModelKey]:
|
|
95
|
+
"""The removed models renamed to added ones: a removed and an added model of one app declared
|
|
96
|
+
alike - the one such pair - that the rename questions confirm.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
old_keys: The selected apps' models of the old state.
|
|
100
|
+
new_keys: The selected apps' models of the new state.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
New key -> old key of each renamed model.
|
|
104
|
+
"""
|
|
105
|
+
renamed: dict[ModelKey, ModelKey] = {}
|
|
106
|
+
removed_keys = [key for key in old_keys if key not in new_keys]
|
|
107
|
+
added_keys = [key for key in new_keys if key not in old_keys]
|
|
108
|
+
# Each model's signature once - the loops below compare every pair.
|
|
109
|
+
old_signatures = {key: StateSignatures.get_model_signature(self.old_state.models[key]) for key in removed_keys}
|
|
110
|
+
new_signatures = {key: StateSignatures.get_model_signature(self.new_state.models[key]) for key in added_keys}
|
|
111
|
+
for new_key in sorted(added_keys):
|
|
112
|
+
new_signature = new_signatures[new_key]
|
|
113
|
+
# A candidate only when exactly one added and one removed model share the signature - a
|
|
114
|
+
# wrong pairing would put rows under the wrong model.
|
|
115
|
+
matching_added = [
|
|
116
|
+
key for key in added_keys if key[0] == new_key[0] and new_signatures[key] == new_signature
|
|
117
|
+
]
|
|
118
|
+
matching_removed = [
|
|
119
|
+
key for key in removed_keys if key[0] == new_key[0] and old_signatures[key] == new_signature
|
|
120
|
+
]
|
|
121
|
+
if len(matching_added) != 1 or len(matching_removed) != 1:
|
|
122
|
+
continue
|
|
123
|
+
old_key = matching_removed[0]
|
|
124
|
+
if not self.rename_questions.ask_model_rename(new_key[0], old_key[1], new_key[1]):
|
|
125
|
+
continue
|
|
126
|
+
renamed[new_key] = old_key
|
|
127
|
+
removed_keys.remove(old_key)
|
|
128
|
+
added_keys.remove(new_key)
|
|
129
|
+
return renamed
|
|
130
|
+
|
|
131
|
+
def _get_table_identity(self, key: ModelKey, model_state: ModelState) -> tuple[str | None, str | None, str]:
|
|
132
|
+
"""The connection, schema and table a model's rows live in.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
key: The model's (app, model name) key.
|
|
136
|
+
model_state: The model's state.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
The connection alias, schema and table name.
|
|
140
|
+
"""
|
|
141
|
+
return (
|
|
142
|
+
self.connection_by_app.get(key[0]),
|
|
143
|
+
model_state.options.get(ModelOption.SCHEMA),
|
|
144
|
+
model_state.table or model_state.name.lower(),
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
def _get_moved_model_source(self, new_key: ModelKey) -> ModelKey | None:
|
|
148
|
+
"""The removed model of another app whose table `new_key` takes over, if any.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
new_key: A model present only in the new state.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
The removed model's key, or None when no removed model of another app used the table.
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
ConfigurationError: The model also changes in the same run, or several removed
|
|
158
|
+
models used the table.
|
|
159
|
+
"""
|
|
160
|
+
new_model_state = self.new_state.models[new_key]
|
|
161
|
+
table_identity = self._get_table_identity(new_key, new_model_state)
|
|
162
|
+
source_keys = [
|
|
163
|
+
old_key
|
|
164
|
+
for old_key, old_model_state in self.old_state.models.items()
|
|
165
|
+
if old_key[0] != new_key[0]
|
|
166
|
+
and old_key not in self.new_state.models
|
|
167
|
+
and self._get_table_identity(old_key, old_model_state) == table_identity
|
|
168
|
+
]
|
|
169
|
+
source_keys = [
|
|
170
|
+
source_key
|
|
171
|
+
for source_key in source_keys
|
|
172
|
+
if self.rename_questions.ask_model_move(f"{source_key[0]}.{source_key[1]}", f"{new_key[0]}.{new_key[1]}")
|
|
173
|
+
]
|
|
174
|
+
if not source_keys:
|
|
175
|
+
return None
|
|
176
|
+
if len(source_keys) > 1:
|
|
177
|
+
source_names = ", ".join(f"{app}.{name}" for app, name in sorted(source_keys))
|
|
178
|
+
raise ConfigurationError(
|
|
179
|
+
f"Model {new_key[0]}.{new_key[1]} takes over table {table_identity[2]!r}, which several "
|
|
180
|
+
f"removed models used ({source_names}) - move one model per makemigrations run."
|
|
181
|
+
)
|
|
182
|
+
source_key = source_keys[0]
|
|
183
|
+
model_diff = StateModelDiff(self.old_state.models[source_key], new_model_state, self.rename_questions)
|
|
184
|
+
if model_diff.generate_operations():
|
|
185
|
+
raise ConfigurationError(
|
|
186
|
+
f"Model {source_key[0]}.{source_key[1]} is moved to {new_key[0]}.{new_key[1]} with its "
|
|
187
|
+
f"table {table_identity[2]!r} kept, but its fields or options change in the same run - "
|
|
188
|
+
"move it unchanged first (one makemigrations run), then change it in a second run."
|
|
189
|
+
)
|
|
190
|
+
return source_key
|
|
191
|
+
|
|
192
|
+
def _get_moved_model_target(self, old_key: ModelKey) -> ModelKey | None:
|
|
193
|
+
"""The added model of another app that takes over the table of the removed `old_key`.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
old_key: A model present only in the old state.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
The added model's key, or None when no added model of another app uses the table.
|
|
200
|
+
"""
|
|
201
|
+
old_table_identity = self._get_table_identity(old_key, self.old_state.models[old_key])
|
|
202
|
+
for new_key, new_model_state in self.new_state.models.items():
|
|
203
|
+
if (
|
|
204
|
+
new_key[0] != old_key[0]
|
|
205
|
+
and new_key not in self.old_state.models
|
|
206
|
+
and self._get_table_identity(new_key, new_model_state) == old_table_identity
|
|
207
|
+
and self._get_moved_model_source(new_key) == old_key
|
|
208
|
+
):
|
|
209
|
+
return new_key
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
@staticmethod
|
|
213
|
+
def _get_rendered_field(state: State, key: ModelKey, field_name: str) -> Field[Any] | None:
|
|
214
|
+
"""A field of a model as rendered (with its relations initialized) in `state`.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
state: The state to look in.
|
|
218
|
+
key: The model's (app, model name) key.
|
|
219
|
+
field_name: The field's name.
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
The rendered field, or None when the model or field isn't rendered there.
|
|
223
|
+
"""
|
|
224
|
+
try:
|
|
225
|
+
model = state.apps.get_model(key[0], key[1])
|
|
226
|
+
except KeyError:
|
|
227
|
+
return None
|
|
228
|
+
return model._meta.fields_map.get(field_name)
|
|
229
|
+
|
|
230
|
+
@staticmethod
|
|
231
|
+
def _get_through_model_table(state: State, many_to_many_field: ManyToManyFieldInstance[Any]) -> str | None:
|
|
232
|
+
"""The table of the through model an M2M field declares in `state`.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
state: The state the field belongs to.
|
|
236
|
+
many_to_many_field: An M2M field declared with ``through=SomeModel``.
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
The through model's table, or None when the model isn't part of `state`.
|
|
240
|
+
"""
|
|
241
|
+
through_key = OperationGenerator._get_through_model_key(many_to_many_field)
|
|
242
|
+
through_model_state = state.models.get(through_key) if through_key is not None else None
|
|
243
|
+
if through_model_state is None:
|
|
244
|
+
return None
|
|
245
|
+
return through_model_state.table or through_model_state.name.lower()
|
|
246
|
+
|
|
247
|
+
@staticmethod
|
|
248
|
+
def _get_through_model_key(many_to_many_field: ManyToManyFieldInstance[Any]) -> ModelKey | None:
|
|
249
|
+
"""The (app, model name) key of the through model an M2M field declares.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
many_to_many_field: An M2M field.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
The through model's key, None for a relation through an automatic table.
|
|
256
|
+
"""
|
|
257
|
+
through_reference = SwappableModelReference.get_model_reference(many_to_many_field.through_model)
|
|
258
|
+
if isinstance(through_reference, str):
|
|
259
|
+
return cast("ModelKey", tuple(through_reference.split(".", 1)))
|
|
260
|
+
if through_reference is not None:
|
|
261
|
+
return (through_reference._meta.app or "", through_reference.__name__)
|
|
262
|
+
return None
|
|
263
|
+
|
|
264
|
+
def _get_through_table_swap_operations(
|
|
265
|
+
self, new_keys: list[ModelKey], renamed_models: dict[ModelKey, ModelKey]
|
|
266
|
+
) -> list[HareOperation]:
|
|
267
|
+
"""Moves an automatic M2M through table aside when a through model takes over its name.
|
|
268
|
+
|
|
269
|
+
The automatic table is renamed first so the through model's CreateModel can create the
|
|
270
|
+
table under that name - the AlterField switching the relation then copies the rows over.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
new_keys: The selected apps' models of the new state.
|
|
274
|
+
renamed_models: New key -> old key of every renamed model.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
The renaming operations to run before any CreateModel.
|
|
278
|
+
"""
|
|
279
|
+
operations: list[HareOperation] = []
|
|
280
|
+
for new_key in new_keys:
|
|
281
|
+
old_key = renamed_models.get(new_key, new_key)
|
|
282
|
+
old_model_state = self.old_state.models.get(old_key)
|
|
283
|
+
if old_model_state is None:
|
|
284
|
+
continue
|
|
285
|
+
new_model_state = self.new_state.models[new_key]
|
|
286
|
+
for field_name, new_field in new_model_state.fields.items():
|
|
287
|
+
old_field = old_model_state.fields.get(field_name)
|
|
288
|
+
if (
|
|
289
|
+
not isinstance(old_field, ManyToManyFieldInstance)
|
|
290
|
+
or not isinstance(new_field, ManyToManyFieldInstance)
|
|
291
|
+
or old_field.through_model is not None
|
|
292
|
+
or new_field.through_model is None
|
|
293
|
+
):
|
|
294
|
+
continue
|
|
295
|
+
rendered_old_field = self._get_rendered_field(self.old_state, old_key, field_name)
|
|
296
|
+
if not isinstance(rendered_old_field, ManyToManyFieldInstance):
|
|
297
|
+
continue
|
|
298
|
+
if rendered_old_field.through != self._get_through_model_table(self.new_state, new_field):
|
|
299
|
+
continue
|
|
300
|
+
swapped_field = copy(old_field)
|
|
301
|
+
swapped_field.through = f"{rendered_old_field.through}{MANY_TO_MANY_THROUGH_TABLE_SWAP_SUFFIX}"
|
|
302
|
+
operations.append(AlterField(model_name=new_model_state.name, name=field_name, field=swapped_field))
|
|
303
|
+
return operations
|
|
304
|
+
|
|
305
|
+
def _swap_through_tables_for_automatic_relations(
|
|
306
|
+
self, operations: list[HareOperation], new_keys: list[ModelKey], renamed_models: dict[ModelKey, ModelKey]
|
|
307
|
+
) -> list[HareOperation]:
|
|
308
|
+
"""Points an M2M relation leaving its through model at a temporary automatic table name
|
|
309
|
+
when the automatic table would take over the through model's table name.
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
operations: The generated operations - their AlterField is rewritten in place.
|
|
313
|
+
new_keys: The selected apps' models of the new state.
|
|
314
|
+
renamed_models: New key -> old key of every renamed model.
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
The renaming operations to run once the through model's table is gone.
|
|
318
|
+
"""
|
|
319
|
+
model_key_by_name = {key[1]: key for key in new_keys}
|
|
320
|
+
final_operations: list[HareOperation] = []
|
|
321
|
+
for index, operation in enumerate(operations):
|
|
322
|
+
if not isinstance(operation, AlterField) or not isinstance(operation.field, ManyToManyFieldInstance):
|
|
323
|
+
continue
|
|
324
|
+
new_key = model_key_by_name.get(operation.model_name)
|
|
325
|
+
if new_key is None:
|
|
326
|
+
continue
|
|
327
|
+
old_key = renamed_models.get(new_key, new_key)
|
|
328
|
+
old_model_state = self.old_state.models.get(old_key)
|
|
329
|
+
old_field = old_model_state.fields.get(operation.name) if old_model_state is not None else None
|
|
330
|
+
if (
|
|
331
|
+
not isinstance(old_field, ManyToManyFieldInstance)
|
|
332
|
+
or old_field.through_model is None
|
|
333
|
+
or operation.field.through_model is not None
|
|
334
|
+
):
|
|
335
|
+
continue
|
|
336
|
+
# A live model's field already carries its derived table name; a replayed one only
|
|
337
|
+
# once rendered.
|
|
338
|
+
new_through = operation.field.through
|
|
339
|
+
if not new_through:
|
|
340
|
+
rendered_new_field = self._get_rendered_field(self.new_state, new_key, operation.name)
|
|
341
|
+
if not isinstance(rendered_new_field, ManyToManyFieldInstance):
|
|
342
|
+
continue
|
|
343
|
+
new_through = rendered_new_field.through
|
|
344
|
+
if new_through != self._get_through_model_table(self.old_state, old_field):
|
|
345
|
+
continue
|
|
346
|
+
swapped_field = copy(operation.field)
|
|
347
|
+
swapped_field.through = f"{new_through}{MANY_TO_MANY_THROUGH_TABLE_SWAP_SUFFIX}"
|
|
348
|
+
operations[index] = AlterField(model_name=operation.model_name, name=operation.name, field=swapped_field)
|
|
349
|
+
# The automatic table takes the through model's table name once that model is gone.
|
|
350
|
+
through_key = self._get_through_model_key(old_field)
|
|
351
|
+
if through_key is not None:
|
|
352
|
+
operation.generation_dependencies = (
|
|
353
|
+
OperationDependency.of_model(*through_key, DependencyType.REMOVED),
|
|
354
|
+
)
|
|
355
|
+
final_operations.append(operation)
|
|
356
|
+
return final_operations
|
|
357
|
+
|
|
358
|
+
@staticmethod
|
|
359
|
+
def _get_relation_target_key(field: Field[Any]) -> ModelKey | None:
|
|
360
|
+
"""The (app, model name) key of the model a relation field points at.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
field: A FK/O2O/M2M field.
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
The target's key, or None when the reference isn't an "app.Model" string or a model.
|
|
367
|
+
"""
|
|
368
|
+
reference = SwappableModelReference.get_model_reference(getattr(field, "model_name", None))
|
|
369
|
+
if not reference:
|
|
370
|
+
return None
|
|
371
|
+
if isinstance(reference, str):
|
|
372
|
+
parts = reference.split(".")
|
|
373
|
+
return (parts[0], parts[1]) if len(parts) == 2 else None
|
|
374
|
+
return (getattr(reference._meta, ModelOption.APP, ""), reference.__name__)
|
|
375
|
+
|
|
376
|
+
@classmethod
|
|
377
|
+
def _get_backward_relation_names(cls, state: State, key: ModelKey) -> dict[tuple[ModelKey, str], str]:
|
|
378
|
+
"""The backward accessors a model's relation fields register on the models they point at.
|
|
379
|
+
|
|
380
|
+
Args:
|
|
381
|
+
state: The state the model belongs to.
|
|
382
|
+
key: The model's (app, model name) key.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
(target model key, backward accessor name) -> name of the relation field registering it.
|
|
386
|
+
"""
|
|
387
|
+
model_state = state.models[key]
|
|
388
|
+
backward_relation_names: dict[tuple[ModelKey, str], str] = {}
|
|
389
|
+
for field_name, field in model_state.fields.items():
|
|
390
|
+
if not isinstance(field, (ForeignKeyFieldInstance, ManyToManyFieldInstance)):
|
|
391
|
+
continue
|
|
392
|
+
if isinstance(field, ManyToManyFieldInstance) and field._generated:
|
|
393
|
+
continue
|
|
394
|
+
target_key = cls._get_relation_target_key(field)
|
|
395
|
+
# The rule the linking goes by.
|
|
396
|
+
related_name = RelationLinking.get_backward_relation_name(
|
|
397
|
+
field.related_name, model_state.table or model_state.name.lower(), key[0], model_state.name
|
|
398
|
+
)
|
|
399
|
+
if target_key is None or related_name is None:
|
|
400
|
+
continue
|
|
401
|
+
backward_relation_names[(target_key, related_name)] = field_name
|
|
402
|
+
return backward_relation_names
|
|
403
|
+
|
|
404
|
+
def _is_referenced_by_other_models(self, key: ModelKey) -> bool:
|
|
405
|
+
"""Whether a relation field of another model of the old state points at `key`.
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
key: A model of the old state.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
True when another model's FK/O2O/M2M (or an M2M's through model) is `key`.
|
|
412
|
+
"""
|
|
413
|
+
model_reference = f"{key[0]}.{key[1]}"
|
|
414
|
+
for other_key, model_state in self.old_state.models.items():
|
|
415
|
+
if other_key == key:
|
|
416
|
+
continue
|
|
417
|
+
for field in model_state.fields.values():
|
|
418
|
+
if not isinstance(field, (ForeignKeyFieldInstance, ManyToManyFieldInstance)):
|
|
419
|
+
continue
|
|
420
|
+
if self._get_relation_target_key(field) == key:
|
|
421
|
+
return True
|
|
422
|
+
through_reference = (
|
|
423
|
+
SwappableModelReference.get_model_reference(field.through_model)
|
|
424
|
+
if isinstance(field, ManyToManyFieldInstance)
|
|
425
|
+
else None
|
|
426
|
+
)
|
|
427
|
+
if through_reference == model_reference or (
|
|
428
|
+
through_reference is not None
|
|
429
|
+
and not isinstance(through_reference, str)
|
|
430
|
+
and (through_reference._meta.app, through_reference.__name__) == key
|
|
431
|
+
):
|
|
432
|
+
return True
|
|
433
|
+
return False
|
|
434
|
+
|
|
435
|
+
def _get_backward_relation_conflicts(
|
|
436
|
+
self, deleted_keys: list[ModelKey]
|
|
437
|
+
) -> tuple[list[ModelKey], list[tuple[ModelKey, str]]]:
|
|
438
|
+
"""Finds the deleted models whose relation registers a backward accessor that a model of
|
|
439
|
+
the new state registers again - created before the deletion, the new relation would
|
|
440
|
+
collide with the still-registered old one.
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
deleted_keys: The deleted models (moved ones excluded).
|
|
444
|
+
|
|
445
|
+
Returns:
|
|
446
|
+
The conflicting deleted models nothing else references, to delete before any model
|
|
447
|
+
is created, and (model key, field name) of the conflicting relation fields of the
|
|
448
|
+
other ones, to remove before any model is created.
|
|
449
|
+
"""
|
|
450
|
+
claimed_backward_relation_names: set[tuple[ModelKey, str]] = set()
|
|
451
|
+
for new_key in self.new_state.models:
|
|
452
|
+
claimed_backward_relation_names.update(self._get_backward_relation_names(self.new_state, new_key))
|
|
453
|
+
early_deleted_keys: list[ModelKey] = []
|
|
454
|
+
early_removed_fields: list[tuple[ModelKey, str]] = []
|
|
455
|
+
for deleted_key in deleted_keys:
|
|
456
|
+
conflicting_field_names = sorted(
|
|
457
|
+
field_name
|
|
458
|
+
for backward_relation, field_name in self._get_backward_relation_names(
|
|
459
|
+
self.old_state, deleted_key
|
|
460
|
+
).items()
|
|
461
|
+
if backward_relation in claimed_backward_relation_names
|
|
462
|
+
)
|
|
463
|
+
if not conflicting_field_names:
|
|
464
|
+
continue
|
|
465
|
+
if self._is_referenced_by_other_models(deleted_key):
|
|
466
|
+
early_removed_fields.extend((deleted_key, field_name) for field_name in conflicting_field_names)
|
|
467
|
+
else:
|
|
468
|
+
early_deleted_keys.append(deleted_key)
|
|
469
|
+
return early_deleted_keys, early_removed_fields
|
|
470
|
+
|
|
471
|
+
def _get_unrecognized_model_rename_warnings(
|
|
472
|
+
self, old_keys: list[ModelKey], new_keys: list[ModelKey], renamed_models: dict[ModelKey, ModelKey]
|
|
473
|
+
) -> list[str]:
|
|
474
|
+
"""Warnings for an added model shaped exactly like a removed one of the same app that
|
|
475
|
+
wasn't recognized as its rename (e.g. two identical models renamed at once).
|
|
476
|
+
|
|
477
|
+
Args:
|
|
478
|
+
old_keys: The selected apps' models of the old state.
|
|
479
|
+
new_keys: The selected apps' models of the new state.
|
|
480
|
+
renamed_models: New key -> old key of every recognized rename.
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
One warning per such added model.
|
|
484
|
+
"""
|
|
485
|
+
renamed_old_keys = set(renamed_models.values())
|
|
486
|
+
removed_keys = [key for key in old_keys if key not in new_keys and key not in renamed_old_keys]
|
|
487
|
+
added_keys = [key for key in new_keys if key not in old_keys and key not in renamed_models]
|
|
488
|
+
warnings: list[str] = []
|
|
489
|
+
for new_key in added_keys:
|
|
490
|
+
new_signature = StateSignatures.get_model_signature(self.new_state.models[new_key])
|
|
491
|
+
matching_removed_names = sorted(
|
|
492
|
+
old_key[1]
|
|
493
|
+
for old_key in removed_keys
|
|
494
|
+
if old_key[0] == new_key[0]
|
|
495
|
+
and StateSignatures.get_model_signature(self.old_state.models[old_key]) == new_signature
|
|
496
|
+
)
|
|
497
|
+
if not matching_removed_names:
|
|
498
|
+
continue
|
|
499
|
+
removed_names = ", ".join(repr(name) for name in matching_removed_names)
|
|
500
|
+
warnings.append(
|
|
501
|
+
f"Model {new_key[1]!r} (app {new_key[0]!r}) has the exact same fields/options as removed "
|
|
502
|
+
f"model(s) {removed_names} - if it's actually a rename, the generated CreateModel/"
|
|
503
|
+
"DeleteModel pair will DROP the old table's data instead of carrying it over. Answer "
|
|
504
|
+
f"the rename question, or run makemigrations with --rename {new_key[0]}.<old>={new_key[1]}."
|
|
505
|
+
)
|
|
506
|
+
return warnings
|
|
507
|
+
|
|
508
|
+
@staticmethod
|
|
509
|
+
def get_create_model_operation(model_state: ModelState) -> CreateModel:
|
|
510
|
+
fields: list[tuple[str, FieldLike]] = list(model_state.fields.items())
|
|
511
|
+
return CreateModel(
|
|
512
|
+
name=model_state.name,
|
|
513
|
+
fields=fields,
|
|
514
|
+
options=model_state.options,
|
|
515
|
+
bases=[base.__name__ for base in model_state.bases],
|
|
516
|
+
)
|
|
517
|
+
|
|
518
|
+
@staticmethod
|
|
519
|
+
def _sort_by_dependencies(keys: list[ModelKey], state: State) -> tuple[list[ModelKey], list[tuple[ModelKey, str]]]:
|
|
520
|
+
"""Sorts deleted models so that the models others point at come first - the caller deletes
|
|
521
|
+
them in the reverse order - and finds the relations of a cycle among them: those are removed by
|
|
522
|
+
a ``RemoveField`` first, as no order of the deletions removes them.
|
|
523
|
+
|
|
524
|
+
Args:
|
|
525
|
+
keys: The deleted models.
|
|
526
|
+
state: The state they are deleted from.
|
|
527
|
+
|
|
528
|
+
Returns:
|
|
529
|
+
The ordered keys (targets first), and the ``(model_key, field_name)`` of each relation of a
|
|
530
|
+
cycle.
|
|
531
|
+
"""
|
|
532
|
+
key_set = set(keys)
|
|
533
|
+
# Adjacency per FIELD, not just per model - breaking a cycle needs to know exactly
|
|
534
|
+
# which field to defer, not just that model A depends on model B (possibly via
|
|
535
|
+
# several fields, only one of which need actually be deferred to break the cycle).
|
|
536
|
+
field_dependencies: dict[ModelKey, dict[str, ModelKey]] = {model_key: {} for model_key in keys}
|
|
537
|
+
for key in keys:
|
|
538
|
+
model_state = state.models[key]
|
|
539
|
+
for field_name, field in model_state.fields.items():
|
|
540
|
+
if not isinstance(field, (ForeignKeyFieldInstance, ManyToManyFieldInstance)):
|
|
541
|
+
continue
|
|
542
|
+
dep_key = OperationGenerator._get_relation_target_key(field)
|
|
543
|
+
if dep_key is not None and dep_key in key_set and dep_key != key:
|
|
544
|
+
field_dependencies[key][field_name] = dep_key
|
|
545
|
+
|
|
546
|
+
dependencies_by_model: dict[ModelKey, set[ModelKey]] = {
|
|
547
|
+
model_key: set(dependencies_by_field.values())
|
|
548
|
+
for model_key, dependencies_by_field in field_dependencies.items()
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
# Kahn's algorithm
|
|
552
|
+
result: list[ModelKey] = []
|
|
553
|
+
in_degree = {
|
|
554
|
+
model_key: len(dependencies_by_field) for model_key, dependencies_by_field in dependencies_by_model.items()
|
|
555
|
+
}
|
|
556
|
+
queue = sorted([model_key for model_key, model_dependencies in in_degree.items() if model_dependencies == 0])
|
|
557
|
+
while queue:
|
|
558
|
+
node = queue.pop(0)
|
|
559
|
+
result.append(node)
|
|
560
|
+
for model_key, model_dependencies in dependencies_by_model.items():
|
|
561
|
+
if node in model_dependencies:
|
|
562
|
+
model_dependencies.discard(node)
|
|
563
|
+
in_degree[model_key] -= 1
|
|
564
|
+
if in_degree[model_key] == 0:
|
|
565
|
+
queue.append(model_key)
|
|
566
|
+
queue.sort()
|
|
567
|
+
|
|
568
|
+
# What is left is a cycle among `keys` - one node's dependencies are deferred at a time.
|
|
569
|
+
deferred: list[tuple[ModelKey, str]] = []
|
|
570
|
+
remaining = {model_key for model_key in keys if model_key not in result}
|
|
571
|
+
while remaining:
|
|
572
|
+
node = sorted(remaining)[0]
|
|
573
|
+
for field_name, dep_key in sorted(field_dependencies[node].items()):
|
|
574
|
+
if dep_key in dependencies_by_model[node]:
|
|
575
|
+
deferred.append((node, field_name))
|
|
576
|
+
dependencies_by_model[node].discard(dep_key)
|
|
577
|
+
result.append(node)
|
|
578
|
+
remaining.discard(node)
|
|
579
|
+
for model_key in remaining:
|
|
580
|
+
dependencies_by_model[model_key].discard(node)
|
|
581
|
+
|
|
582
|
+
return result, deferred
|
|
583
|
+
|
|
584
|
+
@staticmethod
|
|
585
|
+
def _collect_schemas(state: State, keys: Iterable[ModelKey] | None = None) -> set[str]:
|
|
586
|
+
"""Collect all unique schema names used in a state - of the models' tables and of their fields'
|
|
587
|
+
``ENUM`` types.
|
|
588
|
+
|
|
589
|
+
Args:
|
|
590
|
+
state: The state to scan.
|
|
591
|
+
keys: Only these models' schemas - every model of `state` when omitted.
|
|
592
|
+
"""
|
|
593
|
+
schemas: set[str] = set()
|
|
594
|
+
for key in state.models if keys is None else keys:
|
|
595
|
+
model_state = state.models[key]
|
|
596
|
+
schema = model_state.options.get(ModelOption.SCHEMA)
|
|
597
|
+
if schema:
|
|
598
|
+
schemas.add(schema)
|
|
599
|
+
for field in model_state.fields.values():
|
|
600
|
+
enum_type = field.requires_enum_type
|
|
601
|
+
if enum_type is not None and enum_type.schema:
|
|
602
|
+
schemas.add(enum_type.schema)
|
|
603
|
+
return schemas
|
|
604
|
+
|
|
605
|
+
@staticmethod
|
|
606
|
+
def _collect_extensions(state: State, keys: Iterable[ModelKey] | None = None) -> set[str]:
|
|
607
|
+
"""Collect every extension name a model in `state` needs on any dialect - a migration file
|
|
608
|
+
runs on any database (``RequiredExtensions``).
|
|
609
|
+
|
|
610
|
+
Args:
|
|
611
|
+
state: The state to scan.
|
|
612
|
+
keys: Only these models' extensions - every model of `state` when omitted.
|
|
613
|
+
"""
|
|
614
|
+
dialects = DialectRegistry.get_dialects()
|
|
615
|
+
extensions: set[str] = set()
|
|
616
|
+
for key in state.models if keys is None else keys:
|
|
617
|
+
extensions |= RequiredExtensions.get_for_model_state(state.models[key], dialects)
|
|
618
|
+
return extensions
|
|
619
|
+
|
|
620
|
+
@staticmethod
|
|
621
|
+
def _collect_enum_types(
|
|
622
|
+
state: State, keys: Iterable[ModelKey] | None = None
|
|
623
|
+
) -> dict[tuple[str | None, str], EnumType]:
|
|
624
|
+
"""The database ``ENUM`` types the fields of `state`'s models are of, by schema and name.
|
|
625
|
+
|
|
626
|
+
Args:
|
|
627
|
+
state: The state to scan.
|
|
628
|
+
keys: Only these models' types - every model of `state` when omitted.
|
|
629
|
+
|
|
630
|
+
Raises:
|
|
631
|
+
ConfigurationError: Two fields name one type with different labels.
|
|
632
|
+
"""
|
|
633
|
+
enum_types: dict[tuple[str | None, str], EnumType] = {}
|
|
634
|
+
for key in state.models if keys is None else keys:
|
|
635
|
+
for field in state.models[key].fields.values():
|
|
636
|
+
enum_type = field.requires_enum_type
|
|
637
|
+
if enum_type is None:
|
|
638
|
+
continue
|
|
639
|
+
known = enum_types.setdefault(enum_type.key, enum_type)
|
|
640
|
+
if known.labels != enum_type.labels:
|
|
641
|
+
raise ConfigurationError(
|
|
642
|
+
f"Two fields name the ENUM type {enum_type.name!r} with different labels: "
|
|
643
|
+
f"{list(known.labels)} and {list(enum_type.labels)}"
|
|
644
|
+
)
|
|
645
|
+
return enum_types
|
|
646
|
+
|
|
647
|
+
@staticmethod
|
|
648
|
+
def _get_enum_type_order(item: tuple[tuple[str | None, str], EnumType]) -> tuple[str, str]:
|
|
649
|
+
"""The order the operations of ENUM types are written in - the default schema's first, then by
|
|
650
|
+
schema and name."""
|
|
651
|
+
(schema, name), _enum_type = item
|
|
652
|
+
return schema or "", name
|
|
653
|
+
|
|
654
|
+
def generate(self, app_labels: Sequence[str] | None = None) -> list[HareOperation]:
|
|
655
|
+
"""The operations taking the old state to the new one.
|
|
656
|
+
|
|
657
|
+
Args:
|
|
658
|
+
app_labels: The apps whose models are compared, every app when None.
|
|
659
|
+
|
|
660
|
+
Returns:
|
|
661
|
+
The operations, in the order they run.
|
|
662
|
+
|
|
663
|
+
Raises:
|
|
664
|
+
ConfigurationError: A model moved to another app forms a relation cycle with models
|
|
665
|
+
deleted in the same run.
|
|
666
|
+
"""
|
|
667
|
+
old_keys = self._filter_keys(self.old_state.models.keys(), app_labels)
|
|
668
|
+
new_keys = self._filter_keys(self.new_state.models.keys(), app_labels)
|
|
669
|
+
renamed_models = self._match_renamed_models(old_keys, new_keys)
|
|
670
|
+
renamed_old_keys = set(renamed_models.values())
|
|
671
|
+
self.warnings.extend(self._get_unrecognized_model_rename_warnings(old_keys, new_keys, renamed_models))
|
|
672
|
+
|
|
673
|
+
operations, cleanup_operations = self._get_prerequisite_operations(old_keys, new_keys)
|
|
674
|
+
model_diff_operations, field_operations_by_key = self._get_model_diff_operations(new_keys, renamed_models)
|
|
675
|
+
schema_object_operations = self._get_schema_object_operations(
|
|
676
|
+
model_diff_operations, field_operations_by_key, old_keys, new_keys, renamed_models
|
|
677
|
+
)
|
|
678
|
+
# The objects a rename leaves reading the old names go first, under the models' old names.
|
|
679
|
+
operations.extend(schema_object_operations.early_removals)
|
|
680
|
+
operations.extend(
|
|
681
|
+
RenameModel(old_name=old_key[1], new_name=new_key[1])
|
|
682
|
+
for new_key, old_key in sorted(renamed_models.items())
|
|
683
|
+
)
|
|
684
|
+
operations.extend(schema_object_operations.renames)
|
|
685
|
+
operations.extend(self._get_through_table_swap_operations(new_keys, renamed_models))
|
|
686
|
+
|
|
687
|
+
deleted_keys = [
|
|
688
|
+
model_key for model_key in old_keys if model_key not in new_keys and model_key not in renamed_old_keys
|
|
689
|
+
]
|
|
690
|
+
moved_out_keys = {key for key in deleted_keys if self._get_moved_model_target(key) is not None}
|
|
691
|
+
# A deleted model's relation whose backward accessor a new relation registers again has to
|
|
692
|
+
# be gone before that new relation is created - the whole model when nothing else still
|
|
693
|
+
# references it, else only the conflicting relation field.
|
|
694
|
+
early_deleted_keys, early_removed_fields = self._get_backward_relation_conflicts(
|
|
695
|
+
[key for key in deleted_keys if key not in moved_out_keys]
|
|
696
|
+
)
|
|
697
|
+
operations.extend(DeleteModel(name=key[1]) for key in early_deleted_keys)
|
|
698
|
+
operations.extend(RemoveField(model_name=key[1], name=field_name) for key, field_name in early_removed_fields)
|
|
699
|
+
deleted_keys = [key for key in deleted_keys if key not in early_deleted_keys]
|
|
700
|
+
|
|
701
|
+
added_keys = [
|
|
702
|
+
model_key for model_key in new_keys if model_key not in old_keys and model_key not in renamed_models
|
|
703
|
+
]
|
|
704
|
+
operations.extend(self._get_added_model_operations(added_keys))
|
|
705
|
+
operations.extend(model_diff_operations)
|
|
706
|
+
through_table_restore_operations = self._swap_through_tables_for_automatic_relations(
|
|
707
|
+
operations, new_keys, renamed_models
|
|
708
|
+
)
|
|
709
|
+
operations.extend(self._get_deleted_model_operations(deleted_keys, moved_out_keys, early_removed_fields))
|
|
710
|
+
operations.extend(through_table_restore_operations)
|
|
711
|
+
operations.extend(schema_object_operations.late_operations)
|
|
712
|
+
operations.extend(schema_object_operations.last_operations)
|
|
713
|
+
operations.extend(cleanup_operations)
|
|
714
|
+
operations = self._add_removals_of_relations_through_changed_keys(operations, old_keys, renamed_models)
|
|
715
|
+
return self._get_sorted_operations(operations, [*old_keys, *new_keys])
|
|
716
|
+
|
|
717
|
+
def _get_sorted_operations(self, operations: list[HareOperation], keys: list[ModelKey]) -> list[HareOperation]:
|
|
718
|
+
"""The operations ordered by what each needs (``OperationSorter``), each in the app of the model it
|
|
719
|
+
names.
|
|
720
|
+
|
|
721
|
+
Args:
|
|
722
|
+
operations: The operations, in the order they were made.
|
|
723
|
+
keys: The compared models of both states.
|
|
724
|
+
|
|
725
|
+
Returns:
|
|
726
|
+
The ordered operations.
|
|
727
|
+
"""
|
|
728
|
+
app_label_by_model_name: dict[str, str] = {}
|
|
729
|
+
for app_label, model_name in keys:
|
|
730
|
+
app_label_by_model_name.setdefault(model_name.lower(), app_label)
|
|
731
|
+
default_app_label = keys[0][0] if keys else ""
|
|
732
|
+
entries: list[tuple[str, Operation]] = [
|
|
733
|
+
(
|
|
734
|
+
next(
|
|
735
|
+
(
|
|
736
|
+
app_label_by_model_name[model_name.lower()]
|
|
737
|
+
for model_name in operation.get_table_model_names()
|
|
738
|
+
if model_name.lower() in app_label_by_model_name
|
|
739
|
+
),
|
|
740
|
+
default_app_label,
|
|
741
|
+
),
|
|
742
|
+
operation,
|
|
743
|
+
)
|
|
744
|
+
for operation in operations
|
|
745
|
+
]
|
|
746
|
+
return [
|
|
747
|
+
cast("HareOperation", operation) for _app_label, operation in OperationSorter(self.old_state).sort(entries)
|
|
748
|
+
]
|
|
749
|
+
|
|
750
|
+
def _add_removals_of_relations_through_changed_keys(
|
|
751
|
+
self, operations: list[HareOperation], old_keys: list[ModelKey], renamed_models: dict[ModelKey, ModelKey]
|
|
752
|
+
) -> list[HareOperation]:
|
|
753
|
+
"""Gives a many-to-many relation through a model that loses the key to one of the relation's sides a
|
|
754
|
+
RemoveField of its own when the relation's model is deleted - the relation goes before the key
|
|
755
|
+
(``RemoveField`` requires it), and its model only after the key.
|
|
756
|
+
|
|
757
|
+
Args:
|
|
758
|
+
operations: The operations, in generated order.
|
|
759
|
+
old_keys: The compared models of the old state.
|
|
760
|
+
renamed_models: Each renamed model's new key -> its old key.
|
|
761
|
+
|
|
762
|
+
Returns:
|
|
763
|
+
The operations, each RemoveField added before the key's removal.
|
|
764
|
+
"""
|
|
765
|
+
new_names = {old_key: new_key[1] for new_key, old_key in renamed_models.items()}
|
|
766
|
+
ordered_operations = list(operations)
|
|
767
|
+
for owner_key in old_keys:
|
|
768
|
+
owner_name = new_names.get(owner_key, owner_key[1])
|
|
769
|
+
for relation_name, relation in self.old_state.models[owner_key].fields.items():
|
|
770
|
+
if not isinstance(relation, ManyToManyFieldInstance):
|
|
771
|
+
continue
|
|
772
|
+
through_key = self._get_through_model_key(relation)
|
|
773
|
+
through_model_state = self.old_state.models.get(through_key) if through_key is not None else None
|
|
774
|
+
if through_key is None or through_model_state is None:
|
|
775
|
+
continue
|
|
776
|
+
side_keys = {owner_key, self._get_relation_target_key(relation)}
|
|
777
|
+
through_name = new_names.get(through_key, through_key[1])
|
|
778
|
+
key_removal_index = next(
|
|
779
|
+
(
|
|
780
|
+
position
|
|
781
|
+
for position, operation in enumerate(ordered_operations)
|
|
782
|
+
if isinstance(operation, RemoveField)
|
|
783
|
+
and operation.model_name == through_name
|
|
784
|
+
and operation.name in through_model_state.fields
|
|
785
|
+
and self._get_relation_target_key(through_model_state.fields[operation.name]) in side_keys
|
|
786
|
+
),
|
|
787
|
+
None,
|
|
788
|
+
)
|
|
789
|
+
if key_removal_index is None:
|
|
790
|
+
continue
|
|
791
|
+
later_operations = ordered_operations[key_removal_index + 1 :]
|
|
792
|
+
relation_removal = next(
|
|
793
|
+
(
|
|
794
|
+
operation
|
|
795
|
+
for operation in ordered_operations
|
|
796
|
+
if isinstance(operation, RemoveField)
|
|
797
|
+
and operation.model_name == owner_name
|
|
798
|
+
and operation.name == relation_name
|
|
799
|
+
),
|
|
800
|
+
None,
|
|
801
|
+
)
|
|
802
|
+
if relation_removal is None and any(
|
|
803
|
+
isinstance(operation, DeleteModel) and operation.name == owner_name
|
|
804
|
+
for operation in later_operations
|
|
805
|
+
):
|
|
806
|
+
ordered_operations.insert(
|
|
807
|
+
key_removal_index, RemoveField(model_name=owner_name, name=relation_name)
|
|
808
|
+
)
|
|
809
|
+
return ordered_operations
|
|
810
|
+
|
|
811
|
+
def _get_prerequisite_operations(
|
|
812
|
+
self, old_keys: list[ModelKey], new_keys: list[ModelKey]
|
|
813
|
+
) -> tuple[list[HareOperation], list[HareOperation]]:
|
|
814
|
+
"""The operations on what tables are made of - schemas, extensions and ENUM types - scoped
|
|
815
|
+
to the selected apps: only what their own models need is created, since one any old model
|
|
816
|
+
(whatever its app) uses exists already; dropping mirrors it.
|
|
817
|
+
|
|
818
|
+
Args:
|
|
819
|
+
old_keys: The selected models of the old state.
|
|
820
|
+
new_keys: The selected models of the new state.
|
|
821
|
+
|
|
822
|
+
Returns:
|
|
823
|
+
The operations run before any table is created or changed, and the ones dropping what
|
|
824
|
+
nothing uses any more - run after every model and field is removed.
|
|
825
|
+
"""
|
|
826
|
+
operations: list[HareOperation] = []
|
|
827
|
+
# What exists already: what the operations created (kept in the state, though no model uses it
|
|
828
|
+
# any more) and what the old models use. A schema no model uses any more stays - it may hold
|
|
829
|
+
# other objects; a hand-written DropSchema drops it.
|
|
830
|
+
old_schemas = self.old_state.schemas | self._collect_schemas(self.old_state)
|
|
831
|
+
selected_new_schemas = self._collect_schemas(self.new_state, new_keys)
|
|
832
|
+
operations.extend(CreateSchema(schema_name=schema) for schema in sorted(selected_new_schemas - old_schemas))
|
|
833
|
+
|
|
834
|
+
# Before any CreateModel: a column of a type an extension provides (CITEXT) can't be
|
|
835
|
+
# created until its extension exists. An extension no model declares any more stays - the
|
|
836
|
+
# database may use it elsewhere; a hand-written RemoveExtension drops it.
|
|
837
|
+
old_extensions = self.old_state.extensions | self._collect_extensions(self.old_state)
|
|
838
|
+
selected_new_extensions = self._collect_extensions(self.new_state, new_keys)
|
|
839
|
+
operations.extend(
|
|
840
|
+
CreateExtension(extension_name=extension) for extension in sorted(selected_new_extensions - old_extensions)
|
|
841
|
+
)
|
|
842
|
+
|
|
843
|
+
# ENUM types, before the columns of them - created, or given their new labels (a removed
|
|
844
|
+
# label converts the columns, whose values must not hold it any more).
|
|
845
|
+
# A type the operations created, though no column is of it any more, needs no CREATE.
|
|
846
|
+
old_enum_types = {**self.old_state.enum_types, **self._collect_enum_types(self.old_state)}
|
|
847
|
+
new_enum_types = self._collect_enum_types(self.new_state)
|
|
848
|
+
selected_old_enum_types = self._collect_enum_types(self.old_state, old_keys)
|
|
849
|
+
selected_new_enum_types = self._collect_enum_types(self.new_state, new_keys)
|
|
850
|
+
for type_key, enum_type in sorted(selected_new_enum_types.items(), key=self._get_enum_type_order):
|
|
851
|
+
old_enum_type = old_enum_types.get(type_key)
|
|
852
|
+
if old_enum_type is None:
|
|
853
|
+
operations.append(
|
|
854
|
+
CreateEnumType(name=enum_type.name, labels=enum_type.labels, schema=enum_type.schema)
|
|
855
|
+
)
|
|
856
|
+
elif old_enum_type.labels != enum_type.labels:
|
|
857
|
+
operations.append(
|
|
858
|
+
AlterEnumType(
|
|
859
|
+
name=enum_type.name,
|
|
860
|
+
old_labels=old_enum_type.labels,
|
|
861
|
+
new_labels=enum_type.labels,
|
|
862
|
+
schema=enum_type.schema,
|
|
863
|
+
)
|
|
864
|
+
)
|
|
865
|
+
|
|
866
|
+
cleanup_operations: list[HareOperation] = [
|
|
867
|
+
DropEnumType(name=enum_type.name, labels=enum_type.labels, schema=enum_type.schema)
|
|
868
|
+
for type_key, enum_type in sorted(selected_old_enum_types.items(), key=self._get_enum_type_order)
|
|
869
|
+
if type_key not in new_enum_types
|
|
870
|
+
]
|
|
871
|
+
return operations, cleanup_operations
|
|
872
|
+
|
|
873
|
+
def _get_model_diff_operations(
|
|
874
|
+
self, new_keys: list[ModelKey], renamed_models: dict[ModelKey, ModelKey]
|
|
875
|
+
) -> tuple[list[HareOperation], dict[ModelKey, list[HareOperation]]]:
|
|
876
|
+
"""The operations changing the models both states have, with the warnings of each.
|
|
877
|
+
|
|
878
|
+
Args:
|
|
879
|
+
new_keys: The selected models of the new state.
|
|
880
|
+
renamed_models: The old key of each renamed model, by its new key.
|
|
881
|
+
|
|
882
|
+
Returns:
|
|
883
|
+
The operations, and the field operations of each model, by its new key.
|
|
884
|
+
"""
|
|
885
|
+
model_diff_operations: list[HareOperation] = []
|
|
886
|
+
field_operations_by_key: dict[ModelKey, list[HareOperation]] = {}
|
|
887
|
+
# A renamed model is compared as its RenameModel leaves it - its table and its relations to
|
|
888
|
+
# itself follow the new name.
|
|
889
|
+
renamed_old_state = self.old_state.clone()
|
|
890
|
+
for new_key, old_key in sorted(renamed_models.items()):
|
|
891
|
+
RenameModel(old_name=old_key[1], new_name=new_key[1]).state_forward(new_key[0], renamed_old_state)
|
|
892
|
+
old_model_states: dict[ModelKey, ModelState] = {}
|
|
893
|
+
model_diffs: dict[ModelKey, StateModelDiff] = {}
|
|
894
|
+
for new_key in new_keys:
|
|
895
|
+
old_key = renamed_models.get(new_key, new_key)
|
|
896
|
+
if old_key not in self.old_state.models:
|
|
897
|
+
continue
|
|
898
|
+
old_model_states[new_key] = (
|
|
899
|
+
renamed_old_state.models[new_key] if new_key in renamed_models else self.old_state.models[old_key]
|
|
900
|
+
)
|
|
901
|
+
model_diffs[new_key] = StateModelDiff(
|
|
902
|
+
old_model_states[new_key], self.new_state.models[new_key], self.rename_questions
|
|
903
|
+
)
|
|
904
|
+
model_diffs[new_key].generate_operations()
|
|
905
|
+
# A relation naming a renamed field in its to_field is pointed at the new name by the RenameField
|
|
906
|
+
# itself - compared as the field renames leave it, it isn't changed.
|
|
907
|
+
field_renames = [
|
|
908
|
+
(new_key, operation)
|
|
909
|
+
for new_key, model_diff in model_diffs.items()
|
|
910
|
+
for operation in model_diff.field_operations
|
|
911
|
+
if isinstance(operation, RenameField)
|
|
912
|
+
]
|
|
913
|
+
if field_renames:
|
|
914
|
+
fields_renamed_state = renamed_old_state.clone()
|
|
915
|
+
for new_key, rename in field_renames:
|
|
916
|
+
rename.state_forward(new_key[0], fields_renamed_state)
|
|
917
|
+
for new_key, old_model_state in old_model_states.items():
|
|
918
|
+
relations_after_renames = self._get_relations_after_field_renames(
|
|
919
|
+
old_model_state, fields_renamed_state.models[new_key]
|
|
920
|
+
)
|
|
921
|
+
if relations_after_renames is not old_model_state:
|
|
922
|
+
model_diffs[new_key] = StateModelDiff(
|
|
923
|
+
relations_after_renames, self.new_state.models[new_key], self.rename_questions
|
|
924
|
+
)
|
|
925
|
+
model_diffs[new_key].generate_operations()
|
|
926
|
+
for new_key, model_diff in model_diffs.items():
|
|
927
|
+
model_diff_operations.extend(model_diff.operations)
|
|
928
|
+
field_operations_by_key[new_key] = model_diff.field_operations
|
|
929
|
+
self.warnings.extend(model_diff.warnings)
|
|
930
|
+
self.data_loss_warnings.extend(model_diff.data_loss_warnings)
|
|
931
|
+
return model_diff_operations, field_operations_by_key
|
|
932
|
+
|
|
933
|
+
@staticmethod
|
|
934
|
+
def _get_relations_after_field_renames(old_model_state: ModelState, renamed_model_state: ModelState) -> ModelState:
|
|
935
|
+
"""A model's old state with the ``to_field`` of each relation as the field renames of the run leave
|
|
936
|
+
it.
|
|
937
|
+
|
|
938
|
+
Args:
|
|
939
|
+
old_model_state: The model's old state.
|
|
940
|
+
renamed_model_state: The model's state after the field renames.
|
|
941
|
+
|
|
942
|
+
Returns:
|
|
943
|
+
A copy with the relations changed - the state itself when no to_field changes.
|
|
944
|
+
"""
|
|
945
|
+
changed_relations: dict[str, Field[Any]] = {}
|
|
946
|
+
for field_name, field in old_model_state.fields.items():
|
|
947
|
+
renamed_field = renamed_model_state.fields.get(field_name)
|
|
948
|
+
if (
|
|
949
|
+
isinstance(field, ForeignKeyFieldInstance)
|
|
950
|
+
and isinstance(renamed_field, ForeignKeyFieldInstance)
|
|
951
|
+
and renamed_field.to_field != field.to_field
|
|
952
|
+
):
|
|
953
|
+
relation = copy(field)
|
|
954
|
+
relation.to_field = renamed_field.to_field
|
|
955
|
+
changed_relations[field_name] = relation
|
|
956
|
+
if not changed_relations:
|
|
957
|
+
return old_model_state
|
|
958
|
+
changed_state = old_model_state.clone()
|
|
959
|
+
for field_name, changed_relation in changed_relations.items():
|
|
960
|
+
changed_state.set_field(field_name, changed_relation)
|
|
961
|
+
return changed_state
|
|
962
|
+
|
|
963
|
+
def _get_schema_object_operations(
|
|
964
|
+
self,
|
|
965
|
+
model_diff_operations: list[HareOperation],
|
|
966
|
+
field_operations_by_key: dict[ModelKey, list[HareOperation]],
|
|
967
|
+
old_keys: list[ModelKey],
|
|
968
|
+
new_keys: list[ModelKey],
|
|
969
|
+
renamed_models: dict[ModelKey, ModelKey],
|
|
970
|
+
) -> SchemaObjectOperations:
|
|
971
|
+
"""The operations on what the models declare beside their tables: dropped before any column
|
|
972
|
+
changes, created after every table is in place - a changed one is altered only when no column or
|
|
973
|
+
table changes, and one reading a changed column is dropped and created again. An object is
|
|
974
|
+
compared as the field renames leave the old one: an object naming a renamed field follows the
|
|
975
|
+
rename.
|
|
976
|
+
|
|
977
|
+
Args:
|
|
978
|
+
model_diff_operations: The operations changing the models both states have.
|
|
979
|
+
field_operations_by_key: The field operations of each model both states have, by its new key.
|
|
980
|
+
old_keys: The selected models of the old state.
|
|
981
|
+
new_keys: The selected models of the new state.
|
|
982
|
+
renamed_models: The old key of each renamed model, by its new key.
|
|
983
|
+
|
|
984
|
+
Returns:
|
|
985
|
+
The operations, by the moment they run at.
|
|
986
|
+
"""
|
|
987
|
+
tables_change = any(key not in new_keys for key in old_keys) or any(
|
|
988
|
+
isinstance(operation, COLUMN_CHANGING_OPERATIONS) for operation in model_diff_operations
|
|
989
|
+
)
|
|
990
|
+
changed_columns = self._get_changed_columns(field_operations_by_key, old_keys, new_keys, renamed_models)
|
|
991
|
+
schema_object_operations = SchemaObjectOperations(
|
|
992
|
+
alters_in_place=not tables_change, changed_columns=frozenset(changed_columns)
|
|
993
|
+
)
|
|
994
|
+
for new_key in new_keys:
|
|
995
|
+
new_model_state = self.new_state.models[new_key]
|
|
996
|
+
if new_model_state.options.get(ModelOption.MANAGED) is False:
|
|
997
|
+
continue
|
|
998
|
+
old_key = renamed_models.get(new_key, new_key)
|
|
999
|
+
if new_key in field_operations_by_key:
|
|
1000
|
+
old_model_state = StateModelDiff.get_state_after_field_renames(
|
|
1001
|
+
self.old_state.models[old_key], field_operations_by_key[new_key]
|
|
1002
|
+
)
|
|
1003
|
+
schema_object_operations.add_changed_model(old_model_state, new_model_state)
|
|
1004
|
+
elif self._get_moved_model_source(new_key) is None:
|
|
1005
|
+
schema_object_operations.add_created_model(new_model_state)
|
|
1006
|
+
return schema_object_operations
|
|
1007
|
+
|
|
1008
|
+
def _get_changed_columns(
|
|
1009
|
+
self,
|
|
1010
|
+
field_operations_by_key: dict[ModelKey, list[HareOperation]],
|
|
1011
|
+
old_keys: list[ModelKey],
|
|
1012
|
+
new_keys: list[ModelKey],
|
|
1013
|
+
renamed_models: dict[ModelKey, ModelKey],
|
|
1014
|
+
) -> set[tuple[str, str]]:
|
|
1015
|
+
"""The columns the migration changes: those its field operations change, and every column of a
|
|
1016
|
+
deleted model's table.
|
|
1017
|
+
|
|
1018
|
+
Args:
|
|
1019
|
+
field_operations_by_key: The field operations of each model both states have, by its new key.
|
|
1020
|
+
old_keys: The selected models of the old state.
|
|
1021
|
+
new_keys: The selected models of the new state.
|
|
1022
|
+
renamed_models: The old key of each renamed model, by its new key.
|
|
1023
|
+
|
|
1024
|
+
Returns:
|
|
1025
|
+
``(table, column)`` of each column.
|
|
1026
|
+
"""
|
|
1027
|
+
changed_columns: set[tuple[str, str]] = set()
|
|
1028
|
+
for new_key, field_operations in field_operations_by_key.items():
|
|
1029
|
+
old_model_state = self.old_state.models[renamed_models.get(new_key, new_key)]
|
|
1030
|
+
changed_columns |= StateModelDiff.get_changed_columns(old_model_state, field_operations)
|
|
1031
|
+
renamed_old_keys = set(renamed_models.values())
|
|
1032
|
+
for old_key in old_keys:
|
|
1033
|
+
if old_key in new_keys or old_key in renamed_old_keys:
|
|
1034
|
+
continue
|
|
1035
|
+
old_model_state = self.old_state.models[old_key]
|
|
1036
|
+
table = old_model_state.table or old_model_state.name.lower()
|
|
1037
|
+
for field_name, field in old_model_state.fields.items():
|
|
1038
|
+
column = ModelState.get_field_db_column(field_name, field)
|
|
1039
|
+
if column is not None:
|
|
1040
|
+
changed_columns.add((table, column))
|
|
1041
|
+
return changed_columns
|
|
1042
|
+
|
|
1043
|
+
def _get_added_model_operations(self, added_keys: list[ModelKey]) -> list[HareOperation]:
|
|
1044
|
+
"""The operations creating the models only the new state has.
|
|
1045
|
+
|
|
1046
|
+
Args:
|
|
1047
|
+
added_keys: The models only the new state has.
|
|
1048
|
+
|
|
1049
|
+
Returns:
|
|
1050
|
+
The operations.
|
|
1051
|
+
"""
|
|
1052
|
+
operations: list[HareOperation] = []
|
|
1053
|
+
created_keys = []
|
|
1054
|
+
# A model moved here from another app keeps its existing table - recorded in the state
|
|
1055
|
+
# only, and never split up for a relation cycle (that would add an existing column).
|
|
1056
|
+
for new_key in added_keys:
|
|
1057
|
+
source_key = self._get_moved_model_source(new_key)
|
|
1058
|
+
if source_key is None:
|
|
1059
|
+
created_keys.append(new_key)
|
|
1060
|
+
continue
|
|
1061
|
+
self.moved_models[new_key] = source_key
|
|
1062
|
+
moved_model_operation = self.get_create_model_operation(self.new_state.models[new_key])
|
|
1063
|
+
moved_model_operation.state_only = True
|
|
1064
|
+
# The table it keeps is made by the migrations of the app it comes from.
|
|
1065
|
+
moved_model_operation.generation_dependencies = (
|
|
1066
|
+
OperationDependency.of_model(*source_key, DependencyType.CREATED),
|
|
1067
|
+
)
|
|
1068
|
+
operations.append(moved_model_operation)
|
|
1069
|
+
# Their order, and a relation taken out of one for a cycle, are OperationSorter's.
|
|
1070
|
+
for new_key in created_keys:
|
|
1071
|
+
create_model_operation = self.get_create_model_operation(self.new_state.models[new_key])
|
|
1072
|
+
create_model_operation.options = SchemaObjectOperations.without_deferred_options(
|
|
1073
|
+
create_model_operation.options or {}
|
|
1074
|
+
)
|
|
1075
|
+
operations.append(create_model_operation)
|
|
1076
|
+
return operations
|
|
1077
|
+
|
|
1078
|
+
def _get_deleted_model_operations(
|
|
1079
|
+
self,
|
|
1080
|
+
deleted_keys: list[ModelKey],
|
|
1081
|
+
moved_out_keys: set[ModelKey],
|
|
1082
|
+
early_removed_fields: Collection[tuple[ModelKey, str]],
|
|
1083
|
+
) -> list[HareOperation]:
|
|
1084
|
+
"""The operations dropping the models only the old state has - before what they depend on,
|
|
1085
|
+
sorted against the old state. A cycle among them loses its deferred fields first.
|
|
1086
|
+
|
|
1087
|
+
Args:
|
|
1088
|
+
deleted_keys: The models only the old state has.
|
|
1089
|
+
moved_out_keys: Those of them moved to another app - they keep their table.
|
|
1090
|
+
early_removed_fields: The relation fields already removed.
|
|
1091
|
+
|
|
1092
|
+
Returns:
|
|
1093
|
+
The operations.
|
|
1094
|
+
|
|
1095
|
+
Raises:
|
|
1096
|
+
ConfigurationError: A model moved to another app forms a relation cycle with models
|
|
1097
|
+
deleted in the same run.
|
|
1098
|
+
"""
|
|
1099
|
+
operations: list[HareOperation] = []
|
|
1100
|
+
ordered_deleted_keys, deferred_delete_fields = self._sort_by_dependencies(deleted_keys, self.old_state)
|
|
1101
|
+
for key, field_name in deferred_delete_fields:
|
|
1102
|
+
if (key, field_name) in early_removed_fields:
|
|
1103
|
+
continue
|
|
1104
|
+
if key in moved_out_keys:
|
|
1105
|
+
raise ConfigurationError(
|
|
1106
|
+
f"Model {key[0]}.{key[1]} is moved to another app, but its field {field_name!r} "
|
|
1107
|
+
"forms a relation cycle with models deleted in the same run - delete those "
|
|
1108
|
+
"models in a separate makemigrations run first."
|
|
1109
|
+
)
|
|
1110
|
+
operations.append(RemoveField(model_name=self.old_state.models[key].name, name=field_name))
|
|
1111
|
+
operations.extend(
|
|
1112
|
+
DeleteModel(name=old_key[1], state_only=old_key in moved_out_keys)
|
|
1113
|
+
for old_key in reversed(ordered_deleted_keys)
|
|
1114
|
+
)
|
|
1115
|
+
return operations
|