relationalai 0.13.0.dev0__py3-none-any.whl → 0.13.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frontend/debugger/dist/.gitignore +2 -0
- frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- frontend/debugger/dist/assets/index-Cssla-O7.js +208 -0
- frontend/debugger/dist/assets/index-DlHsYx1V.css +9 -0
- frontend/debugger/dist/index.html +17 -0
- relationalai/__init__.py +256 -1
- relationalai/clients/__init__.py +18 -0
- relationalai/clients/client.py +947 -0
- relationalai/clients/config.py +673 -0
- relationalai/clients/direct_access_client.py +118 -0
- relationalai/clients/exec_txn_poller.py +91 -0
- relationalai/clients/hash_util.py +31 -0
- relationalai/clients/local.py +586 -0
- relationalai/clients/profile_polling.py +73 -0
- relationalai/clients/resources/__init__.py +8 -0
- relationalai/clients/resources/azure/azure.py +502 -0
- relationalai/clients/resources/snowflake/__init__.py +20 -0
- relationalai/clients/resources/snowflake/cli_resources.py +98 -0
- relationalai/clients/resources/snowflake/direct_access_resources.py +734 -0
- relationalai/clients/resources/snowflake/engine_service.py +381 -0
- relationalai/clients/resources/snowflake/engine_state_handlers.py +315 -0
- relationalai/clients/resources/snowflake/error_handlers.py +240 -0
- relationalai/clients/resources/snowflake/export_procedure.py.jinja +249 -0
- relationalai/clients/resources/snowflake/resources_factory.py +99 -0
- relationalai/clients/resources/snowflake/snowflake.py +3185 -0
- relationalai/clients/resources/snowflake/use_index_poller.py +1019 -0
- relationalai/clients/resources/snowflake/use_index_resources.py +188 -0
- relationalai/clients/resources/snowflake/util.py +387 -0
- relationalai/clients/result_helpers.py +420 -0
- relationalai/clients/types.py +118 -0
- relationalai/clients/util.py +356 -0
- relationalai/debugging.py +389 -0
- relationalai/dsl.py +1749 -0
- relationalai/early_access/builder/__init__.py +30 -0
- relationalai/early_access/builder/builder/__init__.py +35 -0
- relationalai/early_access/builder/snowflake/__init__.py +12 -0
- relationalai/early_access/builder/std/__init__.py +25 -0
- relationalai/early_access/builder/std/decimals/__init__.py +12 -0
- relationalai/early_access/builder/std/integers/__init__.py +12 -0
- relationalai/early_access/builder/std/math/__init__.py +12 -0
- relationalai/early_access/builder/std/strings/__init__.py +14 -0
- relationalai/early_access/devtools/__init__.py +12 -0
- relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
- relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
- relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
- relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
- relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
- relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
- relationalai/early_access/dsl/bindings/common.py +402 -0
- relationalai/early_access/dsl/bindings/csv.py +170 -0
- relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
- relationalai/early_access/dsl/bindings/snowflake.py +64 -0
- relationalai/early_access/dsl/codegen/binder.py +411 -0
- relationalai/early_access/dsl/codegen/common.py +79 -0
- relationalai/early_access/dsl/codegen/helpers.py +23 -0
- relationalai/early_access/dsl/codegen/relations.py +700 -0
- relationalai/early_access/dsl/codegen/weaver.py +417 -0
- relationalai/early_access/dsl/core/builders/__init__.py +47 -0
- relationalai/early_access/dsl/core/builders/logic.py +19 -0
- relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
- relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
- relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
- relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
- relationalai/early_access/dsl/core/context.py +13 -0
- relationalai/early_access/dsl/core/cset.py +132 -0
- relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
- relationalai/early_access/dsl/core/exprs/relational.py +18 -0
- relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
- relationalai/early_access/dsl/core/instances.py +44 -0
- relationalai/early_access/dsl/core/logic/__init__.py +193 -0
- relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
- relationalai/early_access/dsl/core/logic/exists.py +223 -0
- relationalai/early_access/dsl/core/logic/helper.py +163 -0
- relationalai/early_access/dsl/core/namespaces.py +32 -0
- relationalai/early_access/dsl/core/relations.py +276 -0
- relationalai/early_access/dsl/core/rules.py +112 -0
- relationalai/early_access/dsl/core/std/__init__.py +45 -0
- relationalai/early_access/dsl/core/temporal/recall.py +6 -0
- relationalai/early_access/dsl/core/types/__init__.py +270 -0
- relationalai/early_access/dsl/core/types/concepts.py +128 -0
- relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
- relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
- relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
- relationalai/early_access/dsl/core/types/standard.py +92 -0
- relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
- relationalai/early_access/dsl/core/types/variables.py +203 -0
- relationalai/early_access/dsl/ir/compiler.py +318 -0
- relationalai/early_access/dsl/ir/executor.py +260 -0
- relationalai/early_access/dsl/ontologies/constraints.py +88 -0
- relationalai/early_access/dsl/ontologies/export.py +30 -0
- relationalai/early_access/dsl/ontologies/models.py +453 -0
- relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
- relationalai/early_access/dsl/ontologies/readings.py +60 -0
- relationalai/early_access/dsl/ontologies/relationships.py +322 -0
- relationalai/early_access/dsl/ontologies/roles.py +87 -0
- relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
- relationalai/early_access/dsl/orm/constraints.py +438 -0
- relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
- relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
- relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
- relationalai/early_access/dsl/orm/measures/measures.py +299 -0
- relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
- relationalai/early_access/dsl/orm/models.py +256 -0
- relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
- relationalai/early_access/dsl/orm/printer.py +469 -0
- relationalai/early_access/dsl/orm/reasoners.py +480 -0
- relationalai/early_access/dsl/orm/relations.py +19 -0
- relationalai/early_access/dsl/orm/relationships.py +251 -0
- relationalai/early_access/dsl/orm/types.py +42 -0
- relationalai/early_access/dsl/orm/utils.py +79 -0
- relationalai/early_access/dsl/orm/verb.py +204 -0
- relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
- relationalai/early_access/dsl/relations.py +170 -0
- relationalai/early_access/dsl/rulesets.py +69 -0
- relationalai/early_access/dsl/schemas/__init__.py +450 -0
- relationalai/early_access/dsl/schemas/builder.py +48 -0
- relationalai/early_access/dsl/schemas/comp_names.py +51 -0
- relationalai/early_access/dsl/schemas/components.py +203 -0
- relationalai/early_access/dsl/schemas/contexts.py +156 -0
- relationalai/early_access/dsl/schemas/exprs.py +89 -0
- relationalai/early_access/dsl/schemas/fragments.py +464 -0
- relationalai/early_access/dsl/serialization.py +79 -0
- relationalai/early_access/dsl/serialize/exporter.py +163 -0
- relationalai/early_access/dsl/snow/api.py +105 -0
- relationalai/early_access/dsl/snow/common.py +76 -0
- relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
- relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
- relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
- relationalai/early_access/dsl/types/__init__.py +40 -0
- relationalai/early_access/dsl/types/concepts.py +12 -0
- relationalai/early_access/dsl/types/entities.py +135 -0
- relationalai/early_access/dsl/types/values.py +17 -0
- relationalai/early_access/dsl/utils.py +102 -0
- relationalai/early_access/graphs/__init__.py +13 -0
- relationalai/early_access/lqp/__init__.py +12 -0
- relationalai/early_access/lqp/compiler/__init__.py +12 -0
- relationalai/early_access/lqp/constructors/__init__.py +18 -0
- relationalai/early_access/lqp/executor/__init__.py +12 -0
- relationalai/early_access/lqp/ir/__init__.py +12 -0
- relationalai/early_access/lqp/passes/__init__.py +12 -0
- relationalai/early_access/lqp/pragmas/__init__.py +12 -0
- relationalai/early_access/lqp/primitives/__init__.py +12 -0
- relationalai/early_access/lqp/types/__init__.py +12 -0
- relationalai/early_access/lqp/utils/__init__.py +12 -0
- relationalai/early_access/lqp/validators/__init__.py +12 -0
- relationalai/early_access/metamodel/__init__.py +58 -0
- relationalai/early_access/metamodel/builtins/__init__.py +12 -0
- relationalai/early_access/metamodel/compiler/__init__.py +12 -0
- relationalai/early_access/metamodel/dependency/__init__.py +12 -0
- relationalai/early_access/metamodel/factory/__init__.py +17 -0
- relationalai/early_access/metamodel/helpers/__init__.py +12 -0
- relationalai/early_access/metamodel/ir/__init__.py +14 -0
- relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
- relationalai/early_access/metamodel/typer/__init__.py +3 -0
- relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
- relationalai/early_access/metamodel/types/__init__.py +15 -0
- relationalai/early_access/metamodel/util/__init__.py +15 -0
- relationalai/early_access/metamodel/visitor/__init__.py +12 -0
- relationalai/early_access/rel/__init__.py +12 -0
- relationalai/early_access/rel/executor/__init__.py +12 -0
- relationalai/early_access/rel/rel_utils/__init__.py +12 -0
- relationalai/early_access/rel/rewrite/__init__.py +7 -0
- relationalai/early_access/solvers/__init__.py +19 -0
- relationalai/early_access/sql/__init__.py +11 -0
- relationalai/early_access/sql/executor/__init__.py +3 -0
- relationalai/early_access/sql/rewrite/__init__.py +3 -0
- relationalai/early_access/tests/logging/__init__.py +12 -0
- relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
- relationalai/early_access/tests/utils/__init__.py +12 -0
- relationalai/environments/__init__.py +35 -0
- relationalai/environments/base.py +381 -0
- relationalai/environments/colab.py +14 -0
- relationalai/environments/generic.py +71 -0
- relationalai/environments/ipython.py +68 -0
- relationalai/environments/jupyter.py +9 -0
- relationalai/environments/snowbook.py +169 -0
- relationalai/errors.py +2496 -0
- relationalai/experimental/SF.py +38 -0
- relationalai/experimental/inspect.py +47 -0
- relationalai/experimental/pathfinder/__init__.py +158 -0
- relationalai/experimental/pathfinder/api.py +160 -0
- relationalai/experimental/pathfinder/automaton.py +584 -0
- relationalai/experimental/pathfinder/bridge.py +226 -0
- relationalai/experimental/pathfinder/compiler.py +416 -0
- relationalai/experimental/pathfinder/datalog.py +214 -0
- relationalai/experimental/pathfinder/diagnostics.py +56 -0
- relationalai/experimental/pathfinder/filter.py +236 -0
- relationalai/experimental/pathfinder/glushkov.py +439 -0
- relationalai/experimental/pathfinder/options.py +265 -0
- relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +1951 -0
- relationalai/experimental/pathfinder/rpq.py +344 -0
- relationalai/experimental/pathfinder/transition.py +200 -0
- relationalai/experimental/pathfinder/utils.py +26 -0
- relationalai/experimental/paths/README.md +107 -0
- relationalai/experimental/paths/api.py +143 -0
- relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
- relationalai/experimental/paths/code_organization.md +2 -0
- relationalai/experimental/paths/examples/Movies.ipynb +16328 -0
- relationalai/experimental/paths/examples/basic_example.py +40 -0
- relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
- relationalai/experimental/paths/examples/movie_example.py +77 -0
- relationalai/experimental/paths/examples/movies_data/actedin.csv +193 -0
- relationalai/experimental/paths/examples/movies_data/directed.csv +45 -0
- relationalai/experimental/paths/examples/movies_data/follows.csv +7 -0
- relationalai/experimental/paths/examples/movies_data/movies.csv +39 -0
- relationalai/experimental/paths/examples/movies_data/person.csv +134 -0
- relationalai/experimental/paths/examples/movies_data/produced.csv +16 -0
- relationalai/experimental/paths/examples/movies_data/ratings.csv +10 -0
- relationalai/experimental/paths/examples/movies_data/wrote.csv +11 -0
- relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
- relationalai/experimental/paths/examples/paths_example.py +116 -0
- relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
- relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
- relationalai/experimental/paths/graph.py +185 -0
- relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
- relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
- relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
- relationalai/experimental/paths/path_algorithms/single.py +59 -0
- relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
- relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
- relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
- relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
- relationalai/experimental/paths/path_algorithms/usp.py +150 -0
- relationalai/experimental/paths/product_graph.py +93 -0
- relationalai/experimental/paths/rpq/automaton.py +584 -0
- relationalai/experimental/paths/rpq/diagnostics.py +56 -0
- relationalai/experimental/paths/rpq/rpq.py +378 -0
- relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
- relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
- relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
- relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
- relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
- relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
- relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
- relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
- relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
- relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
- relationalai/experimental/paths/tree_agg.py +168 -0
- relationalai/experimental/paths/utilities/iterators.py +27 -0
- relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
- relationalai/experimental/solvers.py +1087 -0
- relationalai/loaders/csv.py +195 -0
- relationalai/loaders/loader.py +177 -0
- relationalai/loaders/types.py +23 -0
- relationalai/rel_emitter.py +373 -0
- relationalai/rel_utils.py +185 -0
- relationalai/semantics/__init__.py +22 -146
- relationalai/semantics/designs/query_builder/identify_by.md +106 -0
- relationalai/semantics/devtools/benchmark_lqp.py +535 -0
- relationalai/semantics/devtools/compilation_manager.py +294 -0
- relationalai/semantics/devtools/extract_lqp.py +110 -0
- relationalai/semantics/internal/internal.py +3785 -0
- relationalai/semantics/internal/snowflake.py +325 -0
- relationalai/semantics/lqp/README.md +34 -0
- relationalai/semantics/lqp/builtins.py +16 -0
- relationalai/semantics/lqp/compiler.py +22 -0
- relationalai/semantics/lqp/constructors.py +68 -0
- relationalai/semantics/lqp/executor.py +469 -0
- relationalai/semantics/lqp/intrinsics.py +24 -0
- relationalai/semantics/lqp/model2lqp.py +877 -0
- relationalai/semantics/lqp/passes.py +680 -0
- relationalai/semantics/lqp/primitives.py +252 -0
- relationalai/semantics/lqp/result_helpers.py +202 -0
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
- relationalai/semantics/lqp/rewrite/cdc.py +216 -0
- relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
- relationalai/semantics/lqp/rewrite/extract_keys.py +512 -0
- relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
- relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
- relationalai/semantics/lqp/rewrite/splinter.py +76 -0
- relationalai/semantics/lqp/types.py +101 -0
- relationalai/semantics/lqp/utils.py +160 -0
- relationalai/semantics/lqp/validators.py +57 -0
- relationalai/semantics/metamodel/__init__.py +40 -6
- relationalai/semantics/metamodel/builtins.py +771 -205
- relationalai/semantics/metamodel/compiler.py +133 -0
- relationalai/semantics/metamodel/dependency.py +862 -0
- relationalai/semantics/metamodel/executor.py +61 -0
- relationalai/semantics/metamodel/factory.py +287 -0
- relationalai/semantics/metamodel/helpers.py +361 -0
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
- relationalai/semantics/metamodel/rewrite/flatten.py +554 -0
- relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
- relationalai/semantics/metamodel/typer/checker.py +353 -0
- relationalai/semantics/metamodel/typer/typer.py +1399 -0
- relationalai/semantics/metamodel/util.py +506 -0
- relationalai/semantics/reasoners/__init__.py +10 -0
- relationalai/semantics/reasoners/graph/README.md +620 -0
- relationalai/semantics/reasoners/graph/__init__.py +37 -0
- relationalai/semantics/reasoners/graph/core.py +9019 -0
- relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +797 -0
- relationalai/semantics/reasoners/graph/tests/README.md +21 -0
- relationalai/semantics/reasoners/optimization/__init__.py +68 -0
- relationalai/semantics/reasoners/optimization/common.py +88 -0
- relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
- relationalai/semantics/reasoners/optimization/solvers_pb.py +1414 -0
- relationalai/semantics/rel/builtins.py +40 -0
- relationalai/semantics/rel/compiler.py +989 -0
- relationalai/semantics/rel/executor.py +362 -0
- relationalai/semantics/rel/rel.py +482 -0
- relationalai/semantics/rel/rel_utils.py +276 -0
- relationalai/semantics/snowflake/__init__.py +3 -0
- relationalai/semantics/sql/compiler.py +2503 -0
- relationalai/semantics/sql/executor/duck_db.py +52 -0
- relationalai/semantics/sql/executor/result_helpers.py +64 -0
- relationalai/semantics/sql/executor/snowflake.py +149 -0
- relationalai/semantics/sql/rewrite/denormalize.py +222 -0
- relationalai/semantics/sql/rewrite/double_negation.py +49 -0
- relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
- relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
- relationalai/semantics/sql/sql.py +504 -0
- relationalai/semantics/std/__init__.py +40 -60
- relationalai/semantics/std/constraints.py +43 -37
- relationalai/semantics/std/datetime.py +135 -246
- relationalai/semantics/std/decimals.py +52 -45
- relationalai/semantics/std/floats.py +5 -13
- relationalai/semantics/std/integers.py +11 -26
- relationalai/semantics/std/math.py +112 -183
- relationalai/semantics/std/pragmas.py +11 -0
- relationalai/semantics/std/re.py +62 -80
- relationalai/semantics/std/std.py +14 -0
- relationalai/semantics/std/strings.py +60 -117
- relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
- relationalai/semantics/tests/test_snapshot_base.py +9 -0
- relationalai/semantics/tests/utils.py +46 -0
- relationalai/std/__init__.py +70 -0
- relationalai/tools/cli.py +2089 -0
- relationalai/tools/cli_controls.py +1826 -0
- relationalai/tools/cli_helpers.py +802 -0
- relationalai/tools/debugger.py +183 -289
- relationalai/tools/debugger_client.py +109 -0
- relationalai/tools/debugger_server.py +302 -0
- relationalai/tools/dev.py +685 -0
- relationalai/tools/notes +7 -0
- relationalai/tools/qb_debugger.py +425 -0
- relationalai/util/clean_up_databases.py +95 -0
- relationalai/util/format.py +106 -48
- relationalai/util/list_databases.py +9 -0
- relationalai/util/otel_configuration.py +26 -0
- relationalai/util/otel_handler.py +484 -0
- relationalai/util/snowflake_handler.py +88 -0
- relationalai/util/span_format_test.py +43 -0
- relationalai/util/span_tracker.py +207 -0
- relationalai/util/spans_file_handler.py +72 -0
- relationalai/util/tracing_handler.py +34 -0
- relationalai-0.13.2.dist-info/METADATA +74 -0
- relationalai-0.13.2.dist-info/RECORD +460 -0
- relationalai-0.13.2.dist-info/WHEEL +4 -0
- relationalai-0.13.2.dist-info/entry_points.txt +3 -0
- relationalai-0.13.2.dist-info/licenses/LICENSE +202 -0
- relationalai_test_util/__init__.py +4 -0
- relationalai_test_util/fixtures.py +233 -0
- relationalai_test_util/snapshot.py +252 -0
- relationalai_test_util/traceback.py +118 -0
- relationalai/config/__init__.py +0 -56
- relationalai/config/config.py +0 -289
- relationalai/config/config_fields.py +0 -86
- relationalai/config/connections/__init__.py +0 -46
- relationalai/config/connections/base.py +0 -23
- relationalai/config/connections/duckdb.py +0 -29
- relationalai/config/connections/snowflake.py +0 -243
- relationalai/config/external/__init__.py +0 -17
- relationalai/config/external/dbt_converter.py +0 -101
- relationalai/config/external/dbt_models.py +0 -93
- relationalai/config/external/snowflake_converter.py +0 -41
- relationalai/config/external/snowflake_models.py +0 -85
- relationalai/config/external/utils.py +0 -19
- relationalai/semantics/backends/lqp/annotations.py +0 -11
- relationalai/semantics/backends/sql/sql_compiler.py +0 -327
- relationalai/semantics/frontend/base.py +0 -1707
- relationalai/semantics/frontend/core.py +0 -179
- relationalai/semantics/frontend/front_compiler.py +0 -1313
- relationalai/semantics/frontend/pprint.py +0 -408
- relationalai/semantics/metamodel/metamodel.py +0 -437
- relationalai/semantics/metamodel/metamodel_analyzer.py +0 -519
- relationalai/semantics/metamodel/metamodel_compiler.py +0 -0
- relationalai/semantics/metamodel/pprint.py +0 -412
- relationalai/semantics/metamodel/rewriter.py +0 -266
- relationalai/semantics/metamodel/typer.py +0 -1378
- relationalai/semantics/std/aggregates.py +0 -149
- relationalai/semantics/std/common.py +0 -44
- relationalai/semantics/std/numbers.py +0 -86
- relationalai/shims/executor.py +0 -147
- relationalai/shims/helpers.py +0 -126
- relationalai/shims/hoister.py +0 -221
- relationalai/shims/mm2v0.py +0 -1290
- relationalai/tools/cli/__init__.py +0 -6
- relationalai/tools/cli/cli.py +0 -90
- relationalai/tools/cli/components/__init__.py +0 -5
- relationalai/tools/cli/components/progress_reader.py +0 -1524
- relationalai/tools/cli/components/utils.py +0 -58
- relationalai/tools/cli/config_template.py +0 -45
- relationalai/tools/cli/dev.py +0 -19
- relationalai/tools/typer_debugger.py +0 -93
- relationalai/util/dataclasses.py +0 -43
- relationalai/util/docutils.py +0 -40
- relationalai/util/error.py +0 -199
- relationalai/util/naming.py +0 -145
- relationalai/util/python.py +0 -35
- relationalai/util/runtime.py +0 -156
- relationalai/util/schema.py +0 -197
- relationalai/util/source.py +0 -185
- relationalai/util/structures.py +0 -163
- relationalai/util/tracing.py +0 -261
- relationalai-0.13.0.dev0.dist-info/METADATA +0 -46
- relationalai-0.13.0.dev0.dist-info/RECORD +0 -488
- relationalai-0.13.0.dev0.dist-info/WHEEL +0 -5
- relationalai-0.13.0.dev0.dist-info/entry_points.txt +0 -3
- relationalai-0.13.0.dev0.dist-info/top_level.txt +0 -2
- v0/relationalai/__init__.py +0 -216
- v0/relationalai/clients/__init__.py +0 -5
- v0/relationalai/clients/azure.py +0 -477
- v0/relationalai/clients/client.py +0 -912
- v0/relationalai/clients/config.py +0 -673
- v0/relationalai/clients/direct_access_client.py +0 -118
- v0/relationalai/clients/hash_util.py +0 -31
- v0/relationalai/clients/local.py +0 -571
- v0/relationalai/clients/profile_polling.py +0 -73
- v0/relationalai/clients/result_helpers.py +0 -420
- v0/relationalai/clients/snowflake.py +0 -3869
- v0/relationalai/clients/types.py +0 -113
- v0/relationalai/clients/use_index_poller.py +0 -980
- v0/relationalai/clients/util.py +0 -356
- v0/relationalai/debugging.py +0 -389
- v0/relationalai/dsl.py +0 -1749
- v0/relationalai/early_access/builder/__init__.py +0 -30
- v0/relationalai/early_access/builder/builder/__init__.py +0 -35
- v0/relationalai/early_access/builder/snowflake/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/__init__.py +0 -25
- v0/relationalai/early_access/builder/std/decimals/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/integers/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/math/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/strings/__init__.py +0 -14
- v0/relationalai/early_access/devtools/__init__.py +0 -12
- v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
- v0/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
- v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
- v0/relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
- v0/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
- v0/relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
- v0/relationalai/early_access/dsl/bindings/common.py +0 -402
- v0/relationalai/early_access/dsl/bindings/csv.py +0 -170
- v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
- v0/relationalai/early_access/dsl/bindings/snowflake.py +0 -64
- v0/relationalai/early_access/dsl/codegen/binder.py +0 -411
- v0/relationalai/early_access/dsl/codegen/common.py +0 -79
- v0/relationalai/early_access/dsl/codegen/helpers.py +0 -23
- v0/relationalai/early_access/dsl/codegen/relations.py +0 -700
- v0/relationalai/early_access/dsl/codegen/weaver.py +0 -417
- v0/relationalai/early_access/dsl/core/builders/__init__.py +0 -47
- v0/relationalai/early_access/dsl/core/builders/logic.py +0 -19
- v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
- v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
- v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
- v0/relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
- v0/relationalai/early_access/dsl/core/context.py +0 -13
- v0/relationalai/early_access/dsl/core/cset.py +0 -132
- v0/relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
- v0/relationalai/early_access/dsl/core/exprs/relational.py +0 -18
- v0/relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
- v0/relationalai/early_access/dsl/core/instances.py +0 -44
- v0/relationalai/early_access/dsl/core/logic/__init__.py +0 -193
- v0/relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
- v0/relationalai/early_access/dsl/core/logic/exists.py +0 -223
- v0/relationalai/early_access/dsl/core/logic/helper.py +0 -163
- v0/relationalai/early_access/dsl/core/namespaces.py +0 -32
- v0/relationalai/early_access/dsl/core/relations.py +0 -276
- v0/relationalai/early_access/dsl/core/rules.py +0 -112
- v0/relationalai/early_access/dsl/core/std/__init__.py +0 -45
- v0/relationalai/early_access/dsl/core/temporal/recall.py +0 -6
- v0/relationalai/early_access/dsl/core/types/__init__.py +0 -270
- v0/relationalai/early_access/dsl/core/types/concepts.py +0 -128
- v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
- v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
- v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
- v0/relationalai/early_access/dsl/core/types/standard.py +0 -92
- v0/relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
- v0/relationalai/early_access/dsl/core/types/variables.py +0 -203
- v0/relationalai/early_access/dsl/ir/compiler.py +0 -318
- v0/relationalai/early_access/dsl/ir/executor.py +0 -260
- v0/relationalai/early_access/dsl/ontologies/constraints.py +0 -88
- v0/relationalai/early_access/dsl/ontologies/export.py +0 -30
- v0/relationalai/early_access/dsl/ontologies/models.py +0 -453
- v0/relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
- v0/relationalai/early_access/dsl/ontologies/readings.py +0 -60
- v0/relationalai/early_access/dsl/ontologies/relationships.py +0 -322
- v0/relationalai/early_access/dsl/ontologies/roles.py +0 -87
- v0/relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
- v0/relationalai/early_access/dsl/orm/constraints.py +0 -438
- v0/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
- v0/relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
- v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
- v0/relationalai/early_access/dsl/orm/measures/measures.py +0 -299
- v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
- v0/relationalai/early_access/dsl/orm/models.py +0 -256
- v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
- v0/relationalai/early_access/dsl/orm/printer.py +0 -469
- v0/relationalai/early_access/dsl/orm/reasoners.py +0 -480
- v0/relationalai/early_access/dsl/orm/relations.py +0 -19
- v0/relationalai/early_access/dsl/orm/relationships.py +0 -251
- v0/relationalai/early_access/dsl/orm/types.py +0 -42
- v0/relationalai/early_access/dsl/orm/utils.py +0 -79
- v0/relationalai/early_access/dsl/orm/verb.py +0 -204
- v0/relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
- v0/relationalai/early_access/dsl/relations.py +0 -170
- v0/relationalai/early_access/dsl/rulesets.py +0 -69
- v0/relationalai/early_access/dsl/schemas/__init__.py +0 -450
- v0/relationalai/early_access/dsl/schemas/builder.py +0 -48
- v0/relationalai/early_access/dsl/schemas/comp_names.py +0 -51
- v0/relationalai/early_access/dsl/schemas/components.py +0 -203
- v0/relationalai/early_access/dsl/schemas/contexts.py +0 -156
- v0/relationalai/early_access/dsl/schemas/exprs.py +0 -89
- v0/relationalai/early_access/dsl/schemas/fragments.py +0 -464
- v0/relationalai/early_access/dsl/serialization.py +0 -79
- v0/relationalai/early_access/dsl/serialize/exporter.py +0 -163
- v0/relationalai/early_access/dsl/snow/api.py +0 -104
- v0/relationalai/early_access/dsl/snow/common.py +0 -76
- v0/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
- v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
- v0/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
- v0/relationalai/early_access/dsl/types/__init__.py +0 -40
- v0/relationalai/early_access/dsl/types/concepts.py +0 -12
- v0/relationalai/early_access/dsl/types/entities.py +0 -135
- v0/relationalai/early_access/dsl/types/values.py +0 -17
- v0/relationalai/early_access/dsl/utils.py +0 -102
- v0/relationalai/early_access/graphs/__init__.py +0 -13
- v0/relationalai/early_access/lqp/__init__.py +0 -12
- v0/relationalai/early_access/lqp/compiler/__init__.py +0 -12
- v0/relationalai/early_access/lqp/constructors/__init__.py +0 -18
- v0/relationalai/early_access/lqp/executor/__init__.py +0 -12
- v0/relationalai/early_access/lqp/ir/__init__.py +0 -12
- v0/relationalai/early_access/lqp/passes/__init__.py +0 -12
- v0/relationalai/early_access/lqp/pragmas/__init__.py +0 -12
- v0/relationalai/early_access/lqp/primitives/__init__.py +0 -12
- v0/relationalai/early_access/lqp/types/__init__.py +0 -12
- v0/relationalai/early_access/lqp/utils/__init__.py +0 -12
- v0/relationalai/early_access/lqp/validators/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/__init__.py +0 -58
- v0/relationalai/early_access/metamodel/builtins/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/compiler/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/dependency/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/factory/__init__.py +0 -17
- v0/relationalai/early_access/metamodel/helpers/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/ir/__init__.py +0 -14
- v0/relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
- v0/relationalai/early_access/metamodel/typer/__init__.py +0 -3
- v0/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/types/__init__.py +0 -15
- v0/relationalai/early_access/metamodel/util/__init__.py +0 -15
- v0/relationalai/early_access/metamodel/visitor/__init__.py +0 -12
- v0/relationalai/early_access/rel/__init__.py +0 -12
- v0/relationalai/early_access/rel/executor/__init__.py +0 -12
- v0/relationalai/early_access/rel/rel_utils/__init__.py +0 -12
- v0/relationalai/early_access/rel/rewrite/__init__.py +0 -7
- v0/relationalai/early_access/solvers/__init__.py +0 -19
- v0/relationalai/early_access/sql/__init__.py +0 -11
- v0/relationalai/early_access/sql/executor/__init__.py +0 -3
- v0/relationalai/early_access/sql/rewrite/__init__.py +0 -3
- v0/relationalai/early_access/tests/logging/__init__.py +0 -12
- v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
- v0/relationalai/early_access/tests/utils/__init__.py +0 -12
- v0/relationalai/environments/__init__.py +0 -35
- v0/relationalai/environments/base.py +0 -381
- v0/relationalai/environments/colab.py +0 -14
- v0/relationalai/environments/generic.py +0 -71
- v0/relationalai/environments/ipython.py +0 -68
- v0/relationalai/environments/jupyter.py +0 -9
- v0/relationalai/environments/snowbook.py +0 -169
- v0/relationalai/errors.py +0 -2455
- v0/relationalai/experimental/SF.py +0 -38
- v0/relationalai/experimental/inspect.py +0 -47
- v0/relationalai/experimental/pathfinder/__init__.py +0 -158
- v0/relationalai/experimental/pathfinder/api.py +0 -160
- v0/relationalai/experimental/pathfinder/automaton.py +0 -584
- v0/relationalai/experimental/pathfinder/bridge.py +0 -226
- v0/relationalai/experimental/pathfinder/compiler.py +0 -416
- v0/relationalai/experimental/pathfinder/datalog.py +0 -214
- v0/relationalai/experimental/pathfinder/diagnostics.py +0 -56
- v0/relationalai/experimental/pathfinder/filter.py +0 -236
- v0/relationalai/experimental/pathfinder/glushkov.py +0 -439
- v0/relationalai/experimental/pathfinder/options.py +0 -265
- v0/relationalai/experimental/pathfinder/rpq.py +0 -344
- v0/relationalai/experimental/pathfinder/transition.py +0 -200
- v0/relationalai/experimental/pathfinder/utils.py +0 -26
- v0/relationalai/experimental/paths/api.py +0 -143
- v0/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
- v0/relationalai/experimental/paths/examples/basic_example.py +0 -40
- v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
- v0/relationalai/experimental/paths/examples/movie_example.py +0 -77
- v0/relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
- v0/relationalai/experimental/paths/examples/paths_example.py +0 -116
- v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
- v0/relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
- v0/relationalai/experimental/paths/graph.py +0 -185
- v0/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
- v0/relationalai/experimental/paths/path_algorithms/single.py +0 -59
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
- v0/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
- v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
- v0/relationalai/experimental/paths/path_algorithms/usp.py +0 -150
- v0/relationalai/experimental/paths/product_graph.py +0 -93
- v0/relationalai/experimental/paths/rpq/automaton.py +0 -584
- v0/relationalai/experimental/paths/rpq/diagnostics.py +0 -56
- v0/relationalai/experimental/paths/rpq/rpq.py +0 -378
- v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
- v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
- v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
- v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
- v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
- v0/relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
- v0/relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
- v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
- v0/relationalai/experimental/paths/tree_agg.py +0 -168
- v0/relationalai/experimental/paths/utilities/iterators.py +0 -27
- v0/relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
- v0/relationalai/experimental/solvers.py +0 -1087
- v0/relationalai/loaders/csv.py +0 -195
- v0/relationalai/loaders/loader.py +0 -177
- v0/relationalai/loaders/types.py +0 -23
- v0/relationalai/rel_emitter.py +0 -373
- v0/relationalai/rel_utils.py +0 -185
- v0/relationalai/semantics/__init__.py +0 -29
- v0/relationalai/semantics/devtools/benchmark_lqp.py +0 -536
- v0/relationalai/semantics/devtools/compilation_manager.py +0 -294
- v0/relationalai/semantics/devtools/extract_lqp.py +0 -110
- v0/relationalai/semantics/internal/internal.py +0 -3785
- v0/relationalai/semantics/internal/snowflake.py +0 -324
- v0/relationalai/semantics/lqp/builtins.py +0 -16
- v0/relationalai/semantics/lqp/compiler.py +0 -22
- v0/relationalai/semantics/lqp/constructors.py +0 -68
- v0/relationalai/semantics/lqp/executor.py +0 -469
- v0/relationalai/semantics/lqp/intrinsics.py +0 -24
- v0/relationalai/semantics/lqp/model2lqp.py +0 -839
- v0/relationalai/semantics/lqp/passes.py +0 -680
- v0/relationalai/semantics/lqp/primitives.py +0 -252
- v0/relationalai/semantics/lqp/result_helpers.py +0 -202
- v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
- v0/relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- v0/relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
- v0/relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
- v0/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
- v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
- v0/relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- v0/relationalai/semantics/lqp/types.py +0 -101
- v0/relationalai/semantics/lqp/utils.py +0 -160
- v0/relationalai/semantics/lqp/validators.py +0 -57
- v0/relationalai/semantics/metamodel/__init__.py +0 -40
- v0/relationalai/semantics/metamodel/builtins.py +0 -774
- v0/relationalai/semantics/metamodel/compiler.py +0 -133
- v0/relationalai/semantics/metamodel/dependency.py +0 -862
- v0/relationalai/semantics/metamodel/executor.py +0 -61
- v0/relationalai/semantics/metamodel/factory.py +0 -287
- v0/relationalai/semantics/metamodel/helpers.py +0 -361
- v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
- v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- v0/relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
- v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
- v0/relationalai/semantics/metamodel/typer/checker.py +0 -353
- v0/relationalai/semantics/metamodel/typer/typer.py +0 -1395
- v0/relationalai/semantics/metamodel/util.py +0 -505
- v0/relationalai/semantics/reasoners/__init__.py +0 -10
- v0/relationalai/semantics/reasoners/graph/__init__.py +0 -37
- v0/relationalai/semantics/reasoners/graph/core.py +0 -9020
- v0/relationalai/semantics/reasoners/optimization/__init__.py +0 -68
- v0/relationalai/semantics/reasoners/optimization/common.py +0 -88
- v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
- v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
- v0/relationalai/semantics/rel/builtins.py +0 -40
- v0/relationalai/semantics/rel/compiler.py +0 -989
- v0/relationalai/semantics/rel/executor.py +0 -359
- v0/relationalai/semantics/rel/rel.py +0 -482
- v0/relationalai/semantics/rel/rel_utils.py +0 -276
- v0/relationalai/semantics/snowflake/__init__.py +0 -3
- v0/relationalai/semantics/sql/compiler.py +0 -2503
- v0/relationalai/semantics/sql/executor/duck_db.py +0 -52
- v0/relationalai/semantics/sql/executor/result_helpers.py +0 -64
- v0/relationalai/semantics/sql/executor/snowflake.py +0 -145
- v0/relationalai/semantics/sql/rewrite/denormalize.py +0 -222
- v0/relationalai/semantics/sql/rewrite/double_negation.py +0 -49
- v0/relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
- v0/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
- v0/relationalai/semantics/sql/sql.py +0 -504
- v0/relationalai/semantics/std/__init__.py +0 -54
- v0/relationalai/semantics/std/constraints.py +0 -43
- v0/relationalai/semantics/std/datetime.py +0 -363
- v0/relationalai/semantics/std/decimals.py +0 -62
- v0/relationalai/semantics/std/floats.py +0 -7
- v0/relationalai/semantics/std/integers.py +0 -22
- v0/relationalai/semantics/std/math.py +0 -141
- v0/relationalai/semantics/std/pragmas.py +0 -11
- v0/relationalai/semantics/std/re.py +0 -83
- v0/relationalai/semantics/std/std.py +0 -14
- v0/relationalai/semantics/std/strings.py +0 -63
- v0/relationalai/semantics/tests/__init__.py +0 -0
- v0/relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
- v0/relationalai/semantics/tests/test_snapshot_base.py +0 -9
- v0/relationalai/semantics/tests/utils.py +0 -46
- v0/relationalai/std/__init__.py +0 -70
- v0/relationalai/tools/__init__.py +0 -0
- v0/relationalai/tools/cli.py +0 -1940
- v0/relationalai/tools/cli_controls.py +0 -1826
- v0/relationalai/tools/cli_helpers.py +0 -390
- v0/relationalai/tools/debugger.py +0 -183
- v0/relationalai/tools/debugger_client.py +0 -109
- v0/relationalai/tools/debugger_server.py +0 -302
- v0/relationalai/tools/dev.py +0 -685
- v0/relationalai/tools/qb_debugger.py +0 -425
- v0/relationalai/util/clean_up_databases.py +0 -95
- v0/relationalai/util/format.py +0 -123
- v0/relationalai/util/list_databases.py +0 -9
- v0/relationalai/util/otel_configuration.py +0 -25
- v0/relationalai/util/otel_handler.py +0 -484
- v0/relationalai/util/snowflake_handler.py +0 -88
- v0/relationalai/util/span_format_test.py +0 -43
- v0/relationalai/util/span_tracker.py +0 -207
- v0/relationalai/util/spans_file_handler.py +0 -72
- v0/relationalai/util/tracing_handler.py +0 -34
- /relationalai/{semantics/frontend → analysis}/__init__.py +0 -0
- {v0/relationalai → relationalai}/analysis/mechanistic.py +0 -0
- {v0/relationalai → relationalai}/analysis/whynot.py +0 -0
- /relationalai/{shims → auth}/__init__.py +0 -0
- {v0/relationalai → relationalai}/auth/jwt_generator.py +0 -0
- {v0/relationalai → relationalai}/auth/oauth_callback_server.py +0 -0
- {v0/relationalai → relationalai}/auth/token_handler.py +0 -0
- {v0/relationalai → relationalai}/auth/util.py +0 -0
- {v0/relationalai/clients → relationalai/clients/resources/snowflake}/cache_store.py +0 -0
- {v0/relationalai → relationalai}/compiler.py +0 -0
- {v0/relationalai → relationalai}/dependencies.py +0 -0
- {v0/relationalai → relationalai}/docutils.py +0 -0
- {v0/relationalai/analysis → relationalai/early_access}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/__init__.py +0 -0
- {v0/relationalai/auth → relationalai/early_access/dsl/adapters}/__init__.py +0 -0
- {v0/relationalai/early_access → relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
- {v0/relationalai/early_access/dsl/adapters → relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
- {v0/relationalai/early_access/dsl/adapters/orm → relationalai/early_access/dsl/bindings}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/adapters/owl → relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/bindings → relationalai/early_access/dsl/codegen}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/constants.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/stack.py +0 -0
- {v0/relationalai/early_access/dsl/bindings/legacy → relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/utils.py +0 -0
- {v0/relationalai/early_access/dsl/codegen → relationalai/early_access/dsl/ir}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/core/temporal → relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
- {v0/relationalai/early_access/dsl/ir → relationalai/early_access/dsl/orm}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/ontologies → relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
- {v0/relationalai/early_access/dsl/orm → relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/orm/measures → relationalai/early_access/dsl/serialize}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/serialize/model.py +0 -0
- {v0/relationalai/early_access/dsl/physical_metadata → relationalai/early_access/dsl/snow}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/tests/__init__.py +0 -0
- {v0/relationalai → relationalai}/environments/ci.py +0 -0
- {v0/relationalai → relationalai}/environments/hex.py +0 -0
- {v0/relationalai → relationalai}/environments/terminal.py +0 -0
- {v0/relationalai → relationalai}/experimental/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/graphs.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/filter.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/glushkov.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/transition.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/utilities/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/utilities/utilities.py +0 -0
- {v0/relationalai/early_access/dsl/serialize → relationalai/loaders}/__init__.py +0 -0
- {v0/relationalai → relationalai}/metagen.py +0 -0
- {v0/relationalai → relationalai}/metamodel.py +0 -0
- {v0/relationalai → relationalai}/rel.py +0 -0
- {v0/relationalai → relationalai}/semantics/devtools/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/internal/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/internal/annotations.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/ir.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/pragmas.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/dataflow.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/ir.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/typer/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/types.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/visitor.py +0 -0
- {v0/relationalai → relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/rel/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/sql/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/sql/executor/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/sql/rewrite/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/snow → relationalai/semantics/tests}/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/tests/logging.py +0 -0
- {v0/relationalai → relationalai}/std/aggregates.py +0 -0
- {v0/relationalai → relationalai}/std/dates.py +0 -0
- {v0/relationalai → relationalai}/std/graphs.py +0 -0
- {v0/relationalai → relationalai}/std/inspect.py +0 -0
- {v0/relationalai → relationalai}/std/math.py +0 -0
- {v0/relationalai → relationalai}/std/re.py +0 -0
- {v0/relationalai → relationalai}/std/strings.py +0 -0
- {v0/relationalai/loaders → relationalai/tools}/__init__.py +0 -0
- {v0/relationalai → relationalai}/tools/cleanup_snapshots.py +0 -0
- {v0/relationalai → relationalai}/tools/constants.py +0 -0
- {v0/relationalai → relationalai}/tools/query_utils.py +0 -0
- {v0/relationalai → relationalai}/tools/snapshot_viewer.py +0 -0
- {v0/relationalai → relationalai}/util/__init__.py +0 -0
- {v0/relationalai → relationalai}/util/constants.py +0 -0
- {v0/relationalai → relationalai}/util/graph.py +0 -0
- {v0/relationalai → relationalai}/util/timeout.py +0 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any, Dict, List, Protocol, Tuple
|
|
5
|
+
|
|
6
|
+
from .... import debugging
|
|
7
|
+
from ....errors import EngineProvisioningFailed
|
|
8
|
+
from ...config import Config
|
|
9
|
+
from ...types import EngineState
|
|
10
|
+
from ...util import poll_with_specified_overhead
|
|
11
|
+
|
|
12
|
+
# ---------------------------------------------------------------------------
|
|
13
|
+
# CONSTANTS
|
|
14
|
+
# ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
# Keep the same placeholder string as `snowflake.py` so `Resources._exec_sql()` will
|
|
17
|
+
# replace it with the actual app name.
|
|
18
|
+
APP_NAME = "___RAI_APP___"
|
|
19
|
+
ENGINE_SCHEMA = "experimental"
|
|
20
|
+
API_SCHEMA = f"{APP_NAME}.{ENGINE_SCHEMA}"
|
|
21
|
+
|
|
22
|
+
# Cloud-specific engine sizes
|
|
23
|
+
INTERNAL_ENGINE_SIZES = ["XS", "S", "M", "L"]
|
|
24
|
+
ENGINE_SIZES_AWS = ["HIGHMEM_X64_S", "HIGHMEM_X64_M", "HIGHMEM_X64_L"]
|
|
25
|
+
ENGINE_SIZES_AZURE = ["HIGHMEM_X64_S", "HIGHMEM_X64_M", "HIGHMEM_X64_SL"]
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
# Engine types
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
class EngineType:
|
|
32
|
+
"""Engine type constants with descriptions."""
|
|
33
|
+
|
|
34
|
+
LOGIC = "LOGIC"
|
|
35
|
+
SOLVER = "SOLVER"
|
|
36
|
+
ML = "ML"
|
|
37
|
+
|
|
38
|
+
_LABELS = {
|
|
39
|
+
LOGIC: "Logic",
|
|
40
|
+
SOLVER: "Prescriptive",
|
|
41
|
+
ML: "Predictive",
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
_DESCRIPTIONS = {
|
|
45
|
+
LOGIC: "Logic engine for deductive reasoning and relational queries",
|
|
46
|
+
SOLVER: "Optimization engine using mathematical solvers for prescriptive reasoning",
|
|
47
|
+
ML: "Machine learning engine for pattern recognition and predictive reasoning",
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def get_label(cls, type: str) -> str:
|
|
52
|
+
"""Get the user-friendly label for an engine type."""
|
|
53
|
+
return cls._LABELS.get(type, type)
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def get_label_with_value(cls, type: str) -> str:
|
|
57
|
+
"""Get the user-friendly label with the value in parentheses."""
|
|
58
|
+
label = cls.get_label(type)
|
|
59
|
+
return f"{label} ({type})"
|
|
60
|
+
|
|
61
|
+
@classmethod
|
|
62
|
+
def get_description(cls, type: str) -> str:
|
|
63
|
+
"""Get the description for an engine type."""
|
|
64
|
+
return cls._DESCRIPTIONS.get(type, "Unknown engine type")
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def is_valid(cls, type: str) -> bool:
|
|
68
|
+
"""Check if an engine type is valid."""
|
|
69
|
+
return type in cls._DESCRIPTIONS
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def get_all_types(cls) -> List[str]:
|
|
73
|
+
"""Get all valid engine types."""
|
|
74
|
+
return list(cls._DESCRIPTIONS.keys())
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class _ExecResources(Protocol):
|
|
78
|
+
"""Minimal surface EngineServiceSQL needs from Resources (composition, no mixins)."""
|
|
79
|
+
|
|
80
|
+
config: Config
|
|
81
|
+
|
|
82
|
+
def _exec(
|
|
83
|
+
self,
|
|
84
|
+
code: str,
|
|
85
|
+
params: Any | None = None,
|
|
86
|
+
raw: bool = False,
|
|
87
|
+
help: bool = True,
|
|
88
|
+
skip_engine_db_error_retry: bool = False,
|
|
89
|
+
) -> Any:
|
|
90
|
+
"""Execute a statement via the owning resources object."""
|
|
91
|
+
...
|
|
92
|
+
|
|
93
|
+
def get_cloud_provider(self) -> str:
|
|
94
|
+
"""Return the configured cloud provider identifier (e.g. 'aws', 'azure')."""
|
|
95
|
+
...
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# ---------------------------------------------------------------------------
|
|
99
|
+
# Engine Service
|
|
100
|
+
# ---------------------------------------------------------------------------
|
|
101
|
+
class EngineServiceSQL:
|
|
102
|
+
"""Snowflake engine management backed by SQL stored procedures."""
|
|
103
|
+
|
|
104
|
+
def __init__(self, resources: _ExecResources):
|
|
105
|
+
"""Create an engine service bound to a resources-like executor."""
|
|
106
|
+
self._res = resources
|
|
107
|
+
|
|
108
|
+
@staticmethod
|
|
109
|
+
def _parse_settings(val: Any) -> Dict[str, Any] | None:
|
|
110
|
+
if val is None:
|
|
111
|
+
return None
|
|
112
|
+
if isinstance(val, dict):
|
|
113
|
+
return val
|
|
114
|
+
if isinstance(val, str):
|
|
115
|
+
s = val.strip()
|
|
116
|
+
if not s:
|
|
117
|
+
return None
|
|
118
|
+
try:
|
|
119
|
+
parsed = json.loads(s)
|
|
120
|
+
return parsed if isinstance(parsed, dict) else {"value": parsed}
|
|
121
|
+
except Exception:
|
|
122
|
+
return {"value": val}
|
|
123
|
+
# Snowflake VARIANT may arrive as a list/tuple/etc; preserve it under a wrapper
|
|
124
|
+
return {"value": val}
|
|
125
|
+
|
|
126
|
+
def list_engines(
|
|
127
|
+
self,
|
|
128
|
+
*,
|
|
129
|
+
state: str | None = None,
|
|
130
|
+
name: str | None = None,
|
|
131
|
+
type: str | None = None,
|
|
132
|
+
size: str | None = None,
|
|
133
|
+
created_by: str | None = None,
|
|
134
|
+
) -> List[Dict[str, Any]]:
|
|
135
|
+
"""
|
|
136
|
+
List engines with optional filtering.
|
|
137
|
+
|
|
138
|
+
Uses parameterized queries (? placeholders) for SQL injection protection.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
where_conditions: list[str] = []
|
|
142
|
+
params: list[Any] = []
|
|
143
|
+
|
|
144
|
+
if state:
|
|
145
|
+
where_conditions.append("STATUS = ?")
|
|
146
|
+
params.append(state.upper())
|
|
147
|
+
if name:
|
|
148
|
+
where_conditions.append("UPPER(NAME) LIKE ?")
|
|
149
|
+
params.append(f"%{name.upper()}%")
|
|
150
|
+
if type:
|
|
151
|
+
where_conditions.append("TYPE = ?")
|
|
152
|
+
params.append(type.upper())
|
|
153
|
+
if size:
|
|
154
|
+
where_conditions.append("SIZE = ?")
|
|
155
|
+
params.append(size)
|
|
156
|
+
if created_by:
|
|
157
|
+
where_conditions.append("UPPER(CREATED_BY) LIKE ?")
|
|
158
|
+
params.append(f"%{created_by.upper()}%")
|
|
159
|
+
|
|
160
|
+
where_clause = f"WHERE {' AND '.join(where_conditions)}" if where_conditions else ""
|
|
161
|
+
where_suffix = f" {where_clause}" if where_clause else ""
|
|
162
|
+
statement = f"""
|
|
163
|
+
SELECT
|
|
164
|
+
NAME, TYPE, ID, SIZE, STATUS, CREATED_BY, CREATED_ON, UPDATED_ON,
|
|
165
|
+
AUTO_SUSPEND_MINS, SUSPENDS_AT, SETTINGS
|
|
166
|
+
FROM {API_SCHEMA}.engines{where_suffix}
|
|
167
|
+
ORDER BY NAME ASC;
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
results = self._res._exec(statement, params)
|
|
171
|
+
if not results:
|
|
172
|
+
return []
|
|
173
|
+
|
|
174
|
+
return [
|
|
175
|
+
{
|
|
176
|
+
"name": row["NAME"],
|
|
177
|
+
"type": row["TYPE"],
|
|
178
|
+
"id": row["ID"],
|
|
179
|
+
"size": row["SIZE"],
|
|
180
|
+
"state": row["STATUS"], # callers expect 'state'
|
|
181
|
+
"created_by": row["CREATED_BY"],
|
|
182
|
+
"created_on": row["CREATED_ON"],
|
|
183
|
+
"updated_on": row["UPDATED_ON"],
|
|
184
|
+
"auto_suspend_mins": row["AUTO_SUSPEND_MINS"],
|
|
185
|
+
"suspends_at": row["SUSPENDS_AT"],
|
|
186
|
+
"settings": self._parse_settings(
|
|
187
|
+
# Snowpark Row supports dict-style indexing but not `.get()`.
|
|
188
|
+
row["SETTINGS"] if "SETTINGS" in row else None
|
|
189
|
+
),
|
|
190
|
+
}
|
|
191
|
+
for row in results
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
def get_engine(self, name: str, type: str) -> EngineState | None:
|
|
195
|
+
"""Fetch a single engine by (name, type), returning None if not found."""
|
|
196
|
+
results = self._res._exec(
|
|
197
|
+
f"""
|
|
198
|
+
SELECT
|
|
199
|
+
NAME, TYPE, ID, SIZE, STATUS, CREATED_BY, CREATED_ON, UPDATED_ON,
|
|
200
|
+
VERSION, AUTO_SUSPEND_MINS, SUSPENDS_AT, SETTINGS
|
|
201
|
+
FROM {API_SCHEMA}.engines
|
|
202
|
+
WHERE NAME = ? AND TYPE = ?;
|
|
203
|
+
""",
|
|
204
|
+
[name, type],
|
|
205
|
+
)
|
|
206
|
+
if not results:
|
|
207
|
+
return None
|
|
208
|
+
engine = results[0]
|
|
209
|
+
if not engine:
|
|
210
|
+
return None
|
|
211
|
+
engine_state: EngineState = {
|
|
212
|
+
"name": engine["NAME"],
|
|
213
|
+
"type": engine["TYPE"],
|
|
214
|
+
"id": engine["ID"],
|
|
215
|
+
"size": engine["SIZE"],
|
|
216
|
+
"state": engine["STATUS"], # callers expect 'state'
|
|
217
|
+
"created_by": engine["CREATED_BY"],
|
|
218
|
+
"created_on": engine["CREATED_ON"],
|
|
219
|
+
"updated_on": engine["UPDATED_ON"],
|
|
220
|
+
"version": engine["VERSION"],
|
|
221
|
+
"auto_suspend": engine["AUTO_SUSPEND_MINS"],
|
|
222
|
+
"suspends_at": engine["SUSPENDS_AT"],
|
|
223
|
+
"settings": self._parse_settings(engine["SETTINGS"] if "SETTINGS" in engine else None),
|
|
224
|
+
}
|
|
225
|
+
return engine_state
|
|
226
|
+
|
|
227
|
+
def _create_engine(
|
|
228
|
+
self,
|
|
229
|
+
*,
|
|
230
|
+
name: str,
|
|
231
|
+
type: str = EngineType.LOGIC,
|
|
232
|
+
size: str | None = None,
|
|
233
|
+
auto_suspend_mins: int | None = None,
|
|
234
|
+
is_async: bool = False,
|
|
235
|
+
headers: Dict | None = None,
|
|
236
|
+
settings: Dict[str, Any] | None = None,
|
|
237
|
+
) -> None:
|
|
238
|
+
"""Create an engine using the appropriate stored procedure.
|
|
239
|
+
|
|
240
|
+
Note: `headers` is accepted for API compatibility; it is not currently used
|
|
241
|
+
in the Snowflake implementation.
|
|
242
|
+
"""
|
|
243
|
+
API = "create_engine_async" if is_async else "create_engine"
|
|
244
|
+
if size is None:
|
|
245
|
+
size = self._res.config.get_default_engine_size()
|
|
246
|
+
if auto_suspend_mins is None:
|
|
247
|
+
auto_suspend_mins = self._res.config.get_default_auto_suspend_mins()
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
with debugging.span(API, name=name, size=size, auto_suspend_mins=auto_suspend_mins, engine_type=type):
|
|
251
|
+
payload: Dict[str, Any] | None = None
|
|
252
|
+
if settings:
|
|
253
|
+
payload = {"settings": dict(settings)}
|
|
254
|
+
if auto_suspend_mins is not None:
|
|
255
|
+
payload = dict(payload or {})
|
|
256
|
+
payload["auto_suspend_mins"] = auto_suspend_mins
|
|
257
|
+
|
|
258
|
+
if payload is None:
|
|
259
|
+
self._res._exec(
|
|
260
|
+
f"call {API_SCHEMA}.{API}(?, ?, ?, null);",
|
|
261
|
+
[type, name, size],
|
|
262
|
+
)
|
|
263
|
+
else:
|
|
264
|
+
self._res._exec(
|
|
265
|
+
f"call {API_SCHEMA}.{API}(?, ?, ?, PARSE_JSON(?));",
|
|
266
|
+
[type, name, size, json.dumps(payload)],
|
|
267
|
+
)
|
|
268
|
+
except Exception as e:
|
|
269
|
+
raise EngineProvisioningFailed(name, e) from e
|
|
270
|
+
|
|
271
|
+
def create_engine(
|
|
272
|
+
self,
|
|
273
|
+
name: str,
|
|
274
|
+
type: str | None = None,
|
|
275
|
+
size: str | None = None,
|
|
276
|
+
auto_suspend_mins: int | None = None,
|
|
277
|
+
headers: Dict | None = None,
|
|
278
|
+
settings: Dict[str, Any] | None = None,
|
|
279
|
+
) -> None:
|
|
280
|
+
"""Create an engine (synchronous variant)."""
|
|
281
|
+
if type is None:
|
|
282
|
+
type = EngineType.LOGIC
|
|
283
|
+
self._create_engine(
|
|
284
|
+
name=name,
|
|
285
|
+
type=type,
|
|
286
|
+
size=size,
|
|
287
|
+
auto_suspend_mins=auto_suspend_mins,
|
|
288
|
+
headers=headers,
|
|
289
|
+
settings=settings,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
def create_engine_async(
|
|
293
|
+
self,
|
|
294
|
+
name: str,
|
|
295
|
+
type: str = EngineType.LOGIC,
|
|
296
|
+
size: str | None = None,
|
|
297
|
+
auto_suspend_mins: int | None = None,
|
|
298
|
+
) -> None:
|
|
299
|
+
"""Create an engine asynchronously."""
|
|
300
|
+
self._create_engine(
|
|
301
|
+
name=name,
|
|
302
|
+
type=type,
|
|
303
|
+
size=size,
|
|
304
|
+
auto_suspend_mins=auto_suspend_mins,
|
|
305
|
+
is_async=True,
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def delete_engine(self, name: str, type: str) -> None:
|
|
309
|
+
"""Delete an engine by (name, type)."""
|
|
310
|
+
self._res._exec(
|
|
311
|
+
f"call {API_SCHEMA}.delete_engine(?, ?);",
|
|
312
|
+
[type, name],
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
def suspend_engine(self, name: str, type: str | None = None) -> None:
|
|
316
|
+
"""Suspend an engine by name (and optional type)."""
|
|
317
|
+
if type is None:
|
|
318
|
+
type = EngineType.LOGIC
|
|
319
|
+
self._res._exec(
|
|
320
|
+
f"call {API_SCHEMA}.suspend_engine(?, ?);",
|
|
321
|
+
[type, name],
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
def resume_engine(self, name: str, type: str | None = None, headers: Dict | None = None) -> Dict[str, Any]:
|
|
325
|
+
"""Resume an engine and block until it is READY.
|
|
326
|
+
|
|
327
|
+
This preserves historical behavior where `resume_engine` was synchronous.
|
|
328
|
+
Use `resume_engine_async` for a fire-and-forget resume call.
|
|
329
|
+
"""
|
|
330
|
+
if type is None:
|
|
331
|
+
type = EngineType.LOGIC
|
|
332
|
+
self.resume_engine_async(name, type=type, headers=headers)
|
|
333
|
+
poll_with_specified_overhead(
|
|
334
|
+
lambda: (self.get_engine(name, type) or {}).get("state") == "READY",
|
|
335
|
+
overhead_rate=0.1,
|
|
336
|
+
max_delay=0.5,
|
|
337
|
+
timeout=900,
|
|
338
|
+
)
|
|
339
|
+
return {}
|
|
340
|
+
|
|
341
|
+
def resume_engine_async(self, name: str, type: str | None = None, headers: Dict | None = None) -> Dict[str, Any]:
|
|
342
|
+
"""Resume an engine asynchronously and return an API-compatible payload.
|
|
343
|
+
|
|
344
|
+
Note: `headers` is accepted for API compatibility; it is not currently used
|
|
345
|
+
in the Snowflake implementation.
|
|
346
|
+
"""
|
|
347
|
+
if type is None:
|
|
348
|
+
type = EngineType.LOGIC
|
|
349
|
+
self._res._exec(
|
|
350
|
+
f"call {API_SCHEMA}.resume_engine_async(?, ?);",
|
|
351
|
+
[type, name],
|
|
352
|
+
)
|
|
353
|
+
return {}
|
|
354
|
+
|
|
355
|
+
def validate_engine_size(self, size: str) -> Tuple[bool, List[str]]:
|
|
356
|
+
"""Validate an engine size, returning (is_valid, allowed_sizes_if_invalid)."""
|
|
357
|
+
if size is not None:
|
|
358
|
+
sizes = self.get_engine_sizes()
|
|
359
|
+
if size not in sizes:
|
|
360
|
+
return False, sizes
|
|
361
|
+
return True, []
|
|
362
|
+
|
|
363
|
+
def get_engine_sizes(self, cloud_provider: str | None = None) -> List[str]:
|
|
364
|
+
"""Return the list of valid engine sizes for the given cloud provider."""
|
|
365
|
+
if cloud_provider is None:
|
|
366
|
+
cloud_provider = self._res.get_cloud_provider()
|
|
367
|
+
|
|
368
|
+
if cloud_provider == "azure":
|
|
369
|
+
sizes = ENGINE_SIZES_AZURE
|
|
370
|
+
else:
|
|
371
|
+
sizes = ENGINE_SIZES_AWS
|
|
372
|
+
|
|
373
|
+
if self._res.config.show_all_engine_sizes():
|
|
374
|
+
return INTERNAL_ENGINE_SIZES + sizes
|
|
375
|
+
return sizes
|
|
376
|
+
|
|
377
|
+
def alter_engine_pool(self, size: str | None = None, mins: int | None = None, maxs: int | None = None) -> None:
|
|
378
|
+
"""Alter engine pool node limits for Snowflake."""
|
|
379
|
+
# Keep the exact SQL shape used by Resources for backwards compatibility.
|
|
380
|
+
self._res._exec(f"call {APP_NAME}.api.alter_engine_pool_node_limits('{size}', {mins}, {maxs});")
|
|
381
|
+
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Engine state handlers for auto_create_engine methods using Strategy Pattern.
|
|
3
|
+
|
|
4
|
+
Each state handler encapsulates the logic for handling a specific engine state
|
|
5
|
+
(PENDING, SUSPENDED, READY, GONE, or None/missing). Handlers are separated
|
|
6
|
+
for sync and async modes since they have different behaviors.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import TYPE_CHECKING, Dict, Any, cast, Union
|
|
12
|
+
|
|
13
|
+
from ....errors import EngineNotFoundException, EngineProvisioningFailed, EngineResumeFailed, EngineSizeMismatchWarning
|
|
14
|
+
from ....tools.cli_controls import Spinner
|
|
15
|
+
from ...util import poll_with_specified_overhead
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from .snowflake import Resources
|
|
19
|
+
from ...types import EngineState
|
|
20
|
+
EngineDict = Union[EngineState, Dict[str, Any]]
|
|
21
|
+
else:
|
|
22
|
+
EngineDict = Dict[str, Any]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class EngineContext:
|
|
27
|
+
"""Context for engine state handling."""
|
|
28
|
+
name: str
|
|
29
|
+
size: str | None
|
|
30
|
+
type: str
|
|
31
|
+
headers: Dict | None
|
|
32
|
+
requested_size: str | None # Size explicitly requested by user
|
|
33
|
+
spinner: Spinner | None = None # For async mode UI updates
|
|
34
|
+
span: Any = None # For sync mode debugging span
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class EngineStateHandler(ABC):
|
|
38
|
+
"""Base class for engine state handlers using Strategy Pattern."""
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def handles_state(self, state: str | None) -> bool:
|
|
42
|
+
"""Check if this handler can process the given engine state."""
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
47
|
+
"""
|
|
48
|
+
Handle the engine state and return updated engine dict or None.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
- Updated engine dict if engine should remain
|
|
52
|
+
- None if engine should be deleted/recreated
|
|
53
|
+
"""
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ============================================================================
|
|
58
|
+
# Sync Mode Handlers
|
|
59
|
+
# ============================================================================
|
|
60
|
+
|
|
61
|
+
class SyncPendingStateHandler(EngineStateHandler):
|
|
62
|
+
"""Handle PENDING state in sync mode - poll until ready."""
|
|
63
|
+
|
|
64
|
+
def handles_state(self, state: str | None) -> bool:
|
|
65
|
+
return state == "PENDING"
|
|
66
|
+
|
|
67
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
68
|
+
if not engine:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
# Warn if requested size doesn't match pending engine size
|
|
72
|
+
if context.requested_size is not None and engine.get("size") != context.requested_size:
|
|
73
|
+
existing_size = engine.get("size") or ""
|
|
74
|
+
EngineSizeMismatchWarning(context.name, existing_size, context.requested_size)
|
|
75
|
+
|
|
76
|
+
# Poll until engine is ready
|
|
77
|
+
with Spinner(
|
|
78
|
+
"Waiting for engine to be initialized",
|
|
79
|
+
"Engine ready",
|
|
80
|
+
):
|
|
81
|
+
poll_with_specified_overhead(
|
|
82
|
+
lambda: resources.is_engine_ready(context.name, context.type),
|
|
83
|
+
overhead_rate=0.1,
|
|
84
|
+
max_delay=0.5,
|
|
85
|
+
timeout=900
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Return updated engine (should be READY now)
|
|
89
|
+
updated_engine = resources.get_engine(context.name, context.type)
|
|
90
|
+
return cast(EngineDict, updated_engine) if updated_engine else None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class SyncSuspendedStateHandler(EngineStateHandler):
|
|
94
|
+
"""Handle SUSPENDED state in sync mode - resume and poll until ready."""
|
|
95
|
+
|
|
96
|
+
def handles_state(self, state: str | None) -> bool:
|
|
97
|
+
return state == "SUSPENDED"
|
|
98
|
+
|
|
99
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
100
|
+
if not engine:
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
with Spinner(
|
|
104
|
+
f"Resuming engine '{context.name}'",
|
|
105
|
+
f"Engine '{context.name}' resumed",
|
|
106
|
+
f"Failed to resume engine '{context.name}'"
|
|
107
|
+
):
|
|
108
|
+
try:
|
|
109
|
+
resources.resume_engine_async(context.name, type=context.type, headers=context.headers)
|
|
110
|
+
poll_with_specified_overhead(
|
|
111
|
+
lambda: resources.is_engine_ready(context.name, context.type),
|
|
112
|
+
overhead_rate=0.1,
|
|
113
|
+
max_delay=0.5,
|
|
114
|
+
timeout=900
|
|
115
|
+
)
|
|
116
|
+
except Exception:
|
|
117
|
+
raise EngineResumeFailed(context.name)
|
|
118
|
+
|
|
119
|
+
# Return updated engine (should be READY now)
|
|
120
|
+
updated_engine = resources.get_engine(context.name, context.type)
|
|
121
|
+
return cast(EngineDict, updated_engine) if updated_engine else None
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class SyncReadyStateHandler(EngineStateHandler):
|
|
125
|
+
"""Handle READY state in sync mode - set active and return."""
|
|
126
|
+
|
|
127
|
+
def handles_state(self, state: str | None) -> bool:
|
|
128
|
+
return state == "READY"
|
|
129
|
+
|
|
130
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
131
|
+
if not engine:
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
# Warn if requested size doesn't match ready engine size
|
|
135
|
+
if context.requested_size is not None and engine.get("size") != context.requested_size:
|
|
136
|
+
existing_size = engine.get("size") or ""
|
|
137
|
+
EngineSizeMismatchWarning(context.name, existing_size, context.requested_size)
|
|
138
|
+
|
|
139
|
+
# Cast to EngineState for _set_active_engine
|
|
140
|
+
if TYPE_CHECKING:
|
|
141
|
+
from ...types import EngineState
|
|
142
|
+
resources._set_active_engine(cast(EngineState, engine))
|
|
143
|
+
else:
|
|
144
|
+
resources._set_active_engine(engine) # type: ignore[arg-type]
|
|
145
|
+
return engine
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class SyncGoneStateHandler(EngineStateHandler):
|
|
149
|
+
"""Handle GONE state in sync mode - delete and return None to trigger recreation."""
|
|
150
|
+
|
|
151
|
+
def handles_state(self, state: str | None) -> bool:
|
|
152
|
+
return state == "GONE"
|
|
153
|
+
|
|
154
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
155
|
+
if not engine:
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
try:
|
|
159
|
+
# "Gone" is abnormal condition when metadata and SF service don't match
|
|
160
|
+
# Therefore, we have to delete the engine and create a new one
|
|
161
|
+
# It could be case that engine is already deleted, so we have to catch the exception
|
|
162
|
+
resources.delete_engine(context.name, context.type)
|
|
163
|
+
# After deleting the engine, return None so that we can create a new engine
|
|
164
|
+
return None
|
|
165
|
+
except Exception as e:
|
|
166
|
+
# If engine is already deleted, we will get an exception
|
|
167
|
+
# We can ignore this exception and create a new engine
|
|
168
|
+
if isinstance(e, EngineNotFoundException):
|
|
169
|
+
return None
|
|
170
|
+
else:
|
|
171
|
+
raise EngineProvisioningFailed(context.name, e) from e
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class SyncMissingEngineHandler(EngineStateHandler):
|
|
175
|
+
"""Handle missing engine (None) in sync mode - create synchronously."""
|
|
176
|
+
|
|
177
|
+
def handles_state(self, state: str | None) -> bool:
|
|
178
|
+
return state is None
|
|
179
|
+
|
|
180
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
181
|
+
# This handler is called when engine doesn't exist
|
|
182
|
+
# Create engine synchronously with spinner
|
|
183
|
+
with Spinner(
|
|
184
|
+
f"Auto-creating engine {context.name}",
|
|
185
|
+
f"Auto-created engine {context.name}",
|
|
186
|
+
"Engine creation failed",
|
|
187
|
+
):
|
|
188
|
+
resources.create_engine(
|
|
189
|
+
context.name,
|
|
190
|
+
size=context.size,
|
|
191
|
+
type=context.type,
|
|
192
|
+
headers=context.headers,
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return resources.get_engine(context.name, context.type)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# ============================================================================
|
|
199
|
+
# Async Mode Handlers
|
|
200
|
+
# ============================================================================
|
|
201
|
+
|
|
202
|
+
class AsyncPendingStateHandler(EngineStateHandler):
|
|
203
|
+
"""Handle PENDING state in async mode - just update spinner, don't poll."""
|
|
204
|
+
|
|
205
|
+
def handles_state(self, state: str | None) -> bool:
|
|
206
|
+
return state == "PENDING"
|
|
207
|
+
|
|
208
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
209
|
+
if not engine:
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
# In async mode, just update spinner - use_index will wait for engine to be ready
|
|
213
|
+
if context.spinner:
|
|
214
|
+
context.spinner.update_messages({
|
|
215
|
+
"finished_message": f"Starting engine {context.name}",
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
return engine
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class AsyncSuspendedStateHandler(EngineStateHandler):
|
|
222
|
+
"""Handle SUSPENDED state in async mode - resume asynchronously."""
|
|
223
|
+
|
|
224
|
+
def handles_state(self, state: str | None) -> bool:
|
|
225
|
+
return state == "SUSPENDED"
|
|
226
|
+
|
|
227
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
228
|
+
if not engine:
|
|
229
|
+
return None
|
|
230
|
+
|
|
231
|
+
if context.spinner:
|
|
232
|
+
context.spinner.update_messages({
|
|
233
|
+
"finished_message": f"Resuming engine {context.name}",
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
try:
|
|
237
|
+
resources.resume_engine_async(context.name, type=context.type)
|
|
238
|
+
except Exception:
|
|
239
|
+
raise EngineResumeFailed(context.name)
|
|
240
|
+
|
|
241
|
+
return engine
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class AsyncReadyStateHandler(EngineStateHandler):
|
|
245
|
+
"""Handle READY state in async mode - set active."""
|
|
246
|
+
|
|
247
|
+
def handles_state(self, state: str | None) -> bool:
|
|
248
|
+
return state == "READY"
|
|
249
|
+
|
|
250
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
251
|
+
if not engine:
|
|
252
|
+
return None
|
|
253
|
+
|
|
254
|
+
if context.spinner:
|
|
255
|
+
context.spinner.update_messages({
|
|
256
|
+
"finished_message": f"Engine {context.name} initialized",
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
# Cast to EngineState for _set_active_engine
|
|
260
|
+
if TYPE_CHECKING:
|
|
261
|
+
from ...types import EngineState
|
|
262
|
+
resources._set_active_engine(cast(EngineState, engine))
|
|
263
|
+
else:
|
|
264
|
+
resources._set_active_engine(engine) # type: ignore[arg-type]
|
|
265
|
+
return engine
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
class AsyncGoneStateHandler(EngineStateHandler):
|
|
269
|
+
"""Handle GONE state in async mode - delete and return None to trigger recreation."""
|
|
270
|
+
|
|
271
|
+
def handles_state(self, state: str | None) -> bool:
|
|
272
|
+
return state == "GONE"
|
|
273
|
+
|
|
274
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
275
|
+
if not engine:
|
|
276
|
+
return None
|
|
277
|
+
|
|
278
|
+
if context.spinner:
|
|
279
|
+
context.spinner.update_messages({
|
|
280
|
+
"message": f"Restarting engine {context.name}",
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
try:
|
|
284
|
+
# "Gone" is abnormal condition when metadata and SF service don't match
|
|
285
|
+
# Therefore, we have to delete the engine and create a new one
|
|
286
|
+
# It could be case that engine is already deleted, so we have to catch the exception
|
|
287
|
+
# Set it to None so that we can create a new engine asynchronously
|
|
288
|
+
resources.delete_engine(context.name, context.type)
|
|
289
|
+
return None
|
|
290
|
+
except Exception as e:
|
|
291
|
+
# If engine is already deleted, we will get an exception
|
|
292
|
+
# We can ignore this exception and create a new engine asynchronously
|
|
293
|
+
if isinstance(e, EngineNotFoundException):
|
|
294
|
+
return None
|
|
295
|
+
else:
|
|
296
|
+
raise EngineProvisioningFailed(context.name, e) from e
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
class AsyncMissingEngineHandler(EngineStateHandler):
|
|
300
|
+
"""Handle missing engine (None) in async mode - create asynchronously."""
|
|
301
|
+
|
|
302
|
+
def handles_state(self, state: str | None) -> bool:
|
|
303
|
+
return state is None
|
|
304
|
+
|
|
305
|
+
def handle(self, engine: EngineDict | None, context: EngineContext, resources: 'Resources') -> EngineDict | None:
|
|
306
|
+
# This handler is called when engine doesn't exist
|
|
307
|
+
# Create engine asynchronously
|
|
308
|
+
resources.create_engine_async(context.name, size=context.size, type=context.type)
|
|
309
|
+
|
|
310
|
+
if context.spinner:
|
|
311
|
+
context.spinner.update_messages({
|
|
312
|
+
"finished_message": f"Starting engine {context.name}...",
|
|
313
|
+
})
|
|
314
|
+
return None # Engine is being created asynchronously
|
|
315
|
+
|