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
hare/models/meta_info.py
ADDED
|
@@ -0,0 +1,1143 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
from collections.abc import Callable, Iterable
|
|
5
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
6
|
+
|
|
7
|
+
from hare.core.caching.caches import Caches
|
|
8
|
+
from hare.core.connections.connections import Connections
|
|
9
|
+
from hare.core.constants import SWAPPABLE_SETTING_NAME_PATTERN
|
|
10
|
+
from hare.ddl.constraints.unique_constraint import UniqueConstraint
|
|
11
|
+
from hare.ddl.enums import RowLevelSecurity
|
|
12
|
+
from hare.ddl.indexes.index import Index
|
|
13
|
+
from hare.ddl.schema_objects.database_function import DatabaseFunction
|
|
14
|
+
from hare.ddl.schema_objects.database_sequence import DatabaseSequence
|
|
15
|
+
from hare.ddl.schema_objects.dictionary import Dictionary
|
|
16
|
+
from hare.ddl.schema_objects.materialized_view import MaterializedView
|
|
17
|
+
from hare.ddl.schema_objects.view import View
|
|
18
|
+
from hare.ddl.security.grant import Grant
|
|
19
|
+
from hare.ddl.security.policy import Policy
|
|
20
|
+
from hare.ddl.table_options import TableOptions
|
|
21
|
+
from hare.dialects.base.client.database_client import DatabaseClient
|
|
22
|
+
from hare.dialects.base.literals.constants import SQL_NULL_BYTE
|
|
23
|
+
from hare.exceptions import ConfigurationError, HareError, QueryError
|
|
24
|
+
from hare.fields.constants import FOREIGN_KEY_COLUMN_SUFFIX, SCHEMA_TEXT_NULL_BYTE_MESSAGE
|
|
25
|
+
from hare.fields.field import Field
|
|
26
|
+
from hare.fields.relations.fields.backward_foreign_key_relation import BackwardForeignKeyRelation
|
|
27
|
+
from hare.fields.relations.fields.declarations import BackwardOneToOneRelation
|
|
28
|
+
from hare.fields.relations.fields.foreign_key_field_instance import ForeignKeyFieldInstance
|
|
29
|
+
from hare.fields.relations.fields.generic_foreign_key_field_instance import GenericForeignKeyFieldInstance
|
|
30
|
+
from hare.fields.relations.fields.many_to_many_field_instance import ManyToManyFieldInstance
|
|
31
|
+
from hare.fields.relations.fields.one_to_one_field_instance import OneToOneFieldInstance
|
|
32
|
+
from hare.instrumentation.capture.change_capturing import ChangeCapturing
|
|
33
|
+
from hare.models.class_building.lazy_relation_fields import LazyRelationFields
|
|
34
|
+
from hare.models.class_building.model_definition_checks import ModelDefinitionChecks
|
|
35
|
+
from hare.models.class_building.schema_object_declarations import SchemaObjectDeclarations
|
|
36
|
+
from hare.models.constants import META_ORDERING_ALIAS_PREFIX, MISSING_DEFAULT_CONNECTION_MESSAGE
|
|
37
|
+
from hare.models.enums import ModelOption
|
|
38
|
+
from hare.models.tenancy.tenant_row_level_security import TenantRowLevelSecurity
|
|
39
|
+
from hare.query.lookup_info.lookup_info import LookupInfo
|
|
40
|
+
from hare.query.lookup_info.lookup_info_builder import LookupInfoBuilder
|
|
41
|
+
from hare.query.lookup_info.ordering_info import OrderingInfo
|
|
42
|
+
from hare.query.managers.manager import Manager
|
|
43
|
+
from hare.query.queryset import QuerySet
|
|
44
|
+
from hare.query.rows.native.hydration_layout import HydrationLayout
|
|
45
|
+
from hare.sql import Order, Query, Table
|
|
46
|
+
from hare.sql.builder.queries.query_builder import QueryBuilder
|
|
47
|
+
|
|
48
|
+
if TYPE_CHECKING:
|
|
49
|
+
from hare.ddl.constraints.check_constraint import CheckConstraint
|
|
50
|
+
from hare.ddl.constraints.exclusion_constraint import ExclusionConstraint
|
|
51
|
+
from hare.ddl.constraints.foreign_key_constraint import ForeignKeyConstraint
|
|
52
|
+
from hare.ddl.schema_objects.trigger import Trigger
|
|
53
|
+
from hare.dialects.base.dialect import Dialect
|
|
54
|
+
from hare.instrumentation.capture.capture_needs import CaptureNeeds
|
|
55
|
+
from hare.instrumentation.capture.change_sink import ChangeSink
|
|
56
|
+
from hare.models.model import Model
|
|
57
|
+
from hare.query.expressions.expression import Expression
|
|
58
|
+
|
|
59
|
+
ModelConstraint = UniqueConstraint | CheckConstraint | ExclusionConstraint | ForeignKeyConstraint
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class MetaInfo:
|
|
63
|
+
"""What a model declares and what is derived from it: its Meta options, its fields by type, its
|
|
64
|
+
table and connection, and the caches of how its rows are read and its lookups described."""
|
|
65
|
+
|
|
66
|
+
__slots__ = (
|
|
67
|
+
"_default_ordering",
|
|
68
|
+
"_foreign_key_or_one_to_one_inited",
|
|
69
|
+
"_inited",
|
|
70
|
+
"_model",
|
|
71
|
+
"_ordering_validated",
|
|
72
|
+
"ordering_expressions",
|
|
73
|
+
"abstract",
|
|
74
|
+
"app",
|
|
75
|
+
"backward_foreign_key_fields",
|
|
76
|
+
"backward_one_to_one_fields",
|
|
77
|
+
"generic_foreign_key_fields",
|
|
78
|
+
"registered_live",
|
|
79
|
+
"basequery",
|
|
80
|
+
"basequery_all_fields",
|
|
81
|
+
"basetable",
|
|
82
|
+
"constraints",
|
|
83
|
+
"db_default_db_columns",
|
|
84
|
+
"db_fields",
|
|
85
|
+
"db_pk_column",
|
|
86
|
+
"db_table",
|
|
87
|
+
"default_connection",
|
|
88
|
+
"default_custom_generated_pk",
|
|
89
|
+
"direct_fields",
|
|
90
|
+
"extensions",
|
|
91
|
+
"fetch_fields",
|
|
92
|
+
"fields",
|
|
93
|
+
"fields_db_projection",
|
|
94
|
+
"fields_db_projection_reverse",
|
|
95
|
+
"fields_map",
|
|
96
|
+
"foreign_key_fields",
|
|
97
|
+
"foreign_key_shadow_columns",
|
|
98
|
+
"generated_db_fields",
|
|
99
|
+
"computed_field_names",
|
|
100
|
+
"generated_db_table",
|
|
101
|
+
"generated_pk_field_name",
|
|
102
|
+
"get_latest_by",
|
|
103
|
+
"setattr_hooks",
|
|
104
|
+
"next_setattr",
|
|
105
|
+
"instance_constructor",
|
|
106
|
+
"hidden_backward_relations",
|
|
107
|
+
"indexes",
|
|
108
|
+
"many_to_many_fields",
|
|
109
|
+
"managed",
|
|
110
|
+
"manager",
|
|
111
|
+
"meta",
|
|
112
|
+
"one_to_one_fields",
|
|
113
|
+
"declared_field_names",
|
|
114
|
+
"pk",
|
|
115
|
+
"primary_key_attribute",
|
|
116
|
+
"pk_without_overlaps",
|
|
117
|
+
"pk_fields",
|
|
118
|
+
"recomputed_db_fields",
|
|
119
|
+
"returning",
|
|
120
|
+
"schema",
|
|
121
|
+
"sensitive_fields",
|
|
122
|
+
"blind_index_fields",
|
|
123
|
+
"plan_cache_buckets",
|
|
124
|
+
"lookup_paths",
|
|
125
|
+
"concrete_field_paths",
|
|
126
|
+
"lookup_infos",
|
|
127
|
+
"ordering_infos",
|
|
128
|
+
"lookups_by_path",
|
|
129
|
+
"hydration_layouts",
|
|
130
|
+
"model_cache_values",
|
|
131
|
+
"soft_delete_field",
|
|
132
|
+
"soft_delete_hard_cascade",
|
|
133
|
+
"swappable",
|
|
134
|
+
"swapped",
|
|
135
|
+
"table_description",
|
|
136
|
+
"table_is_explicit",
|
|
137
|
+
"table_options",
|
|
138
|
+
"tenant_field",
|
|
139
|
+
"tenant_schema",
|
|
140
|
+
"tenant_row_level_security",
|
|
141
|
+
"checks_tenant_client",
|
|
142
|
+
"track_dirty_fields",
|
|
143
|
+
"change_capture",
|
|
144
|
+
"change_capture_needs",
|
|
145
|
+
"triggers",
|
|
146
|
+
"optimistic_lock_field",
|
|
147
|
+
"views",
|
|
148
|
+
"materialized_views",
|
|
149
|
+
"dictionaries",
|
|
150
|
+
"functions",
|
|
151
|
+
"sequences",
|
|
152
|
+
"policies",
|
|
153
|
+
"grants",
|
|
154
|
+
"row_level_security",
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def __init__(self, meta: type[Model.Meta] | None) -> None:
|
|
158
|
+
"""Reads the model's Meta options; the fields come from the class building.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
meta: The model's Meta, None for the base model.
|
|
162
|
+
"""
|
|
163
|
+
self._read_table_names(meta)
|
|
164
|
+
self._read_schema_objects(meta)
|
|
165
|
+
self._read_query_options(meta)
|
|
166
|
+
self._init_fields(meta)
|
|
167
|
+
self._read_row_options(meta)
|
|
168
|
+
self._init_derived_state(meta)
|
|
169
|
+
|
|
170
|
+
def _read_table_names(self, meta: type[Model.Meta] | None) -> None:
|
|
171
|
+
"""The options naming the model's table, and its manager.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
meta: The model's Meta.
|
|
175
|
+
"""
|
|
176
|
+
#: The model's Meta, the Meta of its abstract ancestors merged in - an extension reads its own
|
|
177
|
+
#: options off it (an outbox model's ``Meta.outbox_wakeup``).
|
|
178
|
+
self.meta = meta
|
|
179
|
+
ModelDefinitionChecks.raise_if_unsupported_option_declared(meta)
|
|
180
|
+
ModelDefinitionChecks.raise_if_option_values_mistyped(meta)
|
|
181
|
+
self.abstract: bool = getattr(meta, ModelOption.ABSTRACT, False)
|
|
182
|
+
# A fresh manager, never the Meta attribute's own object: an abstract base's Meta.manager is
|
|
183
|
+
# one object for every subclass, and each model binds its manager to itself. Read without
|
|
184
|
+
# running the descriptor - off a class it gives a queryset.
|
|
185
|
+
declared_manager: Manager | None = inspect.getattr_static(meta, ModelOption.MANAGER, None)
|
|
186
|
+
self.manager: Manager = declared_manager.copy_unbound() if declared_manager is not None else Manager()
|
|
187
|
+
self.db_table: str = getattr(meta, ModelOption.TABLE, "")
|
|
188
|
+
# Whether Meta.table was declared rather than left to be derived from the class name - a
|
|
189
|
+
# RenameModel tells the two apart. `meta.table_is_explicit` overrides it: a Meta rebuilt
|
|
190
|
+
# from a migration always carries a table.
|
|
191
|
+
explicit_override = getattr(meta, ModelOption.TABLE_IS_EXPLICIT, None)
|
|
192
|
+
self.table_is_explicit: bool = explicit_override if explicit_override is not None else bool(self.db_table)
|
|
193
|
+
#: The table name Apps last generated for this model (table_name_generator or the class
|
|
194
|
+
#: name) - None while db_table came from Meta.table. Lets every init regenerate it instead
|
|
195
|
+
#: of keeping the first init's name.
|
|
196
|
+
self.generated_db_table: str | None = None
|
|
197
|
+
self.schema: str | None = getattr(meta, ModelOption.SCHEMA, None)
|
|
198
|
+
self.app: str | None = getattr(meta, ModelOption.APP, None)
|
|
199
|
+
|
|
200
|
+
def _read_schema_objects(self, meta: type[Model.Meta] | None) -> None:
|
|
201
|
+
"""The schema objects the model declares besides its table.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
meta: The model's Meta.
|
|
205
|
+
"""
|
|
206
|
+
self.constraints: tuple[ModelConstraint, ...] = tuple(getattr(meta, ModelOption.CONSTRAINTS, ()))
|
|
207
|
+
self.triggers: tuple[Trigger, ...] = tuple(getattr(meta, ModelOption.TRIGGERS, ()))
|
|
208
|
+
self.views: tuple[View, ...] = SchemaObjectDeclarations.get_schema_objects(
|
|
209
|
+
meta, ModelOption.VIEWS, View, MaterializedView
|
|
210
|
+
)
|
|
211
|
+
self.materialized_views: tuple[MaterializedView, ...] = SchemaObjectDeclarations.get_schema_objects(
|
|
212
|
+
meta, ModelOption.MATERIALIZED_VIEWS, MaterializedView
|
|
213
|
+
)
|
|
214
|
+
self.dictionaries: tuple[Dictionary, ...] = SchemaObjectDeclarations.get_schema_objects(
|
|
215
|
+
meta, ModelOption.DICTIONARIES, Dictionary
|
|
216
|
+
)
|
|
217
|
+
self.functions: tuple[DatabaseFunction, ...] = SchemaObjectDeclarations.get_schema_objects(
|
|
218
|
+
meta, ModelOption.FUNCTIONS, DatabaseFunction
|
|
219
|
+
)
|
|
220
|
+
self.sequences: tuple[DatabaseSequence, ...] = SchemaObjectDeclarations.get_schema_objects(
|
|
221
|
+
meta, ModelOption.SEQUENCES, DatabaseSequence
|
|
222
|
+
)
|
|
223
|
+
self.policies: tuple[Policy, ...] = SchemaObjectDeclarations.get_schema_objects(
|
|
224
|
+
meta, ModelOption.POLICIES, Policy
|
|
225
|
+
)
|
|
226
|
+
self.grants: tuple[Grant, ...] = SchemaObjectDeclarations.get_schema_objects(meta, ModelOption.GRANTS, Grant)
|
|
227
|
+
ModelDefinitionChecks.raise_if_relation_names_repeat(self)
|
|
228
|
+
self.row_level_security: RowLevelSecurity | None = SchemaObjectDeclarations.get_row_level_security(meta)
|
|
229
|
+
self.indexes: tuple[tuple[str, ...] | Index, ...] = self._get_indexes(meta)
|
|
230
|
+
self.extensions: tuple[str, ...] = tuple(getattr(meta, ModelOption.EXTENSIONS, ()))
|
|
231
|
+
|
|
232
|
+
def _read_query_options(self, meta: type[Model.Meta] | None) -> None:
|
|
233
|
+
"""The options of the model's swapping and of its queries' ordering.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
meta: The model's Meta.
|
|
237
|
+
"""
|
|
238
|
+
#: The ``swappable`` config setting a project may point at another model instead of this one.
|
|
239
|
+
self.swappable: str | None = getattr(meta, ModelOption.SWAPPABLE, None)
|
|
240
|
+
if self.swappable is not None and (
|
|
241
|
+
not isinstance(self.swappable, str) or not SWAPPABLE_SETTING_NAME_PATTERN.fullmatch(self.swappable)
|
|
242
|
+
):
|
|
243
|
+
raise ConfigurationError(
|
|
244
|
+
f'Meta.swappable must be an upper-case setting name such as "USER_MODEL", got {self.swappable!r}'
|
|
245
|
+
)
|
|
246
|
+
#: The ``app_label.ModelName`` label of the model the ``swappable`` setting points at
|
|
247
|
+
#: instead of this one - None while this model is the one in use.
|
|
248
|
+
self.swapped: str | None = None
|
|
249
|
+
#: The expressions ``Meta.ordering`` orders by, by the alias the ordering names each by - a
|
|
250
|
+
#: query ordered by one makes it an alias of its own (``AwaitableQuery``).
|
|
251
|
+
self.ordering_expressions: dict[str, Expression] = {}
|
|
252
|
+
self._default_ordering: tuple[tuple[str, Order], ...] = self._prepare_default_ordering(meta)
|
|
253
|
+
self._ordering_validated: bool = False
|
|
254
|
+
#: The fields ``latest()``/``earliest()`` order by when given none - ``Meta.get_latest_by``.
|
|
255
|
+
self.get_latest_by: tuple[str, ...] = self._get_latest_by_fields(meta)
|
|
256
|
+
|
|
257
|
+
def _init_fields(self, meta: type[Model.Meta] | None) -> None:
|
|
258
|
+
"""The registries of the model's fields and its primary key - filled when the class is built.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
meta: The model's Meta.
|
|
262
|
+
"""
|
|
263
|
+
self.fields: set[str] = set()
|
|
264
|
+
#: Every column of the table, in the order the fields are declared - the SELECT column list.
|
|
265
|
+
self.db_fields: tuple[str, ...] = ()
|
|
266
|
+
self.many_to_many_fields: set[str] = set()
|
|
267
|
+
self.foreign_key_fields: set[str] = set()
|
|
268
|
+
#: Key column field name ("author_id") -> the attribute caching its relation's related
|
|
269
|
+
#: object ("_author") - assigning the column drops that cache.
|
|
270
|
+
self.foreign_key_shadow_columns: dict[str, str] = {}
|
|
271
|
+
self.one_to_one_fields: set[str] = set()
|
|
272
|
+
self.backward_foreign_key_fields: set[str] = set()
|
|
273
|
+
self.backward_one_to_one_fields: set[str] = set()
|
|
274
|
+
#: The generic foreign keys by name - each is no field of its own, its branches are.
|
|
275
|
+
self.generic_foreign_key_fields: dict[str, GenericForeignKeyFieldInstance[Any]] = {}
|
|
276
|
+
#: Whether ``register_live_models()`` registered the model.
|
|
277
|
+
self.registered_live = False
|
|
278
|
+
#: Backward FK/O2O relations of forward fields declared with ``related_name=False``, keyed
|
|
279
|
+
#: by the forward field's ``"app.Model.field"`` - no accessor, filter or fetch field, only
|
|
280
|
+
#: seen by the ``on_delete`` cascade.
|
|
281
|
+
self.hidden_backward_relations: dict[str, BackwardForeignKeyRelation[Any]] = {}
|
|
282
|
+
self.fetch_fields: set[str] = set()
|
|
283
|
+
self.direct_fields: frozenset[str] = frozenset()
|
|
284
|
+
#: Names of every field declared (or, for an FK/O2O shadow column, inherited from its
|
|
285
|
+
#: relation) with ``sensitive=True``.
|
|
286
|
+
self.sensitive_fields: frozenset[str] = frozenset()
|
|
287
|
+
#: The blind index field of each encrypted field declared with ``blind_index=True``.
|
|
288
|
+
self.blind_index_fields: dict[str, str] = {}
|
|
289
|
+
self.fields_db_projection: dict[str, str] = {}
|
|
290
|
+
self.fields_db_projection_reverse: dict[str, str] = {}
|
|
291
|
+
self.fields_map: dict[str, Field[Any]] = {}
|
|
292
|
+
#: The fields this class's own body declares, a synthesized `id` included - read by a
|
|
293
|
+
#: subclass resolving a diamond.
|
|
294
|
+
self.declared_field_names: frozenset[str] = frozenset()
|
|
295
|
+
self._inited: bool = False
|
|
296
|
+
self._foreign_key_or_one_to_one_inited: bool = False
|
|
297
|
+
self.default_connection: str | None = None
|
|
298
|
+
self.basequery: QueryBuilder = QueryBuilder()
|
|
299
|
+
self.basequery_all_fields: QueryBuilder = QueryBuilder()
|
|
300
|
+
self.basetable: Table = Table("")
|
|
301
|
+
self.primary_key_attribute: str | tuple[str, ...] = getattr(meta, ModelOption.PRIMARY_KEY_ATTRIBUTE, "")
|
|
302
|
+
#: Only set when primary_key_attribute is a tuple (composite PK) - the actual Field objects, in the
|
|
303
|
+
#: same order as primary_key_attribute. Empty for a single-column PK (use .pk instead).
|
|
304
|
+
self.pk_fields: tuple[Field[Any], ...] = ()
|
|
305
|
+
#: Whether a composite primary key compares its last field WITHOUT OVERLAPS.
|
|
306
|
+
self.pk_without_overlaps: bool = False
|
|
307
|
+
|
|
308
|
+
def _read_row_options(self, meta: type[Model.Meta] | None) -> None:
|
|
309
|
+
"""The options about the way the model's rows are written - soft delete, tenants, locking,
|
|
310
|
+
change capture.
|
|
311
|
+
|
|
312
|
+
Args:
|
|
313
|
+
meta: The model's Meta.
|
|
314
|
+
"""
|
|
315
|
+
self.soft_delete_field: str | None = getattr(meta, ModelOption.SOFT_DELETE_FIELD, None)
|
|
316
|
+
# Whether a soft delete of the model's rows really deletes the cascaded rows that can't be
|
|
317
|
+
# soft-deleted themselves and the M2M through rows, instead of keeping them for restore().
|
|
318
|
+
self.soft_delete_hard_cascade: bool = getattr(meta, ModelOption.SOFT_DELETE_HARD_CASCADE, False)
|
|
319
|
+
# The column holding the tenant of a multi-tenant model - of any field type.
|
|
320
|
+
self.tenant_field: str | None = getattr(meta, ModelOption.TENANT_FIELD, None)
|
|
321
|
+
#: Whether the table lives in each tenant's own schema (the connection's
|
|
322
|
+
#: ``tenant_schema_template``) rather than once in the shared one.
|
|
323
|
+
self.tenant_schema: bool = getattr(meta, ModelOption.TENANT_SCHEMA, False)
|
|
324
|
+
#: Whether a ``Meta.policies`` policy reads ``TenantCondition`` - the database keeps the rows
|
|
325
|
+
#: to the transaction's tenants.
|
|
326
|
+
self.tenant_row_level_security: bool = False
|
|
327
|
+
#: Whether a query checks its client with ``check_tenant_client()``.
|
|
328
|
+
self.checks_tenant_client: bool = False
|
|
329
|
+
self.optimistic_lock_field: str | None = getattr(meta, ModelOption.OPTIMISTIC_LOCK_FIELD, None)
|
|
330
|
+
# Opt-in: an unconditional per-row snapshot would cost every hydration, not just the
|
|
331
|
+
# models that actually use .get_dirty_fields() - see ModelColumns.compile_hydrate_function().
|
|
332
|
+
self.track_dirty_fields: bool = getattr(meta, ModelOption.TRACK_DIRTY_FIELDS, False)
|
|
333
|
+
#: Where the rows of the model's writes go, in the write's transaction (``Meta.change_capture``).
|
|
334
|
+
self.change_capture: ChangeSink | None = getattr(meta, ModelOption.CHANGE_CAPTURE, None)
|
|
335
|
+
#: What the writes read for ``change_capture`` - worked out when the model is finalised; None
|
|
336
|
+
#: for a model without it.
|
|
337
|
+
self.change_capture_needs: CaptureNeeds | None = None
|
|
338
|
+
# False: the table is never hare's to create, alter or drop - migrations and drift leave it
|
|
339
|
+
# alone.
|
|
340
|
+
self.managed: bool = getattr(meta, ModelOption.MANAGED, True)
|
|
341
|
+
# The default of bulk_create()/bulk_update()'s `returning` when a call doesn't pass it.
|
|
342
|
+
self.returning: bool = getattr(meta, ModelOption.RETURNING, False)
|
|
343
|
+
|
|
344
|
+
def _init_derived_state(self, meta: type[Model.Meta] | None) -> None:
|
|
345
|
+
"""What is worked out when the model is set up, and the caches of the model.
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
meta: The model's Meta.
|
|
349
|
+
"""
|
|
350
|
+
self.generated_db_fields: tuple[str, ...] = None # type: ignore[assignment]
|
|
351
|
+
#: The generated columns an UPDATE makes the database compute again - every one but the
|
|
352
|
+
#: primary key, which an UPDATE never generates anew.
|
|
353
|
+
self.recomputed_db_fields: tuple[str, ...] = None # type: ignore[assignment]
|
|
354
|
+
#: The fields the database computes on every write (``GeneratedField``) - no value of theirs
|
|
355
|
+
#: is ever written, so the constructor refuses one.
|
|
356
|
+
self.computed_field_names: frozenset[str] = frozenset()
|
|
357
|
+
#: Name of the single-column primary key when the database generates it (autoincrement),
|
|
358
|
+
#: else None - the only pk whose explicit assignment flips Model._custom_generated_pk.
|
|
359
|
+
self.generated_pk_field_name: str | None = None
|
|
360
|
+
#: The attribute names Model.__setattr__ does more than store - relations, their key columns,
|
|
361
|
+
#: the soft-delete field and a generated primary key; None until worked out.
|
|
362
|
+
self.setattr_hooks: frozenset[str] | None = None
|
|
363
|
+
#: The ``__setattr__`` Model.__setattr__ stores a plain attribute with - set with
|
|
364
|
+
#: ``setattr_hooks``.
|
|
365
|
+
self.next_setattr: Callable[[Any, str, Any], None] = object.__setattr__
|
|
366
|
+
#: The ``rust.native.rows.ModelConstructor`` setting up new instances; False when
|
|
367
|
+
#: ``Model.__init__`` does it alone; None until worked out.
|
|
368
|
+
self.instance_constructor: Any = None
|
|
369
|
+
self.default_custom_generated_pk: bool = False
|
|
370
|
+
self._model: type[Model] = None # type: ignore[assignment]
|
|
371
|
+
self.table_description: str = getattr(meta, ModelOption.TABLE_DESCRIPTION, "")
|
|
372
|
+
if isinstance(self.table_description, str) and SQL_NULL_BYTE in self.table_description:
|
|
373
|
+
raise ConfigurationError(SCHEMA_TEXT_NULL_BYTE_MESSAGE.format(owner="Meta", parameter="table_description"))
|
|
374
|
+
self.table_options: tuple[TableOptions, ...] = SchemaObjectDeclarations.get_declared_table_options(meta)
|
|
375
|
+
self.pk: Field[Any] = None # type: ignore[assignment]
|
|
376
|
+
self.db_pk_column: str = ""
|
|
377
|
+
#: id(cache) -> this model's bucket of that Cache (the statement plans, the decode
|
|
378
|
+
#: plans, the descriptions of its filter keys) - held here so the entries live exactly as
|
|
379
|
+
#: long as the model class.
|
|
380
|
+
self.plan_cache_buckets: dict[int, Any] = {}
|
|
381
|
+
#: The model's plain buckets of the caches read on every query (``Cache.model_attribute``),
|
|
382
|
+
#: None while the model has none: its parsed lookup paths, the field paths a path reads,
|
|
383
|
+
#: the descriptions of its filter keys, ordering names and field paths' lookups, and its
|
|
384
|
+
#: row layouts by (driver's native Python types, dialect).
|
|
385
|
+
self.lookup_paths: dict[Any, Any] | None = None
|
|
386
|
+
self.concrete_field_paths: dict[Any, Any] | None = None
|
|
387
|
+
self.lookup_infos: dict[Any, Any] | None = None
|
|
388
|
+
self.ordering_infos: dict[Any, Any] | None = None
|
|
389
|
+
self.lookups_by_path: dict[Any, Any] | None = None
|
|
390
|
+
self.hydration_layouts: dict[Any, Any] | None = None
|
|
391
|
+
#: id(cache) -> this model's value of that ModelCache - held here so the value lives
|
|
392
|
+
#: exactly as long as the model class.
|
|
393
|
+
self.model_cache_values: dict[int, Any] = {}
|
|
394
|
+
self.db_default_db_columns: tuple[str, ...] = ()
|
|
395
|
+
|
|
396
|
+
def get_table_options(self, dialect: Dialect) -> TableOptions | None:
|
|
397
|
+
"""Returns the table options of one dialect.
|
|
398
|
+
|
|
399
|
+
Args:
|
|
400
|
+
dialect: The dialect.
|
|
401
|
+
|
|
402
|
+
Returns:
|
|
403
|
+
The ``Meta.table_options`` entry of the dialect, else the dialect's default options
|
|
404
|
+
(``Dialect.default_table_options``), None when there are none.
|
|
405
|
+
"""
|
|
406
|
+
return dialect.get_table_options(self.table_options)
|
|
407
|
+
|
|
408
|
+
@property
|
|
409
|
+
def full_name(self) -> str:
|
|
410
|
+
"""``"app.ModelName"`` - the label relations, ``swappable`` settings and
|
|
411
|
+
``HareContext.get_model()`` name the model by."""
|
|
412
|
+
return f"{self.app}.{self._model.__name__}"
|
|
413
|
+
|
|
414
|
+
@property
|
|
415
|
+
def query_class(self) -> type[Query]:
|
|
416
|
+
"""The query class ``basequery`` is currently bound to - its dialect renders this model's
|
|
417
|
+
SQL. Part of every cached-SQL key: SQL rendered while another context's builder was bound
|
|
418
|
+
must never be served under this context's own dialect/connection."""
|
|
419
|
+
return self.basequery.query_class
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def is_bound(self) -> bool:
|
|
423
|
+
"""Whether the model is bound - its relations resolved and every filter key and ordering
|
|
424
|
+
name of it described - by ``Hare.bind_models()``, ``HareContext.bind_models()`` or
|
|
425
|
+
``Hare.init()``. Until then the model can't describe a filter key or an ordering name."""
|
|
426
|
+
return self._inited
|
|
427
|
+
|
|
428
|
+
def _check_bound(self) -> None:
|
|
429
|
+
"""Refuses to describe a filter key or an ordering name of a model not bound yet.
|
|
430
|
+
|
|
431
|
+
Raises:
|
|
432
|
+
ConfigurationError: The model isn't bound.
|
|
433
|
+
"""
|
|
434
|
+
if not self._inited:
|
|
435
|
+
raise ConfigurationError(
|
|
436
|
+
f"{self._model.__name__} is not bound yet: call Hare.bind_models() or Hare.init() "
|
|
437
|
+
"before describing its filters or orderings"
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
@property
|
|
441
|
+
def has_primary_key(self) -> bool:
|
|
442
|
+
"""Whether the model has a primary key - False with ``Meta.primary_key = None``, whose
|
|
443
|
+
``primary_key_attribute`` is ``()``."""
|
|
444
|
+
return bool(self.primary_key_attribute)
|
|
445
|
+
|
|
446
|
+
@property
|
|
447
|
+
def has_composite_primary_key(self) -> bool:
|
|
448
|
+
"""Whether the primary key is composite (``CompositePrimaryKey``) - ``primary_key_attribute`` is then a
|
|
449
|
+
tuple of field names, ``pk`` None and ``pk_fields`` the key's fields."""
|
|
450
|
+
return isinstance(self.primary_key_attribute, tuple) and bool(self.primary_key_attribute)
|
|
451
|
+
|
|
452
|
+
def get_with_blind_indexes(self, field_names: Iterable[str]) -> list[str]:
|
|
453
|
+
"""Field names to write, each encrypted field followed by its blind index - the index is
|
|
454
|
+
written whenever its field is.
|
|
455
|
+
|
|
456
|
+
Args:
|
|
457
|
+
field_names: The names.
|
|
458
|
+
|
|
459
|
+
Returns:
|
|
460
|
+
The names, deduplicated, in order.
|
|
461
|
+
"""
|
|
462
|
+
if not self.blind_index_fields:
|
|
463
|
+
return list(field_names)
|
|
464
|
+
names: dict[str, None] = {}
|
|
465
|
+
for field_name in field_names:
|
|
466
|
+
names[field_name] = None
|
|
467
|
+
blind_index_field_name = self.blind_index_fields.get(field_name)
|
|
468
|
+
if blind_index_field_name is not None:
|
|
469
|
+
names[blind_index_field_name] = None
|
|
470
|
+
return list(names)
|
|
471
|
+
|
|
472
|
+
def raise_if_no_primary_key(self, operation: str) -> None:
|
|
473
|
+
"""Rejects an operation that identifies a row by its primary key on a model without one.
|
|
474
|
+
|
|
475
|
+
Args:
|
|
476
|
+
operation: What needs the key, named in the error (``"Model.save() of a fetched row"``).
|
|
477
|
+
|
|
478
|
+
Raises:
|
|
479
|
+
ConfigurationError: The model has no primary key.
|
|
480
|
+
"""
|
|
481
|
+
if not self.has_primary_key:
|
|
482
|
+
raise ConfigurationError(
|
|
483
|
+
f"{self._model.__name__} has no primary key (Meta.primary_key = None) - {operation} needs "
|
|
484
|
+
"one to identify a row; filter the queryset and use QuerySet.update()/delete() instead"
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
@property
|
|
488
|
+
def primary_key_attribute_names(self) -> tuple[str, ...]:
|
|
489
|
+
"""``primary_key_attribute`` normalized to a tuple regardless of whether the PK is a single field or
|
|
490
|
+
composite - lets code that only needs "which field names make up the PK" (membership
|
|
491
|
+
checks, iteration) stay agnostic to which case it's in."""
|
|
492
|
+
return (
|
|
493
|
+
self.primary_key_attribute
|
|
494
|
+
if isinstance(self.primary_key_attribute, tuple)
|
|
495
|
+
else (self.primary_key_attribute,)
|
|
496
|
+
)
|
|
497
|
+
|
|
498
|
+
def get_column_names(self, field_names: Iterable[str]) -> list[str]:
|
|
499
|
+
"""Maps field names, as indexes and constraints name them, to DB column names. A relation maps
|
|
500
|
+
to its key column(s); a name that is not a field is taken as a column name.
|
|
501
|
+
|
|
502
|
+
Args:
|
|
503
|
+
field_names: Field names, in order.
|
|
504
|
+
|
|
505
|
+
Returns:
|
|
506
|
+
The DB column names, in the same order.
|
|
507
|
+
"""
|
|
508
|
+
column_names: list[str] = []
|
|
509
|
+
for field_name in field_names:
|
|
510
|
+
field_object = self.fields_map.get(field_name)
|
|
511
|
+
if field_object is None:
|
|
512
|
+
column_names.append(field_name)
|
|
513
|
+
elif isinstance(field_object, ForeignKeyFieldInstance) and len(field_object.db_column_names) > 1:
|
|
514
|
+
column_names.extend(field_object.db_column_names)
|
|
515
|
+
elif isinstance(field_object, ForeignKeyFieldInstance):
|
|
516
|
+
key_field_name = field_object.source_field or f"{field_name}{FOREIGN_KEY_COLUMN_SUFFIX}"
|
|
517
|
+
key_field_object = self.fields_map.get(key_field_name)
|
|
518
|
+
column_names.append(
|
|
519
|
+
key_field_object.source_field or key_field_name if key_field_object is not None else key_field_name
|
|
520
|
+
)
|
|
521
|
+
else:
|
|
522
|
+
column_names.append(field_object.source_field or field_name)
|
|
523
|
+
return column_names
|
|
524
|
+
|
|
525
|
+
def get_field_index_columns(self) -> list[tuple[str, tuple[str, ...]]]:
|
|
526
|
+
"""The indexes the fields' own ``db_index=True`` implies, in column order.
|
|
527
|
+
|
|
528
|
+
Returns:
|
|
529
|
+
(field name, column names) pairs - a plain or shadow key field with its one column,
|
|
530
|
+
a relation to a composite primary key with all of its key columns.
|
|
531
|
+
"""
|
|
532
|
+
field_index_columns: list[tuple[str, tuple[str, ...]]] = []
|
|
533
|
+
for field_name, column_name in self.fields_db_projection.items():
|
|
534
|
+
field_object = self.fields_map[field_name]
|
|
535
|
+
if field_object.index and not field_object.pk:
|
|
536
|
+
field_index_columns.append((field_name, (column_name,)))
|
|
537
|
+
relation_field = field_object.reference
|
|
538
|
+
if (
|
|
539
|
+
isinstance(relation_field, ForeignKeyFieldInstance)
|
|
540
|
+
and relation_field.index
|
|
541
|
+
and len(relation_field.source_fields) > 1
|
|
542
|
+
and relation_field.source_fields[0] == field_name
|
|
543
|
+
):
|
|
544
|
+
field_index_columns.append((relation_field.model_field_name, tuple(relation_field.db_column_names)))
|
|
545
|
+
return field_index_columns
|
|
546
|
+
|
|
547
|
+
def get_leading_index_entries(self) -> list[tuple[str, ...]]:
|
|
548
|
+
"""The field names of every index a lookup on its leading columns can use: plain btree
|
|
549
|
+
``Meta.indexes`` entries, unconditional UniqueConstraints and a composite primary key. An
|
|
550
|
+
unnamed index over one foreign key is left out - it is that relation's own.
|
|
551
|
+
|
|
552
|
+
Returns:
|
|
553
|
+
Each entry's field (or column) names, in index order.
|
|
554
|
+
"""
|
|
555
|
+
entries: list[tuple[str, ...]] = []
|
|
556
|
+
for index in self.indexes:
|
|
557
|
+
if isinstance(index, Index):
|
|
558
|
+
if type(index) is not Index or not index.fields or index.expressions or index.opclasses:
|
|
559
|
+
continue
|
|
560
|
+
if not index.name and not index.unique and self.is_relation_field_names(index.fields):
|
|
561
|
+
continue
|
|
562
|
+
entries.append(tuple(index.fields))
|
|
563
|
+
elif not self.is_relation_field_names(tuple(index)):
|
|
564
|
+
entries.append(tuple(index))
|
|
565
|
+
entries.extend(
|
|
566
|
+
tuple(constraint.fields)
|
|
567
|
+
for constraint in self.constraints
|
|
568
|
+
if isinstance(constraint, UniqueConstraint) and constraint.fields and constraint.condition is None
|
|
569
|
+
)
|
|
570
|
+
if self.has_composite_primary_key:
|
|
571
|
+
entries.append(cast("tuple[str, ...]", self.primary_key_attribute))
|
|
572
|
+
return entries
|
|
573
|
+
|
|
574
|
+
def is_relation_field_names(self, field_names: tuple[str, ...] | list[str]) -> bool:
|
|
575
|
+
"""Whether the names are exactly one foreign key field.
|
|
576
|
+
|
|
577
|
+
Args:
|
|
578
|
+
field_names: Field names of an index entry.
|
|
579
|
+
|
|
580
|
+
Returns:
|
|
581
|
+
True for a single ForeignKeyField name.
|
|
582
|
+
"""
|
|
583
|
+
return len(field_names) == 1 and isinstance(self.fields_map.get(field_names[0]), ForeignKeyFieldInstance)
|
|
584
|
+
|
|
585
|
+
def is_indexed_by_leading_columns(self, relation_field_name: str, key_names: list[tuple[str, ...]]) -> bool:
|
|
586
|
+
"""Whether a declared index already serves a relation's lookups, or would take the name of
|
|
587
|
+
its own index.
|
|
588
|
+
|
|
589
|
+
Args:
|
|
590
|
+
relation_field_name: The relation field's name, which stands for all of its key columns.
|
|
591
|
+
key_names: For each key column, the names an index entry can refer to it by.
|
|
592
|
+
|
|
593
|
+
Returns:
|
|
594
|
+
True when an entry of ``get_leading_index_entries()`` starts with all key columns in
|
|
595
|
+
any order, or an unnamed index of another type (partial, GIN, ...) spans exactly the
|
|
596
|
+
key columns in order - it gets the same generated name.
|
|
597
|
+
"""
|
|
598
|
+
if any(
|
|
599
|
+
self.leads_with_key_columns(entry_names, relation_field_name, key_names)
|
|
600
|
+
for entry_names in self.get_leading_index_entries()
|
|
601
|
+
):
|
|
602
|
+
return True
|
|
603
|
+
for index in self.indexes:
|
|
604
|
+
if not isinstance(index, Index) or type(index) is Index or index.name or index.unique:
|
|
605
|
+
continue
|
|
606
|
+
entry_names = tuple(index.fields or ())
|
|
607
|
+
if entry_names == (relation_field_name,) or (
|
|
608
|
+
len(entry_names) == len(key_names)
|
|
609
|
+
and all(entry_name in names for entry_name, names in zip(entry_names, key_names, strict=True))
|
|
610
|
+
):
|
|
611
|
+
return True
|
|
612
|
+
return False
|
|
613
|
+
|
|
614
|
+
@staticmethod
|
|
615
|
+
def leads_with_key_columns(
|
|
616
|
+
entry_names: tuple[str, ...], relation_field_name: str, key_names: list[tuple[str, ...]]
|
|
617
|
+
) -> bool:
|
|
618
|
+
"""Whether an index entry starts with all key columns of a relation, in any order.
|
|
619
|
+
|
|
620
|
+
Args:
|
|
621
|
+
entry_names: The index entry's field (or column) names, in order.
|
|
622
|
+
relation_field_name: The relation field's name, which stands for all of its key columns.
|
|
623
|
+
key_names: For each key column, the names an index entry can refer to it by.
|
|
624
|
+
|
|
625
|
+
Returns:
|
|
626
|
+
True when the leading entry names cover every key column.
|
|
627
|
+
"""
|
|
628
|
+
uncovered_positions = set(range(len(key_names)))
|
|
629
|
+
for entry_name in entry_names:
|
|
630
|
+
if entry_name == relation_field_name:
|
|
631
|
+
return True
|
|
632
|
+
matched_positions = {position for position in uncovered_positions if entry_name in key_names[position]}
|
|
633
|
+
if not matched_positions:
|
|
634
|
+
return False
|
|
635
|
+
uncovered_positions -= matched_positions
|
|
636
|
+
if not uncovered_positions:
|
|
637
|
+
return True
|
|
638
|
+
return False
|
|
639
|
+
|
|
640
|
+
def add_field(self, name: str, value: Field[Any]) -> None:
|
|
641
|
+
"""Adds a field to the model under a name, sorting it into the sets of its type.
|
|
642
|
+
|
|
643
|
+
Args:
|
|
644
|
+
name: The field's attribute name.
|
|
645
|
+
value: The field.
|
|
646
|
+
|
|
647
|
+
Raises:
|
|
648
|
+
ConfigurationError: The model already has a field of that name.
|
|
649
|
+
"""
|
|
650
|
+
if name in self.fields_map:
|
|
651
|
+
raise ConfigurationError(f"Field {name} already present in meta")
|
|
652
|
+
value.model = self._model
|
|
653
|
+
self.fields_map[name] = value
|
|
654
|
+
value.model_field_name = name
|
|
655
|
+
|
|
656
|
+
if value.has_db_field:
|
|
657
|
+
self.fields_db_projection[name] = value.source_field or name
|
|
658
|
+
|
|
659
|
+
# Dropped, not recomputed: apps are registered incrementally, so a relation can arrive after
|
|
660
|
+
# the deletion caches were filled - the transitive ones of other models included.
|
|
661
|
+
if isinstance(value, ManyToManyFieldInstance):
|
|
662
|
+
self.many_to_many_fields.add(name)
|
|
663
|
+
Caches.forget_model_caches((self._model,))
|
|
664
|
+
elif isinstance(value, OneToOneFieldInstance):
|
|
665
|
+
self.one_to_one_fields.add(name)
|
|
666
|
+
Caches.forget_model_caches((self._model,))
|
|
667
|
+
elif isinstance(value, ForeignKeyFieldInstance):
|
|
668
|
+
self.foreign_key_fields.add(name)
|
|
669
|
+
Caches.forget_model_caches((self._model,))
|
|
670
|
+
elif isinstance(value, BackwardOneToOneRelation):
|
|
671
|
+
self.backward_one_to_one_fields.add(name)
|
|
672
|
+
Caches.forget_model_caches((self._model,))
|
|
673
|
+
elif isinstance(value, BackwardForeignKeyRelation):
|
|
674
|
+
self.backward_foreign_key_fields.add(name)
|
|
675
|
+
Caches.forget_model_caches((self._model,))
|
|
676
|
+
|
|
677
|
+
LookupInfoBuilder.forget_descriptions()
|
|
678
|
+
self.finalise_fields()
|
|
679
|
+
|
|
680
|
+
def add_hidden_backward_relation(self, key: str, value: BackwardForeignKeyRelation[Any]) -> None:
|
|
681
|
+
"""Registers a backward relation that has no accessor on the model.
|
|
682
|
+
|
|
683
|
+
Args:
|
|
684
|
+
key: The forward field's ``"app.Model.field"``; re-registering a key replaces it.
|
|
685
|
+
value: The backward relation.
|
|
686
|
+
"""
|
|
687
|
+
value.model = self._model
|
|
688
|
+
value.model_field_name = key
|
|
689
|
+
self.hidden_backward_relations[key] = value
|
|
690
|
+
LookupInfoBuilder.forget_descriptions()
|
|
691
|
+
Caches.forget_model_caches((self._model,))
|
|
692
|
+
|
|
693
|
+
def place_key_columns(self) -> None:
|
|
694
|
+
"""Puts the key columns of each relation where the relation is declared among the columns -
|
|
695
|
+
the table holds them there."""
|
|
696
|
+
key_names_by_relation: dict[str, list[str]] = {}
|
|
697
|
+
for name in self.fields_db_projection:
|
|
698
|
+
reference = getattr(self.fields_map[name], "reference", None)
|
|
699
|
+
if reference is not None:
|
|
700
|
+
key_names_by_relation.setdefault(reference.model_field_name, []).append(name)
|
|
701
|
+
columns: dict[str, str] = {}
|
|
702
|
+
for name, field in self.fields_map.items():
|
|
703
|
+
if name in key_names_by_relation:
|
|
704
|
+
columns.update(
|
|
705
|
+
(key_name, self.fields_db_projection[key_name]) for key_name in key_names_by_relation[name]
|
|
706
|
+
)
|
|
707
|
+
elif name in self.fields_db_projection and getattr(field, "reference", None) is None:
|
|
708
|
+
columns[name] = self.fields_db_projection[name]
|
|
709
|
+
if len(columns) != len(self.fields_db_projection):
|
|
710
|
+
# A relation isn't among the fields - the columns stay where they are.
|
|
711
|
+
return
|
|
712
|
+
self.fields_db_projection.clear()
|
|
713
|
+
self.fields_db_projection.update(columns)
|
|
714
|
+
|
|
715
|
+
def remove_field(self, name: str) -> None:
|
|
716
|
+
"""Reverses ``add_field()``: drops the field, its lookups and its class-level accessor.
|
|
717
|
+
|
|
718
|
+
Args:
|
|
719
|
+
name: The field's model field name.
|
|
720
|
+
|
|
721
|
+
Raises:
|
|
722
|
+
ConfigurationError: No field named ``name`` exists.
|
|
723
|
+
"""
|
|
724
|
+
value = self.fields_map.pop(name, None)
|
|
725
|
+
if value is None:
|
|
726
|
+
raise ConfigurationError(f"Field {name} not present in meta")
|
|
727
|
+
self.fields_db_projection.pop(name, None)
|
|
728
|
+
self.many_to_many_fields.discard(name)
|
|
729
|
+
self.backward_foreign_key_fields.discard(name)
|
|
730
|
+
self.backward_one_to_one_fields.discard(name)
|
|
731
|
+
self.foreign_key_fields.discard(name)
|
|
732
|
+
self.one_to_one_fields.discard(name)
|
|
733
|
+
self.foreign_key_shadow_columns.pop(name, None)
|
|
734
|
+
LookupInfoBuilder.forget_descriptions()
|
|
735
|
+
if isinstance(self._model.__dict__.get(name), property):
|
|
736
|
+
delattr(self._model, name)
|
|
737
|
+
Caches.forget_model_caches((self._model,))
|
|
738
|
+
self.finalise_fields()
|
|
739
|
+
|
|
740
|
+
def check_not_swapped(self) -> None:
|
|
741
|
+
"""
|
|
742
|
+
Raises:
|
|
743
|
+
ConfigurationError: This model is swapped for another one by its ``swappable`` setting.
|
|
744
|
+
"""
|
|
745
|
+
if self.swapped is not None:
|
|
746
|
+
raise ConfigurationError(
|
|
747
|
+
f"{self.full_name!r} has been swapped for {self.swapped!r} by the {self.swappable} setting - "
|
|
748
|
+
f"query {self.swapped!r} instead"
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
@property
|
|
752
|
+
def connection(self) -> DatabaseClient:
|
|
753
|
+
"""The client of the model's default connection, unrouted.
|
|
754
|
+
|
|
755
|
+
Raises:
|
|
756
|
+
ConfigurationError: No context is active, or the model has no default connection.
|
|
757
|
+
"""
|
|
758
|
+
if self.default_connection is None:
|
|
759
|
+
raise ConfigurationError(MISSING_DEFAULT_CONNECTION_MESSAGE.format(model_name=self._model.__name__))
|
|
760
|
+
return Connections.get(self.default_connection)
|
|
761
|
+
|
|
762
|
+
def check_tenant_client(self, client: DatabaseClient) -> None:
|
|
763
|
+
"""Checks a query of the model may run on a client - a ``Meta.tenant_schema`` model's on a
|
|
764
|
+
tenant schema's client, a model with a ``TenantCondition`` policy's in a transaction that set
|
|
765
|
+
its tenants. Called only when ``checks_tenant_client`` is set.
|
|
766
|
+
|
|
767
|
+
Args:
|
|
768
|
+
client: The client the query would run on.
|
|
769
|
+
|
|
770
|
+
Raises:
|
|
771
|
+
ConfigurationError: The connection has no ``tenant_schema_template`` /
|
|
772
|
+
``tenant_row_level_security``.
|
|
773
|
+
QueryError: No single tenant is active, or the query runs outside a transaction that set
|
|
774
|
+
its tenants.
|
|
775
|
+
"""
|
|
776
|
+
if self.tenant_schema and client.tenant_schema is None:
|
|
777
|
+
raise self.get_missing_tenant_schema_error(client)
|
|
778
|
+
if self.tenant_row_level_security and not getattr(client, "sets_tenants", False):
|
|
779
|
+
raise TenantRowLevelSecurity.get_missing_tenants_error(self._model, client)
|
|
780
|
+
|
|
781
|
+
def get_missing_tenant_schema_error(self, client: DatabaseClient) -> HareError:
|
|
782
|
+
"""The error of reaching a ``Meta.tenant_schema`` model's table through a client of no tenant.
|
|
783
|
+
|
|
784
|
+
Args:
|
|
785
|
+
client: The client the model's connection gave.
|
|
786
|
+
|
|
787
|
+
Returns:
|
|
788
|
+
ConfigurationError when the connection has no schema per tenant, else QueryError - no
|
|
789
|
+
single tenant is active.
|
|
790
|
+
"""
|
|
791
|
+
if client.tenant_schema_template is None:
|
|
792
|
+
return ConfigurationError(
|
|
793
|
+
f"{self._model.__name__} has Meta.tenant_schema, but its connection "
|
|
794
|
+
f"{self.default_connection!r} has no tenant_schema_template"
|
|
795
|
+
)
|
|
796
|
+
return QueryError(
|
|
797
|
+
f"{self._model.__name__} has Meta.tenant_schema - its table is reached inside "
|
|
798
|
+
"Tenancy.scope(tenant) of a single tenant"
|
|
799
|
+
)
|
|
800
|
+
|
|
801
|
+
@property
|
|
802
|
+
def ordering(self) -> tuple[tuple[str, Order], ...]:
|
|
803
|
+
"""``Meta.ordering`` as field paths and their directions, ``pk`` replaced by every primary key
|
|
804
|
+
column.
|
|
805
|
+
|
|
806
|
+
Raises:
|
|
807
|
+
ConfigurationError: The ordering names a field the model lacks.
|
|
808
|
+
"""
|
|
809
|
+
if not self._ordering_validated:
|
|
810
|
+
# Only the first segment of a path is checked, as finalise_fields() does; "pk" is always
|
|
811
|
+
# known.
|
|
812
|
+
unknown_fields = {
|
|
813
|
+
field_path
|
|
814
|
+
for field_path, _ in self._default_ordering
|
|
815
|
+
if field_path != "pk"
|
|
816
|
+
and field_path not in self.ordering_expressions
|
|
817
|
+
and field_path.partition("__")[0] not in self.fields
|
|
818
|
+
}
|
|
819
|
+
raise ConfigurationError(
|
|
820
|
+
f"Unknown fields {','.join(unknown_fields)} in default ordering for model {self._model.__name__}"
|
|
821
|
+
)
|
|
822
|
+
if self._default_ordering and any(field_name == "pk" for field_name, _ in self._default_ordering):
|
|
823
|
+
# Resolved here, not in finalise_fields(): self.primary_key_attribute is only final after
|
|
824
|
+
# build_meta(). "pk" orders by every primary key column.
|
|
825
|
+
self._default_ordering = tuple(
|
|
826
|
+
(ordering_field_name, order)
|
|
827
|
+
for field_name, order in self._default_ordering
|
|
828
|
+
for ordering_field_name in (self.primary_key_attribute_names if field_name == "pk" else (field_name,))
|
|
829
|
+
)
|
|
830
|
+
return self._default_ordering
|
|
831
|
+
|
|
832
|
+
def get_lookup_info(self, key: str) -> LookupInfo:
|
|
833
|
+
"""Describes a ``.filter()`` key of this model - the relations it crosses, the field it
|
|
834
|
+
compares, the lookup and the value the lookup takes - without building a query. Descriptions
|
|
835
|
+
are cached per key.
|
|
836
|
+
|
|
837
|
+
Args:
|
|
838
|
+
key: The filter key.
|
|
839
|
+
|
|
840
|
+
Returns:
|
|
841
|
+
The description.
|
|
842
|
+
|
|
843
|
+
Raises:
|
|
844
|
+
FieldError: The key names no field or relation, or a lookup its field doesn't have.
|
|
845
|
+
QueryError: A lookup other than equality, membership or ``isnull`` on a relation to a
|
|
846
|
+
composite key.
|
|
847
|
+
ConfigurationError: The model isn't bound yet (``is_bound``).
|
|
848
|
+
"""
|
|
849
|
+
self._check_bound()
|
|
850
|
+
return self._get_lookup_info(key)
|
|
851
|
+
|
|
852
|
+
def _get_lookup_info(self, key: str, label: str | None = None) -> LookupInfo:
|
|
853
|
+
"""``get_lookup_info()``, naming the key as ``label`` in an error.
|
|
854
|
+
|
|
855
|
+
Args:
|
|
856
|
+
key: The filter key.
|
|
857
|
+
label: What the key is named as in an error, ``Unknown filter param '<key>'`` by
|
|
858
|
+
default.
|
|
859
|
+
|
|
860
|
+
Returns:
|
|
861
|
+
The description.
|
|
862
|
+
"""
|
|
863
|
+
lookup_infos: dict[str, LookupInfo] | None = self.lookup_infos
|
|
864
|
+
if lookup_infos is None:
|
|
865
|
+
lookup_infos = LookupInfoBuilder.lookup_infos.get_model_bucket(self._model)
|
|
866
|
+
lookup_info = lookup_infos.get(key)
|
|
867
|
+
if lookup_info is None:
|
|
868
|
+
lookup_info = lookup_infos[key] = LookupInfoBuilder.get_lookup_info(self._model, key, label=label)
|
|
869
|
+
return lookup_info
|
|
870
|
+
|
|
871
|
+
def get_lookups(self, path: str, dialect: Dialect | None = None) -> dict[str, LookupInfo]:
|
|
872
|
+
"""Describes every lookup of a field path that a dialect runs.
|
|
873
|
+
|
|
874
|
+
Args:
|
|
875
|
+
path: A field or relation, after any relations (``author__name``, ``tags``, ``pk``).
|
|
876
|
+
dialect: The dialect - by default the one of the connection a query on the model runs
|
|
877
|
+
on now (``Model.get_connection()``).
|
|
878
|
+
|
|
879
|
+
Returns:
|
|
880
|
+
Each lookup's suffix after ``path`` (``""`` for plain equality, ``"icontains"``,
|
|
881
|
+
``"year__gte"``) to its description.
|
|
882
|
+
|
|
883
|
+
Raises:
|
|
884
|
+
FieldError: The path names no field or relation.
|
|
885
|
+
ConfigurationError: The model isn't bound yet (``is_bound``).
|
|
886
|
+
"""
|
|
887
|
+
self._check_bound()
|
|
888
|
+
if dialect is None:
|
|
889
|
+
dialect = self._model.get_connection().dialect
|
|
890
|
+
lookups_by_path = self.lookups_by_path
|
|
891
|
+
if lookups_by_path is None:
|
|
892
|
+
lookups_by_path = LookupInfoBuilder.lookups_by_path.get_model_bucket(self._model)
|
|
893
|
+
cache_key = (path, dialect)
|
|
894
|
+
lookups = lookups_by_path.get(cache_key)
|
|
895
|
+
if lookups is None:
|
|
896
|
+
lookups = lookups_by_path[cache_key] = LookupInfoBuilder.get_lookups(self._model, path, dialect)
|
|
897
|
+
return dict(lookups)
|
|
898
|
+
|
|
899
|
+
def get_ordering_info(self, name: str) -> OrderingInfo:
|
|
900
|
+
"""Describes an ``.order_by()`` name of this model - the relations it crosses and the
|
|
901
|
+
fields it orders by (every key field of a composite ``pk``, a forward relation's own key
|
|
902
|
+
column(s)), and the direction.
|
|
903
|
+
|
|
904
|
+
Args:
|
|
905
|
+
name: The ordering name, optionally with a leading ``-``.
|
|
906
|
+
|
|
907
|
+
Returns:
|
|
908
|
+
The description.
|
|
909
|
+
|
|
910
|
+
Raises:
|
|
911
|
+
FieldError: The name names no field or relation.
|
|
912
|
+
ConfigurationError: The model isn't bound yet (``is_bound``).
|
|
913
|
+
"""
|
|
914
|
+
self._check_bound()
|
|
915
|
+
ordering_infos: dict[str, OrderingInfo] | None = self.ordering_infos
|
|
916
|
+
if ordering_infos is None:
|
|
917
|
+
ordering_infos = LookupInfoBuilder.ordering_infos.get_model_bucket(self._model)
|
|
918
|
+
ordering_info = ordering_infos.get(name)
|
|
919
|
+
if ordering_info is None:
|
|
920
|
+
ordering_info = ordering_infos[name] = LookupInfoBuilder.get_ordering_info(self._model, name)
|
|
921
|
+
return ordering_info
|
|
922
|
+
|
|
923
|
+
def finalise_model(self) -> None:
|
|
924
|
+
"""Completes the model once every model is registered and its relations are wired: the field
|
|
925
|
+
sets, the relation fields declared lazily, the table options naming relation keys, and the checks
|
|
926
|
+
of the definition that need the fields."""
|
|
927
|
+
self.finalise_fields()
|
|
928
|
+
LookupInfoBuilder.forget_descriptions()
|
|
929
|
+
LazyRelationFields.generate_lazy_foreign_key_and_many_to_many_fields(self)
|
|
930
|
+
# The layout rows of the model are read by is built anew over its final fields.
|
|
931
|
+
HydrationLayout.layouts.forget_model(self._model)
|
|
932
|
+
self.table_options = tuple(options.with_relation_keys(self) for options in self.table_options)
|
|
933
|
+
ModelDefinitionChecks.validate_distinct_columns(self)
|
|
934
|
+
ModelDefinitionChecks.validate_triggers_fire_on_a_table(self)
|
|
935
|
+
ModelDefinitionChecks.check_index_expressions(self)
|
|
936
|
+
ModelDefinitionChecks.validate_soft_delete_field(self)
|
|
937
|
+
ModelDefinitionChecks.validate_tenant_field(self)
|
|
938
|
+
ModelDefinitionChecks.validate_schema(self)
|
|
939
|
+
ModelDefinitionChecks.validate_tenant_schema(self)
|
|
940
|
+
ModelDefinitionChecks.validate_tenant_row_level_security(self)
|
|
941
|
+
ModelDefinitionChecks.validate_policies_have_row_level_security(self)
|
|
942
|
+
ModelDefinitionChecks.validate_field_names(self)
|
|
943
|
+
ModelDefinitionChecks.validate_primary_key_values(self)
|
|
944
|
+
ModelDefinitionChecks.validate_latest_by_fields(self)
|
|
945
|
+
ModelDefinitionChecks.validate_optimistic_lock_field(self)
|
|
946
|
+
ModelDefinitionChecks.validate_index_fields(self)
|
|
947
|
+
ModelDefinitionChecks.validate_unique_indexes_do_not_collide_with_constraints(self)
|
|
948
|
+
ModelDefinitionChecks.validate_unnamed_unique_constraints_are_distinct(self)
|
|
949
|
+
ModelDefinitionChecks.validate_unnamed_indexes_are_distinct(self)
|
|
950
|
+
ModelDefinitionChecks.validate_declared_names_are_distinct(self)
|
|
951
|
+
ModelDefinitionChecks.validate_identifiers(self)
|
|
952
|
+
self.change_capture_needs = ChangeCapturing.build_needs(self)
|
|
953
|
+
self.setattr_hooks = None
|
|
954
|
+
self.instance_constructor = None
|
|
955
|
+
|
|
956
|
+
def get_setattr_hooks(self) -> frozenset[str]:
|
|
957
|
+
"""The attribute names ``Model.__setattr__`` does more than store, worked out once.
|
|
958
|
+
|
|
959
|
+
Returns:
|
|
960
|
+
The relations, their key columns, the soft-delete field and a generated primary key.
|
|
961
|
+
"""
|
|
962
|
+
if self.setattr_hooks is None:
|
|
963
|
+
# Imported here: the Model module imports this one.
|
|
964
|
+
from hare.models.model import Model
|
|
965
|
+
|
|
966
|
+
# What super().__setattr__() inside Model.__setattr__ reaches - object's, unless a class
|
|
967
|
+
# after Model in the model's MRO defines its own.
|
|
968
|
+
mro = self._model.__mro__
|
|
969
|
+
self.next_setattr = next(
|
|
970
|
+
klass.__dict__["__setattr__"]
|
|
971
|
+
for klass in mro[mro.index(Model) + 1 :]
|
|
972
|
+
if "__setattr__" in klass.__dict__
|
|
973
|
+
)
|
|
974
|
+
hooks = {*self.foreign_key_fields, *self.one_to_one_fields, *self.foreign_key_shadow_columns}
|
|
975
|
+
if self.soft_delete_field is not None:
|
|
976
|
+
hooks.add(self.soft_delete_field)
|
|
977
|
+
if self.generated_pk_field_name is not None:
|
|
978
|
+
hooks.add(self.generated_pk_field_name)
|
|
979
|
+
self.setattr_hooks = frozenset(hooks)
|
|
980
|
+
return self.setattr_hooks
|
|
981
|
+
|
|
982
|
+
def get_instance_constructor(self) -> Any:
|
|
983
|
+
"""The constructor of the model's new instances, built once.
|
|
984
|
+
|
|
985
|
+
Returns:
|
|
986
|
+
The ``rust.native.rows.ModelConstructor``; False when ``Model.__init__`` sets instances
|
|
987
|
+
up alone.
|
|
988
|
+
"""
|
|
989
|
+
if self.instance_constructor is None:
|
|
990
|
+
# Imported here: the module imports the Model module, which imports this one.
|
|
991
|
+
from hare.models.class_building.instance_constructors import InstanceConstructors
|
|
992
|
+
|
|
993
|
+
constructor = InstanceConstructors.build(self._model)
|
|
994
|
+
if constructor is None:
|
|
995
|
+
# Not known yet - worked out again on the next instance.
|
|
996
|
+
return False
|
|
997
|
+
self.instance_constructor = constructor
|
|
998
|
+
return self.instance_constructor
|
|
999
|
+
|
|
1000
|
+
def finalise_fields(self) -> None:
|
|
1001
|
+
"""Computes what is derived from the model's fields once they are all known: the columns, the
|
|
1002
|
+
field sets by type, and whether ``Meta.ordering`` names only fields the model has."""
|
|
1003
|
+
self.setattr_hooks = None
|
|
1004
|
+
self.instance_constructor = None
|
|
1005
|
+
self.db_fields = tuple(dict.fromkeys(self.fields_db_projection.values()))
|
|
1006
|
+
self.fields = set(self.fields_map.keys())
|
|
1007
|
+
self.fields_db_projection_reverse = {value: key for key, value in self.fields_db_projection.items()}
|
|
1008
|
+
self.fetch_fields = (
|
|
1009
|
+
self.many_to_many_fields
|
|
1010
|
+
| self.backward_foreign_key_fields
|
|
1011
|
+
| self.foreign_key_fields
|
|
1012
|
+
| self.backward_one_to_one_fields
|
|
1013
|
+
| self.one_to_one_fields
|
|
1014
|
+
)
|
|
1015
|
+
# Precomputed once here rather than recomputed on every DirtyFields.snapshot_dirty_fields()/
|
|
1016
|
+
# get_dirty_fields()/clone() call - fields_map/fetch_fields are both fixed once fields
|
|
1017
|
+
# are finalised, never per-instance.
|
|
1018
|
+
self.direct_fields = frozenset(self.fields_map.keys() - self.fetch_fields)
|
|
1019
|
+
# The fields read once for what each list below takes of them - every model's fields are
|
|
1020
|
+
# finalised again as relations are added.
|
|
1021
|
+
sensitive_fields: list[str] = []
|
|
1022
|
+
blind_index_fields: dict[str, str] = {}
|
|
1023
|
+
generated_fields: list[str] = []
|
|
1024
|
+
computed_field_names: list[str] = []
|
|
1025
|
+
db_default_columns: list[str] = []
|
|
1026
|
+
fields_map = self.fields_map
|
|
1027
|
+
for name, field in fields_map.items():
|
|
1028
|
+
if field.sensitive:
|
|
1029
|
+
sensitive_fields.append(name)
|
|
1030
|
+
blind_index_source_field_name = getattr(field, "blind_index_source_field_name", None)
|
|
1031
|
+
if blind_index_source_field_name in fields_map:
|
|
1032
|
+
blind_index_fields[blind_index_source_field_name] = name
|
|
1033
|
+
if field.generated:
|
|
1034
|
+
generated_fields.append(field.source_field or field.model_field_name)
|
|
1035
|
+
if not field.pk:
|
|
1036
|
+
computed_field_names.append(name)
|
|
1037
|
+
elif field.has_db_default():
|
|
1038
|
+
db_default_columns.append(field.source_field or field.model_field_name)
|
|
1039
|
+
self.sensitive_fields = frozenset(sensitive_fields)
|
|
1040
|
+
self.blind_index_fields = blind_index_fields
|
|
1041
|
+
self.generated_db_fields = tuple(generated_fields)
|
|
1042
|
+
self.computed_field_names = frozenset(computed_field_names)
|
|
1043
|
+
self.recomputed_db_fields = tuple(column for column in generated_fields if column != self.db_pk_column)
|
|
1044
|
+
# Computed once, not per hydrated row. A composite primary key is never generated.
|
|
1045
|
+
self.default_custom_generated_pk = not isinstance(self.primary_key_attribute, tuple) and (
|
|
1046
|
+
self.db_pk_column not in self.generated_db_fields
|
|
1047
|
+
)
|
|
1048
|
+
|
|
1049
|
+
self.generated_pk_field_name = (
|
|
1050
|
+
self.primary_key_attribute
|
|
1051
|
+
if isinstance(self.primary_key_attribute, str) and self.pk is not None and self.pk.generated
|
|
1052
|
+
else None
|
|
1053
|
+
)
|
|
1054
|
+
|
|
1055
|
+
self.db_default_db_columns = tuple(db_default_columns)
|
|
1056
|
+
|
|
1057
|
+
self._ordering_validated = True
|
|
1058
|
+
for field_name, _ in self._default_ordering:
|
|
1059
|
+
# "pk" is never a real key in self.fields (only QuerySet.filter()/get() special-case
|
|
1060
|
+
# that alias) - resolving it to the real primary_key_attribute name is deferred to the `ordering`
|
|
1061
|
+
# property itself (see its own comment), so it must not be flagged unknown here.
|
|
1062
|
+
if (
|
|
1063
|
+
field_name != "pk"
|
|
1064
|
+
and field_name not in self.ordering_expressions
|
|
1065
|
+
and field_name.partition("__")[0] not in self.fields
|
|
1066
|
+
):
|
|
1067
|
+
self._ordering_validated = False
|
|
1068
|
+
break
|
|
1069
|
+
|
|
1070
|
+
def get_hydration_layout(self, connection: DatabaseClient) -> HydrationLayout:
|
|
1071
|
+
"""How the model's rows are read on ``connection``.
|
|
1072
|
+
|
|
1073
|
+
Args:
|
|
1074
|
+
connection: The connection the rows are read on.
|
|
1075
|
+
|
|
1076
|
+
Returns:
|
|
1077
|
+
The layout.
|
|
1078
|
+
"""
|
|
1079
|
+
layouts: dict[tuple[frozenset[type], Dialect], HydrationLayout] | None = self.hydration_layouts
|
|
1080
|
+
if layouts is None:
|
|
1081
|
+
layouts = HydrationLayout.layouts.get_model_bucket(self._model)
|
|
1082
|
+
key = (connection.native_python_types, connection.dialect)
|
|
1083
|
+
layout = layouts.get(key)
|
|
1084
|
+
if layout is None:
|
|
1085
|
+
layout = layouts[key] = HydrationLayout.build(self, connection)
|
|
1086
|
+
return layout
|
|
1087
|
+
|
|
1088
|
+
@staticmethod
|
|
1089
|
+
def _get_indexes(meta: type[Model.Meta] | None) -> tuple[tuple[str, ...] | Index, ...]:
|
|
1090
|
+
"""``Meta.indexes`` as a tuple of entries - a single list of field names is one entry. The
|
|
1091
|
+
entries are checked once the model's fields are known.
|
|
1092
|
+
|
|
1093
|
+
Args:
|
|
1094
|
+
meta: The model's Meta.
|
|
1095
|
+
|
|
1096
|
+
Returns:
|
|
1097
|
+
The entries; empty without the option.
|
|
1098
|
+
"""
|
|
1099
|
+
indexes = getattr(meta, ModelOption.INDEXES.value, ())
|
|
1100
|
+
if indexes and isinstance(indexes, (list, tuple)) and isinstance(indexes[0], str):
|
|
1101
|
+
indexes = (indexes,)
|
|
1102
|
+
return indexes
|
|
1103
|
+
|
|
1104
|
+
@staticmethod
|
|
1105
|
+
def _get_latest_by_fields(meta: type[Model.Meta] | None) -> tuple[str, ...]:
|
|
1106
|
+
"""``Meta.get_latest_by`` as a tuple of field names.
|
|
1107
|
+
|
|
1108
|
+
Args:
|
|
1109
|
+
meta: The model's Meta.
|
|
1110
|
+
|
|
1111
|
+
Returns:
|
|
1112
|
+
The names, ``-`` before a descending one; empty without the option.
|
|
1113
|
+
|
|
1114
|
+
Raises:
|
|
1115
|
+
ConfigurationError: The option is neither a field name nor a sequence of them.
|
|
1116
|
+
"""
|
|
1117
|
+
declared = getattr(meta, ModelOption.GET_LATEST_BY, ())
|
|
1118
|
+
names = (declared,) if isinstance(declared, str) else declared
|
|
1119
|
+
if not isinstance(names, (list, tuple)) or not all(isinstance(name, str) and name for name in names):
|
|
1120
|
+
raise ConfigurationError(
|
|
1121
|
+
f"Meta.get_latest_by must be a field name or a sequence of field names, got {declared!r}"
|
|
1122
|
+
)
|
|
1123
|
+
return tuple(names)
|
|
1124
|
+
|
|
1125
|
+
def _prepare_default_ordering(self, meta: type[Model.Meta] | None) -> tuple[tuple[str, Order], ...]:
|
|
1126
|
+
"""``Meta.ordering`` as names and directions - an expression named by an alias of its own,
|
|
1127
|
+
kept in ``ordering_expressions``.
|
|
1128
|
+
|
|
1129
|
+
Args:
|
|
1130
|
+
meta: The model's ``Meta``.
|
|
1131
|
+
|
|
1132
|
+
Returns:
|
|
1133
|
+
The names and directions.
|
|
1134
|
+
"""
|
|
1135
|
+
orderings: list[tuple[str, Order]] = []
|
|
1136
|
+
for ordering in getattr(meta, ModelOption.ORDERING, ()):
|
|
1137
|
+
target, order = QuerySet._get_ordering_string(ordering)
|
|
1138
|
+
if not isinstance(target, str):
|
|
1139
|
+
alias = f"{META_ORDERING_ALIAS_PREFIX}{len(self.ordering_expressions)}"
|
|
1140
|
+
self.ordering_expressions[alias] = target
|
|
1141
|
+
target = alias
|
|
1142
|
+
orderings.append((target, order))
|
|
1143
|
+
return tuple(orderings)
|