relationalai 0.13.3__tar.gz → 0.13.5__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.3 → relationalai-0.13.5}/PKG-INFO +2 -2
- {relationalai-0.13.3 → relationalai-0.13.5}/pyproject.toml +2 -2
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/exec_txn_poller.py +51 -20
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/local.py +15 -7
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/__init__.py +2 -2
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/direct_access_resources.py +8 -4
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/snowflake.py +22 -10
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/use_index_poller.py +1 -1
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/solvers.py +8 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/snowflake.py +5 -1
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/executor.py +31 -11
- relationalai-0.13.5/src/relationalai/semantics/lqp/export_rewriter.py +40 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/model2lqp.py +34 -25
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/passes.py +6 -3
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/result_helpers.py +76 -12
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/__init__.py +2 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/annotate_constraints.py +22 -10
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/extract_common.py +3 -1
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/extract_keys.py +85 -20
- relationalai-0.13.5/src/relationalai/semantics/lqp/rewrite/flatten_script.py +301 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/functional_dependencies.py +43 -9
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/quantify_vars.py +12 -3
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/unify_definitions.py +9 -3
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/dependency.py +9 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/executor.py +17 -10
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/__init__.py +2 -1
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/flatten.py +1 -2
- relationalai-0.13.5/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +256 -0
- relationalai-0.13.5/src/relationalai/semantics/metamodel/rewrite/handle_aggregations_and_ranks.py +237 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/typer.py +1 -1
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/solvers_pb.py +101 -107
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/compiler.py +7 -3
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/executor.py +1 -1
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/test_snapshot_abstract.py +2 -1
- relationalai-0.13.5/src/relationalai/tools/txn_progress.py +188 -0
- relationalai-0.13.3/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -171
- {relationalai-0.13.3 → relationalai-0.13.5}/.gitignore +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/LICENSE +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/docs/pypi/README.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/.gitignore +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/index.html +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/events/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/procedures/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/procedures/procedure.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/rel/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/tables/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/tasks/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/tasks/task.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/analysis/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/analysis/mechanistic.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/analysis/whynot.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/jwt_generator.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/oauth_callback_server.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/token_handler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/util.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/client.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/config.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/direct_access_client.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/hash_util.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/profile_polling.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/azure/azure.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/cache_store.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/cli_resources.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/engine_service.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/error_handlers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/resources_factory.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/use_index_resources.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/util.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/result_helpers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/types.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/util.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/compiler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/debugging.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/dependencies.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/docutils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/dsl.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/builder/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/snowflake/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/decimals/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/integers/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/math/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/strings/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/devtools/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/parser.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/common.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/csv.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/snowflake.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/binder.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/helpers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/relations.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/weaver.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/constants.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/context.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/cset.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/instances.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/relations.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/rules.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/stack.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/compiler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/executor.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/export.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/models.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/python_printer.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/relationships.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/subtyping.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/measures.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/models.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/printer.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/reasoners.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/relations.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/relationships.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/types.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/relations.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/rulesets.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialization.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/api.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/common.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/entities.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/values.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/graphs/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/compiler/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/constructors/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/executor/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/ir/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/passes/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/pragmas/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/primitives/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/types/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/utils/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/validators/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/builtins/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/compiler/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/dependency/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/factory/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/helpers/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/ir/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/rewrite/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/typer/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/types/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/util/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/visitor/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/executor/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/rel_utils/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/rewrite/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/solvers/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/sql/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/sql/rewrite/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/logging/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/utils/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/base.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/ci.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/colab.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/generic.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/hex.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/ipython.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/jupyter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/snowbook.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/terminal.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/errors.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/SF.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/graphs.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/inspect.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/api.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/filter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/options.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/transition.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/README.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/api.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/benchmarks/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/code_organization.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/Movies.ipynb +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/basic_example.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movie_example.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/directed.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/follows.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/movies.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/person.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/produced.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/paths_benchmark.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/paths_example.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/find_paths_via_automaton.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/graph.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/product_graph.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/automaton.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/diagnostics.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/filter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/glushkov.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/rpq.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/transition.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_paths.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_walks.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tree_agg.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/iterators.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/prefix_sum.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/utilities.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/csv.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/loader.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/types.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/metagen.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/metamodel.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/rel.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/rel_emitter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/rel_utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/designs/query_builder/identify_by.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/benchmark_lqp.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/compilation_manager.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/extract_lqp.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/annotations.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/internal.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/README.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/algorithms.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/builtins.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/compiler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/constructors.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/intrinsics.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/ir.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/pragmas.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/primitives.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/algorithm.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/cdc.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/constants_to_vars.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/deduplicate_vars.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/eliminate_data.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/period_math.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/splinter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/types.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/validators.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/builtins.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/compiler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/dataflow.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/factory.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/helpers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/ir.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/checker.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/types.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/util.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/visitor.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/experimental/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/README.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/core.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/tests/README.md +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/common.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/builtins.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/rel.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/rel_utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/snowflake/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/compiler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/duck_db.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/result_helpers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/snowflake.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/denormalize.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/double_negation.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/recursive_union.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/sql.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/constraints.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/datetime.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/decimals.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/floats.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/integers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/math.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/pragmas.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/re.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/std.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/strings.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/logging.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/lqp/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/lqp/algorithms.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/test_snapshot_base.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/aggregates.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/dates.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/graphs.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/inspect.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/math.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/re.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/strings.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cleanup_snapshots.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cli.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cli_controls.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cli_helpers.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/constants.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/debugger.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/debugger_client.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/debugger_server.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/dev.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/notes +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/qb_debugger.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/query_utils.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/snapshot_viewer.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/clean_up_databases.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/constants.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/format.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/graph.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/list_databases.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/otel_configuration.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/otel_handler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/snowflake_handler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/span_format_test.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/span_tracker.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/spans_file_handler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/timeout.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/tracing_handler.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/__init__.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/fixtures.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/snapshot.py +0 -0
- {relationalai-0.13.3 → relationalai-0.13.5}/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.5
|
|
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.2.
|
|
14
|
+
Requires-Dist: lqp==0.2.3
|
|
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.5'
|
|
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.2.
|
|
11
|
+
"lqp==0.2.3",
|
|
12
12
|
"snowflake-connector-python[secure-local-storage]",
|
|
13
13
|
"snowflake-snowpark-python>=1.38.0",
|
|
14
14
|
"typing-extensions",
|
|
@@ -5,11 +5,14 @@ from typing import Dict, Optional, TYPE_CHECKING
|
|
|
5
5
|
|
|
6
6
|
from relationalai import debugging
|
|
7
7
|
from relationalai.clients.util import poll_with_specified_overhead
|
|
8
|
+
from relationalai.clients.config import Config
|
|
8
9
|
from relationalai.tools.cli_controls import create_progress
|
|
9
10
|
from relationalai.util.format import format_duration
|
|
11
|
+
from relationalai.tools.txn_progress import format_execution_tree
|
|
10
12
|
|
|
11
13
|
if TYPE_CHECKING:
|
|
12
14
|
from relationalai.clients.resources.snowflake import Resources
|
|
15
|
+
from relationalai.clients.resources.snowflake.snowflake import TxnStatusResponse
|
|
13
16
|
|
|
14
17
|
# Polling behavior constants
|
|
15
18
|
POLL_OVERHEAD_RATE = 0.1 # Overhead rate for exponential backoff
|
|
@@ -19,6 +22,14 @@ GREEN_COLOR = '\033[92m'
|
|
|
19
22
|
GRAY_COLOR = '\033[90m'
|
|
20
23
|
ENDC = '\033[0m'
|
|
21
24
|
|
|
25
|
+
PRINT_TXN_PROGRESS_FLAG = "print_txn_progress"
|
|
26
|
+
PRINT_INTERNAL_TXN_PROGRESS_FLAG = "print_txn_progress_internal"
|
|
27
|
+
|
|
28
|
+
def should_print_txn_progress(config: Config) -> bool:
|
|
29
|
+
return bool(config.get(PRINT_TXN_PROGRESS_FLAG, False))
|
|
30
|
+
|
|
31
|
+
def should_print_internal_txn_progress(config) -> bool:
|
|
32
|
+
return bool(config.get(PRINT_INTERNAL_TXN_PROGRESS_FLAG, False))
|
|
22
33
|
|
|
23
34
|
class ExecTxnPoller:
|
|
24
35
|
"""
|
|
@@ -27,17 +38,19 @@ class ExecTxnPoller:
|
|
|
27
38
|
|
|
28
39
|
def __init__(
|
|
29
40
|
self,
|
|
30
|
-
|
|
31
|
-
resource: "Resources",
|
|
41
|
+
config: Config,
|
|
42
|
+
resource: Optional["Resources"] = None,
|
|
32
43
|
txn_id: Optional[str] = None,
|
|
33
44
|
headers: Optional[Dict] = None,
|
|
34
|
-
txn_start_time: Optional[float] = None
|
|
45
|
+
txn_start_time: Optional[float] = None
|
|
35
46
|
):
|
|
36
|
-
self.print_txn_progress =
|
|
47
|
+
self.print_txn_progress = should_print_txn_progress(config)
|
|
37
48
|
self.res = resource
|
|
38
49
|
self.txn_id = txn_id
|
|
39
50
|
self.headers = headers or {}
|
|
40
51
|
self.txn_start_time = txn_start_time or time.time()
|
|
52
|
+
self.print_internal_txn_progress = should_print_internal_txn_progress(config)
|
|
53
|
+
self.last_status: Optional[TxnStatusResponse] = None
|
|
41
54
|
|
|
42
55
|
def __enter__(self) -> ExecTxnPoller:
|
|
43
56
|
if not self.print_txn_progress:
|
|
@@ -53,17 +66,23 @@ class ExecTxnPoller:
|
|
|
53
66
|
return self
|
|
54
67
|
|
|
55
68
|
def __exit__(self, exc_type, exc_value, traceback) -> None:
|
|
56
|
-
if not self.print_txn_progress
|
|
69
|
+
if not self.print_txn_progress:
|
|
57
70
|
return
|
|
58
71
|
# Update to success message with duration
|
|
59
72
|
total_duration = time.time() - self.txn_start_time
|
|
60
73
|
txn_id = self.txn_id
|
|
61
74
|
self.progress.update_main_status(
|
|
62
|
-
query_complete_message(txn_id, total_duration)
|
|
75
|
+
query_complete_message(txn_id, total_duration, internal_txn_progress=self._get_internal_progress())
|
|
63
76
|
)
|
|
64
77
|
self.progress.__exit__(exc_type, exc_value, traceback)
|
|
65
78
|
return
|
|
66
79
|
|
|
80
|
+
def _get_internal_progress(self) -> Optional[Dict]:
|
|
81
|
+
"""Get internal transaction progress if enabled and available."""
|
|
82
|
+
if self.print_internal_txn_progress and self.last_status:
|
|
83
|
+
return self.last_status.progress
|
|
84
|
+
return None
|
|
85
|
+
|
|
67
86
|
def poll(self) -> bool:
|
|
68
87
|
"""
|
|
69
88
|
Poll for transaction completion with interactive progress display.
|
|
@@ -79,44 +98,56 @@ class ExecTxnPoller:
|
|
|
79
98
|
if self.print_txn_progress:
|
|
80
99
|
# Update the main status to include the new txn_id
|
|
81
100
|
self.progress.update_main_status_fn(
|
|
82
|
-
lambda: self.description_with_timing(txn_id),
|
|
101
|
+
lambda: self.description_with_timing(txn_id, self._get_internal_progress()),
|
|
83
102
|
)
|
|
84
103
|
|
|
85
104
|
# Don't show duration summary - we handle our own completion message
|
|
86
105
|
def check_status() -> bool:
|
|
87
106
|
"""Check if transaction is complete."""
|
|
88
|
-
|
|
89
|
-
|
|
107
|
+
if self.res is None:
|
|
108
|
+
raise ValueError("Resource must be provided for polling.")
|
|
109
|
+
self.last_status = self.res._check_exec_async_status(txn_id, headers=self.headers)
|
|
110
|
+
return self.last_status.finished
|
|
90
111
|
|
|
91
|
-
with debugging.span("wait", txn_id=
|
|
112
|
+
with debugging.span("wait", txn_id=txn_id):
|
|
92
113
|
poll_with_specified_overhead(check_status, overhead_rate=POLL_OVERHEAD_RATE)
|
|
93
114
|
|
|
94
|
-
|
|
95
115
|
return True
|
|
96
116
|
|
|
97
|
-
def description_with_timing(self, txn_id: str | None = None) -> str:
|
|
117
|
+
def description_with_timing(self, txn_id: str | None = None, internal_txn_progress: Dict | None = None) -> str:
|
|
98
118
|
elapsed = time.time() - self.txn_start_time
|
|
99
119
|
if txn_id is None:
|
|
100
120
|
return query_progress_header(elapsed)
|
|
101
121
|
else:
|
|
102
|
-
return query_progress_message(txn_id, elapsed)
|
|
122
|
+
return query_progress_message(txn_id, elapsed, internal_txn_progress)
|
|
103
123
|
|
|
104
124
|
def query_progress_header(duration: float) -> str:
|
|
105
125
|
# Don't print sub-second decimals, because it updates too fast and is distracting.
|
|
106
126
|
duration_str = format_duration(duration, seconds_decimals=False)
|
|
107
127
|
return f"Evaluating Query... {duration_str:>15}\n"
|
|
108
128
|
|
|
109
|
-
def query_progress_message(id: str, duration: float) -> str:
|
|
110
|
-
|
|
129
|
+
def query_progress_message(id: str, duration: float, internal_txn_progress: Dict | None = None) -> str:
|
|
130
|
+
result = (
|
|
111
131
|
query_progress_header(duration) +
|
|
112
132
|
# Print with whitespace to align with the end of the transaction ID
|
|
113
133
|
f"{GRAY_COLOR}ID: {id}{ENDC}"
|
|
114
134
|
)
|
|
135
|
+
if internal_txn_progress is not None:
|
|
136
|
+
result += format_execution_tree(internal_txn_progress)
|
|
137
|
+
return result
|
|
115
138
|
|
|
116
|
-
def query_complete_message(id: str, duration: float, status_header: bool = False) -> str:
|
|
117
|
-
|
|
139
|
+
def query_complete_message(id: str | None, duration: float, status_header: bool = False, internal_txn_progress: Dict | None = None) -> str:
|
|
140
|
+
out = (
|
|
118
141
|
(f"{GREEN_COLOR}✅ " if status_header else "") +
|
|
119
142
|
# Print with whitespace to align with the end of the transaction ID
|
|
120
|
-
f"Query Complete: {format_duration(duration):>21}
|
|
121
|
-
|
|
122
|
-
|
|
143
|
+
f"Query Complete: {format_duration(duration):>21}"
|
|
144
|
+
)
|
|
145
|
+
if id is None:
|
|
146
|
+
out += ENDC
|
|
147
|
+
else:
|
|
148
|
+
out += f"\n{GRAY_COLOR}ID: {id}{ENDC}"
|
|
149
|
+
|
|
150
|
+
if internal_txn_progress is not None:
|
|
151
|
+
out += format_execution_tree(internal_txn_progress)
|
|
152
|
+
|
|
153
|
+
return out
|
|
@@ -4,6 +4,7 @@ import base64
|
|
|
4
4
|
import json
|
|
5
5
|
from urllib.parse import quote, urlencode
|
|
6
6
|
import pyarrow as pa
|
|
7
|
+
import time
|
|
7
8
|
import requests
|
|
8
9
|
from email import message_from_bytes, policy
|
|
9
10
|
from email.message import EmailMessage
|
|
@@ -18,6 +19,7 @@ from .config import Config
|
|
|
18
19
|
from .types import TransactionAsyncResponse
|
|
19
20
|
from .util import get_pyrel_version
|
|
20
21
|
from ..errors import ResponseStatusException
|
|
22
|
+
from ..clients.exec_txn_poller import ExecTxnPoller
|
|
21
23
|
from .. import debugging
|
|
22
24
|
|
|
23
25
|
@dataclass
|
|
@@ -112,7 +114,7 @@ class LocalResources(ResourcesBase):
|
|
|
112
114
|
|
|
113
115
|
def reset(self):
|
|
114
116
|
raise NotImplementedError("reset not supported in local mode")
|
|
115
|
-
|
|
117
|
+
|
|
116
118
|
#--------------------------------------------------
|
|
117
119
|
# Check direct access is enabled (0 implemented)
|
|
118
120
|
#--------------------------------------------------
|
|
@@ -332,7 +334,7 @@ class LocalResources(ResourcesBase):
|
|
|
332
334
|
#--------------------------------------------------
|
|
333
335
|
# Exec Async
|
|
334
336
|
#--------------------------------------------------
|
|
335
|
-
|
|
337
|
+
|
|
336
338
|
def _parse_multipart_response(self, response: requests.Response) -> Dict[str, Any]:
|
|
337
339
|
response_map = {}
|
|
338
340
|
response_map['results'] = {}
|
|
@@ -464,11 +466,17 @@ class LocalResources(ResourcesBase):
|
|
|
464
466
|
"readonly": readonly,
|
|
465
467
|
}
|
|
466
468
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
469
|
+
txn_start_time = time.time()
|
|
470
|
+
with ExecTxnPoller(
|
|
471
|
+
self.config,
|
|
472
|
+
txn_id=None,
|
|
473
|
+
txn_start_time=txn_start_time
|
|
474
|
+
) as _poller: # unused, except for __enter__ and __exit__ display
|
|
475
|
+
parsed_response = self._create_transaction(
|
|
476
|
+
target_endpoint="create_txn",
|
|
477
|
+
payload=payload,
|
|
478
|
+
headers=headers
|
|
479
|
+
)
|
|
472
480
|
|
|
473
481
|
state = parsed_response["state"]
|
|
474
482
|
if state not in ["COMPLETED", "ABORTED"]:
|
{relationalai-0.13.3 → relationalai-0.13.5}/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, PrimaryKey
|
|
5
|
+
from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext, PrimaryKey
|
|
6
6
|
from .engine_service import EngineType, INTERNAL_ENGINE_SIZES, ENGINE_SIZES_AWS, ENGINE_SIZES_AZURE
|
|
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', 'EngineType',
|
|
16
16
|
'INTERNAL_ENGINE_SIZES', 'ENGINE_SIZES_AWS', 'ENGINE_SIZES_AZURE', 'PrimaryKey',
|
|
17
|
-
'
|
|
17
|
+
'create_resources_instance',
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
|
|
@@ -18,7 +18,7 @@ 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
|
+
from .snowflake import TxnCreationResult, TxnStatusResponse
|
|
22
22
|
|
|
23
23
|
# Import helper functions from util
|
|
24
24
|
from .util import is_engine_issue as _is_engine_issue, is_database_issue as _is_database_issue, collect_error_messages
|
|
@@ -314,7 +314,7 @@ class DirectAccessResources(UseIndexResources):
|
|
|
314
314
|
|
|
315
315
|
return response.json()
|
|
316
316
|
|
|
317
|
-
def _check_exec_async_status(self, txn_id: str, headers: Dict[str, str] | None = None) ->
|
|
317
|
+
def _check_exec_async_status(self, txn_id: str, headers: Dict[str, str] | None = None) -> TxnStatusResponse:
|
|
318
318
|
"""Check whether the given transaction has completed."""
|
|
319
319
|
|
|
320
320
|
with debugging.span("check_status"):
|
|
@@ -349,8 +349,12 @@ class DirectAccessResources(UseIndexResources):
|
|
|
349
349
|
elif reason == TXN_ABORT_REASON_GUARD_RAILS:
|
|
350
350
|
raise GuardRailsException(response_content.get("progress", {}))
|
|
351
351
|
|
|
352
|
-
|
|
353
|
-
|
|
352
|
+
return TxnStatusResponse(
|
|
353
|
+
txn_id=txn_id,
|
|
354
|
+
finished=status in ["COMPLETED", "ABORTED"],
|
|
355
|
+
abort_reason=response_content.get("abort_reason", None),
|
|
356
|
+
progress=response_content.get("progress", None),
|
|
357
|
+
)
|
|
354
358
|
|
|
355
359
|
def _list_exec_async_artifacts(self, txn_id: str, headers: Dict[str, str] | None = None) -> Dict[str, Dict]:
|
|
356
360
|
"""Grab the list of artifacts produced in the transaction and the URLs to retrieve their contents."""
|
|
@@ -15,7 +15,7 @@ import hashlib
|
|
|
15
15
|
from dataclasses import dataclass
|
|
16
16
|
|
|
17
17
|
from ....auth.token_handler import TokenHandler
|
|
18
|
-
from
|
|
18
|
+
from ....clients.exec_txn_poller import ExecTxnPoller
|
|
19
19
|
import snowflake.snowpark
|
|
20
20
|
|
|
21
21
|
from ....rel_utils import sanitize_identifier, to_fqn_relation_name
|
|
@@ -104,14 +104,16 @@ TERMINAL_TXN_STATES = ["COMPLETED", "ABORTED"]
|
|
|
104
104
|
TXN_ABORT_REASON_TIMEOUT = "transaction timeout"
|
|
105
105
|
GUARDRAILS_ABORT_REASON = "guard rail violation"
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
ENABLE_GUARD_RAILS_FLAG = "enable_guard_rails"
|
|
108
|
+
|
|
109
|
+
ENABLE_GUARD_RAILS_HEADER = "X-RAI-Enable-Guard-Rails"
|
|
108
110
|
|
|
109
111
|
#--------------------------------------------------
|
|
110
112
|
# Helpers
|
|
111
113
|
#--------------------------------------------------
|
|
112
114
|
|
|
113
|
-
def
|
|
114
|
-
return bool(config.get(
|
|
115
|
+
def should_enable_guard_rails(config) -> bool:
|
|
116
|
+
return bool(config.get(ENABLE_GUARD_RAILS_FLAG, False))
|
|
115
117
|
|
|
116
118
|
#--------------------------------------------------
|
|
117
119
|
# Resources
|
|
@@ -151,6 +153,14 @@ class TxnCreationResult:
|
|
|
151
153
|
artifact_info: Dict[str, Dict] # Populated if fast-path (state is COMPLETED/ABORTED)
|
|
152
154
|
|
|
153
155
|
|
|
156
|
+
@dataclass
|
|
157
|
+
class TxnStatusResponse:
|
|
158
|
+
"""Transaction progress response for transaction status checks."""
|
|
159
|
+
txn_id: str
|
|
160
|
+
finished: bool
|
|
161
|
+
abort_reason: str | None = None
|
|
162
|
+
progress: Dict | None = None
|
|
163
|
+
|
|
154
164
|
class Resources(ResourcesBase):
|
|
155
165
|
def __init__(
|
|
156
166
|
self,
|
|
@@ -1403,7 +1413,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1403
1413
|
# Exec Async
|
|
1404
1414
|
#--------------------------------------------------
|
|
1405
1415
|
|
|
1406
|
-
def _check_exec_async_status(self, txn_id: str, headers: Dict | None = None):
|
|
1416
|
+
def _check_exec_async_status(self, txn_id: str, headers: Dict | None = None) -> TxnStatusResponse:
|
|
1407
1417
|
"""Check whether the given transaction has completed."""
|
|
1408
1418
|
if headers is None:
|
|
1409
1419
|
headers = {}
|
|
@@ -1433,8 +1443,11 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1433
1443
|
elif response_row.get("ABORT_REASON", "") == GUARDRAILS_ABORT_REASON:
|
|
1434
1444
|
raise GuardRailsException()
|
|
1435
1445
|
|
|
1436
|
-
|
|
1437
|
-
|
|
1446
|
+
return TxnStatusResponse(
|
|
1447
|
+
txn_id=txn_id,
|
|
1448
|
+
finished=status in ["COMPLETED", "ABORTED"],
|
|
1449
|
+
abort_reason=response_row.get("ABORT_REASON", None),
|
|
1450
|
+
)
|
|
1438
1451
|
|
|
1439
1452
|
|
|
1440
1453
|
def _list_exec_async_artifacts(self, txn_id: str, headers: Dict | None = None) -> Dict[str, Dict]:
|
|
@@ -1788,10 +1801,8 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1788
1801
|
|
|
1789
1802
|
with debugging.span("transaction", **query_attrs_dict) as txn_span:
|
|
1790
1803
|
txn_start_time = time.time()
|
|
1791
|
-
print_txn_progress = should_print_txn_progress(self.config)
|
|
1792
|
-
|
|
1793
1804
|
with ExecTxnPoller(
|
|
1794
|
-
|
|
1805
|
+
config=self.config,
|
|
1795
1806
|
resource=self, txn_id=None, headers=request_headers,
|
|
1796
1807
|
txn_start_time=txn_start_time
|
|
1797
1808
|
) as poller:
|
|
@@ -1800,6 +1811,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
|
|
|
1800
1811
|
request_headers['user-agent'] = get_pyrel_version(self.generation)
|
|
1801
1812
|
request_headers['gi_setup_skipped'] = str(gi_setup_skipped)
|
|
1802
1813
|
request_headers['pyrel_program_id'] = debugging.get_program_span_id() or ""
|
|
1814
|
+
request_headers[ENABLE_GUARD_RAILS_HEADER] = str(should_enable_guard_rails(self.config))
|
|
1803
1815
|
|
|
1804
1816
|
# Create the transaction
|
|
1805
1817
|
result = self._create_v2_txn(
|
|
@@ -66,7 +66,7 @@ ERP_CHECK_FREQUENCY = 15
|
|
|
66
66
|
|
|
67
67
|
# Polling behavior constants
|
|
68
68
|
POLL_OVERHEAD_RATE = 0.1 # Overhead rate for exponential backoff
|
|
69
|
-
POLL_MAX_DELAY =
|
|
69
|
+
POLL_MAX_DELAY = 0 # Maximum delay between polls in seconds
|
|
70
70
|
|
|
71
71
|
# SQL query template for getting stream column hashes
|
|
72
72
|
# This query calculates a hash of column metadata (name, type, precision, scale, nullable)
|
|
@@ -533,6 +533,14 @@ class Solver:
|
|
|
533
533
|
self.engine_size = engine_size or settings.pop("engine_size", None)
|
|
534
534
|
self.engine_auto_suspend_mins = auto_suspend_mins or settings.pop("auto_suspend_mins", None)
|
|
535
535
|
|
|
536
|
+
# Set default CSV store setting if not already configured
|
|
537
|
+
if "store" not in settings:
|
|
538
|
+
settings["store"] = {}
|
|
539
|
+
if "csv" not in settings["store"]:
|
|
540
|
+
settings["store"]["csv"] = {}
|
|
541
|
+
if "enabled" not in settings["store"]["csv"]:
|
|
542
|
+
settings["store"]["csv"]["enabled"] = True
|
|
543
|
+
|
|
536
544
|
# The settings are used when creating a solver engine, they
|
|
537
545
|
# may configure each individual solver.
|
|
538
546
|
self.engine_settings = settings
|
{relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/snowflake.py
RENAMED
|
@@ -214,6 +214,7 @@ class Table():
|
|
|
214
214
|
self._col_names = cols
|
|
215
215
|
self._iceberg_config = config
|
|
216
216
|
self._is_iceberg = config is not None
|
|
217
|
+
self._skip_cdc = False
|
|
217
218
|
info = self._schemas.get((self._database, self._schema))
|
|
218
219
|
if not info:
|
|
219
220
|
info = self._schemas[(self._database, self._schema)] = SchemaInfo(self._database, self._schema)
|
|
@@ -303,7 +304,10 @@ class Table():
|
|
|
303
304
|
|
|
304
305
|
def _compile_lookup(self, compiler:b.Compiler, ctx:b.CompilerContext):
|
|
305
306
|
self._lazy_init()
|
|
306
|
-
|
|
307
|
+
if not self._skip_cdc:
|
|
308
|
+
# Don't do CDC if the underlying data has been loaded
|
|
309
|
+
# directly via `api.load_data`.
|
|
310
|
+
Table._used_sources.add(self)
|
|
307
311
|
compiler.lookup(self._rel, ctx)
|
|
308
312
|
return compiler.lookup(b.RelationshipFieldRef(None, self._rel, 0), ctx)
|
|
309
313
|
|
|
@@ -10,8 +10,9 @@ from snowflake.snowpark import Session
|
|
|
10
10
|
|
|
11
11
|
from relationalai import debugging
|
|
12
12
|
from relationalai.errors import NonDefaultLQPSemanticsVersionWarning
|
|
13
|
-
from relationalai.semantics.lqp import result_helpers
|
|
13
|
+
from relationalai.semantics.lqp import result_helpers, export_rewriter
|
|
14
14
|
from relationalai.semantics.metamodel import ir, factory as f, executor as e
|
|
15
|
+
from relationalai.semantics.metamodel.visitor import collect_by_type
|
|
15
16
|
|
|
16
17
|
if TYPE_CHECKING:
|
|
17
18
|
from relationalai.semantics.internal.internal import Model as InternalModel
|
|
@@ -368,7 +369,7 @@ class LQPExecutor(e.Executor):
|
|
|
368
369
|
meta=None,
|
|
369
370
|
)
|
|
370
371
|
|
|
371
|
-
def compile_lqp(self, model: ir.Model, task: ir.Task):
|
|
372
|
+
def compile_lqp(self, model: ir.Model, task: ir.Task, format: Optional[Literal["pandas", "snowpark", "csv"]] = "pandas"):
|
|
372
373
|
configure = self._construct_configure()
|
|
373
374
|
# Merge the epochs into a single transaction. Long term the query bits should all
|
|
374
375
|
# go into a WhatIf action and the intrinsics could be fused with either of them. But
|
|
@@ -394,6 +395,21 @@ class LQPExecutor(e.Executor):
|
|
|
394
395
|
result, final_model = self.compiler.compile_inner(query, options)
|
|
395
396
|
export_info, query_epoch = result
|
|
396
397
|
|
|
398
|
+
if format == "csv":
|
|
399
|
+
# Extract original column names from Output
|
|
400
|
+
outputs = collect_by_type(ir.Output, task)
|
|
401
|
+
assert outputs, "No Output found in the task"
|
|
402
|
+
assert len(outputs) == 1, "Multiple Outputs found in the task"
|
|
403
|
+
output = outputs[0]
|
|
404
|
+
original_cols = []
|
|
405
|
+
for alias, _ in output.aliases:
|
|
406
|
+
if not alias:
|
|
407
|
+
continue
|
|
408
|
+
original_cols.append(alias)
|
|
409
|
+
# Use rewriter to filter data_columns
|
|
410
|
+
column_filter = export_rewriter.ExtraColumnsFilter(original_cols)
|
|
411
|
+
query_epoch = column_filter.filter_epoch(query_epoch)
|
|
412
|
+
|
|
397
413
|
epochs.append(query_epoch)
|
|
398
414
|
epochs.append(self._compile_undefine_query(query_epoch))
|
|
399
415
|
|
|
@@ -417,8 +433,7 @@ class LQPExecutor(e.Executor):
|
|
|
417
433
|
) -> DataFrame:
|
|
418
434
|
self.prepare_data()
|
|
419
435
|
previous_model = self._last_model
|
|
420
|
-
|
|
421
|
-
final_model, export_info, txn_proto = self.compile_lqp(model, task)
|
|
436
|
+
final_model, export_info, txn_proto = self.compile_lqp(model, task, format=format)
|
|
422
437
|
|
|
423
438
|
if self.dry_run:
|
|
424
439
|
return DataFrame()
|
|
@@ -440,11 +455,13 @@ class LQPExecutor(e.Executor):
|
|
|
440
455
|
nowait_durable=True,
|
|
441
456
|
headers=headers,
|
|
442
457
|
)
|
|
443
|
-
assert isinstance(raw_results, TransactionAsyncResponse)
|
|
458
|
+
assert isinstance(raw_results, TransactionAsyncResponse), "Expected TransactionAsyncResponse from LQP execution"
|
|
459
|
+
assert raw_results.transaction is not None, "Transaction result is missing"
|
|
460
|
+
txid = raw_results.transaction['id']
|
|
444
461
|
|
|
445
462
|
try:
|
|
446
|
-
cols, extra_cols = self._compute_cols(task, final_model)
|
|
447
|
-
df, errs = result_helpers.format_results(raw_results, cols)
|
|
463
|
+
cols, extra_cols, key_locs = self._compute_cols(task, final_model)
|
|
464
|
+
df, errs = result_helpers.format_results(raw_results, cols, key_locs)
|
|
448
465
|
self.report_errors(errs)
|
|
449
466
|
|
|
450
467
|
# Rename columns if wide outputs is enabled
|
|
@@ -453,7 +470,6 @@ class LQPExecutor(e.Executor):
|
|
|
453
470
|
|
|
454
471
|
if export_to:
|
|
455
472
|
assert cols, "No columns found in the output"
|
|
456
|
-
assert raw_results.transaction, "Invalid transaction result"
|
|
457
473
|
assert export_info, "Export info should be populated if we are exporting results"
|
|
458
474
|
result_cols = export_to._col_names
|
|
459
475
|
if result_cols is not None:
|
|
@@ -461,14 +477,18 @@ class LQPExecutor(e.Executor):
|
|
|
461
477
|
else:
|
|
462
478
|
result_cols = [col for col in cols if col not in extra_cols]
|
|
463
479
|
assert result_cols
|
|
464
|
-
self._export(
|
|
480
|
+
self._export(txid, export_info, export_to, cols, result_cols, update)
|
|
465
481
|
|
|
466
482
|
if format == "csv":
|
|
467
483
|
if export_info is not None and isinstance(export_info, tuple) and isinstance(export_info[0], str):
|
|
468
|
-
|
|
484
|
+
# The full CSV path has two parts. The first part is chosen by the frontend, while
|
|
485
|
+
# the second part is chosen by the backend to avoid collisions. We need to ensure
|
|
486
|
+
# the second part is synchronized with the future changes in the backend.
|
|
487
|
+
full_path = export_info[0] + f"/data_{txid}.gz"
|
|
488
|
+
return DataFrame([full_path], columns=["path"])
|
|
469
489
|
else:
|
|
470
490
|
raise ValueError("The CSV export was not successful!")
|
|
471
|
-
|
|
491
|
+
|
|
472
492
|
return self._postprocess_df(self.config, df, extra_cols)
|
|
473
493
|
|
|
474
494
|
except Exception as e:
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#----------------------------------------------------------------------------------------------
|
|
2
|
+
# This is a custom LQP rewriter that filters extra columns from CSV export. It is used in the
|
|
3
|
+
# LQP executor, when the format="csv", to ensure only intended columns are being exported.
|
|
4
|
+
#----------------------------------------------------------------------------------------------
|
|
5
|
+
|
|
6
|
+
from dataclasses import replace
|
|
7
|
+
from lqp import ir as lqp_ir
|
|
8
|
+
|
|
9
|
+
class ExtraColumnsFilter:
|
|
10
|
+
|
|
11
|
+
def __init__(self, original_cols: list[str]):
|
|
12
|
+
self.original_cols = set(original_cols)
|
|
13
|
+
|
|
14
|
+
def filter_epoch(self, query_epoch: lqp_ir.Epoch) -> lqp_ir.Epoch:
|
|
15
|
+
|
|
16
|
+
# Only process epochs with a single read which is dedicated to Export
|
|
17
|
+
if not (query_epoch.reads and len(query_epoch.reads) == 1):
|
|
18
|
+
return query_epoch
|
|
19
|
+
|
|
20
|
+
old_read = query_epoch.reads[0]
|
|
21
|
+
if not isinstance(old_read.read_type, lqp_ir.Export):
|
|
22
|
+
return query_epoch
|
|
23
|
+
|
|
24
|
+
config = old_read.read_type.config
|
|
25
|
+
assert isinstance(config, lqp_ir.ExportCSVConfig) and config.data_columns is not None, \
|
|
26
|
+
"Expected ExportCSVConfig with data_columns in the read type"
|
|
27
|
+
|
|
28
|
+
data_columns = config.data_columns
|
|
29
|
+
|
|
30
|
+
# Filter data_columns to only include columns in original_cols
|
|
31
|
+
new_data_columns = [col for col in data_columns if col.column_name in self.original_cols]
|
|
32
|
+
|
|
33
|
+
# Reconstruct the nested structure with filtered data_columns
|
|
34
|
+
new_config = replace(old_read.read_type.config, data_columns=new_data_columns)
|
|
35
|
+
new_read_type = replace(old_read.read_type, config=new_config)
|
|
36
|
+
new_read = replace(old_read, read_type=new_read_type)
|
|
37
|
+
|
|
38
|
+
# Return new epoch with updated read
|
|
39
|
+
remaining_reads = list(query_epoch.reads[1:])
|
|
40
|
+
return replace(query_epoch, reads=[new_read] + remaining_reads)
|
|
@@ -126,34 +126,43 @@ def _translate_to_decls(ctx: TranslationCtx, rule: ir.Logical) -> list[lqp.Decla
|
|
|
126
126
|
def _translate_to_constraint_decls(ctx: TranslationCtx, rule: ir.Logical) -> list[lqp.Declaration]:
|
|
127
127
|
constraint_decls: list[lqp.Declaration] = []
|
|
128
128
|
for task in rule.body:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
assert fd is not None
|
|
132
|
-
|
|
133
|
-
# check for unresolved types
|
|
134
|
-
if any(types.is_any(var.type) for var in fd.keys + fd.values):
|
|
135
|
-
warn(f"Ignoring FD with unresolved type: {fd}")
|
|
129
|
+
if isinstance(task, ir.Logical):
|
|
130
|
+
constraint_decls.extend(_translate_to_constraint_decls(ctx, task))
|
|
136
131
|
continue
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
lqp_guard = mk_abstraction(lqp_typed_vars, mk_and(lqp_guard_atoms))
|
|
143
|
-
lqp_keys:list[lqp.Var] = [var for (var, _) in lqp_typed_keys] # type: ignore
|
|
144
|
-
lqp_values:list[lqp.Var] = [var for (var, _) in lqp_typed_values] # type: ignore
|
|
145
|
-
|
|
146
|
-
fd_decl = lqp.FunctionalDependency(
|
|
147
|
-
guard=lqp_guard,
|
|
148
|
-
keys=lqp_keys,
|
|
149
|
-
values=lqp_values,
|
|
150
|
-
meta=None
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
constraint_decls.append(fd_decl)
|
|
154
|
-
|
|
132
|
+
else:
|
|
133
|
+
assert isinstance(task, ir.Require)
|
|
134
|
+
decl = _translate_to_constraint_decl(ctx, task)
|
|
135
|
+
if decl is not None:
|
|
136
|
+
constraint_decls.append(decl)
|
|
155
137
|
return constraint_decls
|
|
156
138
|
|
|
139
|
+
def _translate_to_constraint_decl(ctx: TranslationCtx, rule: ir.Require) -> Optional[lqp.Declaration]:
|
|
140
|
+
fd = normalized_fd(rule)
|
|
141
|
+
assert fd is not None
|
|
142
|
+
|
|
143
|
+
# check for unresolved types
|
|
144
|
+
if any(types.is_any(var.type) for var in fd.keys + fd.values):
|
|
145
|
+
warn(f"Ignoring FD with unresolved type: {fd}")
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
lqp_typed_keys = [_translate_term(ctx, key) for key in fd.keys]
|
|
149
|
+
lqp_typed_values = [_translate_term(ctx, value) for value in fd.values]
|
|
150
|
+
lqp_typed_vars:list[Tuple[lqp.Var, lqp.Type]] = lqp_typed_keys + lqp_typed_values # type: ignore
|
|
151
|
+
lqp_guard_atoms = [_translate_to_atom(ctx, atom) for atom in fd.guard]
|
|
152
|
+
lqp_guard = mk_abstraction(lqp_typed_vars, mk_and(lqp_guard_atoms))
|
|
153
|
+
lqp_keys:list[lqp.Var] = [var for (var, _) in lqp_typed_keys] # type: ignore
|
|
154
|
+
lqp_values:list[lqp.Var] = [var for (var, _) in lqp_typed_values] # type: ignore
|
|
155
|
+
lqp_id = utils.lqp_hash(fd.canonical_str)
|
|
156
|
+
lqp_name:lqp.RelationId = lqp.RelationId(id=lqp_id, meta=None)
|
|
157
|
+
|
|
158
|
+
return lqp.FunctionalDependency(
|
|
159
|
+
name=lqp_name,
|
|
160
|
+
guard=lqp_guard,
|
|
161
|
+
keys=lqp_keys,
|
|
162
|
+
values=lqp_values,
|
|
163
|
+
meta=None
|
|
164
|
+
)
|
|
165
|
+
|
|
157
166
|
def _translate_algorithms(ctx: TranslationCtx, task: ir.Logical) -> list[lqp.Declaration]:
|
|
158
167
|
assert is_algorithm_logical(task)
|
|
159
168
|
decls: list[lqp.Declaration] = []
|