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,240 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error handlers for Snowflake Resources using Strategy Pattern.
|
|
3
|
+
|
|
4
|
+
Each error handler encapsulates the detection logic and exception creation
|
|
5
|
+
for a specific type of error. Handlers are processed in order until one matches.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
import re
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from typing import TYPE_CHECKING, Any
|
|
11
|
+
|
|
12
|
+
from ....errors import (
|
|
13
|
+
DuoSecurityFailed,
|
|
14
|
+
EngineNotFoundException,
|
|
15
|
+
EnginePending,
|
|
16
|
+
EngineNameValidationException,
|
|
17
|
+
EngineProvisioningFailed,
|
|
18
|
+
EngineResumeFailed,
|
|
19
|
+
RAIAbortedTransactionError,
|
|
20
|
+
RAIException,
|
|
21
|
+
SnowflakeAppMissingException,
|
|
22
|
+
SnowflakeDatabaseException,
|
|
23
|
+
SnowflakeRaiAppNotStarted,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from .snowflake import ExecContext
|
|
28
|
+
from .snowflake import Resources
|
|
29
|
+
|
|
30
|
+
from .util import is_database_issue, is_engine_issue, collect_error_messages
|
|
31
|
+
|
|
32
|
+
class ErrorHandler(ABC):
|
|
33
|
+
"""Base class for error handlers using Strategy Pattern."""
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
37
|
+
"""Check if this handler can process the error."""
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
@abstractmethod
|
|
41
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
42
|
+
"""Handle the error and either raise an exception or return an alternate result."""
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class DuoSecurityErrorHandler(ErrorHandler):
|
|
47
|
+
"""Handle Duo security authentication errors."""
|
|
48
|
+
|
|
49
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
50
|
+
messages = collect_error_messages(error)
|
|
51
|
+
return any("duo security" in msg for msg in messages)
|
|
52
|
+
|
|
53
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
54
|
+
raise DuoSecurityFailed(error)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class AppMissingErrorHandler(ErrorHandler):
|
|
58
|
+
"""Handle missing RAI app database errors."""
|
|
59
|
+
|
|
60
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
61
|
+
rai_app = resources.config.get("rai_app_name", "")
|
|
62
|
+
if not isinstance(rai_app, str):
|
|
63
|
+
return False
|
|
64
|
+
pattern = f"database '{rai_app}' does not exist or not authorized."
|
|
65
|
+
messages = collect_error_messages(error)
|
|
66
|
+
return any(re.search(pattern.lower(), msg) for msg in messages)
|
|
67
|
+
|
|
68
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
69
|
+
rai_app = resources.config.get("rai_app_name", "")
|
|
70
|
+
assert isinstance(rai_app, str), f"rai_app_name must be a string, not {type(rai_app)}"
|
|
71
|
+
raise SnowflakeAppMissingException(rai_app, resources.config.get("role"))
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class AppFunctionMissingErrorHandler(ErrorHandler):
|
|
75
|
+
"""Handle missing RAI app when app-scoped UDFs are unknown.
|
|
76
|
+
|
|
77
|
+
When the RelationalAI Snowflake native application isn't installed (or is installed
|
|
78
|
+
under a different name / not authorized), Snowflake can surface errors like:
|
|
79
|
+
|
|
80
|
+
SQL compilation error: Unknown user-defined function <APP>.<SCHEMA>.<FUNC>.
|
|
81
|
+
|
|
82
|
+
This should be presented to users as an "app missing" configuration issue, not
|
|
83
|
+
as a raw SQL error.
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
87
|
+
rai_app = resources.config.get("rai_app_name", "")
|
|
88
|
+
if not isinstance(rai_app, str) or not rai_app:
|
|
89
|
+
return False
|
|
90
|
+
|
|
91
|
+
rai_app_lower = rai_app.lower()
|
|
92
|
+
# Normalize whitespace/newlines because Snowpark error strings may wrap.
|
|
93
|
+
messages = [" ".join(msg.split()).lower() for msg in collect_error_messages(error)]
|
|
94
|
+
|
|
95
|
+
# Examples:
|
|
96
|
+
# - "unknown user-defined function sqlib_ia_na_app.experimental.resume_engine_async."
|
|
97
|
+
# - "unknown user-defined function sqlib_ia_na_app.api.alter_engine_pool_node_limits."
|
|
98
|
+
needle = f"unknown user-defined function {rai_app_lower}."
|
|
99
|
+
return any(needle in msg for msg in messages)
|
|
100
|
+
|
|
101
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
102
|
+
rai_app = resources.config.get("rai_app_name", "")
|
|
103
|
+
assert isinstance(rai_app, str), f"rai_app_name must be a string, not {type(rai_app)}"
|
|
104
|
+
raise SnowflakeAppMissingException(rai_app, resources.config.get("role"))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class DatabaseErrorsHandler(ErrorHandler):
|
|
108
|
+
"""Handle database-related errors from Snowflake/RAI."""
|
|
109
|
+
|
|
110
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
111
|
+
"""Check if error is database-related."""
|
|
112
|
+
# Use collect_error_messages to get all messages from exception chain
|
|
113
|
+
messages = collect_error_messages(error)
|
|
114
|
+
return any(is_database_issue(msg) for msg in messages)
|
|
115
|
+
|
|
116
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
117
|
+
"""Handle database errors and raise appropriate exception."""
|
|
118
|
+
raise SnowflakeDatabaseException(error)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class EngineErrorsHandler(ErrorHandler):
|
|
122
|
+
"""Handle all engine-related errors from Snowflake/RAI."""
|
|
123
|
+
|
|
124
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
125
|
+
"""Check if error is engine-related."""
|
|
126
|
+
# Use collect_error_messages to get all messages from exception chain
|
|
127
|
+
messages = collect_error_messages(error)
|
|
128
|
+
return any(is_engine_issue(msg) for msg in messages)
|
|
129
|
+
|
|
130
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
131
|
+
"""Handle engine errors and raise appropriate exception."""
|
|
132
|
+
# Use collect_error_messages to get all messages from exception chain
|
|
133
|
+
messages = collect_error_messages(error)
|
|
134
|
+
engine = resources.get_default_engine_name()
|
|
135
|
+
assert isinstance(engine, str), f"engine must be a string, not {type(engine)}"
|
|
136
|
+
|
|
137
|
+
# Check all collected messages for engine error patterns
|
|
138
|
+
for message in messages:
|
|
139
|
+
if "engine is in pending" in message or "engine is provisioning" in message:
|
|
140
|
+
raise EnginePending(engine)
|
|
141
|
+
elif "engine not found" in message or "no engines found" in message:
|
|
142
|
+
raise EngineNotFoundException(engine, str(error))
|
|
143
|
+
elif "engine was deleted" in message:
|
|
144
|
+
raise EngineNotFoundException(engine, "Engine was deleted")
|
|
145
|
+
elif "engine is suspended" in message:
|
|
146
|
+
raise EngineResumeFailed(engine)
|
|
147
|
+
elif "create/resume" in message:
|
|
148
|
+
raise EngineProvisioningFailed(engine, error)
|
|
149
|
+
|
|
150
|
+
# Generic engine error - use the original error message
|
|
151
|
+
raise RAIException(str(error))
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class ServiceNotStartedErrorHandler(ErrorHandler):
|
|
155
|
+
"""Handle RAI service not started errors."""
|
|
156
|
+
|
|
157
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
158
|
+
messages = [" ".join(msg.split()).lower() for msg in collect_error_messages(error)]
|
|
159
|
+
return any(
|
|
160
|
+
(
|
|
161
|
+
# Native app not activated / service not started
|
|
162
|
+
"service has not been started" in msg
|
|
163
|
+
# Native app suspended/deactivated; SPCS control plane is unreachable
|
|
164
|
+
or "not reachable: service suspended" in msg
|
|
165
|
+
)
|
|
166
|
+
for msg in messages
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
170
|
+
rai_app = resources.config.get("rai_app_name", "")
|
|
171
|
+
assert isinstance(rai_app, str), f"rai_app_name must be a string, not {type(rai_app)}"
|
|
172
|
+
raise SnowflakeRaiAppNotStarted(rai_app)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class TransactionAbortedErrorHandler(ErrorHandler):
|
|
176
|
+
"""Handle transaction aborted errors with problem details."""
|
|
177
|
+
|
|
178
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
179
|
+
messages = collect_error_messages(error)
|
|
180
|
+
return any(re.search(r"state:\s*aborted", msg) for msg in messages)
|
|
181
|
+
|
|
182
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
183
|
+
# Use collect_error_messages to get all messages from exception chain
|
|
184
|
+
messages = collect_error_messages(error)
|
|
185
|
+
# Check all collected messages for transaction ID
|
|
186
|
+
for message in messages:
|
|
187
|
+
txn_id_match = re.search(r"id:\s*([0-9a-f\-]+)", message)
|
|
188
|
+
if txn_id_match:
|
|
189
|
+
problems = resources.get_transaction_problems(txn_id_match.group(1))
|
|
190
|
+
if problems:
|
|
191
|
+
# Extract problem details (handle both dict and object formats)
|
|
192
|
+
for problem in problems:
|
|
193
|
+
if isinstance(problem, dict):
|
|
194
|
+
type_field = problem.get('TYPE')
|
|
195
|
+
message_field = problem.get('MESSAGE')
|
|
196
|
+
report_field = problem.get('REPORT')
|
|
197
|
+
else:
|
|
198
|
+
type_field = problem.TYPE
|
|
199
|
+
message_field = problem.MESSAGE
|
|
200
|
+
report_field = problem.REPORT
|
|
201
|
+
raise RAIAbortedTransactionError(type_field, message_field, report_field)
|
|
202
|
+
raise RAIException(str(error))
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class UseIndexRetryErrorHandler(ErrorHandler):
|
|
206
|
+
"""Handle engine/database errors by polling use_index and retrying the execution.
|
|
207
|
+
|
|
208
|
+
Intended for UseIndexResources and subclasses. Register this handler *before*
|
|
209
|
+
the standard Database/Engine error handlers.
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
def matches(self, error: Exception, message: str, ctx: 'ExecContext', resources: 'Resources') -> bool:
|
|
213
|
+
if ctx.skip_engine_db_error_retry:
|
|
214
|
+
return False
|
|
215
|
+
messages = collect_error_messages(error)
|
|
216
|
+
return any(msg and (is_database_issue(msg) or is_engine_issue(msg)) for msg in messages)
|
|
217
|
+
|
|
218
|
+
def handle(self, error: Exception, ctx: 'ExecContext', resources: 'Resources') -> Any | None:
|
|
219
|
+
poll_use_index = getattr(resources, "_poll_use_index", None)
|
|
220
|
+
if not callable(poll_use_index):
|
|
221
|
+
return None
|
|
222
|
+
|
|
223
|
+
engine = resources.get_default_engine_name()
|
|
224
|
+
engine_size = resources.config.get_default_engine_size()
|
|
225
|
+
assert isinstance(engine, str), f"engine must be a string, not {type(engine)}"
|
|
226
|
+
|
|
227
|
+
model = getattr(resources, "database", "")
|
|
228
|
+
try:
|
|
229
|
+
poll_use_index(
|
|
230
|
+
app_name=resources.get_app_name(),
|
|
231
|
+
sources=resources.sources,
|
|
232
|
+
model=model,
|
|
233
|
+
engine_name=engine,
|
|
234
|
+
engine_size=engine_size,
|
|
235
|
+
)
|
|
236
|
+
except EngineNameValidationException as e:
|
|
237
|
+
raise EngineNameValidationException(engine) from e
|
|
238
|
+
|
|
239
|
+
return ctx.re_execute(resources)
|
|
240
|
+
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import json
|
|
3
|
+
import textwrap
|
|
4
|
+
import random
|
|
5
|
+
import string
|
|
6
|
+
import time
|
|
7
|
+
from zoneinfo import ZoneInfo
|
|
8
|
+
from snowflake.snowpark.types import StringType, IntegerType, StructField, StructType, FloatType, MapType, ArrayType, BooleanType, BinaryType, DateType, TimestampType
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
from snowflake.snowpark.exceptions import SnowparkSQLException
|
|
12
|
+
|
|
13
|
+
class RAIException(Exception):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
def random_string():
|
|
17
|
+
chars = string.ascii_letters + string.digits
|
|
18
|
+
return ''.join(random.choice(chars) for _ in range(32))
|
|
19
|
+
|
|
20
|
+
def run_sql(session, query, params=None, engine=""):
|
|
21
|
+
try:
|
|
22
|
+
return session.sql(query, params).collect()
|
|
23
|
+
except SnowparkSQLException as e:
|
|
24
|
+
if "engine not found" in e.message:
|
|
25
|
+
import sys
|
|
26
|
+
def exception_handler(exception_type, exception, traceback):
|
|
27
|
+
print(f"{exception_type.__name__}: {exception}")
|
|
28
|
+
sys.excepthook = exception_handler
|
|
29
|
+
raise RAIException(f"RelationalAI engine not found. Please create an engine called `{engine}` using `___RAI_APP___.api.create_engine`.") from None
|
|
30
|
+
else:
|
|
31
|
+
raise e
|
|
32
|
+
|
|
33
|
+
def poll_with_specified_overhead(
|
|
34
|
+
f,
|
|
35
|
+
overhead_rate: float,
|
|
36
|
+
start_time: float | None = None,
|
|
37
|
+
timeout: int | None = None,
|
|
38
|
+
max_tries: int | None = None,
|
|
39
|
+
max_delay: float = 120,
|
|
40
|
+
min_delay: float = 0.1
|
|
41
|
+
):
|
|
42
|
+
if overhead_rate < 0:
|
|
43
|
+
raise ValueError("overhead_rate must be non-negative")
|
|
44
|
+
|
|
45
|
+
if start_time is None:
|
|
46
|
+
start_time = time.time()
|
|
47
|
+
|
|
48
|
+
tries = 0
|
|
49
|
+
max_time = time.time() + timeout if timeout else None
|
|
50
|
+
|
|
51
|
+
while True:
|
|
52
|
+
if f():
|
|
53
|
+
break
|
|
54
|
+
|
|
55
|
+
current_time = time.time()
|
|
56
|
+
|
|
57
|
+
if max_tries is not None and tries >= max_tries:
|
|
58
|
+
raise Exception(f'max tries {max_tries} exhausted')
|
|
59
|
+
|
|
60
|
+
if max_time is not None and current_time >= max_time:
|
|
61
|
+
raise Exception(f'timed out after {timeout} seconds')
|
|
62
|
+
|
|
63
|
+
duration = (current_time - start_time) * overhead_rate
|
|
64
|
+
duration = max(min(duration, max_delay), min_delay, 0)
|
|
65
|
+
|
|
66
|
+
time.sleep(duration)
|
|
67
|
+
tries += 1
|
|
68
|
+
|
|
69
|
+
def check_ready(session, sql_string, database, engine, wait_for_stream_sync, use_index_id):
|
|
70
|
+
results = run_sql(session, sql_string, [database, engine, wait_for_stream_sync, use_index_id])
|
|
71
|
+
# Extract the JSON string from the `USE_INDEX` field
|
|
72
|
+
use_index_json_str = results[0]["USE_INDEX"]
|
|
73
|
+
|
|
74
|
+
# Convert the JSON string to lowercase
|
|
75
|
+
use_index_json_str = use_index_json_str.lower()
|
|
76
|
+
|
|
77
|
+
# Parse the JSON string into a Python dictionary
|
|
78
|
+
use_index_data = json.loads(use_index_json_str)
|
|
79
|
+
ready = use_index_data.get("ready", False)
|
|
80
|
+
errors = use_index_data.get("errors", [])
|
|
81
|
+
|
|
82
|
+
if ready:
|
|
83
|
+
return True
|
|
84
|
+
elif errors:
|
|
85
|
+
error_strs = []
|
|
86
|
+
for error in errors:
|
|
87
|
+
if error.get("type") == "data":
|
|
88
|
+
error_strs.append(f"{error.get('message')}, source: {error.get('source')}")
|
|
89
|
+
elif error.get("type") == "engine":
|
|
90
|
+
error_strs.append(f"{error.get('message')}")
|
|
91
|
+
raise Exception("\n".join(error_strs))
|
|
92
|
+
|
|
93
|
+
def get_engine(session, passed_engine):
|
|
94
|
+
if passed_engine:
|
|
95
|
+
return passed_engine
|
|
96
|
+
try:
|
|
97
|
+
APP_NAME = {{ APP_NAME }}
|
|
98
|
+
query = f"select * from {APP_NAME}.api.engines where created_by=current_user() and status = 'READY' and name != 'CDC_MANAGED_ENGINE' order by created_on desc;"
|
|
99
|
+
row = run_sql(session, query)[0]
|
|
100
|
+
return row["NAME"]
|
|
101
|
+
except:
|
|
102
|
+
return {{ engine }}
|
|
103
|
+
|
|
104
|
+
def escape(code):
|
|
105
|
+
return (
|
|
106
|
+
code
|
|
107
|
+
.replace("\\", "\\\\\\\\")
|
|
108
|
+
.replace("'", "\\\'")
|
|
109
|
+
.replace('"', '\\\\"')
|
|
110
|
+
.replace("\n", "\\n")
|
|
111
|
+
)
|
|
112
|
+
def replace_column_names(rejected_rows: list[dict], col_names_map: dict) -> list[dict]:
|
|
113
|
+
# col_names_map looks like this: {col000: TIMESTAMPS, col002: id}
|
|
114
|
+
# COLUMN_NAME in rejected_rows looks like this: "OUT23A38988_10B1_4BCB_B566_89F7F3C8D1FB_INTERNAL"["COL000":1]
|
|
115
|
+
|
|
116
|
+
parsing_errors = []
|
|
117
|
+
|
|
118
|
+
# Convert col_names_map keys to lowercase for case-insensitive matching
|
|
119
|
+
col_names_map = {key.lower(): value for key, value in col_names_map.items()}
|
|
120
|
+
for i, row in enumerate(rejected_rows):
|
|
121
|
+
try:
|
|
122
|
+
col_name = row['COLUMN_NAME'].split('[')[1].split(':')[0].replace('"', '').strip().lower()
|
|
123
|
+
if col_name in col_names_map:
|
|
124
|
+
row['COLUMN_NAME'] = col_names_map[col_name]
|
|
125
|
+
except Exception as e:
|
|
126
|
+
parsing_errors.append({"index": i, "message": str(e), "row": str(row)})
|
|
127
|
+
|
|
128
|
+
return parsing_errors
|
|
129
|
+
|
|
130
|
+
def format_rejected_rows(rejected_rows: list[dict], rejected_rows_count: int, col_names_map: dict) -> str:
|
|
131
|
+
parsing_errors = replace_column_names(rejected_rows, col_names_map)
|
|
132
|
+
error_indices = {e["index"] for e in parsing_errors}
|
|
133
|
+
msg = ""
|
|
134
|
+
grouped_errors = {}
|
|
135
|
+
|
|
136
|
+
# Group errors by ROW_NUMBER
|
|
137
|
+
for i, row in enumerate(rejected_rows):
|
|
138
|
+
if i in error_indices:
|
|
139
|
+
continue
|
|
140
|
+
try:
|
|
141
|
+
row_number = row['ROW_NUMBER']
|
|
142
|
+
if row_number not in grouped_errors:
|
|
143
|
+
grouped_errors[row_number] = {'rejected_record': row['REJECTED_RECORD'], 'errors': []}
|
|
144
|
+
grouped_errors[row_number]['errors'].append(f"Erroneous column: {row['COLUMN_NAME']}\nError message: {row['ERROR']}")
|
|
145
|
+
except Exception as e:
|
|
146
|
+
parsing_errors.append({"index": i, "message": str(e), "row": str(row)})
|
|
147
|
+
|
|
148
|
+
msg = f"{rejected_rows_count} rows were skipped due to erroneous data. Here are the first {len(grouped_errors)} rejected rows:\n"
|
|
149
|
+
for row_number, data in grouped_errors.items():
|
|
150
|
+
msg += f"""Rejected record: {data['rejected_record']}"""
|
|
151
|
+
for error in data['errors']:
|
|
152
|
+
msg += f"- {error}\n"
|
|
153
|
+
msg += "\n"
|
|
154
|
+
|
|
155
|
+
return msg
|
|
156
|
+
|
|
157
|
+
{% if has_return_hint %}
|
|
158
|
+
def handle(session{{py_inputs}}, passed_engine=""):
|
|
159
|
+
{% else %}
|
|
160
|
+
def handle(session{{py_inputs}}, save_as_table="", passed_engine=""):
|
|
161
|
+
{% endif %}
|
|
162
|
+
{% if not has_return_hint %}
|
|
163
|
+
if not save_as_table:
|
|
164
|
+
raise ValueError("`save_as_table` must be provided.")
|
|
165
|
+
{% endif %}
|
|
166
|
+
try:
|
|
167
|
+
{{clean_inputs}}
|
|
168
|
+
engine = get_engine(session, passed_engine)
|
|
169
|
+
logging.debug(f"Using engine: {engine}")
|
|
170
|
+
rel_code = {{ rel_code }}
|
|
171
|
+
logging.debug(f"RelationalAI code: {rel_code}")
|
|
172
|
+
proc_database = {{ proc_database }}
|
|
173
|
+
logging.debug(f"Procedure database: {proc_database}")
|
|
174
|
+
APP_NAME = {{ APP_NAME }}
|
|
175
|
+
logging.debug(f"APP_NAME: {APP_NAME}")
|
|
176
|
+
database = {{ database }}
|
|
177
|
+
logging.debug(f"Model database: {database}")
|
|
178
|
+
sql_out_names = [{{ sql_out_names }}]
|
|
179
|
+
logging.debug(f"Output column names: {sql_out_names}")
|
|
180
|
+
table_name = f"{database[:30]}_{random_string()}"
|
|
181
|
+
temp_table = f"temp_{table_name}"
|
|
182
|
+
logging.debug(f"Created temporary table name: {temp_table}")
|
|
183
|
+
nowait_durable = True
|
|
184
|
+
skip_invalid_data = {{ skip_invalid_data }}
|
|
185
|
+
|
|
186
|
+
sources = "{{ source_references }}"
|
|
187
|
+
logging.debug(f"Using source references: {sources}")
|
|
188
|
+
wait_for_stream_sync = {{ wait_for_stream_sync }}
|
|
189
|
+
use_index_id = f"{proc_database}_{random_string()}"
|
|
190
|
+
sql_string = f"CALL {APP_NAME}.api.use_index([{sources}], {{'model': ?, 'engine': ?, 'wait_for_stream_sync': ?, 'use_index_id': ?}});"
|
|
191
|
+
logging.debug("Polling for graph index readiness...")
|
|
192
|
+
poll_with_specified_overhead(lambda: check_ready(session, sql_string, proc_database, engine, wait_for_stream_sync, use_index_id), overhead_rate=0.1, max_delay=1)
|
|
193
|
+
logging.debug("Graph index is ready")
|
|
194
|
+
install_code = '''
|
|
195
|
+
{{ install_code }}
|
|
196
|
+
'''
|
|
197
|
+
if install_code:
|
|
198
|
+
rel_code = install_code + "\n" + rel_code
|
|
199
|
+
# signature: exec_into_table(model, engine, query, table_name, readonly, nowait_durable)
|
|
200
|
+
res = run_sql(session, f"call {APP_NAME}.api.exec_into_table(?, ?, ?, ?, ?, ?, ?);", [proc_database, engine, rel_code, table_name, False, nowait_durable, skip_invalid_data], engine=engine)
|
|
201
|
+
rejected_rows = json.loads(res[0]["EXEC_INTO_TABLE"]).get("rejected_rows", [])
|
|
202
|
+
rejected_rows_count = json.loads(res[0]["EXEC_INTO_TABLE"]).get("rejected_rows_count", [])
|
|
203
|
+
logging.debug("Executed query into table")
|
|
204
|
+
|
|
205
|
+
logging.debug("Sampling output to determine schema...")
|
|
206
|
+
out_sample = run_sql(session, f"select * from {APP_NAME}.results.{table_name} limit 1;")
|
|
207
|
+
keys = set()
|
|
208
|
+
if out_sample:
|
|
209
|
+
keys = set([k.lower() for k in out_sample[0].as_dict().keys()])
|
|
210
|
+
logging.debug(f"Found output columns: {keys}")
|
|
211
|
+
else:
|
|
212
|
+
logging.debug("No output rows found in sample")
|
|
213
|
+
|
|
214
|
+
{% if has_return_hint %}
|
|
215
|
+
names = ", ".join([f"CAST(col{ix:03} as {type_name}) as \"{name}\"" if f"col{ix:03}" in keys else f"NULL as \"{name}\"" for (ix, (name, type_name)) in enumerate(sql_out_names)])
|
|
216
|
+
logging.debug(f"Delete result table and output table with columns: {names}")
|
|
217
|
+
return session.sql(f"""
|
|
218
|
+
BEGIN
|
|
219
|
+
let r resultset := (select {names} from {APP_NAME}.results.{table_name});
|
|
220
|
+
call {APP_NAME}.api.drop_result_table('{table_name}');
|
|
221
|
+
return table(r);
|
|
222
|
+
END;
|
|
223
|
+
""")
|
|
224
|
+
{% else %}
|
|
225
|
+
col_names_map = {}
|
|
226
|
+
for ix, name in enumerate(sql_out_names):
|
|
227
|
+
col_key = f"col{ix:03}"
|
|
228
|
+
col_names_map[col_key] = name
|
|
229
|
+
|
|
230
|
+
names = ", ".join([
|
|
231
|
+
f"{col_key} as {alias}" if col_key in keys else f"NULL as {alias}"
|
|
232
|
+
for col_key, alias in col_names_map.items()
|
|
233
|
+
])
|
|
234
|
+
logging.debug(f"Creating final output table with columns: {names}")
|
|
235
|
+
run_sql(session, f"create or replace table {save_as_table} as select {names} from {APP_NAME}.results.{table_name};", [], engine=engine)
|
|
236
|
+
logging.debug(f"Successfully wrote results to {save_as_table}")
|
|
237
|
+
if rejected_rows:
|
|
238
|
+
rejected_rows_formatted_msg = format_rejected_rows(rejected_rows, rejected_rows_count, col_names_map)
|
|
239
|
+
return f"Results written to {save_as_table} but {rejected_rows_formatted_msg}"
|
|
240
|
+
else:
|
|
241
|
+
return f"Results written to {save_as_table}"
|
|
242
|
+
{% endif %}
|
|
243
|
+
except Exception as e:
|
|
244
|
+
logging.debug(f"Error occurred: {str(e)}")
|
|
245
|
+
msg = str(e).lower()
|
|
246
|
+
if "no columns returned" in msg or "columns of results could not be determined" in msg:
|
|
247
|
+
logging.debug("No results returned - creating empty dataframe")
|
|
248
|
+
return session.createDataFrame([], StructType([{{ py_outs }}]))
|
|
249
|
+
raise e
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Factory function for creating Resources instances based on configuration.
|
|
3
|
+
|
|
4
|
+
This module provides a factory function that selects the appropriate Resources
|
|
5
|
+
class based on configuration settings (platform, use_direct_access, use_graph_index).
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
from typing import Union
|
|
9
|
+
from snowflake.snowpark import Session
|
|
10
|
+
|
|
11
|
+
from ...config import Config
|
|
12
|
+
from ...local import LocalResources
|
|
13
|
+
from . import Resources, DirectAccessResources, UseIndexResources
|
|
14
|
+
from ....tools.constants import USE_DIRECT_ACCESS, USE_GRAPH_INDEX, Generation
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def create_resources_instance(
|
|
18
|
+
config: Config | None = None,
|
|
19
|
+
profile: str | None = None,
|
|
20
|
+
dry_run: bool = False,
|
|
21
|
+
connection: Session | None = None,
|
|
22
|
+
reset_session: bool = False,
|
|
23
|
+
language: str = "rel",
|
|
24
|
+
generation: Generation = Generation.QB,
|
|
25
|
+
) -> Union[LocalResources, DirectAccessResources, UseIndexResources, Resources]:
|
|
26
|
+
"""
|
|
27
|
+
Factory function that creates the appropriate Resources instance based on config.
|
|
28
|
+
|
|
29
|
+
This function selects the Resources class based on:
|
|
30
|
+
1. Platform (local -> LocalResources)
|
|
31
|
+
2. use_direct_access flag (DirectAccessResources)
|
|
32
|
+
3. use_graph_index flag (UseIndexResources)
|
|
33
|
+
4. Default (base Resources)
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
config: Configuration object (optional, will create from profile if not provided)
|
|
37
|
+
profile: Profile name (optional, used if config is not provided)
|
|
38
|
+
dry_run: Whether to run in dry-run mode (default: False)
|
|
39
|
+
connection: Optional Snowflake session connection
|
|
40
|
+
reset_session: Whether to reset the session (default: False)
|
|
41
|
+
language: Language for the resources instance (default: "rel")
|
|
42
|
+
generation: Generation for the resources instance (default: Generation.QB)
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Appropriate Resources instance based on config settings:
|
|
46
|
+
- LocalResources if platform is "local"
|
|
47
|
+
- DirectAccessResources if use_direct_access is enabled
|
|
48
|
+
- UseIndexResources if use_graph_index is enabled
|
|
49
|
+
- Resources (base) otherwise
|
|
50
|
+
"""
|
|
51
|
+
# Create config from profile if not provided
|
|
52
|
+
if config is None:
|
|
53
|
+
config = Config(profile)
|
|
54
|
+
|
|
55
|
+
platform = config.get("platform", "")
|
|
56
|
+
if platform == "local":
|
|
57
|
+
return LocalResources(
|
|
58
|
+
profile=profile,
|
|
59
|
+
config=config,
|
|
60
|
+
dry_run=dry_run,
|
|
61
|
+
generation=generation,
|
|
62
|
+
connection=connection,
|
|
63
|
+
reset_session=reset_session,
|
|
64
|
+
language=language,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if config.get("use_direct_access", USE_DIRECT_ACCESS):
|
|
68
|
+
return DirectAccessResources(
|
|
69
|
+
profile=profile,
|
|
70
|
+
config=config,
|
|
71
|
+
dry_run=dry_run,
|
|
72
|
+
generation=generation,
|
|
73
|
+
connection=connection,
|
|
74
|
+
reset_session=reset_session,
|
|
75
|
+
language=language,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if config.get("use_graph_index", USE_GRAPH_INDEX):
|
|
79
|
+
return UseIndexResources(
|
|
80
|
+
profile=profile,
|
|
81
|
+
config=config,
|
|
82
|
+
dry_run=dry_run,
|
|
83
|
+
generation=generation,
|
|
84
|
+
connection=connection,
|
|
85
|
+
reset_session=reset_session,
|
|
86
|
+
language=language,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return Resources(
|
|
90
|
+
profile=profile,
|
|
91
|
+
config=config,
|
|
92
|
+
dry_run=dry_run,
|
|
93
|
+
generation=generation,
|
|
94
|
+
connection=connection,
|
|
95
|
+
reset_session=reset_session,
|
|
96
|
+
language=language,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|