hare-orm 0.9.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hare/__init__.py +47 -0
- hare/__main__.py +8 -0
- hare/classes/__init__.py +1 -0
- hare/classes/class_path.py +50 -0
- hare/classes/class_property.py +18 -0
- hare/classes/comparable_values.py +113 -0
- hare/classes/constants.py +11 -0
- hare/classes/declared_subclass.py +26 -0
- hare/classes/lazy_exports.py +56 -0
- hare/classes/shown_value_repr.py +21 -0
- hare/classes/value_descriptions.py +81 -0
- hare/cli/__init__.py +3 -0
- hare/cli/__main__.py +7 -0
- hare/cli/arg_parser_builder.py +344 -0
- hare/cli/commands/__init__.py +0 -0
- hare/cli/commands/database_shell_commands.py +56 -0
- hare/cli/commands/distributed_recovery_commands.py +86 -0
- hare/cli/commands/interactive_rename_questions.py +30 -0
- hare/cli/commands/migration_commands.py +579 -0
- hare/cli/commands/schema_commands.py +123 -0
- hare/cli/commands/stub_commands.py +52 -0
- hare/cli/config_locator.py +37 -0
- hare/cli/constants.py +24 -0
- hare/cli/context/__init__.py +9 -0
- hare/cli/context/cli_context.py +17 -0
- hare/cli/context/command_context.py +108 -0
- hare/cli/exceptions.py +9 -0
- hare/cli/hare_cli.py +111 -0
- hare/cli/output/__init__.py +1 -0
- hare/cli/output/output_formatter.py +145 -0
- hare/cli/output/terminal_colors.py +89 -0
- hare/cli/plugins/__init__.py +16 -0
- hare/cli/plugins/cli_command.py +43 -0
- hare/cli/plugins/cli_command_registry.py +144 -0
- hare/cli/plugins/loaded_cli_command.py +13 -0
- hare/cli/shell_launcher.py +95 -0
- hare/contrib/__init__.py +0 -0
- hare/contrib/application_lifecycle.py +157 -0
- hare/contrib/factories/__init__.py +39 -0
- hare/contrib/factories/constants.py +21 -0
- hare/contrib/factories/factory_reference.py +27 -0
- hare/contrib/factories/field_declarations/__init__.py +1 -0
- hare/contrib/factories/field_declarations/declaration.py +19 -0
- hare/contrib/factories/field_declarations/faker.py +49 -0
- hare/contrib/factories/field_declarations/iterator.py +36 -0
- hare/contrib/factories/field_declarations/lazy_attribute.py +35 -0
- hare/contrib/factories/field_declarations/lazy_function.py +22 -0
- hare/contrib/factories/field_declarations/many_to_many.py +40 -0
- hare/contrib/factories/field_declarations/post_declaration.py +22 -0
- hare/contrib/factories/field_declarations/related_factory.py +37 -0
- hare/contrib/factories/field_declarations/sequence.py +22 -0
- hare/contrib/factories/field_declarations/sub_factory.py +30 -0
- hare/contrib/factories/model_factory.py +284 -0
- hare/contrib/factories/trait.py +23 -0
- hare/contrib/frameworks/__init__.py +14 -0
- hare/contrib/frameworks/constants.py +45 -0
- hare/contrib/frameworks/error_answers.py +93 -0
- hare/contrib/frameworks/exceptions.py +19 -0
- hare/contrib/frameworks/fastapi/__init__.py +12 -0
- hare/contrib/frameworks/fastapi/constants.py +4 -0
- hare/contrib/frameworks/fastapi/hare_exception_handlers.py +103 -0
- hare/contrib/frameworks/fastapi/hare_fast_api.py +139 -0
- hare/contrib/frameworks/fastapi/middleware/__init__.py +7 -0
- hare/contrib/frameworks/fastapi/middleware/request_state_reset_middleware.py +27 -0
- hare/contrib/frameworks/fastapi/middleware/transaction_failing_handler.py +31 -0
- hare/contrib/frameworks/fastapi/middleware/transaction_middleware.py +72 -0
- hare/contrib/frameworks/fastapi/request_query_dependency.py +88 -0
- hare/contrib/frameworks/hare_lifecycle.py +50 -0
- hare/contrib/frameworks/health_routes.py +101 -0
- hare/contrib/frameworks/litestar/__init__.py +14 -0
- hare/contrib/frameworks/litestar/constants.py +18 -0
- hare/contrib/frameworks/litestar/hare_dto.py +194 -0
- hare/contrib/frameworks/litestar/hare_exception_handlers.py +77 -0
- hare/contrib/frameworks/litestar/hare_plugin.py +181 -0
- hare/contrib/frameworks/litestar/hare_transfer_function_factory.py +38 -0
- hare/contrib/frameworks/litestar/middleware/__init__.py +7 -0
- hare/contrib/frameworks/litestar/middleware/request_state_reset_middleware.py +23 -0
- hare/contrib/frameworks/litestar/middleware/transaction_middleware.py +35 -0
- hare/contrib/frameworks/litestar/request_query_di_plugin.py +96 -0
- hare/contrib/frameworks/pages/__init__.py +22 -0
- hare/contrib/frameworks/pages/cursor_page_schema.py +25 -0
- hare/contrib/frameworks/pages/page_schema.py +25 -0
- hare/contrib/frameworks/pages/scroll_page_schema.py +23 -0
- hare/contrib/frameworks/parameter_annotation.py +110 -0
- hare/contrib/frameworks/request_state.py +16 -0
- hare/contrib/frameworks/request_transaction.py +186 -0
- hare/contrib/frameworks/robyn/__init__.py +13 -0
- hare/contrib/frameworks/robyn/application/__init__.py +11 -0
- hare/contrib/frameworks/robyn/application/hare_robyn.py +199 -0
- hare/contrib/frameworks/robyn/application/hare_sub_router.py +50 -0
- hare/contrib/frameworks/robyn/constants.py +32 -0
- hare/contrib/frameworks/robyn/hare_exception_handlers.py +128 -0
- hare/contrib/frameworks/robyn/hare_open_api.py +91 -0
- hare/contrib/frameworks/robyn/route_handler.py +198 -0
- hare/contrib/mypy/__init__.py +11 -0
- hare/contrib/mypy/annotation_types.py +170 -0
- hare/contrib/mypy/constants.py +83 -0
- hare/contrib/mypy/enums.py +18 -0
- hare/contrib/mypy/field_names_check.py +222 -0
- hare/contrib/mypy/filter_arguments_check.py +129 -0
- hare/contrib/mypy/hare_mypy_plugin.py +166 -0
- hare/contrib/mypy/instance_attribute_types.py +137 -0
- hare/contrib/mypy/model_registry.py +127 -0
- hare/contrib/mypy/mypy_types.py +383 -0
- hare/contrib/mypy/queryset_extension_methods.py +109 -0
- hare/contrib/mypy/values_row_types.py +146 -0
- hare/contrib/mypy/write_arguments_check.py +159 -0
- hare/contrib/notify/__init__.py +5 -0
- hare/contrib/notify/constants.py +14 -0
- hare/contrib/notify/notification_listener.py +317 -0
- hare/contrib/opentelemetry/__init__.py +16 -0
- hare/contrib/opentelemetry/constants.py +31 -0
- hare/contrib/opentelemetry/open_telemetry_instrumentor.py +60 -0
- hare/contrib/opentelemetry/pool_metric_instruments.py +210 -0
- hare/contrib/opentelemetry/query_spans.py +69 -0
- hare/contrib/outbox/__init__.py +65 -0
- hare/contrib/outbox/broker_arguments.py +40 -0
- hare/contrib/outbox/brokers/__init__.py +1 -0
- hare/contrib/outbox/brokers/rabbitmq_connection.py +55 -0
- hare/contrib/outbox/brokers/redis_connection.py +42 -0
- hare/contrib/outbox/capture/__init__.py +6 -0
- hare/contrib/outbox/capture/change_capture.py +366 -0
- hare/contrib/outbox/capture/change_extension.py +22 -0
- hare/contrib/outbox/capture/constants.py +19 -0
- hare/contrib/outbox/constants.py +31 -0
- hare/contrib/outbox/deliveries/__init__.py +22 -0
- hare/contrib/outbox/deliveries/callable_delivery.py +44 -0
- hare/contrib/outbox/deliveries/constants.py +19 -0
- hare/contrib/outbox/deliveries/kafka_delivery.py +124 -0
- hare/contrib/outbox/deliveries/outbox_delivery.py +106 -0
- hare/contrib/outbox/deliveries/rabbitmq_delivery.py +63 -0
- hare/contrib/outbox/deliveries/redis_streams_delivery.py +110 -0
- hare/contrib/outbox/deliveries/topic_router.py +103 -0
- hare/contrib/outbox/deliveries/webhook_delivery.py +106 -0
- hare/contrib/outbox/exceptions.py +7 -0
- hare/contrib/outbox/outbox_event.py +362 -0
- hare/contrib/outbox/outbox_json_encoding.py +87 -0
- hare/contrib/outbox/relay/__init__.py +7 -0
- hare/contrib/outbox/relay/constants.py +41 -0
- hare/contrib/outbox/relay/declarations.py +76 -0
- hare/contrib/outbox/relay/outbox_backlog.py +18 -0
- hare/contrib/outbox/relay/outbox_relay.py +646 -0
- hare/contrib/outbox/wakeups/__init__.py +20 -0
- hare/contrib/outbox/wakeups/constants.py +20 -0
- hare/contrib/outbox/wakeups/in_process_wakeup.py +17 -0
- hare/contrib/outbox/wakeups/kafka_wakeup.py +123 -0
- hare/contrib/outbox/wakeups/listen_notify_wakeup.py +75 -0
- hare/contrib/outbox/wakeups/outbox_wakeup.py +202 -0
- hare/contrib/outbox/wakeups/rabbitmq_wakeup.py +64 -0
- hare/contrib/outbox/wakeups/redis_wakeup.py +53 -0
- hare/contrib/pydantic/__init__.py +12 -0
- hare/contrib/pydantic/constants.py +41 -0
- hare/contrib/pydantic/creation/__init__.py +1 -0
- hare/contrib/pydantic/creation/computed_field_schemas.py +77 -0
- hare/contrib/pydantic/creation/data_field_schemas.py +230 -0
- hare/contrib/pydantic/creation/field_descriptions.py +17 -0
- hare/contrib/pydantic/creation/field_map.py +138 -0
- hare/contrib/pydantic/creation/generic_foreign_key_schemas.py +136 -0
- hare/contrib/pydantic/creation/generic_foreign_key_tag_reader.py +35 -0
- hare/contrib/pydantic/creation/model_annotations.py +44 -0
- hare/contrib/pydantic/creation/pydantic_creators.py +163 -0
- hare/contrib/pydantic/creation/pydantic_meta_reading.py +134 -0
- hare/contrib/pydantic/creation/pydantic_model_creator.py +434 -0
- hare/contrib/pydantic/creation/relation_field_schemas.py +269 -0
- hare/contrib/pydantic/descriptions/__init__.py +5 -0
- hare/contrib/pydantic/descriptions/computed_field_description.py +12 -0
- hare/contrib/pydantic/descriptions/model_description.py +69 -0
- hare/contrib/pydantic/descriptions/pydantic_meta_data.py +144 -0
- hare/contrib/pydantic/enums.py +12 -0
- hare/contrib/pydantic/models/__init__.py +9 -0
- hare/contrib/pydantic/models/pydantic_list_model.py +34 -0
- hare/contrib/pydantic/models/pydantic_model.py +292 -0
- hare/contrib/pytest/__init__.py +17 -0
- hare/contrib/pytest/constants.py +26 -0
- hare/contrib/pytest/hare_fixtures.py +112 -0
- hare/contrib/pytest/missing_pytest_asyncio_fixtures.py +34 -0
- hare/contrib/pytest/plugin.py +49 -0
- hare/contrib/repeated_queries/__init__.py +19 -0
- hare/contrib/repeated_queries/constants.py +10 -0
- hare/contrib/repeated_queries/repeated_query_collection.py +116 -0
- hare/contrib/repeated_queries/repeated_query_detector.py +227 -0
- hare/contrib/repeated_queries/repeated_query_entry.py +20 -0
- hare/contrib/repeated_queries/repeated_query_report.py +31 -0
- hare/contrib/repeated_queries/shape_stats.py +18 -0
- hare/contrib/request_query/__init__.py +71 -0
- hare/contrib/request_query/bounds/__init__.py +6 -0
- hare/contrib/request_query/bounds/constants.py +4 -0
- hare/contrib/request_query/bounds/lookup_pair_bounds.py +40 -0
- hare/contrib/request_query/bounds/parameter_bounds.py +41 -0
- hare/contrib/request_query/bounds/range_bounds.py +30 -0
- hare/contrib/request_query/constants.py +45 -0
- hare/contrib/request_query/declaration/__init__.py +6 -0
- hare/contrib/request_query/declaration/constants.py +19 -0
- hare/contrib/request_query/declaration/declaration_builder.py +515 -0
- hare/contrib/request_query/declaration/filter_declaration.py +25 -0
- hare/contrib/request_query/declaration/filter_parameter_builder.py +201 -0
- hare/contrib/request_query/declaration/parameter_filter.py +17 -0
- hare/contrib/request_query/declaration/request_query_declaration.py +138 -0
- hare/contrib/request_query/declaration/request_query_parameters.py +54 -0
- hare/contrib/request_query/declaration/request_query_registry.py +90 -0
- hare/contrib/request_query/descriptions/__init__.py +11 -0
- hare/contrib/request_query/descriptions/constants.py +11 -0
- hare/contrib/request_query/descriptions/parameter_choice.py +17 -0
- hare/contrib/request_query/descriptions/parameter_describer.py +240 -0
- hare/contrib/request_query/descriptions/parameter_description.py +66 -0
- hare/contrib/request_query/descriptions/relation_description.py +30 -0
- hare/contrib/request_query/enums.py +69 -0
- hare/contrib/request_query/exceptions.py +52 -0
- hare/contrib/request_query/options/__init__.py +33 -0
- hare/contrib/request_query/options/constants.py +25 -0
- hare/contrib/request_query/options/deleted_config.py +90 -0
- hare/contrib/request_query/options/fields_config.py +55 -0
- hare/contrib/request_query/options/filter.py +34 -0
- hare/contrib/request_query/options/filter_field.py +81 -0
- hare/contrib/request_query/options/in_path.py +12 -0
- hare/contrib/request_query/options/include_config.py +56 -0
- hare/contrib/request_query/options/latest_versions.py +71 -0
- hare/contrib/request_query/options/no_filter.py +11 -0
- hare/contrib/request_query/options/ordering_config.py +81 -0
- hare/contrib/request_query/options/parameter_field.py +27 -0
- hare/contrib/request_query/options/request_option.py +152 -0
- hare/contrib/request_query/options/search_config.py +83 -0
- hare/contrib/request_query/paginations/__init__.py +1 -0
- hare/contrib/request_query/paginations/base_offset_pagination.py +78 -0
- hare/contrib/request_query/paginations/constants.py +17 -0
- hare/contrib/request_query/paginations/cursor.py +83 -0
- hare/contrib/request_query/paginations/cursor_pagination.py +184 -0
- hare/contrib/request_query/paginations/offset_pagination.py +31 -0
- hare/contrib/request_query/paginations/pagination.py +120 -0
- hare/contrib/request_query/paginations/scroll_pagination.py +31 -0
- hare/contrib/request_query/request_query.py +1259 -0
- hare/contrib/request_query/results/__init__.py +11 -0
- hare/contrib/request_query/results/cursor_page.py +25 -0
- hare/contrib/request_query/results/page.py +25 -0
- hare/contrib/request_query/results/scroll_page.py +23 -0
- hare/contrib/request_query/row_changes.py +80 -0
- hare/contrib/request_query/types/__init__.py +15 -0
- hare/contrib/request_query/types/comma_separated.py +46 -0
- hare/contrib/request_query/types/constants.py +16 -0
- hare/contrib/request_query/types/generic_target.py +87 -0
- hare/contrib/request_query/types/key_columns.py +60 -0
- hare/contrib/request_query/types/text_parameter.py +18 -0
- hare/contrib/request_query/value_annotation.py +216 -0
- hare/contrib/request_query/value_counter.py +115 -0
- hare/contrib/request_query/value_target.py +50 -0
- hare/contrib/taskiq/__init__.py +15 -0
- hare/contrib/taskiq/constants.py +23 -0
- hare/contrib/taskiq/hare_taskiq.py +76 -0
- hare/contrib/taskiq/hare_taskiq_middleware.py +195 -0
- hare/contrib/taskiq/running_task.py +29 -0
- hare/contrib/taskiq/task_tenant_labels.py +102 -0
- hare/contrib/taskiq/taskiq_delivery.py +117 -0
- hare/contrib/test/__init__.py +39 -0
- hare/contrib/test/conditions/__init__.py +10 -0
- hare/contrib/test/conditions/condition.py +11 -0
- hare/contrib/test/conditions/in_condition.py +21 -0
- hare/contrib/test/conditions/not_eq.py +18 -0
- hare/contrib/test/conditions/not_in.py +21 -0
- hare/contrib/test/constants.py +18 -0
- hare/contrib/test/databases/__init__.py +1 -0
- hare/contrib/test/databases/kept_test_schema.py +51 -0
- hare/contrib/test/databases/model_truncation.py +128 -0
- hare/contrib/test/databases/reusable_test_databases.py +244 -0
- hare/contrib/test/databases/rollback_isolation.py +149 -0
- hare/contrib/test/databases/temporary_databases.py +118 -0
- hare/contrib/test/exceptions.py +5 -0
- hare/contrib/test/features/__init__.py +1 -0
- hare/contrib/test/features/feature_conditions.py +65 -0
- hare/contrib/test/features/feature_requirements.py +84 -0
- hare/contrib/test/isolated_contexts.py +144 -0
- hare/contrib/test/queries/__init__.py +1 -0
- hare/contrib/test/queries/query_counter.py +35 -0
- hare/contrib/test/queries/query_counting.py +59 -0
- hare/contrib/versioning/__init__.py +7 -0
- hare/contrib/versioning/constants.py +5 -0
- hare/contrib/versioning/versioned_model.py +139 -0
- hare/core/__init__.py +4 -0
- hare/core/apps/__init__.py +8 -0
- hare/core/apps/apps.py +693 -0
- hare/core/apps/cross_connection_checks.py +76 -0
- hare/core/apps/model_connection_checks.py +199 -0
- hare/core/apps/model_discovery.py +142 -0
- hare/core/apps/relation_linking.py +773 -0
- hare/core/apps/swappable_models.py +118 -0
- hare/core/apps/table_names.py +39 -0
- hare/core/caching/__init__.py +1 -0
- hare/core/caching/cache.py +426 -0
- hare/core/caching/caches.py +58 -0
- hare/core/caching/constants.py +13 -0
- hare/core/caching/declarations.py +8 -0
- hare/core/caching/forgettable_cache.py +16 -0
- hare/core/caching/model_cache.py +138 -0
- hare/core/config/__init__.py +25 -0
- hare/core/config/app_config.py +64 -0
- hare/core/config/cli_config.py +38 -0
- hare/core/config/config_secrets.py +101 -0
- hare/core/config/config_section.py +37 -0
- hare/core/config/connection_config.py +69 -0
- hare/core/config/constants.py +17 -0
- hare/core/config/db_url_config.py +24 -0
- hare/core/config/hare_config.py +407 -0
- hare/core/config/migration_safety_config.py +54 -0
- hare/core/config/migrations_config.py +72 -0
- hare/core/connections/__init__.py +1 -0
- hare/core/connections/connection_handler.py +457 -0
- hare/core/connections/connection_token.py +36 -0
- hare/core/connections/connections.py +133 -0
- hare/core/constants.py +40 -0
- hare/core/hare.py +205 -0
- hare/core/hare_context.py +854 -0
- hare/core/hare_meta.py +18 -0
- hare/core/log.py +6 -0
- hare/core/registries.py +22 -0
- hare/core/routing/__init__.py +5 -0
- hare/core/routing/connection_router.py +109 -0
- hare/core/routing/primary_reads.py +42 -0
- hare/core/routing/routing.py +28 -0
- hare/core/routing/written_connections.py +63 -0
- hare/ddl/__init__.py +57 -0
- hare/ddl/conditions/__init__.py +1 -0
- hare/ddl/conditions/constraint_condition.py +154 -0
- hare/ddl/conditions/exclusive_arc_condition.py +80 -0
- hare/ddl/conditions/tenant_condition.py +48 -0
- hare/ddl/conditions/trigger_condition.py +44 -0
- hare/ddl/constants.py +68 -0
- hare/ddl/constraints/__init__.py +7 -0
- hare/ddl/constraints/check_constraint.py +38 -0
- hare/ddl/constraints/exclusion_constraint.py +116 -0
- hare/ddl/constraints/foreign_key_constraint.py +39 -0
- hare/ddl/constraints/unique_constraint.py +150 -0
- hare/ddl/ddl_term_sql.py +45 -0
- hare/ddl/declared_names.py +47 -0
- hare/ddl/enums.py +117 -0
- hare/ddl/expressions/__init__.py +0 -0
- hare/ddl/expressions/declared_expressions.py +102 -0
- hare/ddl/expressions/expression_field_renaming.py +150 -0
- hare/ddl/generated_names.py +87 -0
- hare/ddl/indexes/__init__.py +11 -0
- hare/ddl/indexes/index.py +531 -0
- hare/ddl/indexes/ordered_index_key.py +27 -0
- hare/ddl/indexes/partial_index.py +75 -0
- hare/ddl/raw_sql_term.py +44 -0
- hare/ddl/schema_objects/__init__.py +12 -0
- hare/ddl/schema_objects/database_function.py +91 -0
- hare/ddl/schema_objects/database_sequence.py +87 -0
- hare/ddl/schema_objects/dictionary.py +69 -0
- hare/ddl/schema_objects/enum_type.py +24 -0
- hare/ddl/schema_objects/materialized_view.py +52 -0
- hare/ddl/schema_objects/named_schema_object.py +24 -0
- hare/ddl/schema_objects/trigger.py +151 -0
- hare/ddl/schema_objects/view.py +132 -0
- hare/ddl/security/__init__.py +8 -0
- hare/ddl/security/grant.py +106 -0
- hare/ddl/security/policy.py +92 -0
- hare/ddl/table_options.py +364 -0
- hare/dialects/__init__.py +0 -0
- hare/dialects/base/__init__.py +0 -0
- hare/dialects/base/clauses/__init__.py +1 -0
- hare/dialects/base/clauses/enums.py +37 -0
- hare/dialects/base/clauses/limit_returning_conflict_query_clauses.py +194 -0
- hare/dialects/base/clauses/merge_when_sql.py +24 -0
- hare/dialects/base/clauses/query_clauses.py +636 -0
- hare/dialects/base/client/__init__.py +16 -0
- hare/dialects/base/client/connect_failure_reports.py +49 -0
- hare/dialects/base/client/connection_ping.py +48 -0
- hare/dialects/base/client/connection_wrapper.py +126 -0
- hare/dialects/base/client/constants.py +41 -0
- hare/dialects/base/client/database_client.py +1187 -0
- hare/dialects/base/client/declarations.py +37 -0
- hare/dialects/base/client/driver_statement_log_filter.py +33 -0
- hare/dialects/base/client/password_provider.py +144 -0
- hare/dialects/base/client/pool/__init__.py +1 -0
- hare/dialects/base/client/pool/pool_connection_wrapper.py +37 -0
- hare/dialects/base/client/pool/pool_statistics.py +84 -0
- hare/dialects/base/client/pool/pool_timeouts.py +48 -0
- hare/dialects/base/client/transaction_client.py +621 -0
- hare/dialects/base/client/transaction_lifecycle/__init__.py +1 -0
- hare/dialects/base/client/transaction_lifecycle/pending_statements.py +74 -0
- hare/dialects/base/client/transaction_lifecycle/transaction_callbacks.py +128 -0
- hare/dialects/base/client/transaction_lifecycle/transaction_ending.py +360 -0
- hare/dialects/base/connection/__init__.py +1 -0
- hare/dialects/base/connection/connection_option.py +142 -0
- hare/dialects/base/connection/connection_options.py +69 -0
- hare/dialects/base/connection/constants.py +27 -0
- hare/dialects/base/connection/db_url_config_generator.py +194 -0
- hare/dialects/base/connection/driver.py +136 -0
- hare/dialects/base/constants.py +72 -0
- hare/dialects/base/dialect.py +360 -0
- hare/dialects/base/features.py +369 -0
- hare/dialects/base/literals/__init__.py +1 -0
- hare/dialects/base/literals/constants.py +12 -0
- hare/dialects/base/literals/sql_literals.py +254 -0
- hare/dialects/base/lookups/__init__.py +1 -0
- hare/dialects/base/lookups/filter_operators.py +171 -0
- hare/dialects/base/migration_safety/__init__.py +12 -0
- hare/dialects/base/migration_safety/add_field_backfill_rule.py +37 -0
- hare/dialects/base/migration_safety/alter_field_rewrite_rule.py +39 -0
- hare/dialects/base/migration_safety/constants.py +4 -0
- hare/dialects/base/migration_safety/delete_model_rule.py +33 -0
- hare/dialects/base/migration_safety/migration_safety_rule.py +45 -0
- hare/dialects/base/migration_safety/migration_safety_rules.py +72 -0
- hare/dialects/base/migration_safety/remove_field_rule.py +31 -0
- hare/dialects/base/migration_safety/rename_field_rule.py +41 -0
- hare/dialects/base/migration_safety/rename_model_rule.py +42 -0
- hare/dialects/base/migration_safety/run_sql_rule.py +27 -0
- hare/dialects/base/migration_safety/schema_change_with_run_python_rule.py +49 -0
- hare/dialects/base/parameters/__init__.py +1 -0
- hare/dialects/base/parameters/large_in_list.py +147 -0
- hare/dialects/base/parameters/sql_parameters.py +185 -0
- hare/dialects/base/renderers/__init__.py +7 -0
- hare/dialects/base/renderers/checked_term_renderers.py +61 -0
- hare/dialects/base/renderers/json_renderers.py +60 -0
- hare/dialects/base/renderers/term_renderers.py +508 -0
- hare/dialects/base/results/__init__.py +9 -0
- hare/dialects/base/results/described_result.py +22 -0
- hare/dialects/base/results/statement_result.py +53 -0
- hare/dialects/base/schema/__init__.py +0 -0
- hare/dialects/base/schema/base_schema_editor.py +1139 -0
- hare/dialects/base/schema/columns/__init__.py +1 -0
- hare/dialects/base/schema/columns/column_backfill.py +347 -0
- hare/dialects/base/schema/columns/column_conversion_check.py +51 -0
- hare/dialects/base/schema/columns/column_definitions.py +473 -0
- hare/dialects/base/schema/columns/column_narrowing_check.py +178 -0
- hare/dialects/base/schema/columns/column_renames.py +77 -0
- hare/dialects/base/schema/columns/column_type_changes.py +140 -0
- hare/dialects/base/schema/constants.py +30 -0
- hare/dialects/base/schema/constraints/__init__.py +1 -0
- hare/dialects/base/schema/constraints/constraint_names.py +45 -0
- hare/dialects/base/schema/constraints/constraint_statements.py +262 -0
- hare/dialects/base/schema/data/__init__.py +9 -0
- hare/dialects/base/schema/data/model_sql_data.py +41 -0
- hare/dialects/base/schema/data/referencing_key_columns.py +24 -0
- hare/dialects/base/schema/indexes/__init__.py +1 -0
- hare/dialects/base/schema/indexes/generated_index_names.py +180 -0
- hare/dialects/base/schema/indexes/index_statements.py +397 -0
- hare/dialects/base/schema/relations/__init__.py +1 -0
- hare/dialects/base/schema/relations/foreign_key_rebuild.py +480 -0
- hare/dialects/base/schema/relations/many_to_many_through_tables.py +285 -0
- hare/dialects/base/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/base/schema/runtime_statements/table_clearing.py +54 -0
- hare/dialects/base/schema/runtime_statements/table_locks.py +34 -0
- hare/dialects/base/schema/runtime_statements/tenant_conditions.py +71 -0
- hare/dialects/base/schema/schema_editor_part.py +34 -0
- hare/dialects/base/schema/schema_objects/__init__.py +1 -0
- hare/dialects/base/schema/schema_objects/database_functions.py +74 -0
- hare/dialects/base/schema/schema_objects/dictionaries.py +75 -0
- hare/dialects/base/schema/schema_objects/enum_types.py +88 -0
- hare/dialects/base/schema/schema_objects/extensions.py +69 -0
- hare/dialects/base/schema/schema_objects/grants.py +49 -0
- hare/dialects/base/schema/schema_objects/materialized_views.py +111 -0
- hare/dialects/base/schema/schema_objects/row_level_security_policies.py +82 -0
- hare/dialects/base/schema/schema_objects/schemas.py +65 -0
- hare/dialects/base/schema/schema_objects/sequences.py +95 -0
- hare/dialects/base/schema/schema_objects/views.py +81 -0
- hare/dialects/base/schema/shadow/__init__.py +0 -0
- hare/dialects/base/schema/shadow/shadow_database.py +77 -0
- hare/dialects/base/schema/tables/__init__.py +1 -0
- hare/dialects/base/schema/tables/table_comments.py +92 -0
- hare/dialects/base/schema/tables/table_creation.py +742 -0
- hare/dialects/base/schema/tables/table_partitions.py +78 -0
- hare/dialects/base/schema/tables/table_rebuild.py +268 -0
- hare/dialects/base/schema/triggers/__init__.py +1 -0
- hare/dialects/base/schema/triggers/trigger_statements.py +85 -0
- hare/dialects/base/search/__init__.py +1 -0
- hare/dialects/base/search/text_search.py +135 -0
- hare/dialects/base/sql_dialect.py +23 -0
- hare/dialects/base/transactions/__init__.py +1 -0
- hare/dialects/base/transactions/constants.py +5 -0
- hare/dialects/base/transactions/contexts/__init__.py +1 -0
- hare/dialects/base/transactions/contexts/joined_transaction_context.py +36 -0
- hare/dialects/base/transactions/contexts/nested_transaction_context.py +149 -0
- hare/dialects/base/transactions/contexts/non_transactional_context.py +32 -0
- hare/dialects/base/transactions/contexts/top_level_transaction_context.py +79 -0
- hare/dialects/base/transactions/contexts/transaction_context.py +148 -0
- hare/dialects/base/transactions/savepoints/__init__.py +1 -0
- hare/dialects/base/transactions/savepoints/nested_savepoint_lock.py +152 -0
- hare/dialects/base/transactions/savepoints/savepoint_span.py +51 -0
- hare/dialects/base/transactions/transaction_callback.py +32 -0
- hare/dialects/base/transactions/transaction_statements.py +128 -0
- hare/dialects/base/transactions/two_phase_commit.py +134 -0
- hare/dialects/base/types/__init__.py +9 -0
- hare/dialects/base/types/type_mapping.py +63 -0
- hare/dialects/base/types/type_registry.py +395 -0
- hare/dialects/clickhouse/__init__.py +1 -0
- hare/dialects/clickhouse/clauses/__init__.py +1 -0
- hare/dialects/clickhouse/clauses/clickhouse_query_clauses.py +475 -0
- hare/dialects/clickhouse/clauses/constants.py +42 -0
- hare/dialects/clickhouse/clickhouse_dialect.py +260 -0
- hare/dialects/clickhouse/clickhouse_introspector.py +414 -0
- hare/dialects/clickhouse/clickhouse_table_options.py +727 -0
- hare/dialects/clickhouse/client/__init__.py +1 -0
- hare/dialects/clickhouse/client/clickhouse_client.py +913 -0
- hare/dialects/clickhouse/client/clickhouse_connection.py +30 -0
- hare/dialects/clickhouse/client/clickhouse_error_codes.py +26 -0
- hare/dialects/clickhouse/client/clickhouse_external_sets.py +109 -0
- hare/dialects/clickhouse/client/clickhouse_query_templates.py +79 -0
- hare/dialects/clickhouse/client/clickhouse_statement_result.py +15 -0
- hare/dialects/clickhouse/client/clickhouse_streamed_row.py +52 -0
- hare/dialects/clickhouse/client/clickhouse_transaction_client.py +188 -0
- hare/dialects/clickhouse/client/constants.py +211 -0
- hare/dialects/clickhouse/client/declarations.py +47 -0
- hare/dialects/clickhouse/cluster/__init__.py +0 -0
- hare/dialects/clickhouse/cluster/clickhouse_cluster.py +162 -0
- hare/dialects/clickhouse/cluster/clickhouse_cluster_statements.py +154 -0
- hare/dialects/clickhouse/cluster/constants.py +82 -0
- hare/dialects/clickhouse/connection/__init__.py +1 -0
- hare/dialects/clickhouse/connection/clickhouse_driver.py +40 -0
- hare/dialects/clickhouse/constants.py +226 -0
- hare/dialects/clickhouse/drivers/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/clickhouse_connect_driver.py +43 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_client.py +390 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_dynamic_type.py +76 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_totals_query.py +70 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_transaction_client.py +56 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_connect_whole_response_query.py +127 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/client/clickhouse_json_compact_values.py +96 -0
- hare/dialects/clickhouse/drivers/clickhouse_connect/constants.py +60 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/clickhouse_driver_driver.py +48 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/__init__.py +1 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_client.py +361 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_client_info.py +70 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_column_types.py +104 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_connections.py +189 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_decompressors.py +48 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_dynamic_column.py +51 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_library_client.py +239 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_library_connection.py +16 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_map_columns.py +49 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_moment_columns.py +85 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_query_result.py +24 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_row_stream.py +127 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_service_block_stream.py +95 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_settings.py +62 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_transaction_client.py +23 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_tuple_columns.py +38 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/client/clickhouse_driver_variant_column.py +76 -0
- hare/dialects/clickhouse/drivers/clickhouse_driver/constants.py +133 -0
- hare/dialects/clickhouse/drivers/clickhouse_shared_variant_values.py +878 -0
- hare/dialects/clickhouse/drivers/constants.py +143 -0
- hare/dialects/clickhouse/enums.py +38 -0
- hare/dialects/clickhouse/fields/__init__.py +43 -0
- hare/dialects/clickhouse/fields/clickhouse_date_field.py +32 -0
- hare/dialects/clickhouse/fields/clickhouse_datetime_field.py +162 -0
- hare/dialects/clickhouse/fields/clickhouse_integer_field.py +20 -0
- hare/dialects/clickhouse/fields/constants.py +31 -0
- hare/dialects/clickhouse/fields/declarations.py +81 -0
- hare/dialects/clickhouse/fields/dynamic_field.py +122 -0
- hare/dialects/clickhouse/fields/fixed_string_field.py +81 -0
- hare/dialects/clickhouse/fields/float32_field.py +39 -0
- hare/dialects/clickhouse/fields/low_cardinality_field.py +72 -0
- hare/dialects/clickhouse/fields/variant_field.py +174 -0
- hare/dialects/clickhouse/functions/__init__.py +39 -0
- hare/dialects/clickhouse/functions/aggregates/__init__.py +37 -0
- hare/dialects/clickhouse/functions/aggregates/arg_extremum.py +23 -0
- hare/dialects/clickhouse/functions/aggregates/declarations.py +120 -0
- hare/dialects/clickhouse/functions/aggregates/group_array.py +48 -0
- hare/dialects/clickhouse/functions/aggregates/median.py +18 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_aggregate.py +48 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_aggregate_function.py +45 -0
- hare/dialects/clickhouse/functions/aggregates/parametric_analytic_function.py +27 -0
- hare/dialects/clickhouse/functions/aggregates/quantile.py +74 -0
- hare/dialects/clickhouse/functions/aggregates/quantiles.py +58 -0
- hare/dialects/clickhouse/functions/aggregates/top_k.py +44 -0
- hare/dialects/clickhouse/functions/dict_get.py +199 -0
- hare/dialects/clickhouse/indexes/__init__.py +19 -0
- hare/dialects/clickhouse/indexes/bloom_filter_index.py +49 -0
- hare/dialects/clickhouse/indexes/clickhouse_index.py +145 -0
- hare/dialects/clickhouse/indexes/constants.py +14 -0
- hare/dialects/clickhouse/indexes/min_max_index.py +22 -0
- hare/dialects/clickhouse/indexes/ngram_bloom_filter_index.py +43 -0
- hare/dialects/clickhouse/indexes/set_index.py +35 -0
- hare/dialects/clickhouse/indexes/token_bloom_filter_index.py +60 -0
- hare/dialects/clickhouse/introspection/__init__.py +0 -0
- hare/dialects/clickhouse/introspection/clickhouse_check_constraints.py +40 -0
- hare/dialects/clickhouse/introspection/clickhouse_observed_table_options.py +280 -0
- hare/dialects/clickhouse/introspection/clickhouse_sql_parts.py +302 -0
- hare/dialects/clickhouse/introspection/clickhouse_type_parser.py +276 -0
- hare/dialects/clickhouse/introspection/constants.py +69 -0
- hare/dialects/clickhouse/keeper/__init__.py +0 -0
- hare/dialects/clickhouse/keeper/clickhouse_migration_lock.py +114 -0
- hare/dialects/clickhouse/keeper/constants.py +38 -0
- hare/dialects/clickhouse/keeper/keeper_codec.py +152 -0
- hare/dialects/clickhouse/keeper/keeper_session.py +213 -0
- hare/dialects/clickhouse/literals/__init__.py +1 -0
- hare/dialects/clickhouse/literals/clickhouse_literals.py +362 -0
- hare/dialects/clickhouse/lookups/__init__.py +0 -0
- hare/dialects/clickhouse/lookups/clickhouse_array_elements_key.py +32 -0
- hare/dialects/clickhouse/lookups/clickhouse_filter_operators.py +49 -0
- hare/dialects/clickhouse/lookups/clickhouse_global_lookups.py +129 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_equality.py +78 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_key_existence.py +38 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_lookups.py +57 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_path_lookups.py +102 -0
- hare/dialects/clickhouse/lookups/clickhouse_json_value_text.py +24 -0
- hare/dialects/clickhouse/lookups/clickhouse_typed_value_lookups.py +213 -0
- hare/dialects/clickhouse/lookups/constants.py +67 -0
- hare/dialects/clickhouse/lookups/declarations.py +14 -0
- hare/dialects/clickhouse/lookups/global_contains_criterion.py +15 -0
- hare/dialects/clickhouse/lookups/in_list/__init__.py +0 -0
- hare/dialects/clickhouse/lookups/in_list/clickhouse_large_in_list.py +95 -0
- hare/dialects/clickhouse/lookups/in_list/clickhouse_value_set_values.py +45 -0
- hare/dialects/clickhouse/migration_safety/__init__.py +9 -0
- hare/dialects/clickhouse/migration_safety/clickhouse_migration_safety_rules.py +34 -0
- hare/dialects/clickhouse/migration_safety/constants.py +10 -0
- hare/dialects/clickhouse/parameters/__init__.py +1 -0
- hare/dialects/clickhouse/parameters/clickhouse_parameters.py +42 -0
- hare/dialects/clickhouse/query/__init__.py +1 -0
- hare/dialects/clickhouse/query/clickhouse_dialect_variants.py +31 -0
- hare/dialects/clickhouse/query/clickhouse_queryset_methods.py +356 -0
- hare/dialects/clickhouse/query/clickhouse_sql_context.py +47 -0
- hare/dialects/clickhouse/query/clickhouse_totals.py +34 -0
- hare/dialects/clickhouse/query/constants.py +24 -0
- hare/dialects/clickhouse/query/declarations.py +21 -0
- hare/dialects/clickhouse/query/totals_result.py +21 -0
- hare/dialects/clickhouse/renderers/__init__.py +1 -0
- hare/dialects/clickhouse/renderers/clickhouse_aggregate_renderers.py +124 -0
- hare/dialects/clickhouse/renderers/clickhouse_assigned_enum_number.py +30 -0
- hare/dialects/clickhouse/renderers/clickhouse_cast_renderers.py +49 -0
- hare/dialects/clickhouse/renderers/clickhouse_checked_integer_result.py +34 -0
- hare/dialects/clickhouse/renderers/clickhouse_condition_renderers.py +27 -0
- hare/dialects/clickhouse/renderers/clickhouse_container_renderers.py +129 -0
- hare/dialects/clickhouse/renderers/clickhouse_json_renderers.py +105 -0
- hare/dialects/clickhouse/renderers/clickhouse_json_texts.py +34 -0
- hare/dialects/clickhouse/renderers/clickhouse_number_renderers.py +76 -0
- hare/dialects/clickhouse/renderers/clickhouse_renderers.py +339 -0
- hare/dialects/clickhouse/renderers/clickhouse_temporal_renderers.py +262 -0
- hare/dialects/clickhouse/renderers/clickhouse_text_renderers.py +117 -0
- hare/dialects/clickhouse/renderers/clickhouse_value_casts.py +115 -0
- hare/dialects/clickhouse/renderers/clickhouse_window_renderers.py +72 -0
- hare/dialects/clickhouse/renderers/constants.py +341 -0
- hare/dialects/clickhouse/schema/__init__.py +1 -0
- hare/dialects/clickhouse/schema/columns/__init__.py +1 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_backfill.py +106 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_conversion_check.py +173 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_definitions.py +62 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_narrowing_check.py +109 -0
- hare/dialects/clickhouse/schema/columns/clickhouse_column_renames.py +45 -0
- hare/dialects/clickhouse/schema/constants.py +201 -0
- hare/dialects/clickhouse/schema/declarations.py +95 -0
- hare/dialects/clickhouse/schema/indexes/__init__.py +0 -0
- hare/dialects/clickhouse/schema/indexes/clickhouse_index_statements.py +60 -0
- hare/dialects/clickhouse/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/clickhouse/schema/runtime_statements/clickhouse_table_clearing.py +19 -0
- hare/dialects/clickhouse/schema/schema_objects/__init__.py +0 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_dictionaries.py +169 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_materialized_views.py +221 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_schemas.py +69 -0
- hare/dialects/clickhouse/schema/schema_objects/clickhouse_views.py +59 -0
- hare/dialects/clickhouse/schema/shadow/__init__.py +0 -0
- hare/dialects/clickhouse/schema/shadow/clickhouse_shadow_database.py +155 -0
- hare/dialects/clickhouse/schema/tables/__init__.py +1 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_comments.py +43 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_creation.py +50 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_partitions.py +160 -0
- hare/dialects/clickhouse/schema/tables/clickhouse_table_rebuild.py +227 -0
- hare/dialects/clickhouse/schema_objects/__init__.py +5 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_dictionary.py +118 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_materialized_view.py +159 -0
- hare/dialects/clickhouse/schema_objects/clickhouse_projection.py +204 -0
- hare/dialects/clickhouse/server_versions.py +5 -0
- hare/dialects/clickhouse/spatial/__init__.py +0 -0
- hare/dialects/clickhouse/spatial/clickhouse_geometry_values.py +208 -0
- hare/dialects/clickhouse/spatial/clickhouse_spatial_renderers.py +265 -0
- hare/dialects/clickhouse/spatial/constants.py +66 -0
- hare/dialects/clickhouse/transactions/__init__.py +0 -0
- hare/dialects/clickhouse/transactions/clickhouse_transaction_statements.py +19 -0
- hare/dialects/clickhouse/types/__init__.py +1 -0
- hare/dialects/clickhouse/types/clickhouse_address_values.py +35 -0
- hare/dialects/clickhouse/types/clickhouse_binary_values.py +58 -0
- hare/dialects/clickhouse/types/clickhouse_container_values.py +267 -0
- hare/dialects/clickhouse/types/clickhouse_dynamic_values.py +307 -0
- hare/dialects/clickhouse/types/clickhouse_enum_types.py +232 -0
- hare/dialects/clickhouse/types/clickhouse_json_values.py +202 -0
- hare/dialects/clickhouse/types/clickhouse_low_cardinality_values.py +95 -0
- hare/dialects/clickhouse/types/clickhouse_nullable_types.py +27 -0
- hare/dialects/clickhouse/types/clickhouse_type_names.py +128 -0
- hare/dialects/clickhouse/types/clickhouse_types.py +258 -0
- hare/dialects/clickhouse/types/clickhouse_variant_values.py +128 -0
- hare/dialects/clickhouse/types/constants.py +139 -0
- hare/dialects/clickhouse/types/declarations.py +23 -0
- hare/dialects/constants.py +32 -0
- hare/dialects/dialect_registry.py +340 -0
- hare/dialects/enums.py +34 -0
- hare/dialects/postgresql/__init__.py +0 -0
- hare/dialects/postgresql/clauses/__init__.py +1 -0
- hare/dialects/postgresql/clauses/constants.py +44 -0
- hare/dialects/postgresql/clauses/postgresql_query_clauses.py +114 -0
- hare/dialects/postgresql/client/__init__.py +10 -0
- hare/dialects/postgresql/client/constants.py +328 -0
- hare/dialects/postgresql/client/postgresql_client.py +1224 -0
- hare/dialects/postgresql/client/postgresql_connect_errors.py +66 -0
- hare/dialects/postgresql/client/postgresql_transaction_client.py +80 -0
- hare/dialects/postgresql/client/reusable_test_schemas.py +197 -0
- hare/dialects/postgresql/client/transaction_pooler.py +137 -0
- hare/dialects/postgresql/connection/__init__.py +1 -0
- hare/dialects/postgresql/connection/constants.py +11 -0
- hare/dialects/postgresql/connection/postgresql_driver.py +99 -0
- hare/dialects/postgresql/constants.py +862 -0
- hare/dialects/postgresql/drivers/__init__.py +0 -0
- hare/dialects/postgresql/drivers/asyncpg/__init__.py +0 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_date_codec.py +81 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_driver.py +37 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_extension_type_codecs.py +78 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_hstore_codec.py +84 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_interval_codec.py +72 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_timestamp_codec.py +74 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_timestamptz_codec.py +88 -0
- hare/dialects/postgresql/drivers/asyncpg/asyncpg_tsvector_codec.py +264 -0
- hare/dialects/postgresql/drivers/asyncpg/client/__init__.py +9 -0
- hare/dialects/postgresql/drivers/asyncpg/client/asyncpg_client.py +738 -0
- hare/dialects/postgresql/drivers/asyncpg/client/asyncpg_transaction_client.py +197 -0
- hare/dialects/postgresql/drivers/asyncpg/constants.py +150 -0
- hare/dialects/postgresql/drivers/asyncpg/pre_epoch_local_zone.py +27 -0
- hare/dialects/postgresql/drivers/constants.py +22 -0
- hare/dialects/postgresql/drivers/rust_pg/__init__.py +0 -0
- hare/dialects/postgresql/drivers/rust_pg/client/__init__.py +9 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_client.py +461 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_transaction_client.py +306 -0
- hare/dialects/postgresql/drivers/rust_pg/client/rust_pg_transaction_connection_wrapper.py +53 -0
- hare/dialects/postgresql/drivers/rust_pg/constants.py +43 -0
- hare/dialects/postgresql/drivers/rust_pg/rust_pg_driver.py +66 -0
- hare/dialects/postgresql/enums.py +99 -0
- hare/dialects/postgresql/fields/__init__.py +68 -0
- hare/dialects/postgresql/fields/citext_field.py +42 -0
- hare/dialects/postgresql/fields/constants.py +115 -0
- hare/dialects/postgresql/fields/fixed_char_field.py +23 -0
- hare/dialects/postgresql/fields/hstore/__init__.py +5 -0
- hare/dialects/postgresql/fields/hstore/h_store_field.py +105 -0
- hare/dialects/postgresql/fields/hstore/h_store_text.py +86 -0
- hare/dialects/postgresql/fields/interval_field.py +31 -0
- hare/dialects/postgresql/fields/ltree_field.py +98 -0
- hare/dialects/postgresql/fields/multiranges/__init__.py +19 -0
- hare/dialects/postgresql/fields/multiranges/declarations.py +55 -0
- hare/dialects/postgresql/fields/multiranges/multi_range_field.py +326 -0
- hare/dialects/postgresql/fields/naive_datetime_field.py +74 -0
- hare/dialects/postgresql/fields/naive_time_field.py +64 -0
- hare/dialects/postgresql/fields/native_enum/__init__.py +5 -0
- hare/dialects/postgresql/fields/native_enum/native_enum_field.py +23 -0
- hare/dialects/postgresql/fields/native_enum/native_enum_field_instance.py +87 -0
- hare/dialects/postgresql/fields/network/__init__.py +7 -0
- hare/dialects/postgresql/fields/network/cidr_field.py +24 -0
- hare/dialects/postgresql/fields/network/inet_field.py +25 -0
- hare/dialects/postgresql/fields/network/mac_address_field.py +59 -0
- hare/dialects/postgresql/fields/network/network_field.py +80 -0
- hare/dialects/postgresql/fields/postgis_field.py +206 -0
- hare/dialects/postgresql/fields/ranges/__init__.py +19 -0
- hare/dialects/postgresql/fields/ranges/date_range_field.py +48 -0
- hare/dialects/postgresql/fields/ranges/date_time_range_field.py +153 -0
- hare/dialects/postgresql/fields/ranges/decimal_range_field.py +42 -0
- hare/dialects/postgresql/fields/ranges/declarations.py +15 -0
- hare/dialects/postgresql/fields/ranges/int_range_field.py +60 -0
- hare/dialects/postgresql/fields/ranges/range.py +26 -0
- hare/dialects/postgresql/fields/ranges/range_field.py +349 -0
- hare/dialects/postgresql/fields/ts_vector_field.py +143 -0
- hare/dialects/postgresql/functions/__init__.py +72 -0
- hare/dialects/postgresql/functions/aggregates/__init__.py +21 -0
- hare/dialects/postgresql/functions/aggregates/declarations.py +67 -0
- hare/dialects/postgresql/functions/aggregates/jsonb_agg.py +35 -0
- hare/dialects/postgresql/functions/aggregates/jsonb_agg_field.py +29 -0
- hare/dialects/postgresql/functions/aggregates/range_agg.py +22 -0
- hare/dialects/postgresql/functions/aggregates/string_agg.py +101 -0
- hare/dialects/postgresql/functions/aggregates/string_agg_function.py +13 -0
- hare/dialects/postgresql/functions/array/__init__.py +13 -0
- hare/dialects/postgresql/functions/array/any_value.py +13 -0
- hare/dialects/postgresql/functions/array/array_slice.py +28 -0
- hare/dialects/postgresql/functions/array/array_subquery.py +62 -0
- hare/dialects/postgresql/functions/array/array_subscript.py +66 -0
- hare/dialects/postgresql/functions/constants.py +8 -0
- hare/dialects/postgresql/functions/ltree/__init__.py +7 -0
- hare/dialects/postgresql/functions/ltree/subpath.py +54 -0
- hare/dialects/postgresql/functions/random_uuid.py +26 -0
- hare/dialects/postgresql/functions/spatial/__init__.py +9 -0
- hare/dialects/postgresql/functions/spatial/st_distance.py +63 -0
- hare/dialects/postgresql/functions/spatial/std_within.py +46 -0
- hare/dialects/postgresql/functions/statistics/__init__.py +31 -0
- hare/dialects/postgresql/functions/statistics/covar_pop.py +49 -0
- hare/dialects/postgresql/functions/statistics/declarations.py +84 -0
- hare/dialects/postgresql/functions/statistics/regr_count.py +21 -0
- hare/dialects/postgresql/functions/statistics/statistic_pair_aggregate.py +55 -0
- hare/dialects/postgresql/functions/transaction_now.py +27 -0
- hare/dialects/postgresql/functions/trigram/__init__.py +21 -0
- hare/dialects/postgresql/functions/trigram/declarations.py +53 -0
- hare/dialects/postgresql/functions/trigram/trigram_function.py +61 -0
- hare/dialects/postgresql/functions/trigram/trigram_word_similarity.py +19 -0
- hare/dialects/postgresql/indexes/__init__.py +25 -0
- hare/dialects/postgresql/indexes/constants.py +16 -0
- hare/dialects/postgresql/indexes/declarations.py +36 -0
- hare/dialects/postgresql/indexes/hnsw_index.py +63 -0
- hare/dialects/postgresql/indexes/ivfflat_index.py +37 -0
- hare/dialects/postgresql/indexes/postgresql_index.py +112 -0
- hare/dialects/postgresql/introspection/__init__.py +0 -0
- hare/dialects/postgresql/introspection/postgresql_array_literals.py +101 -0
- hare/dialects/postgresql/introspection/postgresql_definitions.py +193 -0
- hare/dialects/postgresql/introspection/postgresql_inspected_schema_objects.py +196 -0
- hare/dialects/postgresql/introspection/postgresql_object_parts.py +102 -0
- hare/dialects/postgresql/literals/__init__.py +1 -0
- hare/dialects/postgresql/literals/postgresql_literals.py +99 -0
- hare/dialects/postgresql/lookups/__init__.py +0 -0
- hare/dialects/postgresql/lookups/array/__init__.py +5 -0
- hare/dialects/postgresql/lookups/array/array_length.py +26 -0
- hare/dialects/postgresql/lookups/constants.py +44 -0
- hare/dialects/postgresql/lookups/hstore/__init__.py +11 -0
- hare/dialects/postgresql/lookups/hstore/h_store_value_term.py +18 -0
- hare/dialects/postgresql/lookups/hstore/postgresql_h_store_field_lookups.py +75 -0
- hare/dialects/postgresql/lookups/hstore/postgresql_h_store_lookups.py +38 -0
- hare/dialects/postgresql/lookups/in_list/__init__.py +11 -0
- hare/dialects/postgresql/lookups/in_list/array_parameter.py +104 -0
- hare/dialects/postgresql/lookups/in_list/postgresql_large_in_list.py +78 -0
- hare/dialects/postgresql/lookups/in_list/unnest_row_values.py +32 -0
- hare/dialects/postgresql/lookups/json/__init__.py +9 -0
- hare/dialects/postgresql/lookups/json/postgresql_json_filter_guards.py +111 -0
- hare/dialects/postgresql/lookups/json/postgresql_json_lookups.py +59 -0
- hare/dialects/postgresql/lookups/ltree/__init__.py +9 -0
- hare/dialects/postgresql/lookups/ltree/postgresql_ltree_field_lookups.py +54 -0
- hare/dialects/postgresql/lookups/ltree/postgresql_ltree_lookups.py +35 -0
- hare/dialects/postgresql/lookups/multiranges/__init__.py +9 -0
- hare/dialects/postgresql/lookups/multiranges/postgresql_multi_range_field_lookups.py +50 -0
- hare/dialects/postgresql/lookups/network/__init__.py +1 -0
- hare/dialects/postgresql/lookups/network/postgresql_network_field_lookups.py +46 -0
- hare/dialects/postgresql/lookups/network/postgresql_network_lookups.py +35 -0
- hare/dialects/postgresql/lookups/postgresql_filter_operators.py +96 -0
- hare/dialects/postgresql/lookups/postgresql_regex_lookups.py +22 -0
- hare/dialects/postgresql/lookups/postgresql_value_encoders.py +163 -0
- hare/dialects/postgresql/lookups/ranges/__init__.py +9 -0
- hare/dialects/postgresql/lookups/ranges/postgresql_range_field_lookups.py +49 -0
- hare/dialects/postgresql/lookups/ranges/postgresql_range_lookups.py +49 -0
- hare/dialects/postgresql/lookups/trigram/__init__.py +1 -0
- hare/dialects/postgresql/lookups/trigram/postgresql_trigram_lookups.py +69 -0
- hare/dialects/postgresql/lookups/trigram/trigram_operator_term.py +16 -0
- hare/dialects/postgresql/lookups/unaccent_transform.py +39 -0
- hare/dialects/postgresql/migration_safety/__init__.py +9 -0
- hare/dialects/postgresql/migration_safety/check_constraint_validation_rule.py +36 -0
- hare/dialects/postgresql/migration_safety/constants.py +18 -0
- hare/dialects/postgresql/migration_safety/foreign_key_validation_rule.py +74 -0
- hare/dialects/postgresql/migration_safety/index_without_concurrently_rule.py +45 -0
- hare/dialects/postgresql/migration_safety/postgresql_migration_safety_rules.py +59 -0
- hare/dialects/postgresql/migration_safety/set_not_null_rule.py +47 -0
- hare/dialects/postgresql/migration_safety/unique_constraint_index_rule.py +65 -0
- hare/dialects/postgresql/migration_safety/volatile_default_rule.py +40 -0
- hare/dialects/postgresql/parameters/__init__.py +1 -0
- hare/dialects/postgresql/parameters/constants.py +83 -0
- hare/dialects/postgresql/parameters/postgresql_parameters.py +86 -0
- hare/dialects/postgresql/partitioning/__init__.py +23 -0
- hare/dialects/postgresql/partitioning/constants.py +56 -0
- hare/dialects/postgresql/partitioning/explicit_partitioning.py +97 -0
- hare/dialects/postgresql/partitioning/hash_partitioning.py +50 -0
- hare/dialects/postgresql/partitioning/list_partitioning.py +55 -0
- hare/dialects/postgresql/partitioning/observed_partitioning.py +205 -0
- hare/dialects/postgresql/partitioning/partitioning.py +280 -0
- hare/dialects/postgresql/partitioning/partitions/__init__.py +1 -0
- hare/dialects/postgresql/partitioning/partitions/default_partition.py +30 -0
- hare/dialects/postgresql/partitioning/partitions/list_partition.py +36 -0
- hare/dialects/postgresql/partitioning/partitions/partition.py +46 -0
- hare/dialects/postgresql/partitioning/partitions/range_partition.py +94 -0
- hare/dialects/postgresql/partitioning/range_partitioning.py +60 -0
- hare/dialects/postgresql/postgresql_dialect.py +207 -0
- hare/dialects/postgresql/postgresql_introspector.py +1055 -0
- hare/dialects/postgresql/postgresql_table_options.py +165 -0
- hare/dialects/postgresql/query/__init__.py +7 -0
- hare/dialects/postgresql/query/declarations.py +13 -0
- hare/dialects/postgresql/renderers/__init__.py +7 -0
- hare/dialects/postgresql/renderers/constants.py +43 -0
- hare/dialects/postgresql/renderers/postgresql_container_renderers.py +90 -0
- hare/dialects/postgresql/renderers/postgresql_defaults.py +88 -0
- hare/dialects/postgresql/renderers/postgresql_json_renderers.py +57 -0
- hare/dialects/postgresql/renderers/postgresql_number_renderers.py +58 -0
- hare/dialects/postgresql/renderers/postgresql_renderers.py +82 -0
- hare/dialects/postgresql/renderers/postgresql_temporal_renderers.py +179 -0
- hare/dialects/postgresql/renderers/postgresql_text_renderers.py +67 -0
- hare/dialects/postgresql/request_query/__init__.py +8 -0
- hare/dialects/postgresql/request_query/declarations.py +17 -0
- hare/dialects/postgresql/schema/__init__.py +0 -0
- hare/dialects/postgresql/schema/columns/__init__.py +1 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_backfill.py +13 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_narrowing_check.py +42 -0
- hare/dialects/postgresql/schema/columns/postgresql_column_type_changes.py +129 -0
- hare/dialects/postgresql/schema/constants.py +384 -0
- hare/dialects/postgresql/schema/constraints/__init__.py +1 -0
- hare/dialects/postgresql/schema/constraints/postgresql_constraint_statements.py +119 -0
- hare/dialects/postgresql/schema/indexes/__init__.py +1 -0
- hare/dialects/postgresql/schema/indexes/postgresql_index_statements.py +24 -0
- hare/dialects/postgresql/schema/postgresql_schema_editor.py +280 -0
- hare/dialects/postgresql/schema/relations/__init__.py +1 -0
- hare/dialects/postgresql/schema/relations/postgresql_foreign_key_rebuild.py +230 -0
- hare/dialects/postgresql/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_foreign_key_deferral.py +109 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_table_clearing.py +80 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_table_locks.py +27 -0
- hare/dialects/postgresql/schema/runtime_statements/postgresql_tenant_conditions.py +34 -0
- hare/dialects/postgresql/schema/schema_objects/__init__.py +1 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_database_functions.py +95 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_enum_types.py +130 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_extensions.py +35 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_grants.py +89 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_materialized_views.py +107 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_row_level_security_policies.py +125 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_schemas.py +51 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_sequences.py +132 -0
- hare/dialects/postgresql/schema/schema_objects/postgresql_views.py +53 -0
- hare/dialects/postgresql/schema/shadow/__init__.py +0 -0
- hare/dialects/postgresql/schema/shadow/postgresql_shadow_database.py +78 -0
- hare/dialects/postgresql/schema/tables/__init__.py +1 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_comments.py +74 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_partitions.py +229 -0
- hare/dialects/postgresql/schema/tables/postgresql_table_rebuild.py +118 -0
- hare/dialects/postgresql/schema/triggers/__init__.py +1 -0
- hare/dialects/postgresql/schema/triggers/postgresql_trigger_statements.py +141 -0
- hare/dialects/postgresql/search/__init__.py +8 -0
- hare/dialects/postgresql/search/constants.py +43 -0
- hare/dialects/postgresql/search/criterion/__init__.py +14 -0
- hare/dialects/postgresql/search/criterion/declarations.py +14 -0
- hare/dialects/postgresql/search/criterion/search_criterion.py +62 -0
- hare/dialects/postgresql/search/criterion/ts_query_function.py +20 -0
- hare/dialects/postgresql/search/criterion/ts_query_invert.py +32 -0
- hare/dialects/postgresql/search/enums.py +12 -0
- hare/dialects/postgresql/search/functions/__init__.py +9 -0
- hare/dialects/postgresql/search/functions/plain_to_ts_query.py +18 -0
- hare/dialects/postgresql/search/functions/to_ts_vector.py +20 -0
- hare/dialects/postgresql/search/lexemes/__init__.py +1 -0
- hare/dialects/postgresql/search/lexemes/combined_lexeme.py +35 -0
- hare/dialects/postgresql/search/lexemes/lexeme.py +77 -0
- hare/dialects/postgresql/search/lexemes/lexeme_combinable.py +59 -0
- hare/dialects/postgresql/search/postgresql_text_search.py +237 -0
- hare/dialects/postgresql/search/ts_vector_expression_reader.py +106 -0
- hare/dialects/postgresql/server_versions.py +26 -0
- hare/dialects/postgresql/spatial/__init__.py +7 -0
- hare/dialects/postgresql/spatial/constants.py +118 -0
- hare/dialects/postgresql/spatial/postgresql_spatial_renderers.py +102 -0
- hare/dialects/postgresql/transactions/__init__.py +1 -0
- hare/dialects/postgresql/transactions/constants.py +21 -0
- hare/dialects/postgresql/transactions/postgresql_transaction_statements.py +40 -0
- hare/dialects/postgresql/transactions/postgresql_two_phase_commit.py +87 -0
- hare/dialects/postgresql/types/__init__.py +1 -0
- hare/dialects/postgresql/types/postgresql_container_values.py +104 -0
- hare/dialects/postgresql/types/postgresql_types.py +213 -0
- hare/dialects/postgresql/validators/__init__.py +15 -0
- hare/dialects/postgresql/validators/keys_validator.py +32 -0
- hare/dialects/postgresql/validators/range_bound_validator.py +33 -0
- hare/dialects/postgresql/validators/range_max_value_validator.py +17 -0
- hare/dialects/postgresql/validators/range_min_value_validator.py +17 -0
- hare/dialects/postgresql/vectors/__init__.py +1 -0
- hare/dialects/postgresql/vectors/constants.py +13 -0
- hare/dialects/postgresql/vectors/postgresql_vector_renderers.py +40 -0
- hare/dialects/postgresql/vectors/postgresql_vector_values.py +94 -0
- hare/dialects/sqlite/__init__.py +0 -0
- hare/dialects/sqlite/clauses/__init__.py +1 -0
- hare/dialects/sqlite/clauses/constants.py +7 -0
- hare/dialects/sqlite/clauses/sqlite_query_clauses.py +100 -0
- hare/dialects/sqlite/client/__init__.py +12 -0
- hare/dialects/sqlite/client/constants.py +103 -0
- hare/dialects/sqlite/client/declarations.py +27 -0
- hare/dialects/sqlite/client/sqlite_client.py +507 -0
- hare/dialects/sqlite/client/sqlite_migration_lock.py +76 -0
- hare/dialects/sqlite/client/sqlite_transaction_client.py +160 -0
- hare/dialects/sqlite/connection/__init__.py +1 -0
- hare/dialects/sqlite/connection/constants.py +7 -0
- hare/dialects/sqlite/connection/sqlite_driver.py +59 -0
- hare/dialects/sqlite/constants.py +451 -0
- hare/dialects/sqlite/drivers/__init__.py +1 -0
- hare/dialects/sqlite/drivers/aiosqlite/__init__.py +1 -0
- hare/dialects/sqlite/drivers/aiosqlite/aiosqlite_driver.py +41 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/__init__.py +23 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_client.py +428 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_client_with_regexp_support.py +16 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_connection_wrapper.py +62 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_statement_timeout_connection_wrapper.py +53 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_transaction_client.py +176 -0
- hare/dialects/sqlite/drivers/aiosqlite/client/aiosqlite_transaction_connection_wrapper.py +23 -0
- hare/dialects/sqlite/drivers/aiosqlite/constants.py +11 -0
- hare/dialects/sqlite/drivers/constants.py +19 -0
- hare/dialects/sqlite/enums.py +37 -0
- hare/dialects/sqlite/exceptions.py +10 -0
- hare/dialects/sqlite/functions/__init__.py +0 -0
- hare/dialects/sqlite/functions/comparison/__init__.py +11 -0
- hare/dialects/sqlite/functions/comparison/sqlite_cast.py +204 -0
- hare/dialects/sqlite/functions/comparison/sqlite_greatest_least.py +63 -0
- hare/dialects/sqlite/functions/constants.py +102 -0
- hare/dialects/sqlite/functions/datetime/__init__.py +13 -0
- hare/dialects/sqlite/functions/datetime/date_truncation.py +115 -0
- hare/dialects/sqlite/functions/datetime/sqlite_date_part_extraction.py +77 -0
- hare/dialects/sqlite/functions/datetime/sqlite_date_timestamp.py +48 -0
- hare/dialects/sqlite/functions/datetime/sqlite_local_now.py +54 -0
- hare/dialects/sqlite/functions/datetime/temporal_arithmetic_functions.py +147 -0
- hare/dialects/sqlite/functions/decimal/__init__.py +1 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_arithmetic.py +152 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_average.py +23 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_collation.py +125 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_comparand.py +23 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_operation.py +33 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_round.py +50 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_storage.py +77 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_sum.py +62 -0
- hare/dialects/sqlite/functions/decimal/sqlite_decimal_text.py +22 -0
- hare/dialects/sqlite/functions/decimal/sqlite_stored_decimal.py +29 -0
- hare/dialects/sqlite/functions/json/__init__.py +9 -0
- hare/dialects/sqlite/functions/json/sqlite_json_datetime.py +124 -0
- hare/dialects/sqlite/functions/json/sqlite_json_path.py +116 -0
- hare/dialects/sqlite/functions/regex/__init__.py +5 -0
- hare/dialects/sqlite/functions/regex/sqlite_posix_regex.py +102 -0
- hare/dialects/sqlite/functions/regex/sqlite_regex_criterion.py +18 -0
- hare/dialects/sqlite/functions/sqlite_checked_integer.py +15 -0
- hare/dialects/sqlite/functions/sqlite_collation.py +51 -0
- hare/dialects/sqlite/functions/sqlite_connection_function.py +17 -0
- hare/dialects/sqlite/functions/sqlite_function_errors.py +45 -0
- hare/dialects/sqlite/functions/sqlite_integer_range.py +48 -0
- hare/dialects/sqlite/functions/sqlite_math_functions.py +233 -0
- hare/dialects/sqlite/functions/sqlite_native_functions.py +12 -0
- hare/dialects/sqlite/functions/sqlite_sort_keys.py +58 -0
- hare/dialects/sqlite/functions/statistics/__init__.py +19 -0
- hare/dialects/sqlite/functions/statistics/declarations.py +31 -0
- hare/dialects/sqlite/functions/statistics/sqlite_statistic.py +118 -0
- hare/dialects/sqlite/functions/statistics/sqlite_statistics.py +51 -0
- hare/dialects/sqlite/functions/text/__init__.py +1 -0
- hare/dialects/sqlite/functions/text/sqlite_text_functions.py +140 -0
- hare/dialects/sqlite/indexes/__init__.py +7 -0
- hare/dialects/sqlite/indexes/constants.py +45 -0
- hare/dialects/sqlite/indexes/full_text_index.py +228 -0
- hare/dialects/sqlite/indexes/separate_table_index.py +105 -0
- hare/dialects/sqlite/indexes/spatialite_index.py +228 -0
- hare/dialects/sqlite/literals/__init__.py +1 -0
- hare/dialects/sqlite/literals/sqlite_literals.py +51 -0
- hare/dialects/sqlite/lookups/__init__.py +0 -0
- hare/dialects/sqlite/lookups/constants.py +18 -0
- hare/dialects/sqlite/lookups/in_list/__init__.py +11 -0
- hare/dialects/sqlite/lookups/in_list/json_array_row_values.py +39 -0
- hare/dialects/sqlite/lookups/in_list/json_array_values.py +116 -0
- hare/dialects/sqlite/lookups/in_list/sqlite_large_in_list.py +96 -0
- hare/dialects/sqlite/lookups/json/__init__.py +1 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_filter_guards.py +128 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_lookups.py +51 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_path_lookups.py +56 -0
- hare/dialects/sqlite/lookups/json/sqlite_json_type_criterion.py +13 -0
- hare/dialects/sqlite/lookups/sqlite_filter_operators.py +89 -0
- hare/dialects/sqlite/migration_safety/__init__.py +9 -0
- hare/dialects/sqlite/migration_safety/sqlite_migration_safety_rules.py +32 -0
- hare/dialects/sqlite/parameters/__init__.py +1 -0
- hare/dialects/sqlite/parameters/constants.py +11 -0
- hare/dialects/sqlite/parameters/sqlite_parameter_adapters.py +61 -0
- hare/dialects/sqlite/parameters/sqlite_parameters.py +27 -0
- hare/dialects/sqlite/query/__init__.py +7 -0
- hare/dialects/sqlite/query/declarations.py +13 -0
- hare/dialects/sqlite/renderers/__init__.py +7 -0
- hare/dialects/sqlite/renderers/constants.py +43 -0
- hare/dialects/sqlite/renderers/sqlite_defaults.py +84 -0
- hare/dialects/sqlite/renderers/sqlite_json_renderers.py +142 -0
- hare/dialects/sqlite/renderers/sqlite_number_renderers.py +137 -0
- hare/dialects/sqlite/renderers/sqlite_renderers.py +235 -0
- hare/dialects/sqlite/renderers/sqlite_temporal_renderers.py +138 -0
- hare/dialects/sqlite/renderers/sqlite_text_renderers.py +60 -0
- hare/dialects/sqlite/request_query/__init__.py +8 -0
- hare/dialects/sqlite/request_query/declarations.py +16 -0
- hare/dialects/sqlite/schema/__init__.py +0 -0
- hare/dialects/sqlite/schema/columns/__init__.py +1 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_backfill.py +29 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_conversion_check.py +181 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_narrowing_check.py +24 -0
- hare/dialects/sqlite/schema/columns/sqlite_column_type_changes.py +148 -0
- hare/dialects/sqlite/schema/constants.py +108 -0
- hare/dialects/sqlite/schema/constraints/__init__.py +1 -0
- hare/dialects/sqlite/schema/constraints/sqlite_constraint_statements.py +32 -0
- hare/dialects/sqlite/schema/indexes/__init__.py +1 -0
- hare/dialects/sqlite/schema/indexes/sqlite_generated_index_names.py +61 -0
- hare/dialects/sqlite/schema/indexes/sqlite_index_statements.py +78 -0
- hare/dialects/sqlite/schema/relations/__init__.py +1 -0
- hare/dialects/sqlite/schema/relations/sqlite_foreign_key_rebuild.py +100 -0
- hare/dialects/sqlite/schema/runtime_statements/__init__.py +1 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_foreign_key_deferral.py +87 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_table_clearing.py +39 -0
- hare/dialects/sqlite/schema/runtime_statements/sqlite_tenant_conditions.py +21 -0
- hare/dialects/sqlite/schema/shadow/__init__.py +0 -0
- hare/dialects/sqlite/schema/shadow/sqlite_shadow_database.py +36 -0
- hare/dialects/sqlite/schema/sqlite_schema_editor.py +492 -0
- hare/dialects/sqlite/schema/tables/__init__.py +1 -0
- hare/dialects/sqlite/schema/tables/sqlite_table_comments.py +32 -0
- hare/dialects/sqlite/schema/tables/sqlite_table_rebuild.py +164 -0
- hare/dialects/sqlite/schema/triggers/__init__.py +1 -0
- hare/dialects/sqlite/schema/triggers/sqlite_trigger_statements.py +70 -0
- hare/dialects/sqlite/search/__init__.py +8 -0
- hare/dialects/sqlite/search/constants.py +33 -0
- hare/dialects/sqlite/search/sqlite_full_text_query.py +137 -0
- hare/dialects/sqlite/search/sqlite_search_renderers.py +33 -0
- hare/dialects/sqlite/search/sqlite_text_search.py +308 -0
- hare/dialects/sqlite/search/terms/__init__.py +1 -0
- hare/dialects/sqlite/search/terms/full_text_headline.py +56 -0
- hare/dialects/sqlite/search/terms/full_text_match.py +73 -0
- hare/dialects/sqlite/search/terms/full_text_query.py +42 -0
- hare/dialects/sqlite/search/terms/full_text_query_combination.py +82 -0
- hare/dialects/sqlite/search/terms/full_text_rank.py +34 -0
- hare/dialects/sqlite/search/terms/full_text_row_value.py +104 -0
- hare/dialects/sqlite/server_versions.py +17 -0
- hare/dialects/sqlite/spatial/__init__.py +0 -0
- hare/dialects/sqlite/spatial/constants.py +173 -0
- hare/dialects/sqlite/spatial/spatialite_blob_reader.py +166 -0
- hare/dialects/sqlite/spatial/spatialite_blob_writer.py +105 -0
- hare/dialects/sqlite/spatial/sqlite_geometry_values.py +75 -0
- hare/dialects/sqlite/spatial/sqlite_spatial_extension.py +116 -0
- hare/dialects/sqlite/spatial/sqlite_spatial_renderers.py +202 -0
- hare/dialects/sqlite/sqlite_dialect.py +138 -0
- hare/dialects/sqlite/sqlite_introspector.py +1025 -0
- hare/dialects/sqlite/sqlite_table_options.py +92 -0
- hare/dialects/sqlite/table_option_constants.py +15 -0
- hare/dialects/sqlite/transactions/__init__.py +1 -0
- hare/dialects/sqlite/transactions/constants.py +10 -0
- hare/dialects/sqlite/transactions/sqlite_transaction_statements.py +19 -0
- hare/dialects/sqlite/types/__init__.py +1 -0
- hare/dialects/sqlite/types/sqlite_types.py +87 -0
- hare/dialects/sqlite/vectors/__init__.py +1 -0
- hare/dialects/sqlite/vectors/constants.py +16 -0
- hare/dialects/sqlite/vectors/sqlite_vector_extension.py +112 -0
- hare/dialects/sqlite/vectors/sqlite_vector_renderers.py +55 -0
- hare/dialects/sqlite/vectors/sqlite_vector_values.py +113 -0
- hare/exceptions.py +397 -0
- hare/fields/__init__.py +133 -0
- hare/fields/composite_primary_key.py +40 -0
- hare/fields/constants.py +120 -0
- hare/fields/data/__init__.py +3 -0
- hare/fields/data/binary_field.py +62 -0
- hare/fields/data/boolean_field.py +57 -0
- hare/fields/data/choices/__init__.py +16 -0
- hare/fields/data/choices/char_enum_field.py +27 -0
- hare/fields/data/choices/char_enum_field_instance.py +117 -0
- hare/fields/data/choices/int_enum_field.py +23 -0
- hare/fields/data/choices/int_enum_field_instance.py +102 -0
- hare/fields/data/constants.py +122 -0
- hare/fields/data/containers/__init__.py +10 -0
- hare/fields/data/containers/array_field.py +152 -0
- hare/fields/data/containers/constants.py +25 -0
- hare/fields/data/containers/container_field.py +342 -0
- hare/fields/data/containers/declarations.py +13 -0
- hare/fields/data/containers/map_field.py +165 -0
- hare/fields/data/containers/nested_field.py +47 -0
- hare/fields/data/containers/tuple_field.py +177 -0
- hare/fields/data/json/__init__.py +7 -0
- hare/fields/data/json/json_codec.py +152 -0
- hare/fields/data/json/json_field.py +387 -0
- hare/fields/data/json/json_path_field.py +77 -0
- hare/fields/data/json/json_text_field.py +13 -0
- hare/fields/data/network/__init__.py +8 -0
- hare/fields/data/network/constants.py +6 -0
- hare/fields/data/network/ip_address_field.py +109 -0
- hare/fields/data/network/ipv4_address_field.py +26 -0
- hare/fields/data/numeric/__init__.py +23 -0
- hare/fields/data/numeric/big_int_field.py +22 -0
- hare/fields/data/numeric/decimal_field.py +187 -0
- hare/fields/data/numeric/float_field.py +83 -0
- hare/fields/data/numeric/int_field.py +239 -0
- hare/fields/data/numeric/positive_big_int_field.py +19 -0
- hare/fields/data/numeric/positive_int_field.py +19 -0
- hare/fields/data/numeric/positive_small_int_field.py +19 -0
- hare/fields/data/numeric/small_int_field.py +22 -0
- hare/fields/data/temporal/__init__.py +11 -0
- hare/fields/data/temporal/date_field.py +87 -0
- hare/fields/data/temporal/datetime_field.py +384 -0
- hare/fields/data/temporal/parse_datetime.py +17 -0
- hare/fields/data/temporal/temporal_values.py +119 -0
- hare/fields/data/temporal/time_delta_field.py +111 -0
- hare/fields/data/temporal/time_field.py +193 -0
- hare/fields/data/text/__init__.py +20 -0
- hare/fields/data/text/char_field.py +78 -0
- hare/fields/data/text/email_field.py +76 -0
- hare/fields/data/text/phone_field.py +114 -0
- hare/fields/data/text/slug_field.py +52 -0
- hare/fields/data/text/text_field.py +33 -0
- hare/fields/data/text/text_values.py +39 -0
- hare/fields/data/text/url_field.py +62 -0
- hare/fields/data/uuid_field.py +82 -0
- hare/fields/database_default.py +28 -0
- hare/fields/db_default_not_set.py +36 -0
- hare/fields/db_defaults/__init__.py +13 -0
- hare/fields/db_defaults/now.py +108 -0
- hare/fields/db_defaults/random_hex.py +30 -0
- hare/fields/db_defaults/sql_default.py +95 -0
- hare/fields/db_defaults/uuid_v7.py +36 -0
- hare/fields/encrypted/__init__.py +7 -0
- hare/fields/encrypted/blind_index_field.py +49 -0
- hare/fields/encrypted/constants.py +41 -0
- hare/fields/encrypted/encrypted_field_base.py +143 -0
- hare/fields/encrypted/encrypted_json_field.py +238 -0
- hare/fields/encrypted/encrypted_text_field.py +130 -0
- hare/fields/encrypted/field_encryption.py +267 -0
- hare/fields/enums.py +91 -0
- hare/fields/field.py +1231 -0
- hare/fields/field_meta.py +16 -0
- hare/fields/generated_field.py +211 -0
- hare/fields/narrowing/__init__.py +7 -0
- hare/fields/narrowing/decimal_digits_limit.py +11 -0
- hare/fields/narrowing/enum_values_limit.py +32 -0
- hare/fields/narrowing/integer_range_limit.py +13 -0
- hare/fields/narrowing/narrowing_limit.py +8 -0
- hare/fields/narrowing/text_length_limit.py +13 -0
- hare/fields/registrations/__init__.py +1 -0
- hare/fields/registrations/registered_lookup.py +29 -0
- hare/fields/registrations/registered_transform.py +22 -0
- hare/fields/relations/__init__.py +3 -0
- hare/fields/relations/constants.py +10 -0
- hare/fields/relations/declarations.py +5 -0
- hare/fields/relations/fields/__init__.py +35 -0
- hare/fields/relations/fields/backward_foreign_key_relation.py +46 -0
- hare/fields/relations/fields/declarations.py +21 -0
- hare/fields/relations/fields/foreign_key_field.py +89 -0
- hare/fields/relations/fields/foreign_key_field_instance.py +124 -0
- hare/fields/relations/fields/generic_foreign_key_field.py +56 -0
- hare/fields/relations/fields/generic_foreign_key_field_instance.py +455 -0
- hare/fields/relations/fields/many_to_many_field.py +60 -0
- hare/fields/relations/fields/many_to_many_field_instance.py +126 -0
- hare/fields/relations/fields/one_to_one_field.py +89 -0
- hare/fields/relations/fields/one_to_one_field_instance.py +45 -0
- hare/fields/relations/fields/relational_field.py +153 -0
- hare/fields/relations/inherited_relation.py +30 -0
- hare/fields/relations/relation_accessors.py +271 -0
- hare/fields/relations/relation_values.py +106 -0
- hare/fields/relations/swappable_model_reference.py +60 -0
- hare/fields/validators/__init__.py +63 -0
- hare/fields/validators/exceptions.py +52 -0
- hare/fields/validators/formats/__init__.py +1 -0
- hare/fields/validators/formats/comma_separated_integer_list_validator.py +22 -0
- hare/fields/validators/formats/domain_name_validator.py +74 -0
- hare/fields/validators/formats/e164_phone_validator.py +32 -0
- hare/fields/validators/formats/email_validator.py +87 -0
- hare/fields/validators/formats/ipv46_validator.py +28 -0
- hare/fields/validators/formats/ipv4_validator.py +23 -0
- hare/fields/validators/formats/ipv6_validator.py +23 -0
- hare/fields/validators/formats/regex_validator.py +38 -0
- hare/fields/validators/formats/slug_validator.py +36 -0
- hare/fields/validators/formats/url_validator.py +95 -0
- hare/fields/validators/limits/__init__.py +1 -0
- hare/fields/validators/limits/length_validator.py +17 -0
- hare/fields/validators/limits/max_digits_validator.py +58 -0
- hare/fields/validators/limits/max_length_validator.py +20 -0
- hare/fields/validators/limits/max_value_validator.py +19 -0
- hare/fields/validators/limits/min_length_validator.py +20 -0
- hare/fields/validators/limits/min_value_validator.py +19 -0
- hare/fields/validators/limits/numeric_validator.py +19 -0
- hare/fields/validators/validator.py +34 -0
- hare/gis/__init__.py +52 -0
- hare/gis/aggregates/__init__.py +5 -0
- hare/gis/aggregates/declarations.py +42 -0
- hare/gis/aggregates/spatial_aggregate.py +57 -0
- hare/gis/constants.py +126 -0
- hare/gis/enums.py +74 -0
- hare/gis/fields/__init__.py +23 -0
- hare/gis/fields/declarations.py +61 -0
- hare/gis/fields/extent_field.py +60 -0
- hare/gis/fields/geometry_field.py +239 -0
- hare/gis/fields/made_line_field.py +86 -0
- hare/gis/functions/__init__.py +53 -0
- hare/gis/functions/buffer.py +29 -0
- hare/gis/functions/constants.py +17 -0
- hare/gis/functions/declarations.py +188 -0
- hare/gis/functions/simplify.py +29 -0
- hare/gis/functions/spatial_function.py +115 -0
- hare/gis/functions/transform.py +41 -0
- hare/gis/geometries/__init__.py +19 -0
- hare/gis/geometries/declarations.py +38 -0
- hare/gis/geometries/geometry.py +297 -0
- hare/gis/geometries/geometry_collection.py +62 -0
- hare/gis/geometries/line_string.py +46 -0
- hare/gis/geometries/multi_geometry.py +75 -0
- hare/gis/geometries/point.py +65 -0
- hare/gis/geometries/polygon.py +89 -0
- hare/gis/lookups/__init__.py +3 -0
- hare/gis/lookups/spatial_field_lookups.py +219 -0
- hare/gis/readers/__init__.py +11 -0
- hare/gis/readers/constants.py +15 -0
- hare/gis/readers/ewkb_reader.py +148 -0
- hare/gis/readers/geo_json_reader.py +54 -0
- hare/gis/readers/wkt_reader.py +226 -0
- hare/gis/spatial_features.py +57 -0
- hare/gis/terms/__init__.py +11 -0
- hare/gis/terms/geometry_value.py +33 -0
- hare/gis/terms/spatial_aggregate_function.py +30 -0
- hare/gis/terms/spatial_function_term.py +39 -0
- hare/gis/terms/spatial_relation_term.py +39 -0
- hare/health/__init__.py +19 -0
- hare/health/constants.py +32 -0
- hare/health/criteria/__init__.py +27 -0
- hare/health/criteria/acquire_wait_time.py +35 -0
- hare/health/criteria/all_of.py +38 -0
- hare/health/criteria/declarations.py +33 -0
- hare/health/criteria/health_criterion.py +87 -0
- hare/health/criteria/ping_failed.py +27 -0
- hare/health/criteria/ping_latency.py +29 -0
- hare/health/criteria/pool_count_criterion.py +37 -0
- hare/health/criteria/pool_saturation.py +35 -0
- hare/health/criteria/waiting_requests.py +33 -0
- hare/health/declarations.py +83 -0
- hare/health/enums.py +14 -0
- hare/health/health_check.py +240 -0
- hare/health/health_report.py +65 -0
- hare/inspectdb/__init__.py +38 -0
- hare/inspectdb/constants.py +60 -0
- hare/inspectdb/exceptions.py +72 -0
- hare/inspectdb/generation/__init__.py +1 -0
- hare/inspectdb/generation/column_type_mapper.py +113 -0
- hare/inspectdb/generation/declarations.py +34 -0
- hare/inspectdb/generation/inspected_model.py +35 -0
- hare/inspectdb/generation/inspected_model_builder.py +1174 -0
- hare/inspectdb/generation/many_to_many_tables.py +91 -0
- hare/inspectdb/generation/model_factory.py +88 -0
- hare/inspectdb/generation/model_naming.py +75 -0
- hare/inspectdb/generation/model_source_builder.py +148 -0
- hare/inspectdb/introspection/__init__.py +28 -0
- hare/inspectdb/introspection/column_info.py +67 -0
- hare/inspectdb/introspection/composite_foreign_key_info.py +27 -0
- hare/inspectdb/introspection/database_catalog.py +252 -0
- hare/inspectdb/introspection/enums.py +26 -0
- hare/inspectdb/introspection/foreign_key_info.py +25 -0
- hare/inspectdb/introspection/index_info.py +265 -0
- hare/inspectdb/introspection/inspected_field_specification.py +47 -0
- hare/inspectdb/introspection/schema_introspector.py +564 -0
- hare/inspectdb/introspection/schema_part.py +103 -0
- hare/inspectdb/introspection/table_info.py +112 -0
- hare/inspectdb/introspection/table_parts.py +101 -0
- hare/inspectdb/schema_inspector.py +224 -0
- hare/instrumentation/__init__.py +31 -0
- hare/instrumentation/capture/__init__.py +9 -0
- hare/instrumentation/capture/capture_needs.py +54 -0
- hare/instrumentation/capture/captured_change.py +38 -0
- hare/instrumentation/capture/captured_write.py +223 -0
- hare/instrumentation/capture/change_capturing.py +496 -0
- hare/instrumentation/capture/change_sink.py +57 -0
- hare/instrumentation/change_events.py +246 -0
- hare/instrumentation/constants.py +41 -0
- hare/instrumentation/declarations.py +196 -0
- hare/instrumentation/enums.py +35 -0
- hare/instrumentation/observers/__init__.py +1 -0
- hare/instrumentation/observers/observer.py +56 -0
- hare/instrumentation/observers/observer_dispatch.py +197 -0
- hare/instrumentation/observers/observer_set.py +138 -0
- hare/instrumentation/observers/observers.py +368 -0
- hare/instrumentation/pools/__init__.py +1 -0
- hare/instrumentation/pools/duration_records.py +50 -0
- hare/instrumentation/pools/pool_metrics.py +50 -0
- hare/instrumentation/pools/pool_registry.py +49 -0
- hare/instrumentation/queries/__init__.py +1 -0
- hare/instrumentation/queries/query_tags.py +133 -0
- hare/instrumentation/queries/query_wrapper.py +37 -0
- hare/lazy_loading/__init__.py +1 -0
- hare/lazy_loading/lazy_pattern.py +45 -0
- hare/lazy_loading/pydantic_classes.py +96 -0
- hare/migrations/__init__.py +90 -0
- hare/migrations/api/__init__.py +24 -0
- hare/migrations/api/checkmigrations.py +55 -0
- hare/migrations/api/makemigrations.py +78 -0
- hare/migrations/api/migrate.py +47 -0
- hare/migrations/api/migration_request_parser.py +86 -0
- hare/migrations/api/plan.py +39 -0
- hare/migrations/api/sqlmigrate.py +51 -0
- hare/migrations/api/squashmigrations.py +51 -0
- hare/migrations/autodetection/__init__.py +4 -0
- hare/migrations/autodetection/constants.py +49 -0
- hare/migrations/autodetection/diffs/__init__.py +1 -0
- hare/migrations/autodetection/diffs/constraint_diff.py +48 -0
- hare/migrations/autodetection/diffs/declarations.py +73 -0
- hare/migrations/autodetection/diffs/declared_schema_object_diff.py +47 -0
- hare/migrations/autodetection/diffs/grant_diff.py +24 -0
- hare/migrations/autodetection/diffs/index_diff.py +73 -0
- hare/migrations/autodetection/diffs/materialized_view_diff.py +44 -0
- hare/migrations/autodetection/diffs/partition_diff.py +99 -0
- hare/migrations/autodetection/diffs/schema_object_diff.py +153 -0
- hare/migrations/autodetection/diffs/state_field_diff.py +566 -0
- hare/migrations/autodetection/diffs/state_model_diff.py +355 -0
- hare/migrations/autodetection/diffs/trigger_diff.py +31 -0
- hare/migrations/autodetection/diffs/view_diff.py +24 -0
- hare/migrations/autodetection/field_comparable_values.py +20 -0
- hare/migrations/autodetection/migration_autodetector.py +337 -0
- hare/migrations/autodetection/migration_splitter.py +151 -0
- hare/migrations/autodetection/operation_generator.py +1115 -0
- hare/migrations/autodetection/operation_sorter.py +213 -0
- hare/migrations/autodetection/rename_questions.py +98 -0
- hare/migrations/autodetection/required_extensions.py +118 -0
- hare/migrations/autodetection/schema_object_operations.py +150 -0
- hare/migrations/autodetection/split_migration.py +24 -0
- hare/migrations/autodetection/state_signatures.py +192 -0
- hare/migrations/constants.py +109 -0
- hare/migrations/drift/__init__.py +13 -0
- hare/migrations/drift/column_mismatch.py +14 -0
- hare/migrations/drift/constants.py +43 -0
- hare/migrations/drift/detect_drift.py +40 -0
- hare/migrations/drift/detect_drift_for_alias.py +87 -0
- hare/migrations/drift/drift_result.py +22 -0
- hare/migrations/drift/shadow/__init__.py +0 -0
- hare/migrations/drift/shadow/column_field_names.py +26 -0
- hare/migrations/drift/shadow/schema_comparison.py +557 -0
- hare/migrations/drift/shadow/shadow_drift.py +318 -0
- hare/migrations/drift/shadow/shadow_state.py +83 -0
- hare/migrations/exceptions.py +69 -0
- hare/migrations/execution/__init__.py +3 -0
- hare/migrations/execution/connections_plan.py +192 -0
- hare/migrations/execution/constants.py +4 -0
- hare/migrations/execution/executor/__init__.py +11 -0
- hare/migrations/execution/executor/migration_executor.py +640 -0
- hare/migrations/execution/executor/migration_target.py +9 -0
- hare/migrations/execution/executor/plan_step.py +30 -0
- hare/migrations/execution/migration_runner.py +304 -0
- hare/migrations/execution/swappable_setting_check.py +161 -0
- hare/migrations/loading/__init__.py +4 -0
- hare/migrations/loading/graph/__init__.py +13 -0
- hare/migrations/loading/graph/dummy_node.py +22 -0
- hare/migrations/loading/graph/migration_graph.py +235 -0
- hare/migrations/loading/graph/migration_key.py +14 -0
- hare/migrations/loading/graph/node.py +40 -0
- hare/migrations/loading/migration_loader.py +256 -0
- hare/migrations/loading/migrations_modules.py +207 -0
- hare/migrations/loading/recorder/__init__.py +9 -0
- hare/migrations/loading/recorder/migration_recorder.py +130 -0
- hare/migrations/loading/recorder/noop_recorder.py +26 -0
- hare/migrations/making/__init__.py +1 -0
- hare/migrations/making/declared_attribute_values.py +27 -0
- hare/migrations/making/migration_changes.py +27 -0
- hare/migrations/making/migration_checks.py +115 -0
- hare/migrations/making/migration_maker.py +291 -0
- hare/migrations/making/migration_optimizer.py +70 -0
- hare/migrations/making/migration_squasher.py +193 -0
- hare/migrations/making/squashed_migration.py +24 -0
- hare/migrations/migration.py +341 -0
- hare/migrations/operations/__init__.py +132 -0
- hare/migrations/operations/columns/__init__.py +11 -0
- hare/migrations/operations/columns/alter_column_not_null_safe.py +140 -0
- hare/migrations/operations/columns/backfill_column.py +118 -0
- hare/migrations/operations/constants.py +20 -0
- hare/migrations/operations/constraints/__init__.py +15 -0
- hare/migrations/operations/constraints/add_constraint.py +129 -0
- hare/migrations/operations/constraints/declarations.py +13 -0
- hare/migrations/operations/constraints/rename_constraint.py +21 -0
- hare/migrations/operations/constraints/validate_constraint.py +66 -0
- hare/migrations/operations/database_functions/__init__.py +10 -0
- hare/migrations/operations/database_functions/add_function.py +28 -0
- hare/migrations/operations/database_functions/alter_function.py +30 -0
- hare/migrations/operations/database_functions/remove_function.py +20 -0
- hare/migrations/operations/database_functions/rename_function.py +21 -0
- hare/migrations/operations/declared_uniqueness_checks.py +76 -0
- hare/migrations/operations/dependencies/__init__.py +1 -0
- hare/migrations/operations/dependencies/operation_dependency.py +89 -0
- hare/migrations/operations/dependencies/relation_dependencies.py +157 -0
- hare/migrations/operations/dictionaries/__init__.py +10 -0
- hare/migrations/operations/dictionaries/add_dictionary.py +28 -0
- hare/migrations/operations/dictionaries/alter_dictionary.py +29 -0
- hare/migrations/operations/dictionaries/remove_dictionary.py +20 -0
- hare/migrations/operations/dictionaries/rename_dictionary.py +21 -0
- hare/migrations/operations/enum_types/__init__.py +7 -0
- hare/migrations/operations/enum_types/alter_enum_type.py +64 -0
- hare/migrations/operations/enum_types/create_enum_type.py +57 -0
- hare/migrations/operations/enum_types/drop_enum_type.py +66 -0
- hare/migrations/operations/enum_types/enum_type_operation.py +35 -0
- hare/migrations/operations/enums.py +24 -0
- hare/migrations/operations/extensions/__init__.py +15 -0
- hare/migrations/operations/extensions/create_collation.py +82 -0
- hare/migrations/operations/extensions/create_extension.py +47 -0
- hare/migrations/operations/extensions/remove_collation.py +35 -0
- hare/migrations/operations/extensions/remove_extension.py +40 -0
- hare/migrations/operations/fields/__init__.py +11 -0
- hare/migrations/operations/fields/add_field.py +135 -0
- hare/migrations/operations/fields/alter_field.py +128 -0
- hare/migrations/operations/fields/field_add_remove_operation.py +41 -0
- hare/migrations/operations/fields/field_like.py +14 -0
- hare/migrations/operations/fields/remove_field.py +326 -0
- hare/migrations/operations/fields/rename_field.py +725 -0
- hare/migrations/operations/grants/__init__.py +8 -0
- hare/migrations/operations/grants/add_grant.py +31 -0
- hare/migrations/operations/grants/remove_grant.py +35 -0
- hare/migrations/operations/hare_operation.py +174 -0
- hare/migrations/operations/indexes/__init__.py +13 -0
- hare/migrations/operations/indexes/add_index.py +42 -0
- hare/migrations/operations/indexes/declarations.py +12 -0
- hare/migrations/operations/indexes/remove_index.py +36 -0
- hare/migrations/operations/materialized_views/__init__.py +17 -0
- hare/migrations/operations/materialized_views/add_materialized_view.py +37 -0
- hare/migrations/operations/materialized_views/alter_materialized_view.py +32 -0
- hare/migrations/operations/materialized_views/refresh_materialized_view.py +57 -0
- hare/migrations/operations/materialized_views/remove_materialized_view.py +28 -0
- hare/migrations/operations/materialized_views/rename_materialized_view.py +23 -0
- hare/migrations/operations/model_bound_operation.py +95 -0
- hare/migrations/operations/models/__init__.py +12 -0
- hare/migrations/operations/models/alter_model_options.py +158 -0
- hare/migrations/operations/models/alter_model_schema.py +114 -0
- hare/migrations/operations/models/alter_model_table.py +65 -0
- hare/migrations/operations/models/create_model.py +407 -0
- hare/migrations/operations/models/delete_model.py +122 -0
- hare/migrations/operations/models/model_table_operation.py +45 -0
- hare/migrations/operations/models/rename_model.py +165 -0
- hare/migrations/operations/models/table_renaming_operation.py +101 -0
- hare/migrations/operations/operation.py +252 -0
- hare/migrations/operations/partitions/__init__.py +11 -0
- hare/migrations/operations/partitions/add_partition.py +36 -0
- hare/migrations/operations/partitions/partition_operation.py +93 -0
- hare/migrations/operations/partitions/remove_partition.py +36 -0
- hare/migrations/operations/policies/__init__.py +11 -0
- hare/migrations/operations/policies/add_policy.py +28 -0
- hare/migrations/operations/policies/alter_policy.py +30 -0
- hare/migrations/operations/policies/alter_row_level_security.py +90 -0
- hare/migrations/operations/policies/remove_policy.py +21 -0
- hare/migrations/operations/policies/rename_policy.py +21 -0
- hare/migrations/operations/schema_objects/__init__.py +11 -0
- hare/migrations/operations/schema_objects/add_schema_object.py +103 -0
- hare/migrations/operations/schema_objects/alter_schema_object.py +89 -0
- hare/migrations/operations/schema_objects/object_types/__init__.py +1 -0
- hare/migrations/operations/schema_objects/object_types/constraint_object_type.py +98 -0
- hare/migrations/operations/schema_objects/object_types/dictionary_object_type.py +51 -0
- hare/migrations/operations/schema_objects/object_types/function_object_type.py +55 -0
- hare/migrations/operations/schema_objects/object_types/grant_object_type.py +71 -0
- hare/migrations/operations/schema_objects/object_types/index_object_type.py +140 -0
- hare/migrations/operations/schema_objects/object_types/materialized_view_object_type.py +63 -0
- hare/migrations/operations/schema_objects/object_types/policy_object_type.py +53 -0
- hare/migrations/operations/schema_objects/object_types/schema_object_type.py +234 -0
- hare/migrations/operations/schema_objects/object_types/sequence_object_type.py +54 -0
- hare/migrations/operations/schema_objects/object_types/trigger_object_type.py +46 -0
- hare/migrations/operations/schema_objects/object_types/view_object_type.py +60 -0
- hare/migrations/operations/schema_objects/remove_schema_object.py +105 -0
- hare/migrations/operations/schema_objects/rename_schema_object.py +116 -0
- hare/migrations/operations/schemas/__init__.py +11 -0
- hare/migrations/operations/schemas/create_schema.py +45 -0
- hare/migrations/operations/schemas/drop_schema.py +40 -0
- hare/migrations/operations/sequences/__init__.py +10 -0
- hare/migrations/operations/sequences/add_sequence.py +28 -0
- hare/migrations/operations/sequences/alter_sequence.py +29 -0
- hare/migrations/operations/sequences/remove_sequence.py +20 -0
- hare/migrations/operations/sequences/rename_sequence.py +21 -0
- hare/migrations/operations/special/__init__.py +16 -0
- hare/migrations/operations/special/run_python.py +82 -0
- hare/migrations/operations/special/run_sql.py +107 -0
- hare/migrations/operations/special/separate_database_and_state.py +95 -0
- hare/migrations/operations/special/synchronize_key_series.py +51 -0
- hare/migrations/operations/triggers/__init__.py +15 -0
- hare/migrations/operations/triggers/add_trigger.py +28 -0
- hare/migrations/operations/triggers/alter_trigger.py +28 -0
- hare/migrations/operations/triggers/remove_trigger.py +20 -0
- hare/migrations/operations/triggers/rename_trigger.py +21 -0
- hare/migrations/operations/views/__init__.py +10 -0
- hare/migrations/operations/views/add_view.py +29 -0
- hare/migrations/operations/views/alter_view.py +29 -0
- hare/migrations/operations/views/remove_view.py +20 -0
- hare/migrations/operations/views/rename_view.py +21 -0
- hare/migrations/reports/__init__.py +12 -0
- hare/migrations/reports/operation_effect.py +28 -0
- hare/migrations/reports/operation_plan.py +23 -0
- hare/migrations/runtime_enums.py +88 -0
- hare/migrations/safety/__init__.py +16 -0
- hare/migrations/safety/enums.py +37 -0
- hare/migrations/safety/migration_risk.py +33 -0
- hare/migrations/safety/migration_safety_checker.py +250 -0
- hare/migrations/safety/migration_safety_context.py +142 -0
- hare/migrations/state/__init__.py +11 -0
- hare/migrations/state/model_state.py +359 -0
- hare/migrations/state/state.py +297 -0
- hare/migrations/state/state_apps.py +315 -0
- hare/migrations/state/state_rendering.py +222 -0
- hare/migrations/swappable_dependency.py +36 -0
- hare/migrations/writer/__init__.py +9 -0
- hare/migrations/writer/constants.py +28 -0
- hare/migrations/writer/import_manager.py +106 -0
- hare/migrations/writer/migration_writer.py +986 -0
- hare/models/__init__.py +20 -0
- hare/models/class_building/__init__.py +1 -0
- hare/models/class_building/abstract_meta_inheritance.py +116 -0
- hare/models/class_building/blind_indexes.py +54 -0
- hare/models/class_building/constants.py +61 -0
- hare/models/class_building/extension_model_options.py +20 -0
- hare/models/class_building/field_comments.py +131 -0
- hare/models/class_building/generic_foreign_keys.py +287 -0
- hare/models/class_building/instance_constructors.py +110 -0
- hare/models/class_building/lazy_relation_fields.py +140 -0
- hare/models/class_building/model_definition_checks.py +710 -0
- hare/models/class_building/model_field_collection.py +185 -0
- hare/models/class_building/model_managers.py +62 -0
- hare/models/class_building/primary_key_declaration.py +204 -0
- hare/models/class_building/schema_object_declarations.py +106 -0
- hare/models/constants.py +75 -0
- hare/models/deletion/__init__.py +0 -0
- hare/models/deletion/cascade/__init__.py +1 -0
- hare/models/deletion/cascade/cascade_deletion.py +818 -0
- hare/models/deletion/cascade/cascade_restore.py +150 -0
- hare/models/deletion/cascade/deletion_collector.py +646 -0
- hare/models/deletion/cascade/deletion_graph.py +418 -0
- hare/models/deletion/cascade/deletion_plan.py +94 -0
- hare/models/deletion/cascade/protect_constraint_deferral.py +91 -0
- hare/models/deletion/cascade/related_rows.py +417 -0
- hare/models/deletion/cascade/tenant_schema_visits.py +96 -0
- hare/models/deletion/constants.py +29 -0
- hare/models/deletion/instance_deletion.py +288 -0
- hare/models/deletion/preview/__init__.py +1 -0
- hare/models/deletion/preview/delete_preview.py +93 -0
- hare/models/deletion/preview/delete_preview_builder.py +431 -0
- hare/models/deletion/soft_deletion.py +207 -0
- hare/models/enums.py +76 -0
- hare/models/instances/__init__.py +1 -0
- hare/models/instances/dirty_fields.py +99 -0
- hare/models/instances/field_snapshot.py +116 -0
- hare/models/instances/instance_connections.py +61 -0
- hare/models/instances/instance_copies.py +46 -0
- hare/models/instances/instance_initialization.py +323 -0
- hare/models/instances/instance_refresh.py +158 -0
- hare/models/instances/instance_saving.py +512 -0
- hare/models/meta_info.py +1143 -0
- hare/models/model.py +935 -0
- hare/models/model_meta.py +255 -0
- hare/models/tenancy/__init__.py +1 -0
- hare/models/tenancy/constants.py +16 -0
- hare/models/tenancy/tenancy.py +363 -0
- hare/models/tenancy/tenant_row_level_security.py +76 -0
- hare/models/tenancy/tenant_schemas.py +232 -0
- hare/models/uniqueness/__init__.py +0 -0
- hare/models/uniqueness/declared_uniqueness.py +99 -0
- hare/models/write/__init__.py +3 -0
- hare/models/write/generated_keys.py +97 -0
- hare/models/write/insert/__init__.py +1 -0
- hare/models/write/insert/insert_conflict.py +88 -0
- hare/models/write/insert/insert_statement.py +155 -0
- hare/models/write/instance_capture.py +173 -0
- hare/models/write/instance_values.py +126 -0
- hare/models/write/instance_writer.py +949 -0
- hare/models/write/returned_values.py +98 -0
- hare/models/write/rollback_restores.py +213 -0
- hare/models/write/rules/__init__.py +2 -0
- hare/models/write/rules/constants.py +65 -0
- hare/models/write/rules/enums.py +18 -0
- hare/models/write/rules/relation_key_values.py +50 -0
- hare/models/write/rules/row_write_rules.py +635 -0
- hare/models/write/rules/tenant_write_rules.py +300 -0
- hare/models/write/rules/written_instances.py +37 -0
- hare/models/write/rules/written_target_checks.py +63 -0
- hare/models/write/update/__init__.py +1 -0
- hare/models/write/update/expression_assignment.py +162 -0
- hare/models/write/update/update_parameter_slot.py +43 -0
- hare/models/write/write_steps.py +98 -0
- hare/native/__init__.py +1 -0
- hare/native/native_modules.py +19 -0
- hare/numbers/__init__.py +1 -0
- hare/numbers/finite_numbers.py +27 -0
- hare/py.typed +0 -0
- hare/query/__init__.py +0 -0
- hare/query/constants.py +41 -0
- hare/query/enums.py +129 -0
- hare/query/expressions/__init__.py +63 -0
- hare/query/expressions/aggregate.py +442 -0
- hare/query/expressions/aggregate_paths/__init__.py +9 -0
- hare/query/expressions/aggregate_paths/aggregate_crossing.py +20 -0
- hare/query/expressions/aggregate_paths/aggregated_multi_valued_paths.py +581 -0
- hare/query/expressions/aggregate_paths/constants.py +10 -0
- hare/query/expressions/arithmetic/__init__.py +1 -0
- hare/query/expressions/arithmetic/arithmetic_operators.py +57 -0
- hare/query/expressions/arithmetic/combinable_expression.py +47 -0
- hare/query/expressions/arithmetic/combined_expression.py +614 -0
- hare/query/expressions/arithmetic/constants.py +37 -0
- hare/query/expressions/case/__init__.py +1 -0
- hare/query/expressions/case/case.py +230 -0
- hare/query/expressions/case/case_branch_value.py +14 -0
- hare/query/expressions/case/when.py +167 -0
- hare/query/expressions/compatibility/__init__.py +9 -0
- hare/query/expressions/compatibility/constants.py +107 -0
- hare/query/expressions/compatibility/output_field_compatibility.py +248 -0
- hare/query/expressions/compatibility/result_branch.py +46 -0
- hare/query/expressions/conditions/__init__.py +1 -0
- hare/query/expressions/conditions/q.py +525 -0
- hare/query/expressions/conditions/query_modifier.py +90 -0
- hare/query/expressions/constants.py +120 -0
- hare/query/expressions/declarations.py +12 -0
- hare/query/expressions/enums.py +39 -0
- hare/query/expressions/expression.py +129 -0
- hare/query/expressions/expression_context.py +63 -0
- hare/query/expressions/expression_result.py +41 -0
- hare/query/expressions/f.py +212 -0
- hare/query/expressions/frames/__init__.py +12 -0
- hare/query/expressions/frames/constants.py +14 -0
- hare/query/expressions/frames/declarations.py +22 -0
- hare/query/expressions/frames/window_frame.py +126 -0
- hare/query/expressions/function.py +490 -0
- hare/query/expressions/joins/__init__.py +1 -0
- hare/query/expressions/joins/array_join.py +147 -0
- hare/query/expressions/joins/array_join_element.py +27 -0
- hare/query/expressions/joins/asof_join.py +263 -0
- hare/query/expressions/joins/filtered_relation.py +338 -0
- hare/query/expressions/joins/json_table.py +147 -0
- hare/query/expressions/joins/json_table_column.py +21 -0
- hare/query/expressions/joins/lateral.py +88 -0
- hare/query/expressions/joins/merge_source_row.py +44 -0
- hare/query/expressions/joins/named_columns.py +43 -0
- hare/query/expressions/joins/named_join.py +204 -0
- hare/query/expressions/numeric/__init__.py +11 -0
- hare/query/expressions/numeric/numeric_type.py +18 -0
- hare/query/expressions/numeric/numeric_typing.py +216 -0
- hare/query/expressions/numeric/unrounded_decimal_field.py +16 -0
- hare/query/expressions/ordering.py +55 -0
- hare/query/expressions/raw_sql.py +168 -0
- hare/query/expressions/subqueries/__init__.py +1 -0
- hare/query/expressions/subqueries/cte_rows.py +46 -0
- hare/query/expressions/subqueries/declarations.py +8 -0
- hare/query/expressions/subqueries/exists.py +181 -0
- hare/query/expressions/subqueries/outer_reference.py +157 -0
- hare/query/expressions/subqueries/outer_scope.py +74 -0
- hare/query/expressions/subqueries/recursive_rows.py +177 -0
- hare/query/expressions/subqueries/subquery.py +236 -0
- hare/query/expressions/temporal/__init__.py +9 -0
- hare/query/expressions/temporal/constants.py +43 -0
- hare/query/expressions/temporal/temporal_arithmetic.py +254 -0
- hare/query/expressions/temporal/temporal_operand.py +25 -0
- hare/query/expressions/term_expression.py +28 -0
- hare/query/expressions/value.py +259 -0
- hare/query/expressions/value_references/__init__.py +49 -0
- hare/query/expressions/value_references/array_value_reference.py +41 -0
- hare/query/expressions/value_references/composite_key_value_reference.py +61 -0
- hare/query/expressions/value_references/cursor_value_reference.py +41 -0
- hare/query/expressions/value_references/encoded_value_reference.py +43 -0
- hare/query/expressions/value_references/expression_arguments.py +181 -0
- hare/query/expressions/value_references/like_value_reference.py +46 -0
- hare/query/expressions/value_references/list_parameter_value_reference.py +65 -0
- hare/query/expressions/value_references/list_value_reference.py +55 -0
- hare/query/expressions/value_references/literal_value_reference.py +38 -0
- hare/query/expressions/value_references/open_range_value_reference.py +53 -0
- hare/query/expressions/value_references/range_value_reference.py +49 -0
- hare/query/expressions/value_references/rebuilt_criterion_value_reference.py +93 -0
- hare/query/expressions/value_references/related_key_value_reference.py +67 -0
- hare/query/expressions/value_references/related_value_reference.py +33 -0
- hare/query/expressions/value_references/row_list_value_reference.py +67 -0
- hare/query/expressions/value_references/scalar_value_reference.py +41 -0
- hare/query/expressions/value_references/value_reference_types.py +65 -0
- hare/query/expressions/value_references/write_value_reference.py +41 -0
- hare/query/expressions/window.py +220 -0
- hare/query/filters/__init__.py +21 -0
- hare/query/filters/constants.py +89 -0
- hare/query/filters/lookups/__init__.py +1 -0
- hare/query/filters/lookups/annotation_container_lookups.py +40 -0
- hare/query/filters/lookups/constants.py +60 -0
- hare/query/filters/lookups/containers/__init__.py +3 -0
- hare/query/filters/lookups/containers/container_field_lookups.py +78 -0
- hare/query/filters/lookups/containers/container_lookups.py +80 -0
- hare/query/filters/lookups/containers/container_value_encoders.py +94 -0
- hare/query/filters/lookups/date_part_lookups.py +292 -0
- hare/query/filters/lookups/dialect_implemented_operators.py +39 -0
- hare/query/filters/lookups/field_lookup.py +59 -0
- hare/query/filters/lookups/field_lookups.py +289 -0
- hare/query/filters/lookups/field_transforms.py +98 -0
- hare/query/filters/lookups/json/__init__.py +1 -0
- hare/query/filters/lookups/json/json_filter_guards.py +412 -0
- hare/query/filters/lookups/json/json_filter_parser.py +82 -0
- hare/query/filters/lookups/json/json_lookups.py +67 -0
- hare/query/filters/lookups/json/json_path_lookups.py +184 -0
- hare/query/filters/lookups/lookups.py +371 -0
- hare/query/filters/lookups/value_encoders.py +246 -0
- hare/query/filters/resolution/__init__.py +1 -0
- hare/query/filters/resolution/annotation_filters.py +280 -0
- hare/query/filters/resolution/composite_key_filters.py +439 -0
- hare/query/filters/resolution/filter_kwargs.py +704 -0
- hare/query/filters/resolution/filter_values.py +565 -0
- hare/query/filters/resolution/json_path_filters.py +157 -0
- hare/query/filters/resolution/lookup_support.py +84 -0
- hare/query/filters/resolution/relation_filters.py +510 -0
- hare/query/filters/resolution/sensitive_filter_keys.py +91 -0
- hare/query/filters/resolution/to_many_filters.py +436 -0
- hare/query/functions/__init__.py +185 -0
- hare/query/functions/aggregates/__init__.py +9 -0
- hare/query/functions/aggregates/array_agg.py +48 -0
- hare/query/functions/aggregates/avg.py +59 -0
- hare/query/functions/aggregates/constants.py +5 -0
- hare/query/functions/aggregates/count.py +81 -0
- hare/query/functions/aggregates/declarations.py +51 -0
- hare/query/functions/aggregates/statistic_aggregate.py +67 -0
- hare/query/functions/aggregates/sum.py +55 -0
- hare/query/functions/comparison/__init__.py +9 -0
- hare/query/functions/comparison/cast.py +121 -0
- hare/query/functions/comparison/coalesce.py +140 -0
- hare/query/functions/comparison/collate.py +45 -0
- hare/query/functions/comparison/declarations.py +21 -0
- hare/query/functions/comparison/function_arguments.py +70 -0
- hare/query/functions/comparison/greatest_least_function.py +108 -0
- hare/query/functions/comparison/null_if.py +78 -0
- hare/query/functions/containers/__init__.py +7 -0
- hare/query/functions/containers/array_item.py +69 -0
- hare/query/functions/datetime/__init__.py +55 -0
- hare/query/functions/datetime/date_function_source.py +31 -0
- hare/query/functions/datetime/declarations.py +193 -0
- hare/query/functions/datetime/extract.py +97 -0
- hare/query/functions/datetime/now.py +26 -0
- hare/query/functions/datetime/trunc.py +124 -0
- hare/query/functions/json/__init__.py +6 -0
- hare/query/functions/json/json_array.py +34 -0
- hare/query/functions/json/json_object.py +161 -0
- hare/query/functions/math/__init__.py +53 -0
- hare/query/functions/math/declarations.py +192 -0
- hare/query/functions/math/enums.py +16 -0
- hare/query/functions/math/math_function.py +110 -0
- hare/query/functions/math/mod.py +52 -0
- hare/query/functions/math/pi.py +21 -0
- hare/query/functions/math/random.py +22 -0
- hare/query/functions/math/round.py +85 -0
- hare/query/functions/text/__init__.py +55 -0
- hare/query/functions/text/concat.py +99 -0
- hare/query/functions/text/declarations.py +197 -0
- hare/query/functions/text/l_pad.py +17 -0
- hare/query/functions/text/length.py +38 -0
- hare/query/functions/text/r_pad.py +17 -0
- hare/query/functions/text/replace.py +17 -0
- hare/query/functions/text/text_function.py +114 -0
- hare/query/functions/window/__init__.py +45 -0
- hare/query/functions/window/aggregate_window_function.py +43 -0
- hare/query/functions/window/avg.py +23 -0
- hare/query/functions/window/constants.py +3 -0
- hare/query/functions/window/count.py +54 -0
- hare/query/functions/window/declarations.py +153 -0
- hare/query/functions/window/distribution_window_function.py +21 -0
- hare/query/functions/window/field_window_function.py +149 -0
- hare/query/functions/window/n_tile.py +41 -0
- hare/query/functions/window/nth_value.py +54 -0
- hare/query/functions/window/offset_window_function.py +85 -0
- hare/query/functions/window/rank_like_window_function.py +21 -0
- hare/query/functions/window/statistic_window_function.py +44 -0
- hare/query/functions/window/sum.py +23 -0
- hare/query/functions/window/window_function.py +134 -0
- hare/query/generic_foreign_keys/__init__.py +3 -0
- hare/query/generic_foreign_keys/constants.py +21 -0
- hare/query/generic_foreign_keys/generic_foreign_key_filters.py +251 -0
- hare/query/generic_foreign_keys/generic_foreign_key_paths.py +183 -0
- hare/query/generic_foreign_keys/generic_foreign_key_types.py +94 -0
- hare/query/grouping/__init__.py +14 -0
- hare/query/grouping/declarations.py +21 -0
- hare/query/grouping/grouping.py +60 -0
- hare/query/grouping/grouping_set.py +67 -0
- hare/query/grouping/grouping_sets.py +55 -0
- hare/query/key_columns.py +297 -0
- hare/query/lookup_info/__init__.py +12 -0
- hare/query/lookup_info/declarations.py +27 -0
- hare/query/lookup_info/lookup_info.py +89 -0
- hare/query/lookup_info/lookup_info_builder.py +807 -0
- hare/query/lookup_info/lookup_path.py +94 -0
- hare/query/lookup_info/lookup_paths.py +415 -0
- hare/query/lookup_info/ordering_info.py +43 -0
- hare/query/lookup_info/value_paths.py +135 -0
- hare/query/managers/__init__.py +1 -0
- hare/query/managers/base_manager.py +20 -0
- hare/query/managers/manager.py +130 -0
- hare/query/plans/__init__.py +4 -0
- hare/query/plans/call_signatures/__init__.py +1 -0
- hare/query/plans/call_signatures/call_signature_plans.py +318 -0
- hare/query/plans/call_signatures/call_signature_runs.py +466 -0
- hare/query/plans/constants.py +37 -0
- hare/query/plans/description/__init__.py +11 -0
- hare/query/plans/description/declared_plan_parts.py +7 -0
- hare/query/plans/description/filter_plan_descriptions.py +229 -0
- hare/query/plans/description/hashable_values.py +22 -0
- hare/query/plans/description/plan_context.py +33 -0
- hare/query/plans/description/plan_describer_compiler.py +355 -0
- hare/query/plans/description/plan_description.py +66 -0
- hare/query/plans/description/plan_parts.py +150 -0
- hare/query/plans/description/plannable.py +69 -0
- hare/query/plans/description/term_plan_descriptions.py +92 -0
- hare/query/plans/enums.py +97 -0
- hare/query/plans/plan_origins.py +99 -0
- hare/query/plans/recording/__init__.py +1 -0
- hare/query/plans/recording/plan_recording.py +100 -0
- hare/query/plans/recording/scope_value_source.py +67 -0
- hare/query/plans/statement/__init__.py +1 -0
- hare/query/plans/statement/declared_plan_slots.py +11 -0
- hare/query/plans/statement/query_key_compiler.py +171 -0
- hare/query/plans/statement/raw_sql_plan.py +47 -0
- hare/query/plans/statement/statement_plan.py +522 -0
- hare/query/plans/statement/statement_plan_descriptions.py +451 -0
- hare/query/plans/statement/statement_plan_runs.py +306 -0
- hare/query/plans/statement/statement_plans.py +128 -0
- hare/query/query_connection.py +110 -0
- hare/query/queryset/__init__.py +19 -0
- hare/query/queryset/annotation_access_tracker.py +20 -0
- hare/query/queryset/arguments/__init__.py +1 -0
- hare/query/queryset/arguments/annotation_arguments.py +215 -0
- hare/query/queryset/arguments/collection_arguments.py +29 -0
- hare/query/queryset/arguments/filter_arguments.py +260 -0
- hare/query/queryset/arguments/ordering_arguments.py +242 -0
- hare/query/queryset/arguments/values_arguments.py +145 -0
- hare/query/queryset/combination/__init__.py +1 -0
- hare/query/queryset/combination/combination.py +58 -0
- hare/query/queryset/combination/queryset_combination.py +109 -0
- hare/query/queryset/concrete_field_paths.py +109 -0
- hare/query/queryset/constants.py +83 -0
- hare/query/queryset/date_lists.py +74 -0
- hare/query/queryset/declarations.py +7 -0
- hare/query/queryset/extensions/__init__.py +9 -0
- hare/query/queryset/extensions/query_set_extension.py +78 -0
- hare/query/queryset/extensions/query_set_extension_call.py +19 -0
- hare/query/queryset/extensions/query_set_extension_query.py +146 -0
- hare/query/queryset/extensions/query_set_extensions.py +247 -0
- hare/query/queryset/lazy_relation_names.py +33 -0
- hare/query/queryset/model_query.py +79 -0
- hare/query/queryset/objects_by_key.py +79 -0
- hare/query/queryset/options/__init__.py +1 -0
- hare/query/queryset/options/query_option.py +42 -0
- hare/query/queryset/options/query_options.py +313 -0
- hare/query/queryset/pending_calls/__init__.py +1 -0
- hare/query/queryset/pending_calls/calls_before_setup.py +185 -0
- hare/query/queryset/pending_calls/pending_filter_calls.py +144 -0
- hare/query/queryset/query_specification.py +1088 -0
- hare/query/queryset/queryset.py +2527 -0
- hare/query/queryset/relations/__init__.py +3 -0
- hare/query/queryset/relations/linked_many_to_many_relation.py +41 -0
- hare/query/queryset/relations/many_to_many/__init__.py +1 -0
- hare/query/queryset/relations/many_to_many/linked_keys.py +147 -0
- hare/query/queryset/relations/many_to_many/linked_rows_queries.py +175 -0
- hare/query/queryset/relations/many_to_many/many_to_many_members.py +173 -0
- hare/query/queryset/relations/many_to_many/many_to_many_scope_checks.py +332 -0
- hare/query/queryset/relations/many_to_many/through_defaults.py +244 -0
- hare/query/queryset/relations/many_to_many/through_row_inserting.py +516 -0
- hare/query/queryset/relations/many_to_many/through_row_unlinking.py +333 -0
- hare/query/queryset/relations/many_to_many/through_rows.py +185 -0
- hare/query/queryset/relations/many_to_many_relation.py +382 -0
- hare/query/queryset/relations/related_queryset/__init__.py +9 -0
- hare/query/queryset/relations/related_queryset/related_query_set.py +366 -0
- hare/query/queryset/relations/related_queryset/related_rows_iterator.py +42 -0
- hare/query/queryset/relations/related_queryset/relation_rows.py +73 -0
- hare/query/queryset/relations/related_queryset/unsaved_owner_condition.py +37 -0
- hare/query/queryset/relations/reverse_relation.py +474 -0
- hare/query/queryset/row_multiplication.py +151 -0
- hare/query/queryset/schema_object_calls.py +45 -0
- hare/query/queryset/selection/__init__.py +1 -0
- hare/query/queryset/selection/statement_selection.py +217 -0
- hare/query/queryset/selection/values_selection.py +65 -0
- hare/query/queryset/single_rows/__init__.py +1 -0
- hare/query/queryset/single_rows/get_exception_argument.py +7 -0
- hare/query/queryset/single_rows/get_exceptions.py +91 -0
- hare/query/queryset/single_rows/none_awaitable_type.py +21 -0
- hare/query/queryset/single_rows/query_set_single.py +49 -0
- hare/query/queryset/single_rows/single_row.py +103 -0
- hare/query/queryset/specification_copying.py +123 -0
- hare/query/queryset/table_sample.py +60 -0
- hare/query/raw_sql/__init__.py +6 -0
- hare/query/raw_sql/execute_sql.py +71 -0
- hare/query/raw_sql/sql_query_result.py +38 -0
- hare/query/relation_loading/__init__.py +14 -0
- hare/query/relation_loading/constants.py +8 -0
- hare/query/relation_loading/prefetching/__init__.py +1 -0
- hare/query/relation_loading/prefetching/declarations.py +32 -0
- hare/query/relation_loading/prefetching/direct_relation_prefetch.py +234 -0
- hare/query/relation_loading/prefetching/many_to_many_prefetch.py +496 -0
- hare/query/relation_loading/prefetching/prefetch.py +198 -0
- hare/query/relation_loading/prefetching/prefetch_checks.py +80 -0
- hare/query/relation_loading/prefetching/prefetch_related_objects.py +48 -0
- hare/query/relation_loading/prefetching/prefetch_request.py +30 -0
- hare/query/relation_loading/prefetching/prefetcher.py +200 -0
- hare/query/relation_loading/prefetching/related_rows_fetch.py +116 -0
- hare/query/relation_loading/prefetching/reverse_relation_prefetch.py +201 -0
- hare/query/relation_loading/prefetching/sliced_prefetch.py +165 -0
- hare/query/relation_loading/select.py +26 -0
- hare/query/rows/__init__.py +3 -0
- hare/query/rows/constants.py +33 -0
- hare/query/rows/enums.py +81 -0
- hare/query/rows/model_rows/__init__.py +1 -0
- hare/query/rows/model_rows/combined_model_rows.py +254 -0
- hare/query/rows/model_rows/model_columns.py +210 -0
- hare/query/rows/model_rows/model_rows.py +462 -0
- hare/query/rows/native/__init__.py +1 -0
- hare/query/rows/native/enums.py +12 -0
- hare/query/rows/native/field_codecs.py +450 -0
- hare/query/rows/native/hydrate_accelerator.py +264 -0
- hare/query/rows/native/hydration_layout.py +114 -0
- hare/query/rows/values_rows/__init__.py +1 -0
- hare/query/rows/values_rows/combined_values_rows.py +133 -0
- hare/query/rows/values_rows/dict_rows.py +92 -0
- hare/query/rows/values_rows/flat_rows.py +33 -0
- hare/query/rows/values_rows/named_rows.py +52 -0
- hare/query/rows/values_rows/tuple_rows.py +128 -0
- hare/query/rows/values_rows/value_field.py +26 -0
- hare/query/rows/values_rows/values_rows.py +175 -0
- hare/query/scopes/__init__.py +21 -0
- hare/query/scopes/constants.py +14 -0
- hare/query/scopes/manager_scope.py +51 -0
- hare/query/scopes/row_scope.py +46 -0
- hare/query/scopes/row_scopes.py +281 -0
- hare/query/scopes/row_visibility.py +89 -0
- hare/query/scopes/scope_join_conditions.py +273 -0
- hare/query/scopes/soft_delete_scope.py +17 -0
- hare/query/scopes/tenants/__init__.py +1 -0
- hare/query/scopes/tenants/all_tenants.py +11 -0
- hare/query/scopes/tenants/model_tenants.py +79 -0
- hare/query/scopes/tenants/tenant_scope.py +70 -0
- hare/query/scopes/tenants/tenant_values.py +52 -0
- hare/query/statements/__init__.py +30 -0
- hare/query/statements/awaitable_query.py +709 -0
- hare/query/statements/building/__init__.py +1 -0
- hare/query/statements/building/keyset_bounds.py +179 -0
- hare/query/statements/building/query_annotations.py +350 -0
- hare/query/statements/building/query_conditions.py +244 -0
- hare/query/statements/building/query_ctes.py +70 -0
- hare/query/statements/building/query_grouping.py +347 -0
- hare/query/statements/building/query_joins.py +282 -0
- hare/query/statements/building/query_ordering.py +275 -0
- hare/query/statements/building/row_locks.py +216 -0
- hare/query/statements/constants.py +111 -0
- hare/query/statements/select/__init__.py +4 -0
- hare/query/statements/select/combined/__init__.py +1 -0
- hare/query/statements/select/combined/combined_branches.py +380 -0
- hare/query/statements/select/combined/combined_derived_queries.py +220 -0
- hare/query/statements/select/combined/combined_plan_descriptions.py +43 -0
- hare/query/statements/select/combined_query.py +354 -0
- hare/query/statements/select/model_rows/__init__.py +1 -0
- hare/query/statements/select/model_rows/instance_hydration.py +162 -0
- hare/query/statements/select/model_rows/model_rows_plan_descriptions.py +108 -0
- hare/query/statements/select/model_rows/only_defer_fields.py +243 -0
- hare/query/statements/select/model_rows/select_related_joins.py +112 -0
- hare/query/statements/select/model_rows_query.py +416 -0
- hare/query/statements/select/raw_sql_query.py +151 -0
- hare/query/statements/select/rows_query.py +210 -0
- hare/query/statements/select/select_query.py +110 -0
- hare/query/statements/select/values/__init__.py +1 -0
- hare/query/statements/select/values/constants.py +9 -0
- hare/query/statements/select/values/values_distinct.py +41 -0
- hare/query/statements/select/values/values_grouping.py +118 -0
- hare/query/statements/select/values/values_output.py +298 -0
- hare/query/statements/select/values/values_reading.py +26 -0
- hare/query/statements/select/values/window_filter_wrapping.py +91 -0
- hare/query/statements/select/values_query.py +754 -0
- hare/query/statements/summary/__init__.py +3 -0
- hare/query/statements/summary/aggregate_query.py +732 -0
- hare/query/statements/summary/contains_query.py +66 -0
- hare/query/statements/summary/count_query.py +117 -0
- hare/query/statements/summary/exists_query.py +151 -0
- hare/query/statements/summary/rows_summary_query.py +187 -0
- hare/query/statements/write/__init__.py +3 -0
- hare/query/statements/write/bulk/__init__.py +1 -0
- hare/query/statements/write/bulk/bulk_objects.py +61 -0
- hare/query/statements/write/bulk/bulk_update_checks.py +92 -0
- hare/query/statements/write/bulk/bulk_update_query.py +1012 -0
- hare/query/statements/write/bulk/bulk_write_batches.py +368 -0
- hare/query/statements/write/bulk/create/__init__.py +1 -0
- hare/query/statements/write/bulk/create/bulk_create_query.py +936 -0
- hare/query/statements/write/bulk/create/bulk_create_reports.py +316 -0
- hare/query/statements/write/bulk/create/conflict_clause.py +137 -0
- hare/query/statements/write/bulk/create/copy_insert.py +143 -0
- hare/query/statements/write/bulk/create/default_rows_insert.py +85 -0
- hare/query/statements/write/bulk/create/inline_insert.py +93 -0
- hare/query/statements/write/bulk/create/multi_row_insert.py +277 -0
- hare/query/statements/write/bulk/create/returned_rows_matching.py +136 -0
- hare/query/statements/write/bulk/create/template_insert.py +185 -0
- hare/query/statements/write/bulk/declarations.py +61 -0
- hare/query/statements/write/create_or_update.py +193 -0
- hare/query/statements/write/declarations.py +26 -0
- hare/query/statements/write/delete_query.py +402 -0
- hare/query/statements/write/insert_from_query.py +373 -0
- hare/query/statements/write/matching_rows_query.py +268 -0
- hare/query/statements/write/merge/__init__.py +1 -0
- hare/query/statements/write/merge/merge_query.py +818 -0
- hare/query/statements/write/merge/merge_when.py +87 -0
- hare/query/statements/write/restore_query.py +105 -0
- hare/query/statements/write/returning/__init__.py +1 -0
- hare/query/statements/write/returning/delete_returning_query.py +154 -0
- hare/query/statements/write/returning/returned_rows.py +246 -0
- hare/query/statements/write/returning/update_returning_query.py +120 -0
- hare/query/statements/write/update_query.py +851 -0
- hare/search/__init__.py +29 -0
- hare/search/constants.py +22 -0
- hare/search/enums.py +26 -0
- hare/search/query/__init__.py +8 -0
- hare/search/query/combined_search_query.py +46 -0
- hare/search/query/declarations.py +9 -0
- hare/search/query/search_query.py +75 -0
- hare/search/query/search_query_combinable.py +40 -0
- hare/search/search_arguments.py +79 -0
- hare/search/search_features.py +35 -0
- hare/search/search_headline.py +186 -0
- hare/search/search_rank.py +144 -0
- hare/search/types.py +16 -0
- hare/search/vector/__init__.py +7 -0
- hare/search/vector/combined_search_vector.py +32 -0
- hare/search/vector/search_vector.py +77 -0
- hare/search/vector/search_vector_combinable.py +30 -0
- hare/sql/__init__.py +71 -0
- hare/sql/analytics/__init__.py +17 -0
- hare/sql/analytics/count.py +13 -0
- hare/sql/analytics/current_row.py +10 -0
- hare/sql/analytics/declarations.py +15 -0
- hare/sql/analytics/row_number.py +13 -0
- hare/sql/builder/__init__.py +29 -0
- hare/sql/builder/joins/__init__.py +16 -0
- hare/sql/builder/joins/join.py +71 -0
- hare/sql/builder/joins/join_on.py +73 -0
- hare/sql/builder/joins/joiner.py +38 -0
- hare/sql/builder/queries/__init__.py +17 -0
- hare/sql/builder/queries/constants.py +5 -0
- hare/sql/builder/queries/correlated_subqueries.py +583 -0
- hare/sql/builder/queries/pagination_sql.py +19 -0
- hare/sql/builder/queries/query.py +109 -0
- hare/sql/builder/queries/query_builder.py +1090 -0
- hare/sql/builder/queries/query_sql_rendering.py +407 -0
- hare/sql/builder/queries/set_operation_query.py +203 -0
- hare/sql/builder/returned_value.py +19 -0
- hare/sql/builder/tables/__init__.py +22 -0
- hare/sql/builder/tables/aliased_query.py +33 -0
- hare/sql/builder/tables/array_join_source.py +39 -0
- hare/sql/builder/tables/asof_join_source.py +29 -0
- hare/sql/builder/tables/cte.py +18 -0
- hare/sql/builder/tables/database.py +12 -0
- hare/sql/builder/tables/json_table_query.py +76 -0
- hare/sql/builder/tables/lateral_query.py +26 -0
- hare/sql/builder/tables/schema.py +42 -0
- hare/sql/builder/tables/selectable.py +83 -0
- hare/sql/builder/tables/table.py +170 -0
- hare/sql/builder_methods.py +56 -0
- hare/sql/constants.py +87 -0
- hare/sql/enums.py +211 -0
- hare/sql/exceptions.py +31 -0
- hare/sql/functions/__init__.py +81 -0
- hare/sql/functions/address_text.py +18 -0
- hare/sql/functions/cast.py +19 -0
- hare/sql/functions/cast_to.py +38 -0
- hare/sql/functions/coalesce.py +13 -0
- hare/sql/functions/count.py +14 -0
- hare/sql/functions/datetime/__init__.py +1 -0
- hare/sql/functions/datetime/date.py +16 -0
- hare/sql/functions/datetime/date_as_timestamp.py +23 -0
- hare/sql/functions/datetime/date_trunc.py +65 -0
- hare/sql/functions/datetime/datetime_as_text.py +16 -0
- hare/sql/functions/datetime/datetime_cast.py +68 -0
- hare/sql/functions/datetime/extract.py +92 -0
- hare/sql/functions/datetime/now.py +14 -0
- hare/sql/functions/datetime/temporal_difference.py +26 -0
- hare/sql/functions/datetime/temporal_shift.py +38 -0
- hare/sql/functions/datetime/timestamp_comparand.py +18 -0
- hare/sql/functions/declarations.py +19 -0
- hare/sql/functions/distinct_option_function.py +33 -0
- hare/sql/functions/greatest_least.py +25 -0
- hare/sql/functions/grouping_function.py +13 -0
- hare/sql/functions/json/__init__.py +1 -0
- hare/sql/functions/json/json_array.py +14 -0
- hare/sql/functions/json/json_object.py +14 -0
- hare/sql/functions/json/json_sort_key.py +15 -0
- hare/sql/functions/json/json_value.py +19 -0
- hare/sql/functions/numeric_cast.py +16 -0
- hare/sql/functions/random_number.py +13 -0
- hare/sql/functions/round.py +20 -0
- hare/sql/functions/statistic.py +20 -0
- hare/sql/functions/std_dev.py +13 -0
- hare/sql/functions/text/__init__.py +1 -0
- hare/sql/functions/text/collate.py +61 -0
- hare/sql/functions/text/concat.py +18 -0
- hare/sql/functions/text/concat_function.py +53 -0
- hare/sql/functions/text/decimal_text_collate.py +16 -0
- hare/sql/functions/text/lower.py +12 -0
- hare/sql/functions/text/replace.py +12 -0
- hare/sql/functions/text/upper.py +12 -0
- hare/sql/identifiers.py +61 -0
- hare/sql/sql_context.py +155 -0
- hare/sql/terms/__init__.py +90 -0
- hare/sql/terms/arithmetic_expression.py +120 -0
- hare/sql/terms/array.py +109 -0
- hare/sql/terms/bracket.py +12 -0
- hare/sql/terms/case/__init__.py +1 -0
- hare/sql/terms/case/case.py +123 -0
- hare/sql/terms/case/when_then.py +11 -0
- hare/sql/terms/constants.py +5 -0
- hare/sql/terms/containers/__init__.py +35 -0
- hare/sql/terms/containers/array_element_term.py +58 -0
- hare/sql/terms/containers/array_slice_term.py +28 -0
- hare/sql/terms/containers/constants.py +6 -0
- hare/sql/terms/containers/container_function.py +22 -0
- hare/sql/terms/containers/container_literal.py +37 -0
- hare/sql/terms/containers/declarations.py +47 -0
- hare/sql/terms/containers/map_value_term.py +30 -0
- hare/sql/terms/containers/tuple_element_term.py +21 -0
- hare/sql/terms/criteria/__init__.py +37 -0
- hare/sql/terms/criteria/basic_criterion.py +92 -0
- hare/sql/terms/criteria/between_criterion.py +39 -0
- hare/sql/terms/criteria/complex_criterion.py +47 -0
- hare/sql/terms/criteria/contains_criterion.py +81 -0
- hare/sql/terms/criteria/criterion.py +87 -0
- hare/sql/terms/criteria/empty_criterion.py +38 -0
- hare/sql/terms/criteria/is_distinct_from_criterion.py +52 -0
- hare/sql/terms/criteria/is_not_true_criterion.py +49 -0
- hare/sql/terms/criteria/json_attribute_criterion.py +62 -0
- hare/sql/terms/criteria/like.py +56 -0
- hare/sql/terms/criteria/nested_criterion.py +78 -0
- hare/sql/terms/criteria/not_criterion.py +78 -0
- hare/sql/terms/criteria/null_criterion.py +47 -0
- hare/sql/terms/criteria/range_criterion.py +28 -0
- hare/sql/terms/criteria/true_criterion.py +13 -0
- hare/sql/terms/field.py +65 -0
- hare/sql/terms/functions/__init__.py +30 -0
- hare/sql/terms/functions/aggregate_function.py +119 -0
- hare/sql/terms/functions/analytic_function.py +107 -0
- hare/sql/terms/functions/custom_function.py +39 -0
- hare/sql/terms/functions/decimal_mod.py +27 -0
- hare/sql/terms/functions/float_mod.py +24 -0
- hare/sql/terms/functions/function.py +131 -0
- hare/sql/terms/functions/interval.py +110 -0
- hare/sql/terms/functions/mod.py +22 -0
- hare/sql/terms/functions/pow.py +11 -0
- hare/sql/terms/functions/window_frame_analytic_function.py +78 -0
- hare/sql/terms/grouping/__init__.py +14 -0
- hare/sql/terms/grouping/declarations.py +17 -0
- hare/sql/terms/grouping/grouping_element.py +42 -0
- hare/sql/terms/grouping/grouping_sets_element.py +46 -0
- hare/sql/terms/index.py +15 -0
- hare/sql/terms/infix_operator.py +34 -0
- hare/sql/terms/json.py +100 -0
- hare/sql/terms/negative.py +49 -0
- hare/sql/terms/node.py +135 -0
- hare/sql/terms/parameters/__init__.py +1 -0
- hare/sql/terms/parameters/list_parameter.py +33 -0
- hare/sql/terms/parameters/parameter.py +35 -0
- hare/sql/terms/parameters/parameterized_value_wrapper.py +19 -0
- hare/sql/terms/parameters/parameterizer.py +99 -0
- hare/sql/terms/parameters/query_parameters.py +74 -0
- hare/sql/terms/parameters/recording_parameterizer.py +27 -0
- hare/sql/terms/qualified_outer_field.py +58 -0
- hare/sql/terms/select_reference.py +80 -0
- hare/sql/terms/star.py +30 -0
- hare/sql/terms/subqueries/__init__.py +1 -0
- hare/sql/terms/subqueries/exists_term.py +111 -0
- hare/sql/terms/subqueries/outer_aggregate_term.py +51 -0
- hare/sql/terms/term.py +334 -0
- hare/sql/terms/term_identity_text.py +60 -0
- hare/sql/terms/tuple.py +52 -0
- hare/sql/terms/values/__init__.py +1 -0
- hare/sql/terms/values/literal_value.py +21 -0
- hare/sql/terms/values/null_value.py +10 -0
- hare/sql/terms/values/old_row_value.py +28 -0
- hare/sql/terms/values/row_value_list.py +15 -0
- hare/sql/terms/values/value_wrapper.py +129 -0
- hare/sql/types/__init__.py +1 -0
- hare/sql/types/sql_type.py +13 -0
- hare/sql/types/sql_types.py +17 -0
- hare/stubs/__init__.py +2 -0
- hare/stubs/constants.py +18 -0
- hare/stubs/model_stub.py +415 -0
- hare/stubs/module_stub.py +150 -0
- hare/stubs/stub_imports.py +91 -0
- hare/stubs/stub_writer.py +60 -0
- hare/stubs/value_type_text.py +98 -0
- hare/time/__init__.py +12 -0
- hare/time/constants.py +27 -0
- hare/time/system_clock.py +84 -0
- hare/time/timezone.py +534 -0
- hare/time/zone_info.py +13 -0
- hare/transactions/__init__.py +25 -0
- hare/transactions/atomic/__init__.py +1 -0
- hare/transactions/atomic/atomic.py +138 -0
- hare/transactions/atomic/atomic_attempt.py +62 -0
- hare/transactions/atomic/atomic_attempts.py +73 -0
- hare/transactions/constants.py +41 -0
- hare/transactions/distributed/__init__.py +9 -0
- hare/transactions/distributed/declarations.py +32 -0
- hare/transactions/distributed/distributed_coordinator.py +784 -0
- hare/transactions/distributed/distributed_transactions.py +26 -0
- hare/transactions/distributed/stale_prepared_transaction.py +23 -0
- hare/transactions/enums.py +31 -0
- hare/transactions/transaction_options.py +86 -0
- hare/transactions/transactions.py +228 -0
- hare/typing_info/__init__.py +3 -0
- hare/typing_info/bound_models.py +73 -0
- hare/typing_info/constants.py +13 -0
- hare/typing_info/declarations.py +44 -0
- hare/typing_info/filter_value_types.py +144 -0
- hare/vectors/__init__.py +18 -0
- hare/vectors/constants.py +10 -0
- hare/vectors/declarations.py +41 -0
- hare/vectors/enums.py +14 -0
- hare/vectors/terms/__init__.py +6 -0
- hare/vectors/terms/vector_distance_term.py +22 -0
- hare/vectors/terms/vector_literal.py +18 -0
- hare/vectors/vector_distance_expression.py +107 -0
- hare/vectors/vector_field.py +147 -0
- hare/warnings.py +13 -0
- hare_orm-0.9.0.dist-info/LICENSE +27 -0
- hare_orm-0.9.0.dist-info/METADATA +321 -0
- hare_orm-0.9.0.dist-info/NOTICE.md +96 -0
- hare_orm-0.9.0.dist-info/NOTICE.ru.md +98 -0
- hare_orm-0.9.0.dist-info/RECORD +2267 -0
- hare_orm-0.9.0.dist-info/WHEEL +4 -0
- hare_orm-0.9.0.dist-info/entry_points.txt +6 -0
|
@@ -0,0 +1,1088 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import (
|
|
4
|
+
Callable,
|
|
5
|
+
Collection,
|
|
6
|
+
Iterable,
|
|
7
|
+
Mapping,
|
|
8
|
+
Sequence,
|
|
9
|
+
)
|
|
10
|
+
from copy import copy
|
|
11
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Generic, Self, TypeVar, cast
|
|
12
|
+
|
|
13
|
+
from hare.classes.value_descriptions import ValueDescriptions
|
|
14
|
+
from hare.core.hare_context import HareContext
|
|
15
|
+
from hare.dialects.base.client.database_client import DatabaseClient
|
|
16
|
+
from hare.dialects.base.dialect import Dialect
|
|
17
|
+
from hare.dialects.base.features import Features
|
|
18
|
+
from hare.exceptions import (
|
|
19
|
+
ConfigurationError,
|
|
20
|
+
FieldError,
|
|
21
|
+
QueryError,
|
|
22
|
+
UnSupportedError,
|
|
23
|
+
)
|
|
24
|
+
from hare.fields.encrypted.encrypted_field_base import EncryptedFieldBase
|
|
25
|
+
from hare.models.constants import MISSING_DEFAULT_CONNECTION_MESSAGE
|
|
26
|
+
from hare.models.tenancy.tenancy import Tenancy
|
|
27
|
+
from hare.query.constants import AMBIENT_TENANT_NOT_OVERRIDDEN
|
|
28
|
+
from hare.query.enums import Connector, SpecificationSlotPlanRole
|
|
29
|
+
from hare.query.expressions import (
|
|
30
|
+
Expression,
|
|
31
|
+
ExpressionContext,
|
|
32
|
+
F,
|
|
33
|
+
Ordering,
|
|
34
|
+
Q,
|
|
35
|
+
)
|
|
36
|
+
from hare.query.expressions.aggregate_paths.aggregated_multi_valued_paths import AggregatedMultiValuedPaths
|
|
37
|
+
from hare.query.expressions.subqueries.outer_scope import OuterScope
|
|
38
|
+
from hare.query.lookup_info.lookup_path import LookupPath
|
|
39
|
+
from hare.query.plans.description.plannable import Plannable
|
|
40
|
+
from hare.query.plans.statement.statement_plan import StatementPlan
|
|
41
|
+
from hare.query.query_connection import QueryConnection
|
|
42
|
+
from hare.query.queryset.annotation_access_tracker import AnnotationAccessTracker
|
|
43
|
+
from hare.query.queryset.constants import (
|
|
44
|
+
AGGREGATE_GROUP_NAME_MESSAGE,
|
|
45
|
+
ANNOTATION_NAME_COUNTED_LENGTH,
|
|
46
|
+
FORBIDDEN_ANNOTATION_NAME_PATTERN,
|
|
47
|
+
MAX_ROW_COUNT,
|
|
48
|
+
)
|
|
49
|
+
from hare.query.queryset.extensions.query_set_extension_call import QuerySetExtensionCall
|
|
50
|
+
from hare.query.queryset.extensions.query_set_extensions import QuerySetExtensions
|
|
51
|
+
from hare.query.queryset.lazy_relation_names import LazyRelationNames
|
|
52
|
+
from hare.query.queryset.options.query_option import QueryOption
|
|
53
|
+
from hare.query.queryset.options.query_options import QueryOptions
|
|
54
|
+
from hare.query.queryset.pending_calls.calls_before_setup import CallsBeforeSetup
|
|
55
|
+
from hare.query.queryset.pending_calls.pending_filter_calls import PendingFilterCalls
|
|
56
|
+
from hare.query.queryset.specification_copying import SpecificationCopying
|
|
57
|
+
from hare.query.relation_loading.prefetching.prefetch import Prefetch
|
|
58
|
+
from hare.query.scopes.row_visibility import RowVisibility
|
|
59
|
+
from hare.sql import Order, Table
|
|
60
|
+
from hare.sql.builder.queries.query_builder import QueryBuilder
|
|
61
|
+
from hare.sql.constants import IDENTIFIER_LENGTH_LIMIT
|
|
62
|
+
from hare.sql.identifiers import Identifiers
|
|
63
|
+
from hare.sql.terms.term import Term
|
|
64
|
+
|
|
65
|
+
if TYPE_CHECKING:
|
|
66
|
+
from hare.models import Model
|
|
67
|
+
from hare.query.queryset.combination.combination import Combination
|
|
68
|
+
from hare.query.queryset.queryset import QuerySet
|
|
69
|
+
from hare.query.queryset.selection.values_selection import ValuesSelection
|
|
70
|
+
|
|
71
|
+
TModel = TypeVar("TModel", bound="Model")
|
|
72
|
+
|
|
73
|
+
TDerivedAwaitableQuery = TypeVar("TDerivedAwaitableQuery", bound="QuerySpecification[Any]")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class QuerySpecification(Plannable, Generic[TModel], abstract=True):
|
|
77
|
+
"""What a query asks for - the model, the connection choice, the filters, annotations, ordering,
|
|
78
|
+
slice and the other settings the chained methods declare. ``QuerySet`` adds the methods changing
|
|
79
|
+
it; an ``AwaitableQuery`` takes one over, builds and runs its SQL.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
__slots__ = (
|
|
83
|
+
"model",
|
|
84
|
+
"_connection",
|
|
85
|
+
"_features",
|
|
86
|
+
# Whether .using() pinned the connection - _connection is also set once the router or the default
|
|
87
|
+
# connection chose it. A pinned connection is offered to the prefetch queries.
|
|
88
|
+
"_connection_explicitly_chosen",
|
|
89
|
+
# The connection the parent queryset pinned with .using(), offered to its prefetch query:
|
|
90
|
+
# taken after the router and before the model's default connection.
|
|
91
|
+
"_router_fallback_connection",
|
|
92
|
+
# Set by a relation read off a model instance: the alias of the connection the instance was
|
|
93
|
+
# loaded from or saved to - taken after the router and before the model's default
|
|
94
|
+
# connection, looked up when the query runs.
|
|
95
|
+
"_instance_connection_alias",
|
|
96
|
+
"_annotations",
|
|
97
|
+
"_q_object_list",
|
|
98
|
+
# Incremented once per .filter()/.exclude() call - the generation its Q objects are stamped
|
|
99
|
+
# with.
|
|
100
|
+
"_filter_call_counter",
|
|
101
|
+
# The filter() calls of plain values a queryset made by simple calls alone keeps unbuilt - built
|
|
102
|
+
# into _q_object_list on the first read of _q_objects. A query running on the plan of its calls
|
|
103
|
+
# never builds them.
|
|
104
|
+
"_pending_filter_calls",
|
|
105
|
+
# Shared by QuerySet and the queries built from it.
|
|
106
|
+
"_single",
|
|
107
|
+
"_raise_does_not_exist",
|
|
108
|
+
"_limit",
|
|
109
|
+
"_offset",
|
|
110
|
+
"_orderings",
|
|
111
|
+
"_distinct",
|
|
112
|
+
# Set by QuerySet.none(): every query built from the queryset gives its empty result without
|
|
113
|
+
# touching the database.
|
|
114
|
+
"_is_none",
|
|
115
|
+
# Set by Manager.get_queryset() and handed to every query built from such a queryset: the
|
|
116
|
+
# query runs under the model's default scope, resolved when it is compiled.
|
|
117
|
+
"_uses_default_scope",
|
|
118
|
+
# Which rows the default scopes let the query see - its own model's and those of
|
|
119
|
+
# every model it JOINs.
|
|
120
|
+
"_visibility",
|
|
121
|
+
# The rarely set settings, shared with clones - see QueryOptions and the QueryOption
|
|
122
|
+
# attributes below.
|
|
123
|
+
"_options",
|
|
124
|
+
# How many leading entries of _q_objects a build's default scope put there - a query
|
|
125
|
+
# taking the filters over replaces them with its own.
|
|
126
|
+
"_ambient_q_count",
|
|
127
|
+
# QuerySet's own: the relations to load with the model instances.
|
|
128
|
+
"_prefetch_map",
|
|
129
|
+
"_prefetch_queries",
|
|
130
|
+
"_select_related",
|
|
131
|
+
# Descriptions of keys starting with an annotation (see _get_annotation_description()),
|
|
132
|
+
# shared with clones until one of them changes its annotations.
|
|
133
|
+
"_annotation_descriptions",
|
|
134
|
+
# What .values()/.values_list() select - the rows come back in its shape - or None for
|
|
135
|
+
# model instances.
|
|
136
|
+
"_selection",
|
|
137
|
+
# The querysets union()/intersection()/difference() combine - the rows are the combined
|
|
138
|
+
# ones - or None for a queryset of its own model's rows.
|
|
139
|
+
"_combination",
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Settings kept in self._options (QueryOptions) - read and assigned like attributes. An assigned
|
|
143
|
+
# collection is stored immutable, so change one by assigning a new value, never in place.
|
|
144
|
+
# select_for_update() and its flags.
|
|
145
|
+
_select_for_update = QueryOption[bool]("select_for_update")
|
|
146
|
+
_select_for_update_nowait = QueryOption[bool]("select_for_update_nowait")
|
|
147
|
+
_select_for_update_skip_locked = QueryOption[bool]("select_for_update_skip_locked")
|
|
148
|
+
_select_for_update_of = QueryOption[frozenset[str]]("select_for_update_of")
|
|
149
|
+
_select_for_update_strength = QueryOption[Any]("select_for_update_strength")
|
|
150
|
+
# The keyset boundary .after_cursor() set: rows strictly after these values in `_orderings`.
|
|
151
|
+
_cursor_values = QueryOption[tuple[Any, ...]]("cursor_values")
|
|
152
|
+
# The second keyset boundary: rows strictly BEFORE these values in `_orderings` - set
|
|
153
|
+
# only when both .after_cursor() and .before_cursor() bound one query (a window).
|
|
154
|
+
_before_cursor_values = QueryOption[tuple[Any, ...]]("before_cursor_values")
|
|
155
|
+
# Set by .before_cursor(): `_orderings` already holds the reversed ordering (so LIMIT
|
|
156
|
+
# counts back from the cursor), and the fetched rows are reversed back afterwards.
|
|
157
|
+
_reverse_result_order = QueryOption[bool]("reverse_result_order")
|
|
158
|
+
# (name, query) pairs populated by QuerySet.with_cte() and threaded through to count()/
|
|
159
|
+
# exists()/values()/values_list(), the same way _group_bys is - see QueryCtes.apply_with_ctes().
|
|
160
|
+
_with_ctes = QueryOption[tuple[tuple[str, Any], ...]]("with_ctes")
|
|
161
|
+
# Calls of QuerySet methods a dialect registered (QuerySetExtensions), applied once the
|
|
162
|
+
# query is built for its connection.
|
|
163
|
+
_extension_calls = QueryOption[tuple[QuerySetExtensionCall, ...]]("extension_calls")
|
|
164
|
+
# Select(relation, extra_condition=Q(...))'s condition per relation path.
|
|
165
|
+
_select_related_extra_conditions = QueryOption[Mapping[str, Q]]("select_related_extra_conditions")
|
|
166
|
+
# The fields of .distinct(*fields) (DISTINCT ON).
|
|
167
|
+
_distinct_on = QueryOption[tuple[str, ...]]("distinct_on")
|
|
168
|
+
# The fields of .group_by().
|
|
169
|
+
_group_bys = QueryOption[tuple[str, ...]]("group_bys")
|
|
170
|
+
# The Rollup/Cube/GroupingSets of .group_by() - its fields are in _group_bys too.
|
|
171
|
+
_grouping_set = QueryOption[Any]("grouping_set")
|
|
172
|
+
# The sample of the model's table .sample() reads (a TableSample) - None for every row.
|
|
173
|
+
_table_sample = QueryOption[Any]("table_sample")
|
|
174
|
+
# The `_annotations` keys registered by .alias(): usable in filter()/order_by(), selected only
|
|
175
|
+
# when .values()/.values_list() names them.
|
|
176
|
+
_alias_keys = QueryOption[frozenset[str]]("alias_keys")
|
|
177
|
+
# The exception .get(..., does_not_exist_exception=...) raises for no row instead of
|
|
178
|
+
# DoesNotExist - a class or an instance.
|
|
179
|
+
_does_not_exist_exception = QueryOption[type[BaseException] | BaseException | None]("does_not_exist_exception")
|
|
180
|
+
# The exception .get(..., multiple_objects_returned_exception=...) raises for more than one row
|
|
181
|
+
# instead of MultipleObjectsReturned - a class or an instance.
|
|
182
|
+
_multiple_objects_returned_exception = QueryOption[type[BaseException] | BaseException | None](
|
|
183
|
+
"multiple_objects_returned_exception"
|
|
184
|
+
)
|
|
185
|
+
# Set when a single-row query (first(), an index) narrows an already sliced query - its row
|
|
186
|
+
# is picked from the slice, so it can't be filtered or reordered any more.
|
|
187
|
+
_is_single_row_of_slice = QueryOption[bool]("is_single_row_of_slice")
|
|
188
|
+
# Whether Meta.ordering is left out when no ordering is given - set by order_by() with no
|
|
189
|
+
# arguments, and on a branch of a set operation, where only the combined rows can be ordered.
|
|
190
|
+
_default_ordering_disabled = QueryOption[bool]("default_ordering_disabled")
|
|
191
|
+
|
|
192
|
+
# The .only() field names.
|
|
193
|
+
_fields_for_select = QueryOption[tuple[str, ...]]("fields_for_select")
|
|
194
|
+
# The .defer() field names.
|
|
195
|
+
_deferred_fields = QueryOption[tuple[str, ...]]("deferred_fields")
|
|
196
|
+
# Relations whose field-level lazy= default .defer_related() switched off.
|
|
197
|
+
_deferred_related_fields = QueryOption[frozenset[str]]("deferred_related_fields")
|
|
198
|
+
# The calls kept before Hare.init() set the model up.
|
|
199
|
+
_calls_before_setup = QueryOption[CallsBeforeSetup | None]("calls_before_setup")
|
|
200
|
+
# Relations named by an explicit .select_related(...) call, not joined by a field-level
|
|
201
|
+
# lazy="joined" default - only an explicit one is fetched whatever .only() lists.
|
|
202
|
+
_explicitly_select_related = QueryOption[frozenset[str]]("explicitly_select_related")
|
|
203
|
+
|
|
204
|
+
#: The slots a query built from a specification takes over, in the order it copies them.
|
|
205
|
+
SPECIFICATION_SLOTS: ClassVar[tuple[str, ...]] = __slots__
|
|
206
|
+
#: The specification slots holding a container a build changes - a query gets its own copy -
|
|
207
|
+
#: each with the source of an empty container of its type, made instead of copying an empty one.
|
|
208
|
+
MUTABLE_SPECIFICATION_SLOTS: ClassVar[dict[str, str]] = {
|
|
209
|
+
"_prefetch_map": "{}",
|
|
210
|
+
"_orderings": "[]",
|
|
211
|
+
"_q_object_list": "[]",
|
|
212
|
+
"_annotations": "{}",
|
|
213
|
+
"_select_related": "set()",
|
|
214
|
+
}
|
|
215
|
+
#: How each slot meets a plan key - every slot is named, checked when the module loads. A slot
|
|
216
|
+
#: holding SQL that no plan key reads would let two queries of different SQL share a plan.
|
|
217
|
+
SLOT_PLAN_ROLES: ClassVar[dict[str, SpecificationSlotPlanRole]] = {
|
|
218
|
+
"model": SpecificationSlotPlanRole.KEYED,
|
|
219
|
+
"_connection": SpecificationSlotPlanRole.CONNECTION,
|
|
220
|
+
"_features": SpecificationSlotPlanRole.CONNECTION,
|
|
221
|
+
"_connection_explicitly_chosen": SpecificationSlotPlanRole.CONNECTION,
|
|
222
|
+
"_router_fallback_connection": SpecificationSlotPlanRole.CONNECTION,
|
|
223
|
+
"_instance_connection_alias": SpecificationSlotPlanRole.CONNECTION,
|
|
224
|
+
"_annotations": SpecificationSlotPlanRole.DESCRIBED,
|
|
225
|
+
"_q_object_list": SpecificationSlotPlanRole.DESCRIBED,
|
|
226
|
+
"_filter_call_counter": SpecificationSlotPlanRole.DESCRIBED,
|
|
227
|
+
"_pending_filter_calls": SpecificationSlotPlanRole.DESCRIBED,
|
|
228
|
+
"_single": SpecificationSlotPlanRole.KEYED,
|
|
229
|
+
"_raise_does_not_exist": SpecificationSlotPlanRole.RESULT,
|
|
230
|
+
"_limit": SpecificationSlotPlanRole.KEYED,
|
|
231
|
+
"_offset": SpecificationSlotPlanRole.KEYED,
|
|
232
|
+
"_orderings": SpecificationSlotPlanRole.KEYED,
|
|
233
|
+
"_distinct": SpecificationSlotPlanRole.KEYED,
|
|
234
|
+
"_is_none": SpecificationSlotPlanRole.KEYED,
|
|
235
|
+
"_uses_default_scope": SpecificationSlotPlanRole.DESCRIBED,
|
|
236
|
+
"_visibility": SpecificationSlotPlanRole.KEYED,
|
|
237
|
+
"_options": SpecificationSlotPlanRole.KEYED,
|
|
238
|
+
"_ambient_q_count": SpecificationSlotPlanRole.BOOKKEEPING,
|
|
239
|
+
"_prefetch_map": SpecificationSlotPlanRole.RESULT,
|
|
240
|
+
"_prefetch_queries": SpecificationSlotPlanRole.RESULT,
|
|
241
|
+
"_select_related": SpecificationSlotPlanRole.KEYED,
|
|
242
|
+
"_annotation_descriptions": SpecificationSlotPlanRole.BOOKKEEPING,
|
|
243
|
+
"_selection": SpecificationSlotPlanRole.KEYED,
|
|
244
|
+
"_combination": SpecificationSlotPlanRole.KEYED,
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
@classmethod
|
|
248
|
+
def raise_if_slots_unclassified(cls) -> None:
|
|
249
|
+
"""Rejects a slot of ``SPECIFICATION_SLOTS`` without its role in ``SLOT_PLAN_ROLES``, and a role of no slot.
|
|
250
|
+
|
|
251
|
+
Raises:
|
|
252
|
+
TypeError: The two disagree.
|
|
253
|
+
"""
|
|
254
|
+
if set(cls.SLOT_PLAN_ROLES) != set(cls.SPECIFICATION_SLOTS):
|
|
255
|
+
raise TypeError(
|
|
256
|
+
"QuerySpecification.SLOT_PLAN_ROLES names every slot of SPECIFICATION_SLOTS and no other - "
|
|
257
|
+
"unclassified: "
|
|
258
|
+
f"{sorted(set(cls.SPECIFICATION_SLOTS) - set(cls.SLOT_PLAN_ROLES))}, unknown: "
|
|
259
|
+
f"{sorted(set(cls.SLOT_PLAN_ROLES) - set(cls.SPECIFICATION_SLOTS))}"
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
def __init__(self, model: type[TModel]) -> None:
|
|
263
|
+
self.model: type[TModel] = model
|
|
264
|
+
self._options: QueryOptions = QueryOptions.DEFAULT
|
|
265
|
+
self._connection: DatabaseClient = None # type: ignore[assignment]
|
|
266
|
+
self._features: Features | None = None
|
|
267
|
+
self._connection_explicitly_chosen: bool = False
|
|
268
|
+
self._router_fallback_connection: DatabaseClient | None = None
|
|
269
|
+
self._instance_connection_alias: str | None = None
|
|
270
|
+
self._annotations: dict[str, Expression | Term] = {}
|
|
271
|
+
self._q_object_list: list[Q] = []
|
|
272
|
+
#: The filter calls kept unbuilt: (is exclude(), generation, Q conditions, kwargs) each.
|
|
273
|
+
self._pending_filter_calls: tuple[tuple[bool, int, tuple[Q, ...], dict[str, Any]], ...] = ()
|
|
274
|
+
self._filter_call_counter: int = 0
|
|
275
|
+
self._single: bool = False
|
|
276
|
+
self._raise_does_not_exist: bool = False
|
|
277
|
+
self._limit: int | None = None
|
|
278
|
+
self._offset: int | None = None
|
|
279
|
+
self._orderings: Sequence[tuple[str, Order]] = []
|
|
280
|
+
self._distinct: bool = False
|
|
281
|
+
self._is_none: bool = False
|
|
282
|
+
self._visibility: RowVisibility = RowVisibility.DEFAULT
|
|
283
|
+
self._uses_default_scope: bool = False
|
|
284
|
+
self._ambient_q_count: int = 0
|
|
285
|
+
self._prefetch_map: dict[str, set[str | Prefetch]] = {}
|
|
286
|
+
self._prefetch_queries: dict[str, list[tuple[str | None, QuerySet[Model]]]] = {}
|
|
287
|
+
self._select_related: set[str] = set()
|
|
288
|
+
self._annotation_descriptions: dict[tuple[str, str, Dialect], Any] | None = None
|
|
289
|
+
self._selection: ValuesSelection | None = None
|
|
290
|
+
self._combination: Combination | None = None
|
|
291
|
+
|
|
292
|
+
@property
|
|
293
|
+
def _q_objects(self) -> list[Q]:
|
|
294
|
+
"""The conditions the query filters by - the filter calls a queryset made by simple calls
|
|
295
|
+
alone keeps unbuilt (``_pending_filter_calls``) are built on the first read."""
|
|
296
|
+
if self._pending_filter_calls:
|
|
297
|
+
PendingFilterCalls.build_pending_filter_calls(self)
|
|
298
|
+
return self._q_object_list
|
|
299
|
+
|
|
300
|
+
@_q_objects.setter
|
|
301
|
+
def _q_objects(self, q_objects: list[Q]) -> None:
|
|
302
|
+
# The conditions given replace every condition, built or not.
|
|
303
|
+
self._pending_filter_calls = ()
|
|
304
|
+
self._q_object_list = q_objects
|
|
305
|
+
|
|
306
|
+
def _build_conditions_for_copies(self) -> None:
|
|
307
|
+
"""Builds the filter calls kept unbuilt before the query is copied for a description or a
|
|
308
|
+
build of a query it is part of - every copy then holds the same conditions, the origins of
|
|
309
|
+
their values (``PlanOrigins``)."""
|
|
310
|
+
if self._pending_filter_calls:
|
|
311
|
+
PendingFilterCalls.build_pending_filter_calls(self)
|
|
312
|
+
|
|
313
|
+
def _apply_lazy_relation_defaults(self) -> None:
|
|
314
|
+
"""Adds the relations the model loads by default (``lazy=``) and ``.defer_related()``
|
|
315
|
+
didn't switch off to the ones this query joins or prefetches - on the copy a build makes,
|
|
316
|
+
before it reads them."""
|
|
317
|
+
joined, prefetched = LazyRelationNames.get(self.model)
|
|
318
|
+
self._select_related.update(joined - self._deferred_related_fields)
|
|
319
|
+
for field_name in prefetched - self._deferred_related_fields:
|
|
320
|
+
self._prefetch_map.setdefault(field_name, set())
|
|
321
|
+
|
|
322
|
+
def _model_is_set_up(self) -> bool:
|
|
323
|
+
"""Whether ``Hare.init()`` has set the model up - its relations resolved. A query built
|
|
324
|
+
before that checks its field names, relations and lookups when it is compiled instead of
|
|
325
|
+
when each method is called."""
|
|
326
|
+
return self.model._meta._inited
|
|
327
|
+
|
|
328
|
+
def _loads_relations(self) -> bool:
|
|
329
|
+
"""Whether reading this query's rows loads relations - asked for, or by default when the
|
|
330
|
+
rows are model instances."""
|
|
331
|
+
if self._select_related or self._prefetch_map or self._prefetch_queries:
|
|
332
|
+
return True
|
|
333
|
+
if self._selection is not None:
|
|
334
|
+
return False
|
|
335
|
+
joined, prefetched = LazyRelationNames.get(self.model)
|
|
336
|
+
return bool((joined | prefetched) - self._deferred_related_fields)
|
|
337
|
+
|
|
338
|
+
def _take_rows_of(
|
|
339
|
+
self, source: QuerySpecification[Any], *, keeps_ordering: bool = False, keeps_grouping: bool = False
|
|
340
|
+
) -> None:
|
|
341
|
+
"""Takes over which rows ``source`` matches - its model, connection choice, default scope,
|
|
342
|
+
filters, annotations, ``.distinct()``, slice, keyset boundaries, CTEs and dialect method
|
|
343
|
+
calls - and nothing of how it returns them.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
source: The queryset, or a query made from one.
|
|
347
|
+
keeps_ordering: Keep the ordering - a slice is taken in it. Without it the ordering is
|
|
348
|
+
kept only for the keyset boundaries.
|
|
349
|
+
keeps_grouping: Keep the ``.group_by()`` fields.
|
|
350
|
+
"""
|
|
351
|
+
SpecificationCopying.copy_specification(source, self)
|
|
352
|
+
self._single = False
|
|
353
|
+
self._raise_does_not_exist = False
|
|
354
|
+
self._prefetch_map = {}
|
|
355
|
+
self._prefetch_queries = {}
|
|
356
|
+
self._select_related = set()
|
|
357
|
+
self._annotation_descriptions = None
|
|
358
|
+
self._selection = None
|
|
359
|
+
self._combination = None
|
|
360
|
+
options = self._options
|
|
361
|
+
if options is not QueryOptions.DEFAULT:
|
|
362
|
+
if not keeps_grouping and options.group_bys:
|
|
363
|
+
source._raise_if_group_names_invalid()
|
|
364
|
+
options = options.without(*QueryOptions.ROW_RETURN_SETTINGS)
|
|
365
|
+
self._options = options if keeps_grouping else options.without("group_bys")
|
|
366
|
+
if not keeps_ordering and not (options.cursor_values or options.before_cursor_values):
|
|
367
|
+
self._orderings = []
|
|
368
|
+
elif not keeps_ordering:
|
|
369
|
+
self._orderings = []
|
|
370
|
+
|
|
371
|
+
def _raise_if_group_names_invalid(self) -> None:
|
|
372
|
+
"""Refuses a ``group_by()`` name that is neither an annotation nor a field, and one of an
|
|
373
|
+
aggregate annotation - a query reading no group (``count()``, ``exists()``, model rows) would
|
|
374
|
+
leave it unread.
|
|
375
|
+
|
|
376
|
+
Raises:
|
|
377
|
+
FieldError: A name reads no field, or is an aggregate annotation's.
|
|
378
|
+
"""
|
|
379
|
+
for name in self._group_bys:
|
|
380
|
+
if (annotation := self._annotations.get(name)) is not None:
|
|
381
|
+
term = (
|
|
382
|
+
annotation.get_result(self._get_probe_expression_context(self._annotations)).term
|
|
383
|
+
if isinstance(annotation, Expression)
|
|
384
|
+
else annotation
|
|
385
|
+
)
|
|
386
|
+
if term.contains_aggregate:
|
|
387
|
+
raise FieldError(AGGREGATE_GROUP_NAME_MESSAGE.format(name=name))
|
|
388
|
+
continue
|
|
389
|
+
if name == "pk":
|
|
390
|
+
continue
|
|
391
|
+
lookup_path = LookupPath.parse(self.model, name)
|
|
392
|
+
# Refused on model rows too, which group by the primary key and would leave it unread.
|
|
393
|
+
EncryptedFieldBase.raise_if_encrypted(lookup_path.get_target_field(), "GROUP BY")
|
|
394
|
+
if lookup_path.get_target_field() is None and lookup_path.rest != ("pk",):
|
|
395
|
+
missing_name = lookup_path.rest[0] if lookup_path.rest else name
|
|
396
|
+
raise FieldError(f"Unknown field {name!r}: {lookup_path.model.__name__} has no field {missing_name!r}")
|
|
397
|
+
|
|
398
|
+
@staticmethod
|
|
399
|
+
def _raise_if_annotation_names_are_unsafe(names: Iterable[str]) -> None:
|
|
400
|
+
"""Rejects an empty annotation, alias or aggregate name, and one with quotes, brackets, a
|
|
401
|
+
semicolon, whitespace or an SQL comment - an output column name taken from user input stays a
|
|
402
|
+
plain name, like Django's own check.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
names: The new names.
|
|
406
|
+
|
|
407
|
+
Raises:
|
|
408
|
+
QueryError: A name is empty, contains one of them, or is longer than a database keeps
|
|
409
|
+
an identifier (``IDENTIFIER_LENGTH_LIMIT`` bytes) - the column read back would be
|
|
410
|
+
named otherwise.
|
|
411
|
+
"""
|
|
412
|
+
for name in names:
|
|
413
|
+
if not name:
|
|
414
|
+
raise QueryError("An annotation name can't be empty")
|
|
415
|
+
if len(name) >= ANNOTATION_NAME_COUNTED_LENGTH and len(name.encode()) > IDENTIFIER_LENGTH_LIMIT:
|
|
416
|
+
raise QueryError(
|
|
417
|
+
f"Annotation name {name!r} is {len(name.encode())} bytes - a database keeps "
|
|
418
|
+
f"{IDENTIFIER_LENGTH_LIMIT} bytes of an identifier"
|
|
419
|
+
)
|
|
420
|
+
# An identifier - most names - holds none of them.
|
|
421
|
+
if not name.isidentifier() and FORBIDDEN_ANNOTATION_NAME_PATTERN.search(name):
|
|
422
|
+
raise QueryError(
|
|
423
|
+
f"Annotation name {name!r} can't contain whitespace, quotation marks, brackets, "
|
|
424
|
+
"semicolons or SQL comments"
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
@property
|
|
428
|
+
def features(self) -> Features:
|
|
429
|
+
"""What the connection the query runs on supports.
|
|
430
|
+
|
|
431
|
+
Raises:
|
|
432
|
+
QueryError: No connection is chosen yet - the query isn't running.
|
|
433
|
+
"""
|
|
434
|
+
if self._features is None:
|
|
435
|
+
self._features = QueryConnection.get_bound_connection(self).features
|
|
436
|
+
return self._features
|
|
437
|
+
|
|
438
|
+
@property
|
|
439
|
+
def dialect(self) -> Dialect:
|
|
440
|
+
"""The dialect of the connection the query runs on.
|
|
441
|
+
|
|
442
|
+
Raises:
|
|
443
|
+
QueryError: No connection is chosen yet - the query isn't running.
|
|
444
|
+
"""
|
|
445
|
+
return QueryConnection.get_bound_connection(self).dialect
|
|
446
|
+
|
|
447
|
+
def _get_top_level_conditions_by_generation(self) -> dict[int, list[tuple[str, Any]]]:
|
|
448
|
+
"""The filter kwargs every kept row satisfies, per ``.filter()`` call generation.
|
|
449
|
+
|
|
450
|
+
Returns:
|
|
451
|
+
Generation -> key and value of each kwarg.
|
|
452
|
+
"""
|
|
453
|
+
conditions_by_generation: dict[int, list[tuple[str, Any]]] = {}
|
|
454
|
+
for q_object in self._q_objects:
|
|
455
|
+
conditions_by_generation.setdefault(q_object._filter_call_generation, []).extend(
|
|
456
|
+
self._get_top_level_conditions(q_object)
|
|
457
|
+
)
|
|
458
|
+
return conditions_by_generation
|
|
459
|
+
|
|
460
|
+
def _get_probe_expression_context(
|
|
461
|
+
self,
|
|
462
|
+
annotations: dict[str, Any],
|
|
463
|
+
aggregated_multi_valued_paths: AggregatedMultiValuedPaths | None = None,
|
|
464
|
+
multi_valued_join_generations: dict[str, int] | None = None,
|
|
465
|
+
) -> ExpressionContext:
|
|
466
|
+
"""Builds a throwaway context over ``annotations``, used only to find out which annotations or
|
|
467
|
+
to-many relations an expression or a filter reads. Before the query runs it resolves with
|
|
468
|
+
the neutral SQL dialect.
|
|
469
|
+
|
|
470
|
+
Args:
|
|
471
|
+
annotations: The annotation mapping expressions are resolved against.
|
|
472
|
+
aggregated_multi_valued_paths: A tracker recording the to-many JOINs made.
|
|
473
|
+
multi_valued_join_generations: Collects the ``.filter()`` call generation owning each
|
|
474
|
+
to-many JOIN.
|
|
475
|
+
|
|
476
|
+
Returns:
|
|
477
|
+
A fresh context with the scope the real query resolves in.
|
|
478
|
+
"""
|
|
479
|
+
return ExpressionContext(
|
|
480
|
+
model=self.model,
|
|
481
|
+
dialect=QueryConnection.get_analysis_dialect(self),
|
|
482
|
+
connection=self._connection,
|
|
483
|
+
table=self._effective_basetable(),
|
|
484
|
+
annotations=annotations,
|
|
485
|
+
aggregated_multi_valued_paths=aggregated_multi_valued_paths,
|
|
486
|
+
multi_valued_join_generations=multi_valued_join_generations,
|
|
487
|
+
select_related_extra_conditions=self._select_related_extra_conditions,
|
|
488
|
+
visibility=self._visibility,
|
|
489
|
+
# Building the real query rejects a filter on a window function where SQL can't apply it.
|
|
490
|
+
window_function_filter_allowed=True,
|
|
491
|
+
)
|
|
492
|
+
|
|
493
|
+
@staticmethod
|
|
494
|
+
def _get_ordering_string(
|
|
495
|
+
ordering: str | Ordering | Expression, reverse: bool = False
|
|
496
|
+
) -> tuple[str | Expression, Order]:
|
|
497
|
+
"""Splits one ordering item into what it orders by and its direction.
|
|
498
|
+
|
|
499
|
+
Args:
|
|
500
|
+
ordering: A ``"field"``/``"-field"`` string, an ``Ordering``
|
|
501
|
+
(``F("field").desc(nulls_last=True)``, ``Lower("name").asc()``) or an expression,
|
|
502
|
+
ascending.
|
|
503
|
+
reverse: Whether to reverse the ordering - direction and any explicit NULL placement.
|
|
504
|
+
|
|
505
|
+
Returns:
|
|
506
|
+
The field name - an ``F()``'s too - or the expression, and the direction.
|
|
507
|
+
|
|
508
|
+
Raises:
|
|
509
|
+
QueryError: If the item is neither a string, an ``Ordering`` nor an expression.
|
|
510
|
+
"""
|
|
511
|
+
field_name: str | Expression
|
|
512
|
+
if isinstance(ordering, Ordering):
|
|
513
|
+
field_name = ordering.target
|
|
514
|
+
order_type = ordering.order
|
|
515
|
+
elif isinstance(ordering, F):
|
|
516
|
+
field_name = ordering.name
|
|
517
|
+
order_type = Order.ASC
|
|
518
|
+
elif isinstance(ordering, Expression):
|
|
519
|
+
field_name = ordering
|
|
520
|
+
order_type = Order.ASC
|
|
521
|
+
elif isinstance(ordering, str):
|
|
522
|
+
if ordering.startswith("-"):
|
|
523
|
+
field_name = ordering[1:]
|
|
524
|
+
order_type = Order.DESC
|
|
525
|
+
else:
|
|
526
|
+
field_name = ordering
|
|
527
|
+
order_type = Order.ASC
|
|
528
|
+
else:
|
|
529
|
+
raise QueryError(
|
|
530
|
+
"An ordering must be a field name string, an expression or an Ordering "
|
|
531
|
+
f"(F('field').asc()/.desc()), got {ordering!r}"
|
|
532
|
+
)
|
|
533
|
+
|
|
534
|
+
if reverse:
|
|
535
|
+
order_type = order_type.get_reversed()
|
|
536
|
+
|
|
537
|
+
return field_name, order_type
|
|
538
|
+
|
|
539
|
+
@staticmethod
|
|
540
|
+
def _get_ordering_name(ordering: str | Ordering | Expression, reverse: bool = False) -> tuple[str, Order]:
|
|
541
|
+
"""Splits one ordering item that names what it orders by into the name and the direction.
|
|
542
|
+
|
|
543
|
+
Args:
|
|
544
|
+
ordering: The item.
|
|
545
|
+
reverse: Whether to reverse the ordering.
|
|
546
|
+
|
|
547
|
+
Returns:
|
|
548
|
+
The name and the direction.
|
|
549
|
+
|
|
550
|
+
Raises:
|
|
551
|
+
QueryError: The item orders by an expression, which isn't taken there.
|
|
552
|
+
"""
|
|
553
|
+
field_name, order = QuerySpecification._get_ordering_string(ordering, reverse=reverse)
|
|
554
|
+
if not isinstance(field_name, str):
|
|
555
|
+
raise QueryError(
|
|
556
|
+
f"An ordering by an expression ({ordering!r}) isn't taken here - annotate the expression and "
|
|
557
|
+
"order by the annotation's name"
|
|
558
|
+
)
|
|
559
|
+
return field_name, order
|
|
560
|
+
|
|
561
|
+
def _apply_default_ordering(self, orderings: Iterable[tuple[str, Order]]) -> Iterable[tuple[str, Order]]:
|
|
562
|
+
"""Falls back to ``Meta.ordering`` when no ordering was given and the default ordering isn't
|
|
563
|
+
disabled.
|
|
564
|
+
|
|
565
|
+
Args:
|
|
566
|
+
orderings: The explicit ordering.
|
|
567
|
+
|
|
568
|
+
Returns:
|
|
569
|
+
The ordering to apply.
|
|
570
|
+
"""
|
|
571
|
+
if not orderings and not self._default_ordering_disabled and self.model._meta.ordering:
|
|
572
|
+
return self.model._meta.ordering
|
|
573
|
+
return orderings
|
|
574
|
+
|
|
575
|
+
@staticmethod
|
|
576
|
+
def _check_chunk_size(chunk_size: int, highest: int = MAX_ROW_COUNT - 1) -> None:
|
|
577
|
+
"""Checks the page size of ``iterator()`` / ``stream()``.
|
|
578
|
+
|
|
579
|
+
Args:
|
|
580
|
+
chunk_size: The page size.
|
|
581
|
+
highest: The greatest page size - ``MAX_ROW_COUNT - 1`` for a page read with one row more.
|
|
582
|
+
|
|
583
|
+
Raises:
|
|
584
|
+
QueryError: ``chunk_size`` isn't an int in ``1..highest``.
|
|
585
|
+
"""
|
|
586
|
+
if isinstance(chunk_size, bool) or not isinstance(chunk_size, int) or not 1 <= chunk_size <= highest:
|
|
587
|
+
raise QueryError(
|
|
588
|
+
f"chunk_size must be an int from 1 to {highest}, got {ValueDescriptions.get_shown_value(chunk_size)}"
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
@staticmethod
|
|
592
|
+
def _check_streamable(connection: DatabaseClient | None) -> DatabaseClient:
|
|
593
|
+
"""Checks that ``stream()`` can run on ``connection``: a server-side cursor / portal, inside a
|
|
594
|
+
transaction - only one transaction gives it a consistent snapshot for the whole iteration;
|
|
595
|
+
outside one on a database sending a query's rows as it computes them.
|
|
596
|
+
|
|
597
|
+
Args:
|
|
598
|
+
connection: The connection the query runs on.
|
|
599
|
+
|
|
600
|
+
Returns:
|
|
601
|
+
The connection - the transaction's client inside one.
|
|
602
|
+
|
|
603
|
+
Raises:
|
|
604
|
+
UnSupportedError: The database has no streaming (``features.supports_streaming``).
|
|
605
|
+
QueryError: No transaction is open, on a database streaming inside one alone.
|
|
606
|
+
"""
|
|
607
|
+
connection = cast("DatabaseClient", connection)
|
|
608
|
+
if not connection.features.supports_streaming:
|
|
609
|
+
raise UnSupportedError(
|
|
610
|
+
f"stream() is not supported on the {connection.dialect.name} backend - it "
|
|
611
|
+
"has no useful server-side row streaming to offer; use iterator() instead"
|
|
612
|
+
)
|
|
613
|
+
if not connection.is_transaction_client and not connection.features.streams_without_transaction:
|
|
614
|
+
raise QueryError(
|
|
615
|
+
"stream() requires an active Transactions.atomic() block - its server-side "
|
|
616
|
+
"cursor/portal only gets a consistent snapshot for the whole iteration when scoped "
|
|
617
|
+
"to one transaction"
|
|
618
|
+
)
|
|
619
|
+
return connection
|
|
620
|
+
|
|
621
|
+
@staticmethod
|
|
622
|
+
def check_row_count(value: Any, name: str) -> None:
|
|
623
|
+
"""Refuses a count of rows - a limit, an offset, a slice's bound - that isn't an integer from 0
|
|
624
|
+
to ``MAX_ROW_COUNT``.
|
|
625
|
+
|
|
626
|
+
Args:
|
|
627
|
+
value: The count.
|
|
628
|
+
name: What it is, for the message.
|
|
629
|
+
|
|
630
|
+
Raises:
|
|
631
|
+
QueryError: The count isn't such an integer.
|
|
632
|
+
"""
|
|
633
|
+
if isinstance(value, bool) or not isinstance(value, int):
|
|
634
|
+
raise QueryError(f"{name} should be an integer, got {value!r}")
|
|
635
|
+
if value < 0:
|
|
636
|
+
raise QueryError(f"{name} should be non-negative, got {ValueDescriptions.get_shown_text(value)}")
|
|
637
|
+
if value > MAX_ROW_COUNT:
|
|
638
|
+
raise QueryError(
|
|
639
|
+
f"{name} should be at most {MAX_ROW_COUNT}, got {ValueDescriptions.get_shown_text(value)}"
|
|
640
|
+
)
|
|
641
|
+
|
|
642
|
+
@staticmethod
|
|
643
|
+
def _get_sliced_bounds(key: slice, base_offset: int | None, base_limit: int | None) -> tuple[int, int | None]:
|
|
644
|
+
"""The OFFSET and LIMIT of a query sliced by ``key`` - the slice taken within the query's
|
|
645
|
+
own OFFSET and LIMIT.
|
|
646
|
+
|
|
647
|
+
Args:
|
|
648
|
+
key: The slice.
|
|
649
|
+
base_offset: The query's own OFFSET.
|
|
650
|
+
base_limit: The query's own LIMIT, None for none.
|
|
651
|
+
|
|
652
|
+
Returns:
|
|
653
|
+
The OFFSET and the LIMIT, None for no LIMIT.
|
|
654
|
+
|
|
655
|
+
Raises:
|
|
656
|
+
QueryError: A step other than 1, or a start or stop that isn't a non-negative integer.
|
|
657
|
+
"""
|
|
658
|
+
if not (key.step is None or (type(key.step) is int and key.step == 1)):
|
|
659
|
+
raise QueryError(f"Slice steps should be 1 or None, got {key.step!r}.")
|
|
660
|
+
start = key.start if key.start is not None else 0
|
|
661
|
+
QuerySpecification.check_row_count(start, "Slice start")
|
|
662
|
+
if key.stop is not None:
|
|
663
|
+
QuerySpecification.check_row_count(key.stop, "Slice stop")
|
|
664
|
+
base_offset = base_offset or 0
|
|
665
|
+
offset = base_offset + start
|
|
666
|
+
stop: int | None
|
|
667
|
+
if key.stop is not None:
|
|
668
|
+
stop = base_offset + key.stop
|
|
669
|
+
if base_limit is not None:
|
|
670
|
+
stop = min(stop, base_offset + base_limit)
|
|
671
|
+
else:
|
|
672
|
+
stop = base_offset + base_limit if base_limit is not None else None
|
|
673
|
+
return offset, (max(stop - offset, 0) if stop is not None else None)
|
|
674
|
+
|
|
675
|
+
def _share_default_scope(self, query: TDerivedAwaitableQuery) -> TDerivedAwaitableQuery:
|
|
676
|
+
"""Hands this query's default scope to a query built from its filters.
|
|
677
|
+
|
|
678
|
+
Args:
|
|
679
|
+
query: The derived query.
|
|
680
|
+
|
|
681
|
+
Returns:
|
|
682
|
+
``query`` itself.
|
|
683
|
+
"""
|
|
684
|
+
query._uses_default_scope = self._uses_default_scope
|
|
685
|
+
query._ambient_q_count = self._ambient_q_count
|
|
686
|
+
query._visibility = self._visibility
|
|
687
|
+
query._options = query._options.updated(extension_calls=self._extension_calls)
|
|
688
|
+
return query
|
|
689
|
+
|
|
690
|
+
def _effective_basetable(self) -> Table:
|
|
691
|
+
"""The table this query's own fields and filters are read from: the model's table, aliased when
|
|
692
|
+
the query is a correlated subquery over the table its enclosing query selects from - an
|
|
693
|
+
``OuterReference`` would otherwise bind to this query's own row.
|
|
694
|
+
"""
|
|
695
|
+
|
|
696
|
+
table = self.model._meta.basetable
|
|
697
|
+
outer_context = OuterScope.current_expression_context.get()
|
|
698
|
+
if outer_context is not None and table.get_table_name() == outer_context.table.get_table_name():
|
|
699
|
+
return table.as_(Identifiers.get_within_limit(f"{table.get_table_name()}__exists_inner"))
|
|
700
|
+
return table
|
|
701
|
+
|
|
702
|
+
@classmethod
|
|
703
|
+
def _get_top_level_conditions(cls, q_object: Q, including_alternatives: bool = False) -> list[tuple[str, Any]]:
|
|
704
|
+
"""The kwargs of a filter every kept row satisfies - ANDed, not negated. A negated node,
|
|
705
|
+
and a node negated twice, crossing a relation renders as a ``NOT EXISTS``/``EXISTS``
|
|
706
|
+
subquery instead of a JOIN of the query, so its kwargs are never included.
|
|
707
|
+
|
|
708
|
+
Args:
|
|
709
|
+
q_object: The filter.
|
|
710
|
+
including_alternatives: Also the kwargs of OR-ed nodes.
|
|
711
|
+
|
|
712
|
+
Returns:
|
|
713
|
+
Key and value of each kwarg.
|
|
714
|
+
"""
|
|
715
|
+
if q_object._is_negated or q_object._needs_double_negation_rewrite:
|
|
716
|
+
return []
|
|
717
|
+
if not including_alternatives and q_object.connector != Connector.AND:
|
|
718
|
+
return []
|
|
719
|
+
conditions = list(q_object.filters.items())
|
|
720
|
+
for child in q_object.children:
|
|
721
|
+
conditions.extend(cls._get_top_level_conditions(child, including_alternatives))
|
|
722
|
+
return conditions
|
|
723
|
+
|
|
724
|
+
def _get_selected_field_names(self) -> Collection[str]:
|
|
725
|
+
"""The field/annotation names a ``values()``/``values_list()`` query selects.
|
|
726
|
+
|
|
727
|
+
Returns:
|
|
728
|
+
The names, empty for a query that selects whole rows.
|
|
729
|
+
"""
|
|
730
|
+
return ()
|
|
731
|
+
|
|
732
|
+
def _get_unused_alias_keys(self, fields_for_select: Collection[str] | None = None) -> set[str]:
|
|
733
|
+
"""The ``.alias()`` annotations nothing in the query reads - left out of the query
|
|
734
|
+
entirely, so their JOINs don't repeat rows.
|
|
735
|
+
|
|
736
|
+
Args:
|
|
737
|
+
fields_for_select: The names selected explicitly, if any.
|
|
738
|
+
|
|
739
|
+
Returns:
|
|
740
|
+
The unused alias names.
|
|
741
|
+
"""
|
|
742
|
+
if not self._alias_keys:
|
|
743
|
+
return set()
|
|
744
|
+
directly_used_names = {
|
|
745
|
+
*(fields_for_select or ()),
|
|
746
|
+
*self._get_selected_field_names(),
|
|
747
|
+
*self._group_bys,
|
|
748
|
+
*self._distinct_on,
|
|
749
|
+
# Meta.ordering's too - an expression of it is ordered by an alias.
|
|
750
|
+
*(field_name for field_name, _order in self._orderings or self.model._meta.ordering),
|
|
751
|
+
}
|
|
752
|
+
tracker = AnnotationAccessTracker(self._annotations)
|
|
753
|
+
for annotation_name, annotation in self._annotations.items():
|
|
754
|
+
if annotation_name in self._alias_keys and annotation_name not in directly_used_names:
|
|
755
|
+
continue
|
|
756
|
+
if isinstance(annotation, Expression):
|
|
757
|
+
annotation.get_result(self._get_probe_expression_context(tracker))
|
|
758
|
+
for q_object in self._q_objects:
|
|
759
|
+
q_object.get_result(self._get_probe_expression_context(tracker))
|
|
760
|
+
return {
|
|
761
|
+
alias_key
|
|
762
|
+
for alias_key in self._alias_keys
|
|
763
|
+
if alias_key not in directly_used_names
|
|
764
|
+
and alias_key not in tracker.accessed_keys
|
|
765
|
+
and not getattr(self._annotations.get(alias_key), "repeats_rows", False)
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
# Declared for the type checker: _apply_connection() assigns None.
|
|
769
|
+
_features: Features | None
|
|
770
|
+
|
|
771
|
+
# Declared for the type checker: the slot of the queryset and query classes, set only on a
|
|
772
|
+
# query made again for each description or build (PlanOrigins).
|
|
773
|
+
_plan_origin: Any
|
|
774
|
+
|
|
775
|
+
# Declared for the type checker, as _connection and _features are - get_connection() (this
|
|
776
|
+
# class, not a subclass) reads it directly.
|
|
777
|
+
_router_fallback_connection: DatabaseClient | None
|
|
778
|
+
|
|
779
|
+
_instance_connection_alias: str | None
|
|
780
|
+
|
|
781
|
+
_visibility: RowVisibility
|
|
782
|
+
|
|
783
|
+
model: type[TModel]
|
|
784
|
+
|
|
785
|
+
#: Whether the query takes the QuerySet methods dialects registered (QuerySetExtensions).
|
|
786
|
+
accepts_extension_methods: ClassVar[bool] = False
|
|
787
|
+
|
|
788
|
+
#: Whether the query binds the values of an annotation a GROUP BY, ORDER BY or DISTINCT ON
|
|
789
|
+
#: resolves again into its full expression (QueryAnnotations.get_expression_term_value_references()) - a query of
|
|
790
|
+
#: another type ordering by such an annotation keeps no plan.
|
|
791
|
+
binds_expression_term_values: ClassVar[bool] = False
|
|
792
|
+
|
|
793
|
+
if not TYPE_CHECKING:
|
|
794
|
+
|
|
795
|
+
def __getattr__(self, name: str) -> Any:
|
|
796
|
+
# A QuerySet method a dialect registered (QuerySetExtensions).
|
|
797
|
+
if self.accepts_extension_methods and name in QuerySetExtensions.registered:
|
|
798
|
+
return QuerySetExtensions.get_method(cast("QuerySet[Any]", self), name)
|
|
799
|
+
raise AttributeError(f"{type(self).__name__!r} object has no attribute {name!r}")
|
|
800
|
+
|
|
801
|
+
# The slot names of the class, cached per subclass.
|
|
802
|
+
clone_slots_cache: ClassVar[tuple[str, ...] | None] = None
|
|
803
|
+
|
|
804
|
+
# The compiled per-subclass copy function SpecificationCopying.compile_copy() builds - see its own docstring.
|
|
805
|
+
compiled_copy_cache: ClassVar[Callable[[Any, Any], None] | None] = None
|
|
806
|
+
|
|
807
|
+
# The slots holding a mutable container, each with the source of an empty container of its type
|
|
808
|
+
# - a clone gets its own shallow copy.
|
|
809
|
+
mutable_clone_slots: ClassVar[dict[str, str]] = {}
|
|
810
|
+
|
|
811
|
+
def __copy__(self) -> QuerySpecification[TModel]:
|
|
812
|
+
cls = type(self)
|
|
813
|
+
newone = cls.__new__(cls)
|
|
814
|
+
(cls.__dict__.get("compiled_copy_cache") or SpecificationCopying.compile_copy(cls))(self, newone)
|
|
815
|
+
# A subclass without __slots__ keeps its own attributes in a __dict__ - asked of the class:
|
|
816
|
+
# hasattr() on a slotted instance would raise through __getattr__().
|
|
817
|
+
if cls.__dictoffset__:
|
|
818
|
+
newone.__dict__.update(self.__dict__)
|
|
819
|
+
return newone
|
|
820
|
+
|
|
821
|
+
def get_connection(self, *, for_write: bool = False) -> DatabaseClient:
|
|
822
|
+
"""Returns the connection this query would run on now: the one pinned with ``using()``, else
|
|
823
|
+
the router's choice (asked under the tenant the query was built for), else the connection of
|
|
824
|
+
the instance a relation was read off, else the one a parent queryset offered to its
|
|
825
|
+
prefetch, else the model's default. Inside an open transaction on it, the transaction's
|
|
826
|
+
client. Nothing is bound - pass the result to ``using()`` to pin it.
|
|
827
|
+
|
|
828
|
+
Args:
|
|
829
|
+
for_write: Whether the connection is chosen for a write.
|
|
830
|
+
|
|
831
|
+
Returns:
|
|
832
|
+
The chosen connection.
|
|
833
|
+
|
|
834
|
+
Raises:
|
|
835
|
+
ConfigurationError: No connection is pinned and no Hare context is active; the model has
|
|
836
|
+
no default connection, or its tenancy needs a setting of the connection it lacks
|
|
837
|
+
(``MetaInfo.check_tenant_client()``).
|
|
838
|
+
QueryError: The model's tenancy needs a single active tenant, or a transaction that set
|
|
839
|
+
its tenants (``MetaInfo.check_tenant_client()``).
|
|
840
|
+
"""
|
|
841
|
+
if self._connection:
|
|
842
|
+
return self._connection
|
|
843
|
+
# HareContext.require_current() - its calls left for the error.
|
|
844
|
+
context = HareContext.current_context.get() or HareContext.global_context or HareContext.require_current()
|
|
845
|
+
# The connection is chosen under the tenant this query's WHERE was built for, not the one
|
|
846
|
+
# active when the query is awaited - a router routing by tenant, or a connection with a schema
|
|
847
|
+
# per tenant, would otherwise pick another tenant's database or schema.
|
|
848
|
+
tenant_snapshot = self._visibility.tenant
|
|
849
|
+
tenant_token = (
|
|
850
|
+
None
|
|
851
|
+
if tenant_snapshot is AMBIENT_TENANT_NOT_OVERRIDDEN
|
|
852
|
+
or tenant_snapshot is None
|
|
853
|
+
or tenant_snapshot is Tenancy.current.get()
|
|
854
|
+
else Tenancy.current.set(tenant_snapshot)
|
|
855
|
+
)
|
|
856
|
+
# One method, not two: this is the hottest path of the ORM, and a try costs nothing until
|
|
857
|
+
# something raises.
|
|
858
|
+
try:
|
|
859
|
+
# HareContext.router/connections and ConnectionRouter.db_for_read/write() when there are
|
|
860
|
+
# routers - read without their calls.
|
|
861
|
+
router = context._router
|
|
862
|
+
connection = (
|
|
863
|
+
(router.db_for_write(self.model) if for_write else router.db_for_read(self.model))
|
|
864
|
+
if router is not None and router._routers
|
|
865
|
+
else None
|
|
866
|
+
)
|
|
867
|
+
meta = self.model._meta
|
|
868
|
+
if connection is None:
|
|
869
|
+
connections = context._connections if context._connections is not None else context.connections
|
|
870
|
+
if self._instance_connection_alias is not None:
|
|
871
|
+
connection = connections.get(self._instance_connection_alias)
|
|
872
|
+
elif self._router_fallback_connection is not None:
|
|
873
|
+
connection = self._router_fallback_connection
|
|
874
|
+
else:
|
|
875
|
+
# The model's default connection, read from the context already in hand.
|
|
876
|
+
default_connection = meta.default_connection
|
|
877
|
+
if default_connection is None:
|
|
878
|
+
raise ConfigurationError(
|
|
879
|
+
MISSING_DEFAULT_CONNECTION_MESSAGE.format(model_name=self.model.__name__)
|
|
880
|
+
)
|
|
881
|
+
connection = connections.get(default_connection)
|
|
882
|
+
if meta.checks_tenant_client:
|
|
883
|
+
meta.check_tenant_client(connection)
|
|
884
|
+
return connection
|
|
885
|
+
finally:
|
|
886
|
+
if tenant_token is not None:
|
|
887
|
+
Tenancy.current.reset(tenant_token)
|
|
888
|
+
|
|
889
|
+
def _apply_connection(self, connection: DatabaseClient | None) -> None:
|
|
890
|
+
"""Binds this query to the connection it runs on.
|
|
891
|
+
|
|
892
|
+
Args:
|
|
893
|
+
connection: The database connection to use for this query.
|
|
894
|
+
"""
|
|
895
|
+
# None leaves the connection to be chosen when the query runs.
|
|
896
|
+
self._connection = connection # type: ignore[assignment]
|
|
897
|
+
self._features = None
|
|
898
|
+
|
|
899
|
+
def _get_base_query(self) -> QueryBuilder:
|
|
900
|
+
"""A fresh ``SELECT ... FROM`` the model's table, built for the connection the query runs on.
|
|
901
|
+
|
|
902
|
+
Returns:
|
|
903
|
+
The query builder.
|
|
904
|
+
"""
|
|
905
|
+
meta = self.model._meta
|
|
906
|
+
connection = self._connection if self._connection is not None else meta.connection
|
|
907
|
+
if connection.query_class is meta.connection.query_class:
|
|
908
|
+
return self._get_sampled_query(copy(meta.basequery), connection)
|
|
909
|
+
return self._get_sampled_query(connection.query_class.from_(meta.basetable), connection)
|
|
910
|
+
|
|
911
|
+
def _get_base_query_all_fields(self) -> QueryBuilder:
|
|
912
|
+
"""``_get_base_query()`` selecting every column of the model.
|
|
913
|
+
|
|
914
|
+
Returns:
|
|
915
|
+
The query builder.
|
|
916
|
+
"""
|
|
917
|
+
meta = self.model._meta
|
|
918
|
+
connection = self._connection if self._connection is not None else meta.connection
|
|
919
|
+
if connection.query_class is meta.connection.query_class:
|
|
920
|
+
return self._get_sampled_query(copy(meta.basequery_all_fields), connection)
|
|
921
|
+
return self._get_sampled_query(
|
|
922
|
+
connection.query_class.from_(meta.basetable).select(*meta.db_fields), connection
|
|
923
|
+
)
|
|
924
|
+
|
|
925
|
+
def _get_sampled_query(self, query: QueryBuilder, connection: DatabaseClient) -> QueryBuilder:
|
|
926
|
+
"""``query`` reading the sample of the model's table ``sample()`` asked for.
|
|
927
|
+
|
|
928
|
+
Args:
|
|
929
|
+
query: A ``SELECT ... FROM`` the model's table.
|
|
930
|
+
connection: The connection the query runs on.
|
|
931
|
+
|
|
932
|
+
Returns:
|
|
933
|
+
The query - itself without a sample.
|
|
934
|
+
|
|
935
|
+
Raises:
|
|
936
|
+
UnSupportedError: The database can't read a sample of a table.
|
|
937
|
+
QueryError: The model's table options allow no sample (``TableOptions.raise_if_unsampled()``).
|
|
938
|
+
"""
|
|
939
|
+
table_sample = self._table_sample
|
|
940
|
+
if table_sample is None:
|
|
941
|
+
return query
|
|
942
|
+
if not connection.features.supports_table_sample:
|
|
943
|
+
raise UnSupportedError(f"sample() needs TABLESAMPLE, which {connection.dialect} doesn't have")
|
|
944
|
+
table_options = self.model._meta.get_table_options(connection.dialect)
|
|
945
|
+
if table_options is not None:
|
|
946
|
+
table_options.raise_if_unsampled(self.model)
|
|
947
|
+
return query.sample(table_sample.method, table_sample.percent, table_sample.seed)
|
|
948
|
+
|
|
949
|
+
def _get_execution_query(self, for_write: bool = False) -> Self:
|
|
950
|
+
"""Returns the query to run now: itself when its connection is pinned, otherwise a copy
|
|
951
|
+
bound to the connection chosen for this one execution, so a queryset evaluated again later
|
|
952
|
+
(after a transaction ends, inside another one, from another task) chooses afresh.
|
|
953
|
+
|
|
954
|
+
Args:
|
|
955
|
+
for_write: Whether the connection is chosen for a write.
|
|
956
|
+
|
|
957
|
+
Returns:
|
|
958
|
+
The query bound to a connection.
|
|
959
|
+
"""
|
|
960
|
+
if cast("DatabaseClient | None", self._connection) is not None:
|
|
961
|
+
return self
|
|
962
|
+
execution_query = copy(self)
|
|
963
|
+
execution_query._apply_connection(execution_query.get_connection(for_write=for_write))
|
|
964
|
+
return execution_query
|
|
965
|
+
|
|
966
|
+
def _get_compiler(self) -> QuerySpecification[Any]:
|
|
967
|
+
"""The query building this query's SQL - the query itself, unless it only describes the
|
|
968
|
+
rows another query builds.
|
|
969
|
+
|
|
970
|
+
Returns:
|
|
971
|
+
The query.
|
|
972
|
+
"""
|
|
973
|
+
return self
|
|
974
|
+
|
|
975
|
+
def _make_query(self) -> None:
|
|
976
|
+
"""Builds the query for the connection it runs on."""
|
|
977
|
+
raise NotImplementedError()
|
|
978
|
+
|
|
979
|
+
def _get_statements(self, parameters_inline: bool) -> list[tuple[str, list[Any]]]:
|
|
980
|
+
"""The statements the query runs, built for the connection it runs on.
|
|
981
|
+
|
|
982
|
+
Args:
|
|
983
|
+
parameters_inline: Whether values are rendered into the SQL instead of bound.
|
|
984
|
+
|
|
985
|
+
Returns:
|
|
986
|
+
``(sql, bound values)`` of each statement.
|
|
987
|
+
"""
|
|
988
|
+
raise NotImplementedError()
|
|
989
|
+
|
|
990
|
+
def _get_read_columns(self) -> set[tuple[str, str]]:
|
|
991
|
+
"""The columns the query reads, by the tables they belong to.
|
|
992
|
+
|
|
993
|
+
Returns:
|
|
994
|
+
``(table, column)`` of each column.
|
|
995
|
+
"""
|
|
996
|
+
raise NotImplementedError()
|
|
997
|
+
|
|
998
|
+
def _get_explain_statements(
|
|
999
|
+
self, statements: list[tuple[str, list[Any]]], output_format: str | None, options: dict[str, bool]
|
|
1000
|
+
) -> list[tuple[str, list[Any]]]:
|
|
1001
|
+
"""The EXPLAIN statement of each statement, in the dialect of the connection the query runs on.
|
|
1002
|
+
|
|
1003
|
+
Args:
|
|
1004
|
+
statements: ``(sql, bound values)`` of each explained statement.
|
|
1005
|
+
output_format: The plan's output format, None for the dialect's default.
|
|
1006
|
+
options: The EXPLAIN options.
|
|
1007
|
+
|
|
1008
|
+
Returns:
|
|
1009
|
+
``(sql, bound values)`` of each EXPLAIN statement.
|
|
1010
|
+
"""
|
|
1011
|
+
connection = self._connection
|
|
1012
|
+
clauses = connection.dialect.clauses
|
|
1013
|
+
return [
|
|
1014
|
+
(clauses.get_explain_sql(sql, output_format, options, connection.features), values)
|
|
1015
|
+
for sql, values in statements
|
|
1016
|
+
]
|
|
1017
|
+
|
|
1018
|
+
def sql(
|
|
1019
|
+
self,
|
|
1020
|
+
parameters_inline: bool = False,
|
|
1021
|
+
*,
|
|
1022
|
+
explain: bool = False,
|
|
1023
|
+
output_format: str | None = None,
|
|
1024
|
+
**explain_options: bool,
|
|
1025
|
+
) -> str:
|
|
1026
|
+
"""The SQL the query runs, in the dialect of the connection it runs on.
|
|
1027
|
+
|
|
1028
|
+
Args:
|
|
1029
|
+
parameters_inline: Whether values are rendered into the SQL instead of placeholders.
|
|
1030
|
+
explain: Return the ``EXPLAIN`` statement of the query instead - what ``explain()`` runs.
|
|
1031
|
+
output_format: The plan's output format with ``explain=True``.
|
|
1032
|
+
explain_options: The EXPLAIN options with ``explain=True``.
|
|
1033
|
+
|
|
1034
|
+
Returns:
|
|
1035
|
+
The SQL; several statements are joined with ``;``.
|
|
1036
|
+
|
|
1037
|
+
Raises:
|
|
1038
|
+
QueryError: ``output_format`` or an EXPLAIN option is given without ``explain=True``.
|
|
1039
|
+
UnSupportedError: The dialect has no such EXPLAIN format or option.
|
|
1040
|
+
"""
|
|
1041
|
+
if not explain and (output_format is not None or explain_options):
|
|
1042
|
+
raise QueryError("output_format and EXPLAIN options apply only with explain=True")
|
|
1043
|
+
execution_query = self._get_compiler()._get_execution_query()
|
|
1044
|
+
statements = execution_query._get_statements(parameters_inline)
|
|
1045
|
+
if explain:
|
|
1046
|
+
statements = execution_query._get_explain_statements(statements, output_format, explain_options)
|
|
1047
|
+
return ";".join(sql for sql, _values in statements)
|
|
1048
|
+
|
|
1049
|
+
def get_read_columns(self) -> set[tuple[str, str]]:
|
|
1050
|
+
"""The columns the query reads - in its joins and subqueries too - by the tables they belong to:
|
|
1051
|
+
what a view selecting it depends on.
|
|
1052
|
+
|
|
1053
|
+
Returns:
|
|
1054
|
+
``(table, column)`` of each column.
|
|
1055
|
+
"""
|
|
1056
|
+
return self._get_compiler()._get_execution_query()._get_read_columns()
|
|
1057
|
+
|
|
1058
|
+
async def explain(self, output_format: str | None = None, **options: bool) -> list[dict[str, Any]]:
|
|
1059
|
+
"""Runs the query's ``EXPLAIN`` statement - the one ``sql(explain=True)`` returns - and
|
|
1060
|
+
returns the plan rows.
|
|
1061
|
+
|
|
1062
|
+
Args:
|
|
1063
|
+
output_format: The plan's output format - one the dialect has (``text``, ``json``, ...),
|
|
1064
|
+
its own default when None.
|
|
1065
|
+
options: The EXPLAIN options - those of ``Features.explain_options``.
|
|
1066
|
+
|
|
1067
|
+
Returns:
|
|
1068
|
+
The plan rows as dicts of column name and value - the columns and their content depend
|
|
1069
|
+
on the database, never on its driver.
|
|
1070
|
+
|
|
1071
|
+
Raises:
|
|
1072
|
+
UnSupportedError: The dialect has no such format or option.
|
|
1073
|
+
"""
|
|
1074
|
+
execution_query = self._get_compiler()._get_execution_query()
|
|
1075
|
+
connection = execution_query._connection
|
|
1076
|
+
statements = execution_query._get_explain_statements(
|
|
1077
|
+
execution_query._get_statements(parameters_inline=False), output_format, options
|
|
1078
|
+
)
|
|
1079
|
+
rows: list[dict[str, Any]] = []
|
|
1080
|
+
for sql, values in statements:
|
|
1081
|
+
rows.extend(dict(row) for row in (await connection.execute(sql, values))[1])
|
|
1082
|
+
return rows
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
# The query classes are defined above, and the expressions imported - a value of any of them is
|
|
1086
|
+
# written into a statement or a subquery, never bound as a parameter.
|
|
1087
|
+
StatementPlan.unbindable_value_classes = (Term, Expression, QuerySpecification)
|
|
1088
|
+
QuerySpecification.raise_if_slots_unclassified()
|