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,143 @@
|
|
|
1
|
+
import dataclasses
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from relationalai.early_access.dsl.core.namespaces import Namespace
|
|
5
|
+
from relationalai.early_access.dsl.core.relations import Relation, RelationSignature
|
|
6
|
+
from relationalai.early_access.dsl.core.types import Type
|
|
7
|
+
from relationalai.early_access.dsl.core.utils import generate_stable_uuid
|
|
8
|
+
from relationalai.early_access.dsl.ontologies.relationships import Relationship
|
|
9
|
+
from relationalai.early_access.dsl.ontologies.roles import Role
|
|
10
|
+
from relationalai.early_access.dsl.physical_metadata.tables import Column, Table, TemporalTable
|
|
11
|
+
from relationalai.early_access.dsl.types.entities import EntityType
|
|
12
|
+
from relationalai.early_access.dsl.types.values import ValueType
|
|
13
|
+
|
|
14
|
+
from relationalai.early_access.dsl import ExternalRelation
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclasses.dataclass
|
|
18
|
+
class EntityMapRef:
|
|
19
|
+
name: str
|
|
20
|
+
source: Table
|
|
21
|
+
entity_type: EntityType
|
|
22
|
+
relation: Relation
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclasses.dataclass
|
|
26
|
+
class ReificationPattern:
|
|
27
|
+
concept: type
|
|
28
|
+
reifies_as: type
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Binding:
|
|
32
|
+
|
|
33
|
+
def __init__(self, role: Role, column: Optional[Column] = None, entity_map: Optional[EntityMapRef] = None):
|
|
34
|
+
self._role = role
|
|
35
|
+
self._column = column
|
|
36
|
+
self._entity_map = entity_map
|
|
37
|
+
self._has_value: Optional[str] = None
|
|
38
|
+
self._applied_transformations = []
|
|
39
|
+
self._check_either_column_or_entity_map_provided()
|
|
40
|
+
|
|
41
|
+
def guid(self):
|
|
42
|
+
salt = self._column.guid() if self._column is not None else self._entity_map.name if self._entity_map is not None else None
|
|
43
|
+
return generate_stable_uuid(f"{salt}_{self._role.guid()}")
|
|
44
|
+
|
|
45
|
+
def transform(self, transformer: Relation):
|
|
46
|
+
self._applied_transformations.append(transformer)
|
|
47
|
+
return self
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def role(self):
|
|
51
|
+
return self._role
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def column(self):
|
|
55
|
+
return self._column
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def entity_map(self):
|
|
59
|
+
return self._entity_map
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def has_value(self) -> Optional[str]:
|
|
63
|
+
return self._has_value
|
|
64
|
+
|
|
65
|
+
@has_value.setter
|
|
66
|
+
def has_value(self, value: str):
|
|
67
|
+
if value is not None:
|
|
68
|
+
self._has_value = value
|
|
69
|
+
Binding._check_has_value_applicable(self._role.part_of)
|
|
70
|
+
|
|
71
|
+
def __str__(self):
|
|
72
|
+
binds_to = self._column.pprint() if self._column is not None else self._entity_map.name if self._entity_map is not None else None
|
|
73
|
+
return f"{self._role.verbalize()}: {binds_to}"
|
|
74
|
+
|
|
75
|
+
def _check_either_column_or_entity_map_provided(self):
|
|
76
|
+
if self._column is None and self._entity_map is None:
|
|
77
|
+
raise Exception("Either a column or an entity map must be provided")
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def _check_has_value_applicable(relationship):
|
|
81
|
+
if not (relationship.arity() == 1 or relationship.is_subtype()):
|
|
82
|
+
raise Exception(
|
|
83
|
+
f"The 'has_value' setting requires a unary or a subtype relationship, "
|
|
84
|
+
f"but non-subtype relationship '{relationship.name()}' has arity {relationship.arity()}")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class BindingModel:
|
|
88
|
+
def __init__(self):
|
|
89
|
+
self._bindings = []
|
|
90
|
+
self._patterns = {}
|
|
91
|
+
self._transformers = {}
|
|
92
|
+
self._entity_maps = {}
|
|
93
|
+
|
|
94
|
+
def bind_role(self, role: Role, column: Optional[Column] = None, entity_map: Optional[EntityMapRef] = None,
|
|
95
|
+
data_transformers: Optional[list[Relation]] = None, has_value: Optional[str] = None):
|
|
96
|
+
if column is not None and isinstance(column.part_of, TemporalTable):
|
|
97
|
+
if column.part_of.temporal_col.name not in column.part_of.columns:
|
|
98
|
+
raise Exception(f"Cannot bind attribute {column.name} of TemporalTable {column.part_of.name} as it uses"
|
|
99
|
+
f" missing temporal column: column {column.part_of.temporal_col} is not in the table")
|
|
100
|
+
b = Binding(role, column, entity_map)
|
|
101
|
+
self._register_transformations(b, data_transformers)
|
|
102
|
+
b._has_value = has_value
|
|
103
|
+
self._bindings.append(b)
|
|
104
|
+
return b
|
|
105
|
+
|
|
106
|
+
def bind_attribute(self, relationship: Relationship, column: Column,
|
|
107
|
+
data_transformers: Optional[list[Relation]] = None, has_value: Optional[str] = None):
|
|
108
|
+
b = Binding(relationship.attr(), column)
|
|
109
|
+
self._register_transformations(b, data_transformers)
|
|
110
|
+
b._has_value = has_value
|
|
111
|
+
self._bindings.append(b)
|
|
112
|
+
return b
|
|
113
|
+
|
|
114
|
+
def transformer(self, name: str, sig: tuple[Type, Type]):
|
|
115
|
+
self._transformers[name] = sig
|
|
116
|
+
signature = RelationSignature(*sig)
|
|
117
|
+
t = ExternalRelation(Namespace.top, name, signature)
|
|
118
|
+
if len(sig) < 2:
|
|
119
|
+
raise Exception(f"Signature \"{sig}\" provided for the relation {name} used as transformer must be exactly"
|
|
120
|
+
f" a tuple of two types (source type [0] and target type [1])")
|
|
121
|
+
return t
|
|
122
|
+
|
|
123
|
+
def entity_map(self, name: str, source: Table, entity_type: EntityType, relation: Relation):
|
|
124
|
+
emap = EntityMapRef(name, source, entity_type, relation)
|
|
125
|
+
if name in self._entity_maps:
|
|
126
|
+
raise Exception(f"Entity map reference with name {name} already declared")
|
|
127
|
+
self._entity_maps[name] = emap
|
|
128
|
+
return emap
|
|
129
|
+
|
|
130
|
+
def pattern(self, concept: type, reifies_as: type):
|
|
131
|
+
if type is not EntityType or type is not ValueType:
|
|
132
|
+
raise Exception(f"Reification pattern must use EntityType or ValueType, but for {concept} got {reifies_as}")
|
|
133
|
+
self._patterns[concept] = reifies_as
|
|
134
|
+
return ReificationPattern(concept, reifies_as)
|
|
135
|
+
|
|
136
|
+
def pprint(self):
|
|
137
|
+
return "\n".join([str(b) for b in self._bindings])
|
|
138
|
+
|
|
139
|
+
@staticmethod
|
|
140
|
+
def _register_transformations(b: Binding, *transformations):
|
|
141
|
+
if transformations is not None:
|
|
142
|
+
for t in transformations:
|
|
143
|
+
b.transform(t)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from relationalai.semantics.internal import snowflake as sf, internal as b
|
|
3
|
+
from relationalai.early_access.dsl.bindings.common import BindableColumn, AbstractBindableTable
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
#=
|
|
7
|
+
# Bindable classes and interfaces.
|
|
8
|
+
#=
|
|
9
|
+
|
|
10
|
+
class BindableSnowflakeColumn(BindableColumn, sf.Column):
|
|
11
|
+
_metadata: b.Field
|
|
12
|
+
|
|
13
|
+
def __init__(self, metadata: b.Field, table: 'SnowflakeTable', model):
|
|
14
|
+
col_name = metadata.name
|
|
15
|
+
col_type = b.field_to_type(model.qb_model(), metadata)
|
|
16
|
+
sf.Column.__init__(self, table, col_name)
|
|
17
|
+
BindableColumn.__init__(self, col_name, col_type, table, model)
|
|
18
|
+
self._metadata = metadata
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def metadata(self):
|
|
22
|
+
return self._metadata
|
|
23
|
+
|
|
24
|
+
def __repr__(self):
|
|
25
|
+
return f"Snowflake:{super().__repr__()}"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SnowflakeTable(AbstractBindableTable[BindableSnowflakeColumn], sf.Table):
|
|
29
|
+
|
|
30
|
+
def __init__(self, fqn: str, model, schema:dict[str, str|b.Concept]|None=None):
|
|
31
|
+
sf.Table.__init__(self, fqn, schema=schema)
|
|
32
|
+
AbstractBindableTable.__init__(self, fqn, model, set())
|
|
33
|
+
self._initialize(model)
|
|
34
|
+
|
|
35
|
+
def _initialize(self, model):
|
|
36
|
+
self._lazy_init()
|
|
37
|
+
self._model = model
|
|
38
|
+
schema_info = self._schemas[(self._database, self._schema)]
|
|
39
|
+
table_info = schema_info.tables[self._table]
|
|
40
|
+
self._cols = {field.name: BindableSnowflakeColumn(field, self, model) for field in table_info.fields}
|
|
41
|
+
self._generate_declare()
|
|
42
|
+
|
|
43
|
+
def _generate_declare(self):
|
|
44
|
+
src = f"declare {self.physical_name()}"
|
|
45
|
+
self._model.qb_model().define(b.RawSource('rel', src))
|
|
46
|
+
|
|
47
|
+
def _to_type(self) -> b.Concept:
|
|
48
|
+
return self._concept
|
|
49
|
+
|
|
50
|
+
def _to_keys(self) -> list[b.Ref]:
|
|
51
|
+
return [self._rel._field_refs[0]]
|
|
52
|
+
|
|
53
|
+
def _compile_lookup(self, compiler:b.Compiler, ctx:b.CompilerContext):
|
|
54
|
+
sf.Table._used_sources.add(self)
|
|
55
|
+
compiler.lookup(self._rel, ctx)
|
|
56
|
+
return compiler.lookup(b.RelationshipFieldRef(None, self._rel, 0), ctx)
|
|
57
|
+
|
|
58
|
+
def __str__(self):
|
|
59
|
+
# returns the name of the table, as well as the columns and their types
|
|
60
|
+
return f"SnowflakeTable({self.physical_name()}"
|
|
61
|
+
|
|
62
|
+
def physical_name(self):
|
|
63
|
+
# physical relation name is always in the form of `{database}_{schema}_{table}
|
|
64
|
+
return f"{self._fqn.lower()}".replace('.', '_')
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
from typing import Union
|
|
2
|
+
|
|
3
|
+
from relationalai.early_access.dsl.bindings.common import Binding, IdentifierConceptBinding, RoleBinding, \
|
|
4
|
+
SubtypeConceptBinding, BindableTable, BindableAttribute, ReferentConceptBinding
|
|
5
|
+
from relationalai.early_access.dsl.codegen.common import BoundIdentifierConstraint, BoundRelationship
|
|
6
|
+
from relationalai.early_access.dsl.orm.relationships import Role, Relationship
|
|
7
|
+
from relationalai.semantics.metamodel.util import OrderedSet
|
|
8
|
+
|
|
9
|
+
import relationalai.semantics as qb
|
|
10
|
+
|
|
11
|
+
class Binder:
|
|
12
|
+
def __init__(self, model):
|
|
13
|
+
self._model = model
|
|
14
|
+
self._reasoner = self._model.reasoner()
|
|
15
|
+
|
|
16
|
+
# bindings classification
|
|
17
|
+
self._identifier_bindings: OrderedSet[IdentifierConceptBinding] = OrderedSet()
|
|
18
|
+
self._subtype_bindings: OrderedSet[Union[IdentifierConceptBinding, ReferentConceptBinding]] = OrderedSet()
|
|
19
|
+
self._subtype_concept_bindings: OrderedSet[SubtypeConceptBinding] = OrderedSet()
|
|
20
|
+
self._referent_concept_bindings: OrderedSet[ReferentConceptBinding] = OrderedSet()
|
|
21
|
+
self._value_type_bindings: OrderedSet[Binding] = OrderedSet()
|
|
22
|
+
self._entity_type_bindings: OrderedSet[Binding] = OrderedSet()
|
|
23
|
+
self._role_bindings: dict[Role, OrderedSet[Binding]] = {}
|
|
24
|
+
self._bound_identifier_constraints = OrderedSet[BoundIdentifierConstraint]()
|
|
25
|
+
self._bound_relationships = OrderedSet[BoundRelationship]()
|
|
26
|
+
|
|
27
|
+
self._analyze()
|
|
28
|
+
|
|
29
|
+
def value_type_bindings(self) -> OrderedSet[Binding]:
|
|
30
|
+
"""
|
|
31
|
+
Returns the value type bindings.
|
|
32
|
+
"""
|
|
33
|
+
return self._value_type_bindings
|
|
34
|
+
|
|
35
|
+
def is_value_type_binding(self, binding: Binding) -> bool:
|
|
36
|
+
"""
|
|
37
|
+
Returns True if the binding is a value type binding.
|
|
38
|
+
"""
|
|
39
|
+
return binding in self._value_type_bindings
|
|
40
|
+
|
|
41
|
+
def constructor_bindings(self) -> OrderedSet[IdentifierConceptBinding]:
|
|
42
|
+
"""
|
|
43
|
+
Returns the identifier bindings that construct entity types.
|
|
44
|
+
"""
|
|
45
|
+
return self._identifier_bindings
|
|
46
|
+
|
|
47
|
+
def is_constructor_binding(self, binding: Binding) -> bool:
|
|
48
|
+
"""
|
|
49
|
+
Returns True if the binding is an IdentifierBinding.
|
|
50
|
+
"""
|
|
51
|
+
return isinstance(binding, IdentifierConceptBinding) and binding in self._identifier_bindings
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def is_filtering_binding(binding: Binding) -> bool:
|
|
55
|
+
"""
|
|
56
|
+
Returns True if the binding is a SubtypeConceptBinding or has filter_by.
|
|
57
|
+
"""
|
|
58
|
+
return isinstance(binding, SubtypeConceptBinding) or binding.filter_by is not None
|
|
59
|
+
|
|
60
|
+
def subtype_ctor_bindings(self) -> OrderedSet[Union[IdentifierConceptBinding, ReferentConceptBinding]]:
|
|
61
|
+
"""
|
|
62
|
+
Returns the identifier or referent subtype bindings. Those are only possible for subtypes that define
|
|
63
|
+
their own reference scheme.
|
|
64
|
+
|
|
65
|
+
They are different from SubtypeConceptBinding, which is a subtype binding with a filter.
|
|
66
|
+
"""
|
|
67
|
+
return self._subtype_bindings
|
|
68
|
+
|
|
69
|
+
def subtype_filtering_bindings(self) -> OrderedSet[SubtypeConceptBinding]:
|
|
70
|
+
"""
|
|
71
|
+
Returns the subtype concept bindings. These are bindings that are used to derive subtypes from a parent type,
|
|
72
|
+
and they are different from IdentifierConceptBinding or ReferentConceptBinding, which are used to construct
|
|
73
|
+
entities or refer to them.
|
|
74
|
+
"""
|
|
75
|
+
return self._subtype_concept_bindings
|
|
76
|
+
|
|
77
|
+
def referent_concept_bindings(self) -> OrderedSet[ReferentConceptBinding]:
|
|
78
|
+
"""
|
|
79
|
+
Returns the referent concept bindings.
|
|
80
|
+
"""
|
|
81
|
+
return self._referent_concept_bindings
|
|
82
|
+
|
|
83
|
+
def lookup_binding_role(self, binding: Binding):
|
|
84
|
+
if isinstance(binding, RoleBinding):
|
|
85
|
+
# simple case: use the Role from the binding
|
|
86
|
+
role = binding.role
|
|
87
|
+
elif isinstance(binding, (IdentifierConceptBinding, SubtypeConceptBinding, ReferentConceptBinding)):
|
|
88
|
+
# either an IdentifierBinding or a SubtypeBinding, look up the role in the IdentifierRelationship
|
|
89
|
+
concept = binding.entity_type
|
|
90
|
+
if self._reasoner.has_own_ref_scheme(concept):
|
|
91
|
+
role = self._reasoner.own_ref_scheme_role(concept)
|
|
92
|
+
else:
|
|
93
|
+
# this is a subtype binding...
|
|
94
|
+
role = self._reasoner.subtype_unique_ref_scheme_role(concept)
|
|
95
|
+
else:
|
|
96
|
+
raise ValueError(f"Unknown binding type: {type(binding)}")
|
|
97
|
+
return role
|
|
98
|
+
|
|
99
|
+
def lookup_role_bindings(self, role: Role, source: BindableTable) -> OrderedSet[Binding]:
|
|
100
|
+
"""
|
|
101
|
+
Look up bindings for the given Role and source table.
|
|
102
|
+
Returns an OrderedSet of bindings.
|
|
103
|
+
"""
|
|
104
|
+
if role not in self._role_bindings:
|
|
105
|
+
raise ValueError(f"No bindings found for role {role} in table {source}")
|
|
106
|
+
bindings = [binding for binding in self._role_bindings[role] if binding.column.table == source]
|
|
107
|
+
return OrderedSet().update(bindings)
|
|
108
|
+
|
|
109
|
+
def is_role_bound(self, role: Role, source: BindableTable) -> bool:
|
|
110
|
+
"""
|
|
111
|
+
Check if the given Role is bound in the source table.
|
|
112
|
+
"""
|
|
113
|
+
return role in self._role_bindings and bool(self.lookup_role_bindings(role, source))
|
|
114
|
+
|
|
115
|
+
def lookup_constructor_binding(self, concept: qb.Concept, column: BindableAttribute):
|
|
116
|
+
"""
|
|
117
|
+
Look up a constructor binding for the given Concept and source table.
|
|
118
|
+
"""
|
|
119
|
+
if concept._is_primitive():
|
|
120
|
+
raise ValueError(f"Cannot look up entity constructor binding for a value type: {concept}")
|
|
121
|
+
candidates = list(self._identifier_bindings) + list(self._referent_concept_bindings)
|
|
122
|
+
for binding in candidates:
|
|
123
|
+
candidate_role = self.lookup_binding_role(binding)
|
|
124
|
+
sibling = candidate_role.sibling()
|
|
125
|
+
assert sibling is not None
|
|
126
|
+
if binding.column is column and sibling.player() is concept:
|
|
127
|
+
return binding
|
|
128
|
+
raise ValueError(f"Cannot look up entity constructor binding for {concept} from {column}")
|
|
129
|
+
|
|
130
|
+
def lookup_constructor_binding_by_source(self, concept: qb.Concept, source: BindableTable):
|
|
131
|
+
"""
|
|
132
|
+
Look up a constructor binding for the given Concept and source table.
|
|
133
|
+
"""
|
|
134
|
+
if concept._is_primitive():
|
|
135
|
+
raise ValueError(f"Cannot look up entity constructor binding for a value type: {concept}")
|
|
136
|
+
for binding in self._identifier_bindings:
|
|
137
|
+
sibling_role = self.lookup_binding_role(binding).sibling()
|
|
138
|
+
assert sibling_role is not None
|
|
139
|
+
if binding.column.table == source and sibling_role.player() is concept:
|
|
140
|
+
return binding
|
|
141
|
+
raise ValueError(f"Cannot look up entity constructor binding for {concept} from {source}")
|
|
142
|
+
|
|
143
|
+
def lookup_subtype_reference_binding(self, binding: Union[IdentifierConceptBinding, SubtypeConceptBinding]):
|
|
144
|
+
"""
|
|
145
|
+
Look up a constructor binding referenced by the subtype binding.
|
|
146
|
+
"""
|
|
147
|
+
ctor_role = self._reasoner.subtype_unique_ref_scheme_role(binding.entity_type)
|
|
148
|
+
sibling_role = ctor_role.sibling()
|
|
149
|
+
assert sibling_role is not None
|
|
150
|
+
parent_type = sibling_role.player()
|
|
151
|
+
return self.lookup_constructor_binding(parent_type, binding.column)
|
|
152
|
+
|
|
153
|
+
def lookup_subtype_reference_binding_by_source(self, binding: Union[IdentifierConceptBinding, SubtypeConceptBinding]):
|
|
154
|
+
"""
|
|
155
|
+
Look up a constructor binding referenced by the subtype binding.
|
|
156
|
+
"""
|
|
157
|
+
ctor_role = self._reasoner.subtype_unique_ref_scheme_role(binding.entity_type)
|
|
158
|
+
sibling_role = ctor_role.sibling()
|
|
159
|
+
assert sibling_role is not None
|
|
160
|
+
parent_type = sibling_role.player()
|
|
161
|
+
return self.lookup_constructor_binding_by_source(parent_type, binding.column.table)
|
|
162
|
+
|
|
163
|
+
def lookup_bound_identifier_constraint_by_source(self, concept: qb.Concept, source: BindableTable):
|
|
164
|
+
"""
|
|
165
|
+
Look up a bound identifier constraint for the given Concept and source table.
|
|
166
|
+
"""
|
|
167
|
+
identifier_constraints = self._reasoner.ref_schemes_of(concept)
|
|
168
|
+
bound_constraints = OrderedSet()
|
|
169
|
+
for bound_constraint in self._bound_identifier_constraints:
|
|
170
|
+
if bound_constraint.constraint in identifier_constraints and bound_constraint.table == source:
|
|
171
|
+
bound_constraints.add(bound_constraint)
|
|
172
|
+
#=
|
|
173
|
+
# Note: this is a bit naive right now, it should take into account whether the concept is being:
|
|
174
|
+
# * constructed (we need ALL) or;
|
|
175
|
+
# * referenced (we need exactly one).
|
|
176
|
+
#
|
|
177
|
+
# To be addressed in https://relationalai.atlassian.net/browse/RAI-39757.
|
|
178
|
+
#=
|
|
179
|
+
if not (bound_constraints and all(b.constraint in identifier_constraints for b in bound_constraints)):
|
|
180
|
+
raise ValueError(
|
|
181
|
+
f"Cannot look up bound identifier constraints for {concept} from {source}, "
|
|
182
|
+
f"no bound constraints found"
|
|
183
|
+
)
|
|
184
|
+
return bound_constraints
|
|
185
|
+
|
|
186
|
+
def bound_identifier_constraints(self):
|
|
187
|
+
"""
|
|
188
|
+
Returns the bound identifier constraints.
|
|
189
|
+
"""
|
|
190
|
+
return self._bound_identifier_constraints
|
|
191
|
+
|
|
192
|
+
def lookup_bound_identifier_constraint_by_column(self, concept: qb.Concept, column: BindableAttribute):
|
|
193
|
+
"""
|
|
194
|
+
Look up a bound identifier constraint for the given column and concept.
|
|
195
|
+
"""
|
|
196
|
+
for constraint in self._bound_identifier_constraints:
|
|
197
|
+
if constraint.concept is concept and constraint.table == column.table:
|
|
198
|
+
for _, binding in constraint.role_bindings.items():
|
|
199
|
+
if binding.column is column:
|
|
200
|
+
return constraint
|
|
201
|
+
raise ValueError(f"Cannot look up bound identifier constraint for {concept} from {column.table}")
|
|
202
|
+
|
|
203
|
+
def bound_relationships(self) -> OrderedSet[BoundRelationship]:
|
|
204
|
+
"""
|
|
205
|
+
Returns the bound relationships.
|
|
206
|
+
"""
|
|
207
|
+
return self._bound_relationships
|
|
208
|
+
|
|
209
|
+
#=
|
|
210
|
+
# Analysis based on the bindings in the model.
|
|
211
|
+
#=
|
|
212
|
+
|
|
213
|
+
def _analyze(self):
|
|
214
|
+
self._classify_bindings()
|
|
215
|
+
self._classify_constraints()
|
|
216
|
+
self._classify_relationships()
|
|
217
|
+
|
|
218
|
+
#=
|
|
219
|
+
# Look through the bindings and classify them.
|
|
220
|
+
#=
|
|
221
|
+
|
|
222
|
+
def _classify_bindings(self):
|
|
223
|
+
"""
|
|
224
|
+
Analyze the bindings in the model and update the reasoner.
|
|
225
|
+
"""
|
|
226
|
+
for binding in self._model._bindings:
|
|
227
|
+
self._classify_binding(binding)
|
|
228
|
+
|
|
229
|
+
def _classify_binding(self, binding: Binding):
|
|
230
|
+
if isinstance(binding, Union[IdentifierConceptBinding, ReferentConceptBinding]):
|
|
231
|
+
self._process_concept_binding(binding)
|
|
232
|
+
elif isinstance(binding, RoleBinding):
|
|
233
|
+
self._process_role_binding(binding)
|
|
234
|
+
elif isinstance(binding, SubtypeConceptBinding):
|
|
235
|
+
self._process_subtype_concept_binding(binding)
|
|
236
|
+
else:
|
|
237
|
+
raise ValueError(f"Unknown binding type: {type(binding)}")
|
|
238
|
+
|
|
239
|
+
def _process_concept_binding(self, binding: Union[IdentifierConceptBinding, ReferentConceptBinding]):
|
|
240
|
+
"""
|
|
241
|
+
ConceptBinding could either be an IdentifierBinding or a SubtypeBinding.
|
|
242
|
+
It depends on whether the entity type has a reference scheme or not, if so
|
|
243
|
+
it is an IdentifierBinding, otherwise it is a SubtypeBinding.
|
|
244
|
+
"""
|
|
245
|
+
concept = binding.entity_type
|
|
246
|
+
is_referent_binding = isinstance(binding, ReferentConceptBinding)
|
|
247
|
+
if self._reasoner.has_own_ref_scheme(concept):
|
|
248
|
+
# If the concept has its own reference scheme, it is an IdentifierBinding,
|
|
249
|
+
# which could be a referent (if there's a FK to another table) or constructor binding.
|
|
250
|
+
# ReferentConceptBinding is a special case of ConceptBinding, where users tell explicitly
|
|
251
|
+
# that the binding is a referent.
|
|
252
|
+
if not is_referent_binding:
|
|
253
|
+
self._identifier_bindings.add(binding)
|
|
254
|
+
constructing_role = self._reasoner.own_ref_scheme_role(concept)
|
|
255
|
+
else:
|
|
256
|
+
self._subtype_bindings.add(binding)
|
|
257
|
+
constructing_role = self._reasoner.subtype_unique_ref_scheme_role(concept)
|
|
258
|
+
if is_referent_binding:
|
|
259
|
+
self._referent_concept_bindings.add(binding)
|
|
260
|
+
self._role_bindings.setdefault(constructing_role, OrderedSet()).add(binding)
|
|
261
|
+
ref_mode_concept = constructing_role.player()
|
|
262
|
+
self._classify_binding_by_type(binding, ref_mode_concept)
|
|
263
|
+
|
|
264
|
+
def _process_role_binding(self, binding: RoleBinding):
|
|
265
|
+
"""
|
|
266
|
+
RoleBinding is a simple binding to a Role in a Relationship. The player of the role could
|
|
267
|
+
be either a ValueType or an EntityType.
|
|
268
|
+
"""
|
|
269
|
+
self._classify_binding_by_type(binding, binding.role.player())
|
|
270
|
+
self._role_bindings.setdefault(binding.role, OrderedSet()).add(binding)
|
|
271
|
+
|
|
272
|
+
def _process_subtype_concept_binding(self, binding: SubtypeConceptBinding):
|
|
273
|
+
"""
|
|
274
|
+
FilteringSubtypeBinding is a subtype binding with a filter.
|
|
275
|
+
|
|
276
|
+
It is neither an entity nor a value type binding. The filter may be a literal or a value from a
|
|
277
|
+
RoleValueConstraint.
|
|
278
|
+
"""
|
|
279
|
+
self._subtype_concept_bindings.add(binding)
|
|
280
|
+
|
|
281
|
+
def _classify_binding_by_type(self, binding: Binding, player: qb.Concept):
|
|
282
|
+
if isinstance(binding, SubtypeConceptBinding):
|
|
283
|
+
# SubtypeConceptBinding is neither an entity nor a value type binding.
|
|
284
|
+
return
|
|
285
|
+
if player._is_primitive():
|
|
286
|
+
self._value_type_bindings.add(binding)
|
|
287
|
+
else:
|
|
288
|
+
self._entity_type_bindings.add(binding)
|
|
289
|
+
|
|
290
|
+
def _classify_constraints(self):
|
|
291
|
+
for concept, identifier_constraints in self._reasoner.concept_identifiers().items():
|
|
292
|
+
for constraint in identifier_constraints:
|
|
293
|
+
roles = constraint.roles()
|
|
294
|
+
role_bindings_by_table = self._collect_table_role_bindings(roles)
|
|
295
|
+
for table, bindings in role_bindings_by_table.items():
|
|
296
|
+
if len(bindings) < len(roles):
|
|
297
|
+
raise ValueError(f"Not all roles are bound in {table.physical_name()}: {bindings} for {roles}")
|
|
298
|
+
bound_constraint = BoundIdentifierConstraint(constraint, table, bindings)
|
|
299
|
+
self._bound_identifier_constraints.add(bound_constraint)
|
|
300
|
+
|
|
301
|
+
def _collect_table_role_bindings(self, roles):
|
|
302
|
+
role_bindings_by_table = {}
|
|
303
|
+
for role in roles:
|
|
304
|
+
bindings = self._role_bindings.get(role)
|
|
305
|
+
if not bindings:
|
|
306
|
+
continue
|
|
307
|
+
for binding in bindings:
|
|
308
|
+
table = binding.column.table
|
|
309
|
+
role_bindings_by_table.setdefault(table, {}).setdefault(role, []).append(binding)
|
|
310
|
+
return role_bindings_by_table
|
|
311
|
+
|
|
312
|
+
def _classify_relationships(self):
|
|
313
|
+
bound_relationship_bindings = {}
|
|
314
|
+
for role, bindings in self._role_bindings.items():
|
|
315
|
+
relationship = role._part_of()
|
|
316
|
+
assert isinstance(relationship, Relationship)
|
|
317
|
+
for binding in bindings:
|
|
318
|
+
table = binding.column.table
|
|
319
|
+
bound_relationship = BoundRelationship(relationship, table)
|
|
320
|
+
bound_relationship_bindings.setdefault(bound_relationship, []).append(binding)
|
|
321
|
+
|
|
322
|
+
for bound_relationship, bindings in bound_relationship_bindings.items():
|
|
323
|
+
bound_relationship.bindings.extend(bindings)
|
|
324
|
+
self._validate_bound_relationship(bound_relationship)
|
|
325
|
+
|
|
326
|
+
def _validate_bound_relationship(self, bound_relationship: BoundRelationship):
|
|
327
|
+
relationship = bound_relationship.relationship
|
|
328
|
+
arity = relationship._arity()
|
|
329
|
+
|
|
330
|
+
if arity == 1 and bound_relationship.bindings:
|
|
331
|
+
self._bound_relationships.add(bound_relationship)
|
|
332
|
+
elif arity == 2:
|
|
333
|
+
self._validate_binary_bound_relationship(bound_relationship)
|
|
334
|
+
elif arity > 2:
|
|
335
|
+
self._validate_nary_bound_relationship(bound_relationship)
|
|
336
|
+
|
|
337
|
+
def _validate_binary_bound_relationship(self, bound_relationship: BoundRelationship):
|
|
338
|
+
relationship = bound_relationship.relationship
|
|
339
|
+
if self._reasoner.is_identifier_relationship(relationship):
|
|
340
|
+
# ignore as this is handled by constructor entity maps
|
|
341
|
+
return
|
|
342
|
+
#=
|
|
343
|
+
# Typically, at least one of the roles in a binary relationship must be bound.
|
|
344
|
+
# In such cases, we attempt to infer the entity map for the unbound role, but
|
|
345
|
+
# any value type role must be bound. If unable to infer the entity map, an error
|
|
346
|
+
# is raised.
|
|
347
|
+
#=
|
|
348
|
+
key_role, value_role = self._identify_binary_relationship_roles(relationship)
|
|
349
|
+
# the value role may infer if it's an entity type and the key role is bound
|
|
350
|
+
value_role_may_infer =\
|
|
351
|
+
not value_role.player()._is_primitive() and self.is_role_bound(key_role, bound_relationship.table)
|
|
352
|
+
self._assert_role_is_bound(value_role, bound_relationship.table, may_infer=value_role_may_infer)
|
|
353
|
+
self._assert_role_is_bound(key_role, bound_relationship.table, may_infer=True)
|
|
354
|
+
self._bound_relationships.add(bound_relationship)
|
|
355
|
+
|
|
356
|
+
def _identify_binary_relationship_roles(self, relationship: Relationship) -> tuple[Role, Role]:
|
|
357
|
+
roles = relationship._roles()
|
|
358
|
+
key_role, value_role = None, None
|
|
359
|
+
for role in roles:
|
|
360
|
+
if role.player()._is_primitive():
|
|
361
|
+
if value_role is not None:
|
|
362
|
+
raise ValueError(f"Binary relationship {relationship} has multiple value type roles: "
|
|
363
|
+
f"{value_role} and {role}")
|
|
364
|
+
value_role = role
|
|
365
|
+
elif key_role is None and not self._reasoner.is_constructing_role(role):
|
|
366
|
+
key_role = role
|
|
367
|
+
else:
|
|
368
|
+
value_role = role
|
|
369
|
+
if not isinstance(key_role, Role) and not isinstance(value_role, Role):
|
|
370
|
+
raise ValueError(f'Cannot identify roles in a binary relationship {relationship}')
|
|
371
|
+
return key_role, value_role # pyright: ignore[reportReturnType]
|
|
372
|
+
|
|
373
|
+
def _assert_role_is_bound(self, role: Role, source: BindableTable, may_infer=False):
|
|
374
|
+
"""
|
|
375
|
+
Asserts that the role is bound in the context of a tabular source.
|
|
376
|
+
If may_infer is True, it allows for inferring the entity map, only for roles played by
|
|
377
|
+
an entity type.
|
|
378
|
+
"""
|
|
379
|
+
if not self._role_bindings.get(role):
|
|
380
|
+
# value type roles must be bound, entity type roles may infer
|
|
381
|
+
may_infer = False if role.player()._is_primitive() else may_infer
|
|
382
|
+
if may_infer and self.lookup_bound_identifier_constraint_by_source(role.player(), source):
|
|
383
|
+
# infer the binding from the relationship
|
|
384
|
+
return
|
|
385
|
+
raise ValueError(f"Role {role} in relationship {role._part_of()} is not bound")
|
|
386
|
+
|
|
387
|
+
def _validate_nary_bound_relationship(self, bound_relationship: BoundRelationship):
|
|
388
|
+
relationship = bound_relationship.relationship
|
|
389
|
+
roles = relationship._roles()
|
|
390
|
+
bound_roles = OrderedSet()
|
|
391
|
+
for binding in bound_relationship.bindings:
|
|
392
|
+
if not isinstance(binding, RoleBinding):
|
|
393
|
+
raise ValueError(f"Only RoleBindings allowed in N-ary relationships, got: {type(binding)}")
|
|
394
|
+
bound_roles.add(binding.role)
|
|
395
|
+
|
|
396
|
+
has_entity_type_player, is_bound = False, True
|
|
397
|
+
for role in roles:
|
|
398
|
+
if not (role in bound_roles or
|
|
399
|
+
self.lookup_bound_identifier_constraint_by_source(role.player(), bound_relationship.table)):
|
|
400
|
+
is_bound = False
|
|
401
|
+
break
|
|
402
|
+
if not role.player()._is_primitive():
|
|
403
|
+
has_entity_type_player = True
|
|
404
|
+
|
|
405
|
+
if is_bound and has_entity_type_player:
|
|
406
|
+
self._bound_relationships.add(bound_relationship)
|
|
407
|
+
elif not is_bound:
|
|
408
|
+
raise ValueError(f"N-ary relationship {relationship} is not fully bound: {bound_roles} vs {roles}")
|
|
409
|
+
else:
|
|
410
|
+
raise ValueError(f"N-ary relationship {relationship} must have at least one entity type player, "
|
|
411
|
+
f"but all players are value types: {roles}")
|