relationalai 0.13.0__tar.gz → 0.13.1__tar.gz
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.
- {relationalai-0.13.0 → relationalai-0.13.1}/PKG-INFO +2 -2
- {relationalai-0.13.0 → relationalai-0.13.1}/pyproject.toml +2 -2
- relationalai-0.13.1/src/relationalai/clients/exec_txn_poller.py +91 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/__init__.py +2 -2
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/direct_access_resources.py +62 -79
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/snowflake.py +138 -31
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/use_index_poller.py +8 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/errors.py +18 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/extract_keys.py +6 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/optimization/solvers_pb.py +335 -84
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai_test_util/fixtures.py +5 -1
- {relationalai-0.13.0 → relationalai-0.13.1}/.gitignore +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/LICENSE +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/docs/pypi/README.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/frontend/debugger/dist/.gitignore +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/frontend/debugger/dist/index.html +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/events/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/procedures/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/procedures/procedure.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/rel/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/tables/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/tasks/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/raitoolkit/tasks/task.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/analysis/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/analysis/mechanistic.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/analysis/whynot.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/auth/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/auth/jwt_generator.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/auth/oauth_callback_server.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/auth/token_handler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/auth/util.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/client.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/config.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/direct_access_client.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/hash_util.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/local.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/profile_polling.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/azure/azure.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/cache_store.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/cli_resources.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/error_handlers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/resources_factory.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/use_index_resources.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/util.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/result_helpers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/types.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/util.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/debugging.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/dependencies.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/docutils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/dsl.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/builder/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/snowflake/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/std/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/std/decimals/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/std/integers/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/std/math/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/builder/std/strings/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/devtools/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/orm/parser.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/bindings/common.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/bindings/csv.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/bindings/snowflake.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/codegen/binder.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/codegen/helpers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/codegen/relations.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/codegen/weaver.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/constants.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/context.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/cset.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/instances.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/relations.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/rules.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/stack.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/core/utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ir/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ir/executor.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/export.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/models.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/python_printer.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/relationships.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/ontologies/subtyping.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/measures/measures.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/models.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/printer.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/reasoners.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/relations.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/relationships.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/types.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/relations.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/rulesets.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/serialization.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/snow/api.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/snow/common.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/types/entities.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/types/values.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/dsl/utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/graphs/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/compiler/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/constructors/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/executor/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/ir/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/passes/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/pragmas/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/primitives/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/types/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/utils/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/lqp/validators/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/builtins/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/compiler/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/dependency/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/factory/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/helpers/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/ir/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/rewrite/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/typer/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/types/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/util/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/metamodel/visitor/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/rel/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/rel/executor/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/rel/rel_utils/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/rel/rewrite/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/solvers/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/sql/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/sql/rewrite/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/tests/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/tests/logging/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/early_access/tests/utils/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/base.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/ci.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/colab.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/generic.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/hex.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/ipython.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/jupyter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/snowbook.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/environments/terminal.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/SF.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/graphs.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/inspect.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/api.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/filter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/options.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/transition.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/pathfinder/utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/README.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/api.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/benchmarks/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/code_organization.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/Movies.ipynb +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/basic_example.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movie_example.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/directed.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/follows.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/movies.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/person.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/produced.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/paths_benchmark.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/paths_example.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/find_paths_via_automaton.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/graph.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/path_algorithms/usp.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/product_graph.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/automaton.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/diagnostics.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/filter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/glushkov.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/rpq.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/rpq/transition.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_single_paths.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_single_walks.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/tree_agg.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/utilities/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/utilities/iterators.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/utilities/prefix_sum.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/paths/utilities/utilities.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/experimental/solvers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/loaders/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/loaders/csv.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/loaders/loader.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/loaders/types.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/metagen.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/metamodel.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/rel.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/rel_emitter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/rel_utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/designs/query_builder/identify_by.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/devtools/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/devtools/benchmark_lqp.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/devtools/compilation_manager.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/devtools/extract_lqp.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/internal/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/internal/annotations.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/internal/internal.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/internal/snowflake.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/README.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/builtins.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/constructors.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/executor.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/intrinsics.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/ir.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/model2lqp.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/passes.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/pragmas.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/primitives.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/result_helpers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/cdc.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/extract_common.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/rewrite/splinter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/types.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/lqp/validators.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/builtins.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/dataflow.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/dependency.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/executor.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/factory.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/helpers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/ir.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/rewrite/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/rewrite/flatten.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/typer/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/typer/checker.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/typer/typer.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/types.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/util.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/metamodel/visitor.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/experimental/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/graph/README.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/graph/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/graph/core.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/graph/tests/README.md +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/optimization/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/optimization/common.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/rel/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/rel/builtins.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/rel/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/rel/executor.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/rel/rel.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/rel/rel_utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/snowflake/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/compiler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/executor/duck_db.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/executor/result_helpers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/executor/snowflake.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/rewrite/denormalize.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/rewrite/double_negation.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/rewrite/recursive_union.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/sql/sql.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/constraints.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/datetime.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/decimals.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/floats.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/integers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/math.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/pragmas.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/re.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/std.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/std/strings.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/tests/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/tests/logging.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/tests/test_snapshot_abstract.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/tests/test_snapshot_base.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/semantics/tests/utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/aggregates.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/dates.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/graphs.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/inspect.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/math.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/re.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/std/strings.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/cleanup_snapshots.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/cli.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/cli_controls.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/cli_helpers.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/constants.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/debugger.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/debugger_client.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/debugger_server.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/dev.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/notes +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/qb_debugger.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/query_utils.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/tools/snapshot_viewer.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/clean_up_databases.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/constants.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/format.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/graph.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/list_databases.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/otel_configuration.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/otel_handler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/snowflake_handler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/span_format_test.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/span_tracker.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/spans_file_handler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/timeout.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/util/tracing_handler.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai_test_util/__init__.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai_test_util/snapshot.py +0 -0
- {relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai_test_util/traceback.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: relationalai
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.1
|
|
4
4
|
Summary: RelationalAI Library and CLI
|
|
5
5
|
Author-email: RelationalAI <support@relational.ai>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -11,7 +11,7 @@ Requires-Dist: colorama
|
|
|
11
11
|
Requires-Dist: cryptography
|
|
12
12
|
Requires-Dist: gravis
|
|
13
13
|
Requires-Dist: inquirerpy
|
|
14
|
-
Requires-Dist: lqp==0.1
|
|
14
|
+
Requires-Dist: lqp==0.2.1
|
|
15
15
|
Requires-Dist: nicegui==2.16.1
|
|
16
16
|
Requires-Dist: numpy<2
|
|
17
17
|
Requires-Dist: opentelemetry-api
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = 'relationalai'
|
|
3
|
-
version = '0.13.
|
|
3
|
+
version = '0.13.1'
|
|
4
4
|
description = 'RelationalAI Library and CLI'
|
|
5
5
|
readme="docs/pypi/README.md"
|
|
6
6
|
authors = [
|
|
@@ -8,7 +8,7 @@ authors = [
|
|
|
8
8
|
]
|
|
9
9
|
requires-python = ">= 3.10"
|
|
10
10
|
dependencies = [
|
|
11
|
-
"lqp==0.1
|
|
11
|
+
"lqp==0.2.1",
|
|
12
12
|
"snowflake-connector-python[secure-local-storage]",
|
|
13
13
|
"snowflake-snowpark-python>=1.38.0",
|
|
14
14
|
"typing-extensions",
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
from typing import Dict, Optional, TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from relationalai import debugging
|
|
7
|
+
from relationalai.clients.util import poll_with_specified_overhead
|
|
8
|
+
from relationalai.tools.cli_controls import create_progress
|
|
9
|
+
from relationalai.util.format import format_duration
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from relationalai.clients.resources.snowflake import Resources
|
|
13
|
+
|
|
14
|
+
# Polling behavior constants
|
|
15
|
+
POLL_OVERHEAD_RATE = 0.1 # Overhead rate for exponential backoff
|
|
16
|
+
|
|
17
|
+
# Text color constants
|
|
18
|
+
GREEN_COLOR = '\033[92m'
|
|
19
|
+
GRAY_COLOR = '\033[90m'
|
|
20
|
+
ENDC = '\033[0m'
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ExecTxnPoller:
|
|
24
|
+
"""
|
|
25
|
+
Encapsulates the polling logic for exec_async transaction completion.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
resource: "Resources",
|
|
31
|
+
txn_id: str,
|
|
32
|
+
headers: Optional[Dict] = None,
|
|
33
|
+
txn_start_time: Optional[float] = None,
|
|
34
|
+
):
|
|
35
|
+
self.res = resource
|
|
36
|
+
self.txn_id = txn_id
|
|
37
|
+
self.headers = headers or {}
|
|
38
|
+
self.txn_start_time = txn_start_time or time.time()
|
|
39
|
+
|
|
40
|
+
def poll(self) -> bool:
|
|
41
|
+
"""
|
|
42
|
+
Poll for transaction completion with interactive progress display.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
True if transaction completed successfully, False otherwise
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
# Don't show duration summary - we handle our own completion message
|
|
49
|
+
with create_progress(
|
|
50
|
+
description="Evaluating Query...",
|
|
51
|
+
success_message="", # We'll handle this ourselves
|
|
52
|
+
leading_newline=False,
|
|
53
|
+
trailing_newline=False,
|
|
54
|
+
show_duration_summary=False,
|
|
55
|
+
) as progress:
|
|
56
|
+
def check_status() -> bool:
|
|
57
|
+
"""Check if transaction is complete."""
|
|
58
|
+
elapsed = time.time() - self.txn_start_time
|
|
59
|
+
# Update the main status with elapsed time
|
|
60
|
+
progress.update_main_status(
|
|
61
|
+
query_progress_message(self.txn_id, elapsed)
|
|
62
|
+
)
|
|
63
|
+
return self.res._check_exec_async_status(self.txn_id, headers=self.headers)
|
|
64
|
+
|
|
65
|
+
with debugging.span("wait", txn_id=self.txn_id):
|
|
66
|
+
poll_with_specified_overhead(check_status, overhead_rate=POLL_OVERHEAD_RATE)
|
|
67
|
+
|
|
68
|
+
# Calculate final duration
|
|
69
|
+
total_duration = time.time() - self.txn_start_time
|
|
70
|
+
|
|
71
|
+
# Update to success message with duration
|
|
72
|
+
progress.update_main_status(
|
|
73
|
+
query_complete_message(self.txn_id, total_duration)
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
def query_progress_message(id: str, duration: float) -> str:
|
|
79
|
+
return (
|
|
80
|
+
# Print with whitespace to align with the end of the transaction ID
|
|
81
|
+
f"Evaluating Query... {format_duration(duration):>18}\n" +
|
|
82
|
+
f"{GRAY_COLOR}Query: {id}{ENDC}"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def query_complete_message(id: str, duration: float, status_header: bool = False) -> str:
|
|
86
|
+
return (
|
|
87
|
+
(f"{GREEN_COLOR}✅ " if status_header else "") +
|
|
88
|
+
# Print with whitespace to align with the end of the transaction ID
|
|
89
|
+
f"Query Complete: {format_duration(duration):>24}\n" +
|
|
90
|
+
f"{GRAY_COLOR}Query: {id}{ENDC}"
|
|
91
|
+
)
|
{relationalai-0.13.0 → relationalai-0.13.1}/src/relationalai/clients/resources/snowflake/__init__.py
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Snowflake resources module.
|
|
3
3
|
"""
|
|
4
4
|
# Import order matters - Resources must be imported first since other classes depend on it
|
|
5
|
-
from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext, INTERNAL_ENGINE_SIZES, ENGINE_SIZES_AWS, ENGINE_SIZES_AZURE, PrimaryKey
|
|
5
|
+
from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext, INTERNAL_ENGINE_SIZES, ENGINE_SIZES_AWS, ENGINE_SIZES_AZURE, PrimaryKey, PRINT_TXN_PROGRESS_FLAG
|
|
6
6
|
|
|
7
7
|
# These imports depend on Resources, so they come after
|
|
8
8
|
from .cli_resources import CLIResources
|
|
@@ -14,7 +14,7 @@ __all__ = [
|
|
|
14
14
|
'Resources', 'DirectAccessResources', 'Provider', 'Graph', 'SnowflakeClient',
|
|
15
15
|
'APP_NAME', 'PYREL_ROOT_DB', 'CLIResources', 'UseIndexResources', 'ExecContext',
|
|
16
16
|
'INTERNAL_ENGINE_SIZES', 'ENGINE_SIZES_AWS', 'ENGINE_SIZES_AZURE', 'PrimaryKey',
|
|
17
|
-
'create_resources_instance',
|
|
17
|
+
'PRINT_TXN_PROGRESS_FLAG', 'create_resources_instance',
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
|
|
@@ -12,12 +12,13 @@ from ....environments import runtime_env, SnowbookEnvironment
|
|
|
12
12
|
from ...config import Config, ConfigStore, ENDPOINT_FILE
|
|
13
13
|
from ...direct_access_client import DirectAccessClient
|
|
14
14
|
from ...types import EngineState
|
|
15
|
-
from ...util import get_pyrel_version,
|
|
16
|
-
from ....errors import ResponseStatusException, QueryTimeoutExceededException
|
|
15
|
+
from ...util import get_pyrel_version, safe_json_loads, ms_to_timestamp
|
|
16
|
+
from ....errors import GuardRailsException, ResponseStatusException, QueryTimeoutExceededException
|
|
17
17
|
from snowflake.snowpark import Session
|
|
18
18
|
|
|
19
19
|
# Import UseIndexResources to enable use_index functionality with direct access
|
|
20
20
|
from .use_index_resources import UseIndexResources
|
|
21
|
+
from .snowflake import TxnCreationResult
|
|
21
22
|
|
|
22
23
|
# Import helper functions from util
|
|
23
24
|
from .util import is_engine_issue as _is_engine_issue, is_database_issue as _is_database_issue, collect_error_messages
|
|
@@ -27,6 +28,7 @@ from typing import Iterable
|
|
|
27
28
|
|
|
28
29
|
# Constants
|
|
29
30
|
TXN_ABORT_REASON_TIMEOUT = "transaction timeout"
|
|
31
|
+
TXN_ABORT_REASON_GUARD_RAILS = "guard rail violation"
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
class DirectAccessResources(UseIndexResources):
|
|
@@ -217,83 +219,59 @@ class DirectAccessResources(UseIndexResources):
|
|
|
217
219
|
|
|
218
220
|
return response
|
|
219
221
|
|
|
220
|
-
def
|
|
222
|
+
def _create_v2_txn(
|
|
221
223
|
self,
|
|
222
224
|
database: str,
|
|
223
|
-
engine:
|
|
225
|
+
engine: str | None,
|
|
224
226
|
raw_code: str,
|
|
225
|
-
inputs: Dict
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
bypass_index
|
|
230
|
-
language: str
|
|
231
|
-
query_timeout_mins: int | None
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
with debugging.span("transaction") as txn_span:
|
|
236
|
-
with debugging.span("create_v2") as create_span:
|
|
237
|
-
|
|
238
|
-
use_graph_index = self.config.get("use_graph_index", USE_GRAPH_INDEX)
|
|
239
|
-
|
|
240
|
-
payload = {
|
|
241
|
-
"dbname": database,
|
|
242
|
-
"engine_name": engine,
|
|
243
|
-
"query": raw_code,
|
|
244
|
-
"v1_inputs": inputs,
|
|
245
|
-
"nowait_durable": nowait_durable,
|
|
246
|
-
"readonly": readonly,
|
|
247
|
-
"language": language,
|
|
248
|
-
}
|
|
249
|
-
if query_timeout_mins is None and (timeout_value := self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS)) is not None:
|
|
250
|
-
query_timeout_mins = int(timeout_value)
|
|
251
|
-
if query_timeout_mins is not None:
|
|
252
|
-
payload["timeout_mins"] = query_timeout_mins
|
|
253
|
-
query_params={"use_graph_index": str(use_graph_index and not bypass_index)}
|
|
254
|
-
|
|
255
|
-
# Add gi_setup_skipped to headers
|
|
256
|
-
if headers is None:
|
|
257
|
-
headers = {}
|
|
258
|
-
headers["gi_setup_skipped"] = str(gi_setup_skipped)
|
|
259
|
-
headers['pyrel_program_id'] = debugging.get_program_span_id() or ""
|
|
260
|
-
|
|
261
|
-
response = self._txn_request_with_gi_retry(
|
|
262
|
-
payload, headers, query_params, engine
|
|
263
|
-
)
|
|
264
|
-
|
|
265
|
-
artifact_info = {}
|
|
266
|
-
response_content = response.json()
|
|
227
|
+
inputs: Dict,
|
|
228
|
+
headers: Dict[str, str],
|
|
229
|
+
readonly: bool,
|
|
230
|
+
nowait_durable: bool,
|
|
231
|
+
bypass_index: bool,
|
|
232
|
+
language: str,
|
|
233
|
+
query_timeout_mins: int | None,
|
|
234
|
+
) -> TxnCreationResult:
|
|
235
|
+
"""
|
|
236
|
+
Create a transaction via direct HTTP access and return the result.
|
|
267
237
|
|
|
268
|
-
|
|
269
|
-
|
|
238
|
+
This override uses HTTP requests instead of SQL stored procedures.
|
|
239
|
+
"""
|
|
240
|
+
use_graph_index = self.config.get("use_graph_index", USE_GRAPH_INDEX)
|
|
270
241
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
242
|
+
payload = {
|
|
243
|
+
"dbname": database,
|
|
244
|
+
"engine_name": engine,
|
|
245
|
+
"query": raw_code,
|
|
246
|
+
"v1_inputs": inputs,
|
|
247
|
+
"nowait_durable": nowait_durable,
|
|
248
|
+
"readonly": readonly,
|
|
249
|
+
"language": language,
|
|
250
|
+
}
|
|
251
|
+
if query_timeout_mins is None and (timeout_value := self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS)) is not None:
|
|
252
|
+
query_timeout_mins = int(timeout_value)
|
|
253
|
+
if query_timeout_mins is not None:
|
|
254
|
+
payload["timeout_mins"] = query_timeout_mins
|
|
255
|
+
query_params = {"use_graph_index": str(use_graph_index and not bypass_index)}
|
|
256
|
+
|
|
257
|
+
response = self._txn_request_with_gi_retry(
|
|
258
|
+
payload, headers, query_params, engine
|
|
259
|
+
)
|
|
274
260
|
|
|
275
|
-
|
|
276
|
-
if state in ["COMPLETED", "ABORTED"]:
|
|
277
|
-
if txn_id in self._pending_transactions:
|
|
278
|
-
self._pending_transactions.remove(txn_id)
|
|
261
|
+
response_content = response.json()
|
|
279
262
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
filename = result['filename']
|
|
283
|
-
# making keys uppercase to match the old behavior
|
|
284
|
-
artifact_info[filename] = {k.upper(): v for k, v in result.items()}
|
|
263
|
+
txn_id = response_content["transaction"]['id']
|
|
264
|
+
state = response_content["transaction"]['state']
|
|
285
265
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
artifact_info = self._list_exec_async_artifacts(txn_id, headers=headers)
|
|
266
|
+
# Build artifact_info if transaction completed immediately (fast path)
|
|
267
|
+
artifact_info: Dict[str, Dict] = {}
|
|
268
|
+
if state in ["COMPLETED", "ABORTED"]:
|
|
269
|
+
for result in response_content.get("results", []):
|
|
270
|
+
filename = result['filename']
|
|
271
|
+
# making keys uppercase to match the old behavior
|
|
272
|
+
artifact_info[filename] = {k.upper(): v for k, v in result.items()}
|
|
294
273
|
|
|
295
|
-
|
|
296
|
-
return self._download_results(artifact_info, txn_id, state)
|
|
274
|
+
return TxnCreationResult(txn_id=txn_id, state=state, artifact_info=artifact_info)
|
|
297
275
|
|
|
298
276
|
def _prepare_index(
|
|
299
277
|
self,
|
|
@@ -355,15 +333,20 @@ class DirectAccessResources(UseIndexResources):
|
|
|
355
333
|
if txn_id in self._pending_transactions:
|
|
356
334
|
self._pending_transactions.remove(txn_id)
|
|
357
335
|
|
|
358
|
-
if status == "ABORTED"
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
336
|
+
if status == "ABORTED":
|
|
337
|
+
reason = transaction.get("abort_reason", "")
|
|
338
|
+
|
|
339
|
+
if reason == TXN_ABORT_REASON_TIMEOUT:
|
|
340
|
+
config_file_path = getattr(self.config, 'file_path', None)
|
|
341
|
+
timeout_ms = int(transaction.get("timeout_ms", 0))
|
|
342
|
+
timeout_mins = timeout_ms // 60000 if timeout_ms > 0 else int(self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS) or DEFAULT_QUERY_TIMEOUT_MINS)
|
|
343
|
+
raise QueryTimeoutExceededException(
|
|
344
|
+
timeout_mins=timeout_mins,
|
|
345
|
+
query_id=txn_id,
|
|
346
|
+
config_file_path=config_file_path,
|
|
347
|
+
)
|
|
348
|
+
elif reason == TXN_ABORT_REASON_GUARD_RAILS:
|
|
349
|
+
raise GuardRailsException(response_content.get("progress", {}))
|
|
367
350
|
|
|
368
351
|
# @TODO: Find some way to tunnel the ABORT_REASON out. Azure doesn't have this, but it's handy
|
|
369
352
|
return status == "COMPLETED" or status == "ABORTED"
|
|
@@ -15,6 +15,7 @@ import hashlib
|
|
|
15
15
|
from dataclasses import dataclass
|
|
16
16
|
|
|
17
17
|
from ....auth.token_handler import TokenHandler
|
|
18
|
+
from relationalai.clients.exec_txn_poller import ExecTxnPoller, query_complete_message
|
|
18
19
|
import snowflake.snowpark
|
|
19
20
|
|
|
20
21
|
from ....rel_utils import sanitize_identifier, to_fqn_relation_name
|
|
@@ -54,7 +55,7 @@ from .util import (
|
|
|
54
55
|
)
|
|
55
56
|
from ....environments import runtime_env, HexEnvironment, SnowbookEnvironment
|
|
56
57
|
from .... import dsl, rel, metamodel as m
|
|
57
|
-
from ....errors import EngineProvisioningFailed, EngineNameValidationException, Errors, InvalidAliasError, InvalidEngineSizeError, InvalidSourceTypeWarning, RAIException, HexSessionException, SnowflakeChangeTrackingNotEnabledException, SnowflakeDatabaseException, SnowflakeImportMissingException, SnowflakeInvalidSource, SnowflakeMissingConfigValuesException, SnowflakeProxyAPIDeprecationWarning, SnowflakeProxySourceError, ModelNotFoundException, UnknownSourceWarning, RowsDroppedFromTargetTableWarning, QueryTimeoutExceededException
|
|
58
|
+
from ....errors import EngineProvisioningFailed, EngineNameValidationException, Errors, GuardRailsException, InvalidAliasError, InvalidEngineSizeError, InvalidSourceTypeWarning, RAIException, HexSessionException, SnowflakeChangeTrackingNotEnabledException, SnowflakeDatabaseException, SnowflakeImportMissingException, SnowflakeInvalidSource, SnowflakeMissingConfigValuesException, SnowflakeProxyAPIDeprecationWarning, SnowflakeProxySourceError, ModelNotFoundException, UnknownSourceWarning, RowsDroppedFromTargetTableWarning, QueryTimeoutExceededException
|
|
58
59
|
from concurrent.futures import ThreadPoolExecutor
|
|
59
60
|
from datetime import datetime, timedelta
|
|
60
61
|
from snowflake.snowpark.types import StringType, StructField, StructType
|
|
@@ -105,6 +106,16 @@ PYREL_ROOT_DB = 'pyrel_root_db'
|
|
|
105
106
|
TERMINAL_TXN_STATES = ["COMPLETED", "ABORTED"]
|
|
106
107
|
|
|
107
108
|
TXN_ABORT_REASON_TIMEOUT = "transaction timeout"
|
|
109
|
+
GUARDRAILS_ABORT_REASON = "guard rail violation"
|
|
110
|
+
|
|
111
|
+
PRINT_TXN_PROGRESS_FLAG = "print_txn_progress"
|
|
112
|
+
|
|
113
|
+
#--------------------------------------------------
|
|
114
|
+
# Helpers
|
|
115
|
+
#--------------------------------------------------
|
|
116
|
+
|
|
117
|
+
def should_print_txn_progress(config) -> bool:
|
|
118
|
+
return bool(config.get(PRINT_TXN_PROGRESS_FLAG, False))
|
|
108
119
|
|
|
109
120
|
#--------------------------------------------------
|
|
110
121
|
# Resources
|
|
@@ -131,6 +142,19 @@ class ExecContext:
|
|
|
131
142
|
skip_engine_db_error_retry=self.skip_engine_db_error_retry
|
|
132
143
|
)
|
|
133
144
|
|
|
145
|
+
|
|
146
|
+
@dataclass
|
|
147
|
+
class TxnCreationResult:
|
|
148
|
+
"""Result of creating a transaction via _create_v2_txn.
|
|
149
|
+
|
|
150
|
+
This standardizes the response format between different implementations
|
|
151
|
+
(SQL stored procedure vs HTTP direct access).
|
|
152
|
+
"""
|
|
153
|
+
txn_id: str
|
|
154
|
+
state: str
|
|
155
|
+
artifact_info: Dict[str, Dict] # Populated if fast-path (state is COMPLETED/ABORTED)
|
|
156
|
+
|
|
157
|
+
|
|
134
158
|
class Resources(ResourcesBase):
|
|
135
159
|
def __init__(
|
|
136
160
|
self,
|
|
@@ -1411,15 +1435,18 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1411
1435
|
if txn_id in self._pending_transactions:
|
|
1412
1436
|
self._pending_transactions.remove(txn_id)
|
|
1413
1437
|
|
|
1414
|
-
if status == "ABORTED"
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1438
|
+
if status == "ABORTED":
|
|
1439
|
+
if response_row.get("ABORT_REASON", "") == TXN_ABORT_REASON_TIMEOUT:
|
|
1440
|
+
config_file_path = getattr(self.config, 'file_path', None)
|
|
1441
|
+
# todo: use the timeout returned alongside the transaction as soon as it's exposed
|
|
1442
|
+
timeout_mins = int(self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS) or DEFAULT_QUERY_TIMEOUT_MINS)
|
|
1443
|
+
raise QueryTimeoutExceededException(
|
|
1444
|
+
timeout_mins=timeout_mins,
|
|
1445
|
+
query_id=txn_id,
|
|
1446
|
+
config_file_path=config_file_path,
|
|
1447
|
+
)
|
|
1448
|
+
elif response_row.get("ABORT_REASON", "") == GUARDRAILS_ABORT_REASON:
|
|
1449
|
+
raise GuardRailsException()
|
|
1423
1450
|
|
|
1424
1451
|
# @TODO: Find some way to tunnel the ABORT_REASON out. Azure doesn't have this, but it's handy
|
|
1425
1452
|
return status == "COMPLETED" or status == "ABORTED"
|
|
@@ -1654,6 +1681,72 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1654
1681
|
raise Exception("Failed to create transaction")
|
|
1655
1682
|
return response
|
|
1656
1683
|
|
|
1684
|
+
def _create_v2_txn(
|
|
1685
|
+
self,
|
|
1686
|
+
database: str,
|
|
1687
|
+
engine: str | None,
|
|
1688
|
+
raw_code: str,
|
|
1689
|
+
inputs: Dict,
|
|
1690
|
+
headers: Dict[str, str],
|
|
1691
|
+
readonly: bool,
|
|
1692
|
+
nowait_durable: bool,
|
|
1693
|
+
bypass_index: bool,
|
|
1694
|
+
language: str,
|
|
1695
|
+
query_timeout_mins: int | None,
|
|
1696
|
+
) -> TxnCreationResult:
|
|
1697
|
+
"""
|
|
1698
|
+
Create a transaction and return the result.
|
|
1699
|
+
|
|
1700
|
+
This method handles calling the RAI app stored procedure to create a transaction
|
|
1701
|
+
and parses the response into a standardized TxnCreationResult format.
|
|
1702
|
+
|
|
1703
|
+
This method can be overridden by subclasses (e.g., DirectAccessResources)
|
|
1704
|
+
to use different transport mechanisms (HTTP instead of SQL).
|
|
1705
|
+
|
|
1706
|
+
Args:
|
|
1707
|
+
database: Database/model name
|
|
1708
|
+
engine: Engine name (optional)
|
|
1709
|
+
raw_code: Code to execute (REL, LQP, or SQL)
|
|
1710
|
+
inputs: Input parameters for the query
|
|
1711
|
+
headers: HTTP headers (must be prepared by caller)
|
|
1712
|
+
readonly: Whether the transaction is read-only
|
|
1713
|
+
nowait_durable: Whether to wait for durable writes
|
|
1714
|
+
bypass_index: Whether to bypass graph index setup
|
|
1715
|
+
language: Query language ("rel" or "lqp")
|
|
1716
|
+
query_timeout_mins: Optional query timeout in minutes
|
|
1717
|
+
|
|
1718
|
+
Returns:
|
|
1719
|
+
TxnCreationResult containing txn_id, state, and artifact_info
|
|
1720
|
+
"""
|
|
1721
|
+
response = self._exec_rai_app(
|
|
1722
|
+
database=database,
|
|
1723
|
+
engine=engine,
|
|
1724
|
+
raw_code=raw_code,
|
|
1725
|
+
inputs=inputs,
|
|
1726
|
+
readonly=readonly,
|
|
1727
|
+
nowait_durable=nowait_durable,
|
|
1728
|
+
request_headers=headers,
|
|
1729
|
+
bypass_index=bypass_index,
|
|
1730
|
+
language=language,
|
|
1731
|
+
query_timeout_mins=query_timeout_mins,
|
|
1732
|
+
)
|
|
1733
|
+
|
|
1734
|
+
rows = list(iter(response))
|
|
1735
|
+
|
|
1736
|
+
# process the first row since txn_id and state are the same for all rows
|
|
1737
|
+
first_row = rows[0]
|
|
1738
|
+
txn_id = first_row['ID']
|
|
1739
|
+
state = first_row['STATE']
|
|
1740
|
+
|
|
1741
|
+
# Build artifact_info if transaction completed immediately (fast path)
|
|
1742
|
+
artifact_info: Dict[str, Dict] = {}
|
|
1743
|
+
if state in ["COMPLETED", "ABORTED"]:
|
|
1744
|
+
for row in rows:
|
|
1745
|
+
filename = row['FILENAME']
|
|
1746
|
+
artifact_info[filename] = row
|
|
1747
|
+
|
|
1748
|
+
return TxnCreationResult(txn_id=txn_id, state=state, artifact_info=artifact_info)
|
|
1749
|
+
|
|
1657
1750
|
def _exec_async_v2(
|
|
1658
1751
|
self,
|
|
1659
1752
|
database: str,
|
|
@@ -1672,15 +1765,20 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1672
1765
|
High-level async execution method with transaction polling and artifact management.
|
|
1673
1766
|
|
|
1674
1767
|
This is the core method for executing queries asynchronously. It:
|
|
1675
|
-
1. Creates a transaction by calling
|
|
1768
|
+
1. Creates a transaction by calling _create_v2_txn
|
|
1676
1769
|
2. Handles two execution paths:
|
|
1677
1770
|
- Fast path: Transaction completes immediately (COMPLETED/ABORTED)
|
|
1678
1771
|
- Slow path: Transaction is pending, requires polling until completion
|
|
1679
1772
|
3. Manages pending transactions list
|
|
1680
1773
|
4. Downloads and returns query results/artifacts
|
|
1681
1774
|
|
|
1682
|
-
This method is called by _execute_code (base implementation) and
|
|
1683
|
-
overridden by child classes (e.g.,
|
|
1775
|
+
This method is called by _execute_code (base implementation), and calls the
|
|
1776
|
+
following methods that can be overridden by child classes (e.g.,
|
|
1777
|
+
DirectAccessResources uses HTTP instead):
|
|
1778
|
+
- _create_v2_txn
|
|
1779
|
+
- _check_exec_async_status
|
|
1780
|
+
- _list_exec_async_artifacts
|
|
1781
|
+
- _download_results
|
|
1684
1782
|
|
|
1685
1783
|
Args:
|
|
1686
1784
|
database: Database/model name
|
|
@@ -1704,53 +1802,62 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1704
1802
|
query_attrs_dict = json.loads(request_headers.get("X-Query-Attributes", "{}"))
|
|
1705
1803
|
|
|
1706
1804
|
with debugging.span("transaction", **query_attrs_dict) as txn_span:
|
|
1805
|
+
txn_start_time = time.time()
|
|
1707
1806
|
with debugging.span("create_v2", **query_attrs_dict) as create_span:
|
|
1807
|
+
# Prepare headers for transaction creation
|
|
1708
1808
|
request_headers['user-agent'] = get_pyrel_version(self.generation)
|
|
1709
1809
|
request_headers['gi_setup_skipped'] = str(gi_setup_skipped)
|
|
1710
1810
|
request_headers['pyrel_program_id'] = debugging.get_program_span_id() or ""
|
|
1711
|
-
|
|
1811
|
+
|
|
1812
|
+
# Create the transaction
|
|
1813
|
+
result = self._create_v2_txn(
|
|
1712
1814
|
database=database,
|
|
1713
1815
|
engine=engine,
|
|
1714
1816
|
raw_code=raw_code,
|
|
1715
1817
|
inputs=inputs,
|
|
1818
|
+
headers=request_headers,
|
|
1716
1819
|
readonly=readonly,
|
|
1717
1820
|
nowait_durable=nowait_durable,
|
|
1718
|
-
request_headers=request_headers,
|
|
1719
1821
|
bypass_index=bypass_index,
|
|
1720
1822
|
language=language,
|
|
1721
1823
|
query_timeout_mins=query_timeout_mins,
|
|
1722
1824
|
)
|
|
1723
1825
|
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
# process the first row since txn_id and state are the same for all rows
|
|
1728
|
-
first_row = rows[0]
|
|
1729
|
-
txn_id = first_row['ID']
|
|
1730
|
-
state = first_row['STATE']
|
|
1731
|
-
filename = first_row['FILENAME']
|
|
1826
|
+
txn_id = result.txn_id
|
|
1827
|
+
state = result.state
|
|
1732
1828
|
|
|
1733
1829
|
txn_span["txn_id"] = txn_id
|
|
1734
1830
|
create_span["txn_id"] = txn_id
|
|
1735
1831
|
debugging.event("transaction_created", txn_span, txn_id=txn_id)
|
|
1736
1832
|
|
|
1833
|
+
print_txn_progress = should_print_txn_progress(self.config)
|
|
1834
|
+
|
|
1737
1835
|
# fast path: transaction already finished
|
|
1738
1836
|
if state in ["COMPLETED", "ABORTED"]:
|
|
1837
|
+
txn_end_time = time.time()
|
|
1739
1838
|
if txn_id in self._pending_transactions:
|
|
1740
1839
|
self._pending_transactions.remove(txn_id)
|
|
1741
1840
|
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1841
|
+
artifact_info = result.artifact_info
|
|
1842
|
+
|
|
1843
|
+
txn_duration = txn_end_time - txn_start_time
|
|
1844
|
+
if print_txn_progress:
|
|
1845
|
+
print(
|
|
1846
|
+
query_complete_message(txn_id, txn_duration, status_header=True)
|
|
1847
|
+
)
|
|
1746
1848
|
|
|
1747
1849
|
# Slow path: transaction not done yet; start polling
|
|
1748
1850
|
else:
|
|
1749
1851
|
self._pending_transactions.append(txn_id)
|
|
1852
|
+
# Use the interactive poller for transaction status
|
|
1750
1853
|
with debugging.span("wait", txn_id=txn_id):
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1854
|
+
if print_txn_progress:
|
|
1855
|
+
poller = ExecTxnPoller(resource=self, txn_id=txn_id, headers=request_headers, txn_start_time=txn_start_time)
|
|
1856
|
+
poller.poll()
|
|
1857
|
+
else:
|
|
1858
|
+
poll_with_specified_overhead(
|
|
1859
|
+
lambda: self._check_exec_async_status(txn_id, headers=request_headers), 0.1
|
|
1860
|
+
)
|
|
1754
1861
|
artifact_info = self._list_exec_async_artifacts(txn_id, headers=request_headers)
|
|
1755
1862
|
|
|
1756
1863
|
with debugging.span("fetch"):
|
|
@@ -2408,7 +2515,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
2408
2515
|
return None
|
|
2409
2516
|
return results[0][0]
|
|
2410
2517
|
|
|
2411
|
-
# CLI methods (list_warehouses, list_compute_pools, list_roles, list_apps,
|
|
2518
|
+
# CLI methods (list_warehouses, list_compute_pools, list_roles, list_apps,
|
|
2412
2519
|
# list_databases, list_sf_schemas, list_tables) are now in CLIResources class
|
|
2413
2520
|
# schema_info is kept in base Resources class since it's used by SnowflakeSchema._fetch_info()
|
|
2414
2521
|
|
|
@@ -189,6 +189,9 @@ class UseIndexPoller:
|
|
|
189
189
|
# on every 5th iteration we reset the cdc status, so it will be checked again
|
|
190
190
|
self.should_check_cdc = True
|
|
191
191
|
|
|
192
|
+
# Flag to only check data stream health once in the first call
|
|
193
|
+
self.check_data_stream_health = True
|
|
194
|
+
|
|
192
195
|
self.wait_for_stream_sync = self.res.config.get(
|
|
193
196
|
"wait_for_stream_sync", WAIT_FOR_STREAM_SYNC
|
|
194
197
|
)
|
|
@@ -503,6 +506,7 @@ class UseIndexPoller:
|
|
|
503
506
|
"init_engine_async": self.init_engine_async,
|
|
504
507
|
"language": self.language,
|
|
505
508
|
"data_freshness_mins": self.data_freshness,
|
|
509
|
+
"check_data_stream_health": self.check_data_stream_health
|
|
506
510
|
})
|
|
507
511
|
|
|
508
512
|
request_headers = debugging.add_current_propagation_headers(self.headers)
|
|
@@ -535,6 +539,7 @@ class UseIndexPoller:
|
|
|
535
539
|
errors = use_index_data.get("errors", [])
|
|
536
540
|
relations = use_index_data.get("relations", {})
|
|
537
541
|
cdc_enabled = use_index_data.get("cdcEnabled", False)
|
|
542
|
+
health_checked = use_index_data.get("healthChecked", False)
|
|
538
543
|
if self.check_ready_count % ERP_CHECK_FREQUENCY == 0 or not cdc_enabled:
|
|
539
544
|
self.should_check_cdc = True
|
|
540
545
|
else:
|
|
@@ -542,6 +547,9 @@ class UseIndexPoller:
|
|
|
542
547
|
|
|
543
548
|
if engines and self.init_engine_async:
|
|
544
549
|
self.init_engine_async = False
|
|
550
|
+
|
|
551
|
+
if self.check_data_stream_health and health_checked:
|
|
552
|
+
self.check_data_stream_health = False
|
|
545
553
|
|
|
546
554
|
break_loop = False
|
|
547
555
|
has_stream_errors = False
|
|
@@ -2436,6 +2436,24 @@ class QueryTimeoutExceededException(RAIException):
|
|
|
2436
2436
|
Consider increasing the 'query_timeout_mins' parameter in your configuration file{f' (stored in {self.config_file_path})' if self.config_file_path else ''} to allow more time for query execution.
|
|
2437
2437
|
""")
|
|
2438
2438
|
|
|
2439
|
+
class GuardRailsException(RAIException):
|
|
2440
|
+
def __init__(self, progress: dict[str, Any]={}):
|
|
2441
|
+
self.name = "Guard Rails Violation"
|
|
2442
|
+
self.message = "Transaction aborted due to guard rails violation."
|
|
2443
|
+
self.progress = progress
|
|
2444
|
+
self.content = self.format_message()
|
|
2445
|
+
super().__init__(self.message, self.name, self.content)
|
|
2446
|
+
|
|
2447
|
+
def format_message(self):
|
|
2448
|
+
messages = [] if self.progress else [self.message]
|
|
2449
|
+
for task in self.progress.get("tasks", {}).values():
|
|
2450
|
+
for warning_type, warning_data in task.get("warnings", {}).items():
|
|
2451
|
+
messages.append(textwrap.dedent(f"""
|
|
2452
|
+
Relation Name: [yellow]{task["task_name"]}[/yellow]
|
|
2453
|
+
Warning: {warning_type}
|
|
2454
|
+
Message: {warning_data["message"]}
|
|
2455
|
+
"""))
|
|
2456
|
+
return "\n".join(messages)
|
|
2439
2457
|
|
|
2440
2458
|
#--------------------------------------------------
|
|
2441
2459
|
# Azure Exceptions
|