relationalai 0.13.0.dev0__py3-none-any.whl → 0.13.1__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 +912 -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 +571 -0
- relationalai/clients/profile_polling.py +73 -0
- relationalai/clients/resources/__init__.py +8 -0
- relationalai/clients/resources/azure/azure.py +477 -0
- relationalai/clients/resources/snowflake/__init__.py +20 -0
- relationalai/clients/resources/snowflake/cli_resources.py +87 -0
- relationalai/clients/resources/snowflake/direct_access_resources.py +694 -0
- relationalai/clients/resources/snowflake/engine_state_handlers.py +309 -0
- relationalai/clients/resources/snowflake/error_handlers.py +199 -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 +3190 -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 +113 -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 +1395 -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 +1936 -0
- relationalai/tools/cli_controls.py +1826 -0
- relationalai/tools/cli_helpers.py +398 -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.1.dist-info/METADATA +74 -0
- relationalai-0.13.1.dist-info/RECORD +459 -0
- relationalai-0.13.1.dist-info/WHEEL +4 -0
- relationalai-0.13.1.dist-info/entry_points.txt +3 -0
- relationalai-0.13.1.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,571 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import base64
|
|
4
|
+
import json
|
|
5
|
+
from urllib.parse import quote, urlencode
|
|
6
|
+
import pyarrow as pa
|
|
7
|
+
import requests
|
|
8
|
+
from email import message_from_bytes, policy
|
|
9
|
+
from email.message import EmailMessage
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Any, Dict, List, Iterable, Literal, Optional, Tuple, Union
|
|
13
|
+
from requests.adapters import HTTPAdapter
|
|
14
|
+
from urllib3.util.retry import Retry
|
|
15
|
+
|
|
16
|
+
from .client import ResourcesBase, ProviderBase
|
|
17
|
+
from .config import Config
|
|
18
|
+
from .types import TransactionAsyncResponse
|
|
19
|
+
from .util import get_pyrel_version
|
|
20
|
+
from ..errors import ResponseStatusException
|
|
21
|
+
from .. import debugging
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class Endpoint:
|
|
25
|
+
method: str
|
|
26
|
+
endpoint: str
|
|
27
|
+
|
|
28
|
+
TXN_ABORT_REASON_TIMEOUT = "QUERY_TIMEOUT_EXCEEDED"
|
|
29
|
+
|
|
30
|
+
class LocalClient:
|
|
31
|
+
|
|
32
|
+
def __init__(self, host: str, port: int):
|
|
33
|
+
self.service_endpoint = f"http://{host}:{port}"
|
|
34
|
+
self.endpoints: Dict[str, Endpoint] = {
|
|
35
|
+
"create_txn": Endpoint(method="POST", endpoint="/transactions"), # API for creating a (query) transaction
|
|
36
|
+
"create_db": Endpoint(method="POST", endpoint="/v2/<local_org>/<local_account>/databases"), # API for creating a database
|
|
37
|
+
}
|
|
38
|
+
self.http_session = self._create_retry_session()
|
|
39
|
+
|
|
40
|
+
def _create_retry_session(self) -> requests.Session:
|
|
41
|
+
http_session = requests.Session()
|
|
42
|
+
retries = Retry(
|
|
43
|
+
total=3,
|
|
44
|
+
backoff_factor=0.3,
|
|
45
|
+
status_forcelist=[500, 502, 503, 504],
|
|
46
|
+
allowed_methods=frozenset({"GET", "POST", "PUT", "DELETE"}),
|
|
47
|
+
raise_on_status=False
|
|
48
|
+
)
|
|
49
|
+
adapter = HTTPAdapter(max_retries=retries)
|
|
50
|
+
http_session.mount("http://", adapter)
|
|
51
|
+
http_session.mount("https://", adapter)
|
|
52
|
+
http_session.headers.update({
|
|
53
|
+
"Connection": "keep-alive",
|
|
54
|
+
"Accept": "application/json",
|
|
55
|
+
"user-agent": get_pyrel_version(None)
|
|
56
|
+
})
|
|
57
|
+
return http_session
|
|
58
|
+
|
|
59
|
+
def request(
|
|
60
|
+
self,
|
|
61
|
+
endpoint: str,
|
|
62
|
+
payload: Dict[str, Any] | None = None,
|
|
63
|
+
headers: Dict[str, str] | None = None,
|
|
64
|
+
path_params: Dict[str, str] | None = None,
|
|
65
|
+
query_params: Dict[str, str] | None = None,
|
|
66
|
+
) -> requests.Response:
|
|
67
|
+
with debugging.span("local_request"):
|
|
68
|
+
url, method = self._prepare_url(endpoint, path_params, query_params)
|
|
69
|
+
request_headers = self._prepare_headers(headers)
|
|
70
|
+
return self.http_session.request(method, url, json=payload, headers=request_headers)
|
|
71
|
+
|
|
72
|
+
def _prepare_url(self, endpoint: str, path_params: Dict[str, str] | None = None, query_params: Dict[str, str] | None = None) -> Tuple[str, str]:
|
|
73
|
+
try:
|
|
74
|
+
ep = self.endpoints[endpoint]
|
|
75
|
+
except KeyError:
|
|
76
|
+
raise ValueError(f"Invalid endpoint: {endpoint}. Available endpoints: {list(self.endpoints.keys())}")
|
|
77
|
+
url = f"{self.service_endpoint}{ep.endpoint}"
|
|
78
|
+
if path_params:
|
|
79
|
+
escaped_path_params = {k: quote(v, safe='') for k, v in path_params.items()}
|
|
80
|
+
url = url.format(**escaped_path_params)
|
|
81
|
+
if query_params:
|
|
82
|
+
url += '?' + urlencode(query_params)
|
|
83
|
+
return url, ep.method
|
|
84
|
+
|
|
85
|
+
def _prepare_headers(self, headers: Dict[str, str] | None) -> Dict[str, str]:
|
|
86
|
+
request_headers = {}
|
|
87
|
+
if headers:
|
|
88
|
+
request_headers.update(headers)
|
|
89
|
+
return request_headers
|
|
90
|
+
|
|
91
|
+
class LocalResources(ResourcesBase):
|
|
92
|
+
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
profile: str | None = None,
|
|
96
|
+
config: Config | None = None,
|
|
97
|
+
connection: Any | None = None,
|
|
98
|
+
dry_run: bool = False,
|
|
99
|
+
reset_session: bool = False,
|
|
100
|
+
generation: Any | None = None,
|
|
101
|
+
language: str = "lqp",
|
|
102
|
+
):
|
|
103
|
+
super().__init__(config=config)
|
|
104
|
+
self.language = language
|
|
105
|
+
|
|
106
|
+
host = self.config.get("host", None) or "localhost"
|
|
107
|
+
port = int(self.config.get("port", None) or 8010)
|
|
108
|
+
self.client = LocalClient(host, port)
|
|
109
|
+
|
|
110
|
+
# Keep track of whether we already created the local database to run on.
|
|
111
|
+
self._db_created = False
|
|
112
|
+
|
|
113
|
+
def reset(self):
|
|
114
|
+
raise NotImplementedError("reset not supported in local mode")
|
|
115
|
+
|
|
116
|
+
#--------------------------------------------------
|
|
117
|
+
# Check direct access is enabled (0 implemented)
|
|
118
|
+
#--------------------------------------------------
|
|
119
|
+
|
|
120
|
+
def is_direct_access_enabled(self) -> bool:
|
|
121
|
+
raise NotImplementedError("is_direct_access_enabled not supported in local mode")
|
|
122
|
+
|
|
123
|
+
#--------------------------------------------------
|
|
124
|
+
# Snowflake Account Flags (0 implemented)
|
|
125
|
+
#--------------------------------------------------
|
|
126
|
+
|
|
127
|
+
def is_account_flag_set(self, flag: str) -> bool:
|
|
128
|
+
raise NotImplementedError("is_account_flag_set not supported in local mode")
|
|
129
|
+
|
|
130
|
+
#--------------------------------------------------
|
|
131
|
+
# Databases (0 implemented)
|
|
132
|
+
#--------------------------------------------------
|
|
133
|
+
|
|
134
|
+
def get_database(self, database: str):
|
|
135
|
+
raise NotImplementedError("get_database not supported in local mode")
|
|
136
|
+
|
|
137
|
+
def get_installed_packages(self, database: str):
|
|
138
|
+
raise NotImplementedError("get_installed_packages not supported in local mode")
|
|
139
|
+
|
|
140
|
+
def _create_database(self, name:str):
|
|
141
|
+
with debugging.span("create_database"):
|
|
142
|
+
response = self.client.request(
|
|
143
|
+
endpoint="create_db",
|
|
144
|
+
payload = {
|
|
145
|
+
"language": "lqp",
|
|
146
|
+
"readonly": False,
|
|
147
|
+
"database_id": name,
|
|
148
|
+
"transaction_id": "mock_txn_id:create-db",
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
if response.status_code != 200:
|
|
152
|
+
raise ResponseStatusException("Failed to create database in local mode.", response)
|
|
153
|
+
|
|
154
|
+
parsed_response = self._parse_txn_response(response)
|
|
155
|
+
|
|
156
|
+
state = parsed_response["state"]
|
|
157
|
+
if state != "COMPLETED":
|
|
158
|
+
# NOTE for now we just ignore it when the database creation transaction
|
|
159
|
+
# aborts. In most cases where this happens, it is because the database
|
|
160
|
+
# already exists. If it doesn't, we'll fail later on anyways.
|
|
161
|
+
pass
|
|
162
|
+
|
|
163
|
+
return parsed_response
|
|
164
|
+
|
|
165
|
+
#--------------------------------------------------
|
|
166
|
+
# Engines (0 implemented)
|
|
167
|
+
#--------------------------------------------------
|
|
168
|
+
|
|
169
|
+
def get_version(self):
|
|
170
|
+
raise NotImplementedError("get_version not supported in local mode")
|
|
171
|
+
|
|
172
|
+
def get_engine_sizes(self, cloud_provider: str | None = None):
|
|
173
|
+
raise NotImplementedError("get_engine_sizes not supported in local mode")
|
|
174
|
+
|
|
175
|
+
def list_engines(self, state: str | None = None):
|
|
176
|
+
raise NotImplementedError("list_engines not supported in local mode")
|
|
177
|
+
|
|
178
|
+
def get_engine(self, name: str):
|
|
179
|
+
raise NotImplementedError("get_engine not supported in local mode")
|
|
180
|
+
|
|
181
|
+
def get_cloud_provider(self) -> str:
|
|
182
|
+
raise NotImplementedError("get_cloud_provider not supported in local mode")
|
|
183
|
+
|
|
184
|
+
def is_valid_engine_state(self, name: str) -> bool:
|
|
185
|
+
raise NotImplementedError("is_valid_engine_state not supported in local mode")
|
|
186
|
+
|
|
187
|
+
def create_engine(self, name: str, size:str|None=None, auto_suspend_mins:int|None=None):
|
|
188
|
+
raise NotImplementedError("create_engine not supported in local mode")
|
|
189
|
+
|
|
190
|
+
def delete_engine(self, name: str, force: bool = False):
|
|
191
|
+
raise NotImplementedError("delete_engine not supported in local mode")
|
|
192
|
+
|
|
193
|
+
def suspend_engine(self, name: str):
|
|
194
|
+
raise NotImplementedError("suspend_engine not supported in local mode")
|
|
195
|
+
|
|
196
|
+
def resume_engine(self, name: str, headers: Dict | None = None):
|
|
197
|
+
raise NotImplementedError("resume_engine not supported in local mode")
|
|
198
|
+
|
|
199
|
+
def resume_engine_async(self, name: str):
|
|
200
|
+
raise NotImplementedError("resume_engine_async not supported in local mode")
|
|
201
|
+
|
|
202
|
+
def alter_engine_pool(self, size: str | None = None, mins: int | None = None, maxs: int | None = None):
|
|
203
|
+
raise NotImplementedError("alter_engine_pool not supported in local mode")
|
|
204
|
+
|
|
205
|
+
def auto_create_engine_async(self, name: str | None = None) -> str:
|
|
206
|
+
raise NotImplementedError("auto_create_engine_async not supported in local mode")
|
|
207
|
+
|
|
208
|
+
#--------------------------------------------------
|
|
209
|
+
# Graphs (0 implemented)
|
|
210
|
+
#--------------------------------------------------
|
|
211
|
+
|
|
212
|
+
def list_graphs(self):
|
|
213
|
+
raise NotImplementedError("list_graphs not supported in local mode")
|
|
214
|
+
|
|
215
|
+
def get_graph(self, name: str):
|
|
216
|
+
raise NotImplementedError("get_graph not supported in local mode")
|
|
217
|
+
|
|
218
|
+
def create_graph(self, name: str):
|
|
219
|
+
raise NotImplementedError("create_graph not supported in local mode")
|
|
220
|
+
|
|
221
|
+
def delete_graph(self, name: str, force=False, language: str = "lqp"):
|
|
222
|
+
# NOTE There is no way to delete a local graph at the moment, which is documented in
|
|
223
|
+
# the README. This function will get called in regular usage, so for now we just
|
|
224
|
+
# silently do nothing.
|
|
225
|
+
return None
|
|
226
|
+
|
|
227
|
+
def clone_graph(self, target_name: str, source_name: str, nowait_durable: bool = True):
|
|
228
|
+
raise NotImplementedError("clone_graph not supported in local mode")
|
|
229
|
+
|
|
230
|
+
def maybe_poll_use_index(
|
|
231
|
+
self,
|
|
232
|
+
app_name: str,
|
|
233
|
+
sources: Iterable[str],
|
|
234
|
+
model: str,
|
|
235
|
+
engine_name: str,
|
|
236
|
+
engine_size: str | None = None,
|
|
237
|
+
program_span_id: str | None = None,
|
|
238
|
+
headers: Dict | None = None,
|
|
239
|
+
):
|
|
240
|
+
# Snowflake sources are not supported in local mode.
|
|
241
|
+
if len(list(sources)) != 0:
|
|
242
|
+
raise NotImplementedError("Snowflake sources are not supported in local mode")
|
|
243
|
+
|
|
244
|
+
# Nothing to do for local mode if the database was already created.
|
|
245
|
+
if self._db_created:
|
|
246
|
+
return
|
|
247
|
+
|
|
248
|
+
self._create_database(model)
|
|
249
|
+
self._db_created = True
|
|
250
|
+
|
|
251
|
+
#--------------------------------------------------
|
|
252
|
+
# Models (0 implemented)
|
|
253
|
+
#--------------------------------------------------
|
|
254
|
+
|
|
255
|
+
def list_models(self, database: str, engine: str):
|
|
256
|
+
raise NotImplementedError("list_models not supported in local mode")
|
|
257
|
+
|
|
258
|
+
def create_models(self, database: str, engine: str, models):
|
|
259
|
+
raise NotImplementedError("create_models not supported in local mode")
|
|
260
|
+
|
|
261
|
+
def delete_model(self, database: str, engine: str, name: str):
|
|
262
|
+
raise NotImplementedError("delete_model not supported in local mode")
|
|
263
|
+
|
|
264
|
+
def create_models_code(self, models):
|
|
265
|
+
raise NotImplementedError("create_models_code not supported in local mode")
|
|
266
|
+
|
|
267
|
+
#--------------------------------------------------
|
|
268
|
+
# Exports (0 implemented)
|
|
269
|
+
#--------------------------------------------------
|
|
270
|
+
|
|
271
|
+
def list_exports(self, database: str, engine: str):
|
|
272
|
+
raise NotImplementedError("list_exports not supported in local mode")
|
|
273
|
+
|
|
274
|
+
def create_export(self, params):
|
|
275
|
+
raise NotImplementedError("create_export not supported in local mode")
|
|
276
|
+
|
|
277
|
+
def create_export_table(self, database: str, engine: str, table: str, relation: str, columns: Dict[str, str], code: str, refresh: str | None = None):
|
|
278
|
+
raise NotImplementedError("create_export_table not supported in local mode")
|
|
279
|
+
|
|
280
|
+
def delete_export(self, database: str, engine: str, name: str):
|
|
281
|
+
raise NotImplementedError("delete_export not supported in local mode")
|
|
282
|
+
|
|
283
|
+
#--------------------------------------------------
|
|
284
|
+
# Imports (0 implemented)
|
|
285
|
+
#--------------------------------------------------
|
|
286
|
+
|
|
287
|
+
def get_import_stream(self, name: str | None, model: str | None):
|
|
288
|
+
raise NotImplementedError("get_import_stream not supported in local mode")
|
|
289
|
+
|
|
290
|
+
def change_stream_status(self, stream_id: str, model: str, suspend: bool):
|
|
291
|
+
raise NotImplementedError("change_stream_status not supported in local mode")
|
|
292
|
+
|
|
293
|
+
def change_imports_status(self, suspend: bool):
|
|
294
|
+
raise NotImplementedError("change_imports_status not supported in local mode")
|
|
295
|
+
|
|
296
|
+
def get_imports_status(self):
|
|
297
|
+
raise NotImplementedError("get_imports_status not supported in local mode")
|
|
298
|
+
|
|
299
|
+
def set_imports_engine_size(self, size: str):
|
|
300
|
+
raise NotImplementedError("set_imports_engine_size not supported in local mode")
|
|
301
|
+
|
|
302
|
+
def list_imports(self, id: str | None = None, name: str | None = None, model: str | None = None, status: str | None = None, creator: str | None = None):
|
|
303
|
+
raise NotImplementedError("list_imports not supported in local mode")
|
|
304
|
+
|
|
305
|
+
def poll_imports(self, sources, model: str):
|
|
306
|
+
raise NotImplementedError("poll_imports not supported in local mode")
|
|
307
|
+
|
|
308
|
+
def create_import_stream(self, source, model: str, rate: int | None = None, options: dict | None = None):
|
|
309
|
+
raise NotImplementedError("create_import_stream not supported in local mode")
|
|
310
|
+
|
|
311
|
+
def create_import_snapshot(self, source, model: str, options: dict | None):
|
|
312
|
+
raise NotImplementedError("create_import_snapshot not supported in local mode")
|
|
313
|
+
|
|
314
|
+
def delete_import(self, import_name: str, model: str, force=False):
|
|
315
|
+
raise NotImplementedError("delete_import not supported in local mode")
|
|
316
|
+
|
|
317
|
+
#--------------------------------------------------
|
|
318
|
+
# Exec Async
|
|
319
|
+
#--------------------------------------------------
|
|
320
|
+
|
|
321
|
+
def _parse_multipart_response(self, response: requests.Response) -> Dict[str, Any]:
|
|
322
|
+
response_map = {}
|
|
323
|
+
response_map['results'] = {}
|
|
324
|
+
|
|
325
|
+
content_type = response.headers.get("Content-Type")
|
|
326
|
+
if not content_type:
|
|
327
|
+
raise ValueError("Missing Content-Type header")
|
|
328
|
+
|
|
329
|
+
# Parse using Python's email module
|
|
330
|
+
# Construct a proper MIME message with headers
|
|
331
|
+
mime_content = f"Content-Type: {content_type}\r\n\r\n".encode('utf-8') + response.content
|
|
332
|
+
msg: EmailMessage = message_from_bytes(mime_content, policy=policy.default) # type: ignore[assignment]
|
|
333
|
+
|
|
334
|
+
if not msg.is_multipart():
|
|
335
|
+
raise ValueError("Response is not multipart")
|
|
336
|
+
|
|
337
|
+
for part in msg.iter_parts():
|
|
338
|
+
part_content_type = part.get_content_type() or 'application/octet-stream'
|
|
339
|
+
part_content: bytes = part.get_payload(decode=True) # type: ignore[assignment]
|
|
340
|
+
|
|
341
|
+
# Extract disposition info
|
|
342
|
+
disposition = part.get('Content-Disposition', '')
|
|
343
|
+
part_name = None
|
|
344
|
+
part_filename = None
|
|
345
|
+
if disposition:
|
|
346
|
+
params = {}
|
|
347
|
+
for param_str in disposition.split(';')[1:]:
|
|
348
|
+
if '=' in param_str:
|
|
349
|
+
key, val = param_str.strip().split('=', 1)
|
|
350
|
+
params[key] = val.strip('"')
|
|
351
|
+
part_name = params.get('name')
|
|
352
|
+
part_filename = params.get('filename')
|
|
353
|
+
|
|
354
|
+
if 'json' in part_content_type.lower() and not part_filename:
|
|
355
|
+
# JSON part (no filename)
|
|
356
|
+
try:
|
|
357
|
+
response_map[part_name] = json.loads(part_content.decode('utf-8'))
|
|
358
|
+
except json.JSONDecodeError as e:
|
|
359
|
+
raise ValueError(f"Failed to decode JSON part: {e}")
|
|
360
|
+
|
|
361
|
+
elif part_filename:
|
|
362
|
+
# File/attachment part
|
|
363
|
+
response_map['results'][part_filename] = {
|
|
364
|
+
'name': part_name,
|
|
365
|
+
'filename': part_filename,
|
|
366
|
+
'content': part_content,
|
|
367
|
+
'content_type': part_content_type
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return response_map
|
|
371
|
+
|
|
372
|
+
def _parse_txn_response(self, get_txn_response: requests.Response) -> Dict[str, Any]:
|
|
373
|
+
with debugging.span("parse_txn_response"):
|
|
374
|
+
response_content_type = get_txn_response.headers.get("Content-Type", "")
|
|
375
|
+
if "application/json" in response_content_type:
|
|
376
|
+
parsed_response = get_txn_response.json()
|
|
377
|
+
elif "multipart/form-data" in response_content_type:
|
|
378
|
+
parsed_response = self._parse_multipart_response(get_txn_response)
|
|
379
|
+
state = parsed_response.get('transaction', {}).get('state', None)
|
|
380
|
+
parsed_response['state'] = state
|
|
381
|
+
txn_id = parsed_response.get('transaction', {}).get('id', None)
|
|
382
|
+
parsed_response['id'] = txn_id
|
|
383
|
+
else:
|
|
384
|
+
raise Exception(f"Unsupported Response Content Type:, {response_content_type}")
|
|
385
|
+
return parsed_response
|
|
386
|
+
|
|
387
|
+
def _create_transaction(
|
|
388
|
+
self,
|
|
389
|
+
target_endpoint: str,
|
|
390
|
+
payload: Dict[str, Any] | None = None,
|
|
391
|
+
headers: Dict[str, str] | None = None,
|
|
392
|
+
path_params: Dict[str, str] | None = None,
|
|
393
|
+
query_params: Dict[str, str] | None = None
|
|
394
|
+
) -> Dict[str, Any]:
|
|
395
|
+
with debugging.span("transaction"):
|
|
396
|
+
response = self.client.request(
|
|
397
|
+
target_endpoint,
|
|
398
|
+
path_params=path_params,
|
|
399
|
+
query_params=query_params,
|
|
400
|
+
payload=payload,
|
|
401
|
+
headers=headers,
|
|
402
|
+
)
|
|
403
|
+
assert response, "No results from create transaction request."
|
|
404
|
+
if response.status_code not in [200, 201]:
|
|
405
|
+
raise ResponseStatusException("Failed to create transaction.", response)
|
|
406
|
+
|
|
407
|
+
return self._parse_txn_response(response)
|
|
408
|
+
|
|
409
|
+
def _convert_txn_response(self, parsed_response: Dict[str, Any]) -> TransactionAsyncResponse:
|
|
410
|
+
results = []
|
|
411
|
+
for (file_name, file_info) in parsed_response.get("results", {}).items():
|
|
412
|
+
if not file_name.endswith(".arrow"):
|
|
413
|
+
continue
|
|
414
|
+
with pa.ipc.open_stream(file_info["content"]) as reader:
|
|
415
|
+
schema = reader.schema
|
|
416
|
+
batches = [batch for batch in reader]
|
|
417
|
+
table = pa.Table.from_batches(batches=batches, schema=schema)
|
|
418
|
+
results.append({"relationId": file_info["name"], "table": table})
|
|
419
|
+
|
|
420
|
+
rsp = TransactionAsyncResponse()
|
|
421
|
+
rsp.transaction = {
|
|
422
|
+
"id": parsed_response["id"],
|
|
423
|
+
"state": parsed_response["state"]
|
|
424
|
+
}
|
|
425
|
+
rsp.results = results
|
|
426
|
+
rsp.metadata = parsed_response.get("metadata", [])
|
|
427
|
+
rsp.problems = parsed_response.get("problems", [])
|
|
428
|
+
|
|
429
|
+
return rsp
|
|
430
|
+
|
|
431
|
+
def _exec_async_v2(
|
|
432
|
+
self,
|
|
433
|
+
database: str,
|
|
434
|
+
engine: Union[str, None],
|
|
435
|
+
raw_code: str,
|
|
436
|
+
inputs: Dict | None = None,
|
|
437
|
+
readonly=True,
|
|
438
|
+
nowait_durable=False,
|
|
439
|
+
headers: Dict[str, str] | None = None,
|
|
440
|
+
bypass_index=False,
|
|
441
|
+
language: str = "lqp",
|
|
442
|
+
query_timeout_mins: int | None = None,
|
|
443
|
+
):
|
|
444
|
+
payload = {
|
|
445
|
+
"engine_name": engine,
|
|
446
|
+
"dbname": database,
|
|
447
|
+
"query": raw_code,
|
|
448
|
+
"language": "lqp",
|
|
449
|
+
"readonly": readonly,
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
parsed_response = self._create_transaction(
|
|
453
|
+
target_endpoint="create_txn",
|
|
454
|
+
payload=payload,
|
|
455
|
+
headers=headers
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
state = parsed_response["state"]
|
|
459
|
+
if state not in ["COMPLETED", "ABORTED"]:
|
|
460
|
+
# Local mode only supports synchronous transactions for now.
|
|
461
|
+
txn_id = parsed_response["id"]
|
|
462
|
+
raise Exception(f"Transaction {txn_id} did not complete or abort synchronously (state = {state}).")
|
|
463
|
+
|
|
464
|
+
return self._convert_txn_response(parsed_response)
|
|
465
|
+
|
|
466
|
+
#--------------------------------------------------
|
|
467
|
+
# Exec (1 implemented, others are stubs)
|
|
468
|
+
#--------------------------------------------------
|
|
469
|
+
|
|
470
|
+
def exec_lqp(
|
|
471
|
+
self,
|
|
472
|
+
database: str,
|
|
473
|
+
engine: str | None,
|
|
474
|
+
raw_code: bytes,
|
|
475
|
+
readonly=True,
|
|
476
|
+
*,
|
|
477
|
+
inputs: Dict | None = None,
|
|
478
|
+
nowait_durable=False,
|
|
479
|
+
headers: Dict | None = None,
|
|
480
|
+
bypass_index=False,
|
|
481
|
+
query_timeout_mins: int | None = None,
|
|
482
|
+
):
|
|
483
|
+
raw_code_b64 = base64.b64encode(raw_code).decode("utf-8")
|
|
484
|
+
return self._exec_async_v2(
|
|
485
|
+
database, engine, raw_code_b64, inputs, readonly, nowait_durable,
|
|
486
|
+
headers=headers, bypass_index=bypass_index, language='lqp',
|
|
487
|
+
query_timeout_mins=query_timeout_mins,
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
def exec_raw(
|
|
491
|
+
self,
|
|
492
|
+
database: str,
|
|
493
|
+
engine: str | None,
|
|
494
|
+
raw_code: str,
|
|
495
|
+
readonly: bool = True,
|
|
496
|
+
*,
|
|
497
|
+
inputs: Dict | None = None,
|
|
498
|
+
nowait_durable: bool = False,
|
|
499
|
+
headers: Dict | None = None,
|
|
500
|
+
query_timeout_mins: Optional[int] = None,
|
|
501
|
+
):
|
|
502
|
+
raise NotImplementedError("exec_raw not supported in local mode - use exec_lqp instead")
|
|
503
|
+
|
|
504
|
+
def exec_format(self, database: str, engine: str, raw_code: str, cols: List[str], format:str, inputs: Dict | None = None, readonly: bool = True, nowait_durable=False, skip_invalid_data=False, headers: Dict | None = None, query_timeout_mins: int | None = None) -> Any:
|
|
505
|
+
raise NotImplementedError("exec_format not supported in local mode")
|
|
506
|
+
|
|
507
|
+
def format_results(self, results, task=None):
|
|
508
|
+
raise NotImplementedError("format_results not supported in local mode")
|
|
509
|
+
|
|
510
|
+
def to_model_type(self, model, name: str, source: str):
|
|
511
|
+
raise NotImplementedError("to_model_type not supported in local mode")
|
|
512
|
+
|
|
513
|
+
def _exec(self, code: str, params=None, raw=False, help=True):
|
|
514
|
+
raise NotImplementedError("_exec not supported in local mode")
|
|
515
|
+
|
|
516
|
+
#--------------------------------------------------
|
|
517
|
+
# Transactions (0 implemented)
|
|
518
|
+
#--------------------------------------------------
|
|
519
|
+
|
|
520
|
+
def get_transaction(self, transaction_id: str):
|
|
521
|
+
raise NotImplementedError("get_transaction not supported in local mode")
|
|
522
|
+
|
|
523
|
+
def list_transactions(self, *, limit: int, only_active=False, **kwargs):
|
|
524
|
+
raise NotImplementedError("list_transactions not supported in local mode")
|
|
525
|
+
|
|
526
|
+
def cancel_transaction(self, transaction_id: str):
|
|
527
|
+
raise NotImplementedError("cancel_transaction not supported in local mode")
|
|
528
|
+
|
|
529
|
+
def cancel_pending_transactions(self):
|
|
530
|
+
raise NotImplementedError("cancel_pending_transactions not supported in local mode")
|
|
531
|
+
|
|
532
|
+
def get_transaction_events(self, transaction_id: str, continuation_token: str):
|
|
533
|
+
raise NotImplementedError("get_transaction_events not supported in local mode")
|
|
534
|
+
|
|
535
|
+
class LocalProvider(ProviderBase):
|
|
536
|
+
|
|
537
|
+
def __init__(
|
|
538
|
+
self,
|
|
539
|
+
host: str = "localhost",
|
|
540
|
+
port: int = 8010,
|
|
541
|
+
profile: str | None = None,
|
|
542
|
+
config: Config | None = None,
|
|
543
|
+
resources: LocalResources | None = None,
|
|
544
|
+
):
|
|
545
|
+
if resources:
|
|
546
|
+
self.resources = resources
|
|
547
|
+
else:
|
|
548
|
+
self.resources = LocalResources(
|
|
549
|
+
profile=profile,
|
|
550
|
+
config=config,
|
|
551
|
+
connection=None,
|
|
552
|
+
dry_run=False,
|
|
553
|
+
reset_session=False,
|
|
554
|
+
generation=None,
|
|
555
|
+
language="lqp",
|
|
556
|
+
)
|
|
557
|
+
self.config = self.resources.config
|
|
558
|
+
|
|
559
|
+
# A mock sql function that simulates SQL execution for the LocalProvider. This is only
|
|
560
|
+
# here to make the test suite pass.
|
|
561
|
+
def sql(self, query: str, params: List[Any] = [], format: Literal["list", "pandas", "polars", "lazy"] = "list"):
|
|
562
|
+
if format == "list":
|
|
563
|
+
# Used by "test_snapshot_abstract.py"
|
|
564
|
+
import re
|
|
565
|
+
pattern = r"\s*SELECT EXISTS\(\s*SELECT 1\s*FROM (\w+)\.INFORMATION_SCHEMA\.TABLES\s*WHERE TABLE_SCHEMA = '(\w+)'\s*AND TABLE_NAME = '(\w+)'\s*\) AS TABLE_EXISTS;\s*"
|
|
566
|
+
query_cleaned = query.replace("\n", " ").replace(" ", " ")
|
|
567
|
+
match_obj = re.match(pattern, query_cleaned, re.DOTALL)
|
|
568
|
+
if match_obj:
|
|
569
|
+
return [{"TABLE_EXISTS": False}]
|
|
570
|
+
else:
|
|
571
|
+
raise NotImplementedError("Only specific SQL queries are defined in local mode.")
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
import logging
|
|
3
|
+
from queue import Queue
|
|
4
|
+
import threading
|
|
5
|
+
import time
|
|
6
|
+
import traceback
|
|
7
|
+
from typing import Union
|
|
8
|
+
|
|
9
|
+
from relationalai import debugging
|
|
10
|
+
from relationalai.clients.client import ResourcesBase
|
|
11
|
+
|
|
12
|
+
PROFILE_POLL_SLEEP_S = 1.5
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class ProfilePollingItem:
|
|
16
|
+
txn_id: str
|
|
17
|
+
continuation_token: str
|
|
18
|
+
|
|
19
|
+
# using None as a sentinel value in the queue to indicate
|
|
20
|
+
# that it's shutting down
|
|
21
|
+
SHUTTING_DOWN = None
|
|
22
|
+
|
|
23
|
+
class ProfilePollerHandler(logging.Handler):
|
|
24
|
+
"""
|
|
25
|
+
A handler which sees transaction start events come over the log stream,
|
|
26
|
+
starts polling for profile events for each transaction, and puts them into
|
|
27
|
+
the same stream.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self, resources: ResourcesBase):
|
|
31
|
+
super().__init__()
|
|
32
|
+
self.resources = resources
|
|
33
|
+
self.queue = Queue[Union[ProfilePollingItem,None]]()
|
|
34
|
+
|
|
35
|
+
# daemon thread so it doesn't keep the process alive forever
|
|
36
|
+
self.thread = threading.Thread(target=self._polling_loop, daemon=True)
|
|
37
|
+
self.thread.start()
|
|
38
|
+
|
|
39
|
+
def emit(self, record):
|
|
40
|
+
if (isinstance(record.msg, dict) and
|
|
41
|
+
record.msg["event"] == "span_start"):
|
|
42
|
+
span = record.msg["span"]
|
|
43
|
+
if span.type == "wait" and span.parent.type == "transaction":
|
|
44
|
+
txn_id = record.msg["span"].attrs["txn_id"]
|
|
45
|
+
self.queue.put(ProfilePollingItem(txn_id, ""))
|
|
46
|
+
|
|
47
|
+
def _polling_loop(self):
|
|
48
|
+
while True:
|
|
49
|
+
try:
|
|
50
|
+
item = self.queue.get()
|
|
51
|
+
if item is SHUTTING_DOWN:
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
assert item is not None
|
|
55
|
+
resp = self.resources.get_transaction_events(item.txn_id, item.continuation_token)
|
|
56
|
+
|
|
57
|
+
debugging.event('profile_events', txn_id=item.txn_id, profile_events=resp['events'])
|
|
58
|
+
|
|
59
|
+
continuation_token = resp['continuation_token']
|
|
60
|
+
if continuation_token != '':
|
|
61
|
+
self.queue.put(ProfilePollingItem(item.txn_id, continuation_token))
|
|
62
|
+
except Exception as e:
|
|
63
|
+
debugging.error(e)
|
|
64
|
+
print('Error polling profile events:', e)
|
|
65
|
+
traceback.print_exc()
|
|
66
|
+
|
|
67
|
+
# If multiple txns are running concurrently, a given one of them may be polled
|
|
68
|
+
# at a longer interval than PROFILE_POLL_SLEEP_S, but that's ok.
|
|
69
|
+
time.sleep(PROFILE_POLL_SLEEP_S)
|
|
70
|
+
|
|
71
|
+
def shut_down(self):
|
|
72
|
+
self.queue.put(SHUTTING_DOWN)
|
|
73
|
+
self.thread.join()
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Resources module for RelationalAI clients.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
# This package contains resource implementations for different platforms:
|
|
6
|
+
# - snowflake: Snowflake-specific resources
|
|
7
|
+
# - azure: Azure-specific resources (optional, may not be available in all environments)
|
|
8
|
+
|