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,299 @@
|
|
|
1
|
+
from itertools import chain
|
|
2
|
+
|
|
3
|
+
from relationalai.early_access.dsl.orm.measures.initializer import get_model, get_reasoner
|
|
4
|
+
from relationalai.early_access.dsl.orm.models import Relationship, Role
|
|
5
|
+
from relationalai.semantics.metamodel.util import ordered_set
|
|
6
|
+
import relationalai.semantics as qb
|
|
7
|
+
|
|
8
|
+
from relationalai.early_access.dsl.orm.measures.dimensions import Dimension, Splicer
|
|
9
|
+
from relationalai.early_access.dsl.orm.measures.role_exprs import ComposeRoleExpr, NilRoleExpr, RoleExpr, SimpleRoleExpr, UnionRoleExpr
|
|
10
|
+
|
|
11
|
+
# Measures
|
|
12
|
+
|
|
13
|
+
class BaseMeasure:
|
|
14
|
+
|
|
15
|
+
def __init__(self, m):
|
|
16
|
+
if not isinstance(m, Role):
|
|
17
|
+
raise Exception(f"Cannot classify {m} (or type {type(m)} as a base measure")
|
|
18
|
+
|
|
19
|
+
self._reasoner = get_reasoner()
|
|
20
|
+
|
|
21
|
+
c = m.player()
|
|
22
|
+
if not c._is_primitive():
|
|
23
|
+
raise Exception(f"Role {m} is played by {c}, which is not a value type; thus cannot classify {m} as a base measure")
|
|
24
|
+
if not self._reasoner.is_one_role(m):
|
|
25
|
+
raise Exception(f"Cannot classify role {m} as a base measure because it is spanned by an internel UC")
|
|
26
|
+
self._measure_role = m
|
|
27
|
+
self._dims = None
|
|
28
|
+
|
|
29
|
+
def __call__(self, *args, **kwargs):
|
|
30
|
+
return self.relationship()(*args, **kwargs)
|
|
31
|
+
|
|
32
|
+
def dimensions(self):
|
|
33
|
+
if self._dims is None:
|
|
34
|
+
self._dims = [
|
|
35
|
+
Dimension(r, rx())
|
|
36
|
+
for r in self.measure_role().siblings()
|
|
37
|
+
]
|
|
38
|
+
return self._dims
|
|
39
|
+
|
|
40
|
+
def measure_role(self) -> Role:
|
|
41
|
+
return self._measure_role
|
|
42
|
+
|
|
43
|
+
def measure_type(self):
|
|
44
|
+
return self._measure_role.player()
|
|
45
|
+
|
|
46
|
+
def relationship(self):
|
|
47
|
+
return self.measure_role()._part_of()
|
|
48
|
+
|
|
49
|
+
class Measure:
|
|
50
|
+
|
|
51
|
+
# Create a new derived Measure by extending a sub-Measure (sub_measure) using
|
|
52
|
+
# one or more dimension expressions to derive the dimensions of self from
|
|
53
|
+
# those of sub_measure, aggregating the measurements so grouped by method.
|
|
54
|
+
def __init__(self, sub_measure, *dim_exprs, method=qb.count):
|
|
55
|
+
|
|
56
|
+
# Verify that m is a Measure, promoting Roles to BaseMeasures where
|
|
57
|
+
# appropriate and throwing an exception if m is neither a Measure
|
|
58
|
+
# nor a Role that denotes a BaseMeasure
|
|
59
|
+
def check_measure(m):
|
|
60
|
+
if isinstance(m, Role):
|
|
61
|
+
# Then self derives from a base measure
|
|
62
|
+
return BaseMeasure(m)
|
|
63
|
+
else:
|
|
64
|
+
# m should be a Measure...
|
|
65
|
+
if not isinstance(m, Measure):
|
|
66
|
+
raise Exception(f"Tried to derive a measure from {m} of type {type(m)}, which is not a measure")
|
|
67
|
+
return m
|
|
68
|
+
|
|
69
|
+
self._sub_measure = check_measure(sub_measure)
|
|
70
|
+
|
|
71
|
+
self._agg_method = method
|
|
72
|
+
|
|
73
|
+
self._reasoner = get_reasoner()
|
|
74
|
+
|
|
75
|
+
# Maps each Dimension (guid) to the Concept that the grouping role of the
|
|
76
|
+
# Dimension is played by
|
|
77
|
+
self._dimension_type = {}
|
|
78
|
+
|
|
79
|
+
# Retains the dimension expressions declared to derive the dimensions of this
|
|
80
|
+
# measure from those of the measure it derives from (self.sub_measure())
|
|
81
|
+
self._dimension_exprs = dim_exprs
|
|
82
|
+
|
|
83
|
+
# The ordered list of dimensions of this measure
|
|
84
|
+
self._dims = []
|
|
85
|
+
|
|
86
|
+
# A map from the guid of each Dimension in self._dims to that Dimension
|
|
87
|
+
self._dimmap = {}
|
|
88
|
+
|
|
89
|
+
# A map from the guid of each of this measure's dimensions 'd' to the root
|
|
90
|
+
# dimension 'r' of the measure being derived from such that 'd' extends 'r',
|
|
91
|
+
# either trivially or by applying some expression in self._dimension_exprs
|
|
92
|
+
self._extends_sub_dimension = {}
|
|
93
|
+
|
|
94
|
+
# The relationship that this measure generates.
|
|
95
|
+
self._relationship = self._generate_relationship()
|
|
96
|
+
|
|
97
|
+
def __call__(self, *args, **kwargs):
|
|
98
|
+
return self._relationship(*args, **kwargs)
|
|
99
|
+
|
|
100
|
+
def dimensions(self):
|
|
101
|
+
if not self._dims:
|
|
102
|
+
self._compute_dimensions()
|
|
103
|
+
return self._dims
|
|
104
|
+
|
|
105
|
+
def dimension_type(self, dim):
|
|
106
|
+
return self._dimension_type[dim.guid()]
|
|
107
|
+
|
|
108
|
+
# Returns the sub-dimension that dim (assumed to be a Dimension of self)
|
|
109
|
+
# extends, or None
|
|
110
|
+
def extends_sub_dimension(self, dim):
|
|
111
|
+
dim_guid = dim.guid()
|
|
112
|
+
if dim_guid in self._extends_sub_dimension:
|
|
113
|
+
return self._extends_sub_dimension[dim_guid]
|
|
114
|
+
|
|
115
|
+
return None
|
|
116
|
+
|
|
117
|
+
# Returns true if dim is orthogonal to other dimensions in this measure.
|
|
118
|
+
def orthogonal(self, dim):
|
|
119
|
+
if not dim.mandatory():
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
# An orthogonal dimension that is cut and that starts with the same
|
|
123
|
+
# measuring role as some other dimension, then it should be hidden
|
|
124
|
+
r_guid = dim.measuring_role()._guid()
|
|
125
|
+
return any(d2.measuring_role()._guid() == r_guid for d2 in self._dims)
|
|
126
|
+
|
|
127
|
+
def measure_role(self) -> Role:
|
|
128
|
+
return self.sub_measure().measure_role()
|
|
129
|
+
|
|
130
|
+
def measure_type(self):
|
|
131
|
+
return self.measure_role().player()
|
|
132
|
+
|
|
133
|
+
def relationship(self):
|
|
134
|
+
return self._relationship
|
|
135
|
+
|
|
136
|
+
def sub_measure(self): return self._sub_measure
|
|
137
|
+
|
|
138
|
+
# Internal methods
|
|
139
|
+
|
|
140
|
+
def _add_dimension(self, dim):
|
|
141
|
+
dim_guid = dim.guid()
|
|
142
|
+
if dim_guid in self._dimmap:
|
|
143
|
+
raise Exception(f"Cannot add the same Dimension ({dim.pretty_print}) to the same derived measure")
|
|
144
|
+
self._dims.append(dim)
|
|
145
|
+
self._dimmap[dim_guid] = dim
|
|
146
|
+
|
|
147
|
+
def _add_dimension_type(self, dim, concept):
|
|
148
|
+
dim_guid = dim.guid()
|
|
149
|
+
if dim_guid in self._dimension_type:
|
|
150
|
+
raise Exception(f"Error: Dimension {dim.pretty_print()} maps more than one type {str(self._dimension_type[dim_guid])} and {str(concept)}")
|
|
151
|
+
else:
|
|
152
|
+
self._dimension_type[dim_guid] = concept
|
|
153
|
+
|
|
154
|
+
# Computes the dimensions of this measure by using the dimension expressions
|
|
155
|
+
# named in this measure's declaration to extend (by either subsuming or splicing)
|
|
156
|
+
# the dimensions of this measure's sub measure. We call these dimensions to splice
|
|
157
|
+
# or extend "root" dimensions.
|
|
158
|
+
def _compute_dimensions(self):
|
|
159
|
+
|
|
160
|
+
# Partitions a list of dimensions into those that are exposed vs hidden
|
|
161
|
+
def partition_hiddens(dims):
|
|
162
|
+
hidden_dims = []
|
|
163
|
+
exposed_dims = []
|
|
164
|
+
for d in dims:
|
|
165
|
+
if d.cuts():
|
|
166
|
+
hidden_dims.append(d)
|
|
167
|
+
else:
|
|
168
|
+
exposed_dims.append(d)
|
|
169
|
+
return exposed_dims, hidden_dims
|
|
170
|
+
|
|
171
|
+
def check_used(used_exprs, exprs):
|
|
172
|
+
if len(used_exprs) < len(exprs):
|
|
173
|
+
unused_expr_seq = []
|
|
174
|
+
for e in exprs:
|
|
175
|
+
if e.guid() not in used_exprs:
|
|
176
|
+
unused_expr_seq.append(e.pretty_print())
|
|
177
|
+
unused_exprs = '{ ' + ",\n ".join(unused_expr_seq) + '}'
|
|
178
|
+
raise Exception(f"Attempted to derive a measure with incompatible dimension expressions: {unused_exprs}")
|
|
179
|
+
|
|
180
|
+
# When invoked with a pair of the form (exposed_sub_dims, exprs) where:
|
|
181
|
+
#
|
|
182
|
+
# * (exposed_sub_dims) is the ordered sequence of dimensions exposed
|
|
183
|
+
# by the sub measure; and
|
|
184
|
+
#
|
|
185
|
+
# * exprs is a set of dimension expressions that self declares to
|
|
186
|
+
# either subsume or splice dimensions in exposed_sub_dims
|
|
187
|
+
#
|
|
188
|
+
# this function iterates through exposed_sub_dims in order, trying to apply
|
|
189
|
+
# some dimension expression in exprs where possible.
|
|
190
|
+
#
|
|
191
|
+
# Returns any dimensions that extend some dimension in exposed_sub_dims but
|
|
192
|
+
# which end in a cut.
|
|
193
|
+
#
|
|
194
|
+
def apply_all(exposed_sub_dims, exprs):
|
|
195
|
+
cut_dims = []
|
|
196
|
+
|
|
197
|
+
# Remember those expressions that were used to extend some sub dimension.
|
|
198
|
+
# At the end of the loop, every expr from exprs should be used at least
|
|
199
|
+
# once; otherwise the measure declaration is in error.
|
|
200
|
+
used_exprs = ordered_set()
|
|
201
|
+
|
|
202
|
+
for r in exposed_sub_dims:
|
|
203
|
+
matched_root = False
|
|
204
|
+
|
|
205
|
+
for e in exprs:
|
|
206
|
+
new_dim = r.extend_by(e)
|
|
207
|
+
if new_dim is not None:
|
|
208
|
+
if new_dim.cuts():
|
|
209
|
+
cut_dims.append(new_dim)
|
|
210
|
+
else:
|
|
211
|
+
self._add_dimension(new_dim)
|
|
212
|
+
self._extends_sub_dimension[new_dim.guid()] = r
|
|
213
|
+
matched_root = True
|
|
214
|
+
used_exprs.add(e.guid())
|
|
215
|
+
|
|
216
|
+
if not matched_root:
|
|
217
|
+
self._extends_sub_dimension[r.guid()] = r
|
|
218
|
+
self._add_dimension(r)
|
|
219
|
+
|
|
220
|
+
check_used(used_exprs, exprs)
|
|
221
|
+
|
|
222
|
+
return cut_dims
|
|
223
|
+
|
|
224
|
+
self._dims = []
|
|
225
|
+
# First, partition the dimensions of the sub measure into two sets -- those that are
|
|
226
|
+
# exposed and are therefore extendable -- and those that are hidden
|
|
227
|
+
(exposed_sub_dims, hidden_roots) = partition_hiddens(self.sub_measure().dimensions())
|
|
228
|
+
|
|
229
|
+
if len(exposed_sub_dims) == 0:
|
|
230
|
+
raise Exception("Cannot derive a measure from a 0-dimensional measure")
|
|
231
|
+
|
|
232
|
+
cut_dims = apply_all(exposed_sub_dims, self._dimension_exprs)
|
|
233
|
+
|
|
234
|
+
# Get those hidden dimensions that are not orthogonal to any non-hidden
|
|
235
|
+
# dimension of self, and add them as dimensions of self rather than
|
|
236
|
+
# projecting them away.
|
|
237
|
+
hidden_dims = [d for d in cut_dims if not self.orthogonal(d)]
|
|
238
|
+
for d in chain(hidden_dims, hidden_roots):
|
|
239
|
+
self._add_dimension(d)
|
|
240
|
+
|
|
241
|
+
def _generate_relationship(self) -> Relationship:
|
|
242
|
+
value_type = self.measure_role().player()
|
|
243
|
+
dims = self.dimensions()
|
|
244
|
+
role_seq = []
|
|
245
|
+
for i in range(len(dims)):
|
|
246
|
+
player = dims[i].grouping_role_player()
|
|
247
|
+
self._add_dimension_type(dims[i], player)
|
|
248
|
+
role_str = ' {' + f"dim{i+1}:{player}" + '} '
|
|
249
|
+
role_seq.append(role_str)
|
|
250
|
+
madlib_prefix = " and ".join(role_seq)
|
|
251
|
+
madlib = madlib_prefix + "maps to " + '{val:' + f"{value_type}" + '}'
|
|
252
|
+
return get_model().Relationship(madlib)
|
|
253
|
+
|
|
254
|
+
def rx(*args) -> RoleExpr:
|
|
255
|
+
if len(args) == 0:
|
|
256
|
+
return NilRoleExpr()
|
|
257
|
+
|
|
258
|
+
reasoner = get_reasoner()
|
|
259
|
+
|
|
260
|
+
if len(args) == 1:
|
|
261
|
+
arg = args[0]
|
|
262
|
+
if isinstance(arg, Role):
|
|
263
|
+
if not reasoner.is_one_role(arg):
|
|
264
|
+
raise Exception(f"Role {arg} used in a dimension or splicer is not a one role")
|
|
265
|
+
return SimpleRoleExpr(arg)
|
|
266
|
+
else:
|
|
267
|
+
return arg
|
|
268
|
+
|
|
269
|
+
components = []
|
|
270
|
+
|
|
271
|
+
for arg in args:
|
|
272
|
+
if isinstance(arg, Role):
|
|
273
|
+
if not reasoner.is_one_role(arg):
|
|
274
|
+
raise Exception(f"Role {arg} used in a dimension or splicer is not a one role")
|
|
275
|
+
|
|
276
|
+
components.append(SimpleRoleExpr(arg))
|
|
277
|
+
else:
|
|
278
|
+
components.append(arg)
|
|
279
|
+
|
|
280
|
+
if len(components) == 1:
|
|
281
|
+
return components[0]
|
|
282
|
+
else:
|
|
283
|
+
return ComposeRoleExpr(*components)
|
|
284
|
+
|
|
285
|
+
def star(*args): return rx(*args).star()
|
|
286
|
+
def plus(*args): return rx(*args).plus()
|
|
287
|
+
|
|
288
|
+
def dim(r, *args):
|
|
289
|
+
return Dimension(r, rx(*args))
|
|
290
|
+
|
|
291
|
+
def splice(x, *args): return Splicer(x, rx(*args))
|
|
292
|
+
|
|
293
|
+
def union(*args): return UnionRoleExpr(*args)
|
|
294
|
+
|
|
295
|
+
def avg(m, *dims): return Measure(m, *dims, method = qb.avg)
|
|
296
|
+
def count(m, *dims): return Measure(m, *dims, method = qb.count)
|
|
297
|
+
def min(m, *dims): return Measure(m, *dims, method = qb.min)
|
|
298
|
+
def max(m, *dims): return Measure(m, *dims, method = qb.max)
|
|
299
|
+
def sum(m, *dims): return Measure(m, *dims, method = qb.sum)
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Union, Optional
|
|
3
|
+
|
|
4
|
+
from relationalai.early_access.dsl.orm.measures.initializer import get_reasoner
|
|
5
|
+
from relationalai.early_access.dsl.orm.models import Role
|
|
6
|
+
from relationalai.semantics.metamodel.util import OrderedSet, ordered_set
|
|
7
|
+
|
|
8
|
+
class RoleExpr(ABC):
|
|
9
|
+
|
|
10
|
+
def __init__(self):
|
|
11
|
+
self._reasoner = get_reasoner()
|
|
12
|
+
|
|
13
|
+
@staticmethod
|
|
14
|
+
def flat_concat(x1, x2):
|
|
15
|
+
def flatten(expr):
|
|
16
|
+
return expr._seq if expr.composer() else [expr]
|
|
17
|
+
|
|
18
|
+
parts = flatten(x1) + flatten(x2)
|
|
19
|
+
return ComposeRoleExpr(*parts)
|
|
20
|
+
|
|
21
|
+
def ending_roles(self) -> OrderedSet[Role] : return ordered_set()
|
|
22
|
+
|
|
23
|
+
@abstractmethod
|
|
24
|
+
def guid(self) -> int: pass
|
|
25
|
+
|
|
26
|
+
def composer(self) -> bool: return False
|
|
27
|
+
def nil(self) -> bool: return False
|
|
28
|
+
def kleene_plus(self) -> bool: return False
|
|
29
|
+
def kleene_star(self) -> bool: return False
|
|
30
|
+
def simple(self) -> bool: return False
|
|
31
|
+
def mandatory(self) -> bool: return False
|
|
32
|
+
|
|
33
|
+
def plus(self):
|
|
34
|
+
return PlusRoleExpr(self)
|
|
35
|
+
|
|
36
|
+
def star(self):
|
|
37
|
+
return StarRoleExpr(self)
|
|
38
|
+
|
|
39
|
+
def subsumes(self, other) -> Union[tuple['RoleExpr', Optional['RoleExpr']], tuple[None, None]]:
|
|
40
|
+
return (self, None) if other.nil() else (None, None)
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
def pretty_print(self) -> str:
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
class NilRoleExpr(RoleExpr):
|
|
47
|
+
|
|
48
|
+
def __init__(self):
|
|
49
|
+
super().__init__()
|
|
50
|
+
|
|
51
|
+
def guid(self) -> int: return hash("Nil")
|
|
52
|
+
|
|
53
|
+
def mandatory(self): return True
|
|
54
|
+
|
|
55
|
+
def nil(self): return True
|
|
56
|
+
|
|
57
|
+
def pretty_print(self) -> str: return "Nil"
|
|
58
|
+
|
|
59
|
+
class SimpleRoleExpr(RoleExpr):
|
|
60
|
+
|
|
61
|
+
def __init__(self, r: Role):
|
|
62
|
+
super().__init__()
|
|
63
|
+
if not isinstance(r, Role):
|
|
64
|
+
raise Exception(f"Tried to instantiate a SimpleRoleExpr with a non-role: {r} of type {type(r)}")
|
|
65
|
+
self._role = r
|
|
66
|
+
|
|
67
|
+
def ending_roles(self): return ordered_set(self._role)
|
|
68
|
+
|
|
69
|
+
def guid(self) -> int: return hash(self._role._guid())
|
|
70
|
+
|
|
71
|
+
def simple(self): return True
|
|
72
|
+
|
|
73
|
+
def mandatory(self):
|
|
74
|
+
this = self._role
|
|
75
|
+
|
|
76
|
+
if not self._reasoner.is_one_role(this):
|
|
77
|
+
return False
|
|
78
|
+
|
|
79
|
+
roles = this.siblings()
|
|
80
|
+
if len(roles) > 1:
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
return self._reasoner.is_mandatory_role(roles[0])
|
|
84
|
+
|
|
85
|
+
def pretty_print(self) -> str:
|
|
86
|
+
return f"{self._role}"
|
|
87
|
+
|
|
88
|
+
def subsumes(self, other):
|
|
89
|
+
if other.simple():
|
|
90
|
+
return (self, None) if self._role._guid() == other._role._guid() else (None, None)
|
|
91
|
+
return super().subsumes(other)
|
|
92
|
+
|
|
93
|
+
class UnionRoleExpr(RoleExpr):
|
|
94
|
+
def __init__(self, *roles):
|
|
95
|
+
super().__init__()
|
|
96
|
+
|
|
97
|
+
if not roles:
|
|
98
|
+
raise ValueError("At least one role must be provided for the UnionRoleExpr.")
|
|
99
|
+
|
|
100
|
+
self._roles = roles
|
|
101
|
+
|
|
102
|
+
matcher=None
|
|
103
|
+
for r in roles:
|
|
104
|
+
if r is None:
|
|
105
|
+
raise ValueError("NoneType role provided to UnionRoleExpr.")
|
|
106
|
+
if matcher is None:
|
|
107
|
+
matcher = r
|
|
108
|
+
else:
|
|
109
|
+
if not self._reasoner.are_roles_compatible(r, matcher):
|
|
110
|
+
raise Exception(f"Two roles {r} and {matcher} with incompatible players used in a union role expression")
|
|
111
|
+
|
|
112
|
+
assert matcher is not None, "Matcher should not be None after processing roles."
|
|
113
|
+
self._role_player = matcher.player()
|
|
114
|
+
|
|
115
|
+
def common_player(self): return self._role_player
|
|
116
|
+
|
|
117
|
+
def guid(self) -> int:
|
|
118
|
+
role_hashes = [hash(r) for r in self._roles]
|
|
119
|
+
return hash(tuple(role_hashes))
|
|
120
|
+
|
|
121
|
+
def pretty_print(self) -> str:
|
|
122
|
+
expr = " | ".join([f"{r}" for r in self._roles])
|
|
123
|
+
return f"( {expr} )"
|
|
124
|
+
|
|
125
|
+
def roles(self): return self._roles
|
|
126
|
+
|
|
127
|
+
class ComposeRoleExpr(RoleExpr):
|
|
128
|
+
|
|
129
|
+
def __init__(self, *exprs):
|
|
130
|
+
super().__init__()
|
|
131
|
+
self._seq = []
|
|
132
|
+
for exp in exprs:
|
|
133
|
+
if not isinstance(exp, RoleExpr):
|
|
134
|
+
raise Exception(f"Tried to concatenate with non- role expr: {exp} of type {type(exp)}")
|
|
135
|
+
self._seq.append(exp)
|
|
136
|
+
|
|
137
|
+
def composer(self) -> bool: return True
|
|
138
|
+
|
|
139
|
+
# Finds all ending roles of this ConcatExpr. We have to iterate
|
|
140
|
+
# in reverse until we find the first non Kleene star expr to make
|
|
141
|
+
# sure we account for exprs like:
|
|
142
|
+
# r1 . r2 . ( r3 )* . (r4 . r5)*
|
|
143
|
+
# which should return { r2, r3, r5 }
|
|
144
|
+
#
|
|
145
|
+
def ending_roles(self):
|
|
146
|
+
roles = ordered_set()
|
|
147
|
+
for expr in reversed(self._seq):
|
|
148
|
+
roles.update(expr.ending_roles())
|
|
149
|
+
if not expr.kleene_star():
|
|
150
|
+
break
|
|
151
|
+
return roles
|
|
152
|
+
|
|
153
|
+
def guid(self) -> int:
|
|
154
|
+
role_hashes = [x.guid() for x in self._seq]
|
|
155
|
+
return hash(tuple(role_hashes))
|
|
156
|
+
|
|
157
|
+
def mandatory(self):
|
|
158
|
+
for e in self._seq:
|
|
159
|
+
if not e.mandatory():
|
|
160
|
+
return False
|
|
161
|
+
return True
|
|
162
|
+
|
|
163
|
+
def pretty_print(self) -> str:
|
|
164
|
+
parts = [ p.pretty_print() for p in self._seq ]
|
|
165
|
+
return " . ".join(parts)
|
|
166
|
+
|
|
167
|
+
def subsumes(self, other):
|
|
168
|
+
|
|
169
|
+
if other.nil():
|
|
170
|
+
return self, None
|
|
171
|
+
|
|
172
|
+
o_seq = other._seq if other.composer() else [other]
|
|
173
|
+
my_seq = self._seq
|
|
174
|
+
o_seq_length = len(o_seq)
|
|
175
|
+
|
|
176
|
+
if len(my_seq) < o_seq_length:
|
|
177
|
+
return None, None
|
|
178
|
+
|
|
179
|
+
splice_point_stack = []
|
|
180
|
+
for i in range(o_seq_length):
|
|
181
|
+
my_expr = my_seq[i]
|
|
182
|
+
(x, splicer) = my_expr.subsumes(o_seq[i])
|
|
183
|
+
if x is None:
|
|
184
|
+
return None, None
|
|
185
|
+
else:
|
|
186
|
+
if my_expr.kleene_star():
|
|
187
|
+
splice_point_stack.append(my_expr)
|
|
188
|
+
else:
|
|
189
|
+
splice_point_stack = [my_expr]
|
|
190
|
+
|
|
191
|
+
# Upon exit, splice_point_stack must contain at least one role expr,
|
|
192
|
+
# and because len(o_seq) could be less than len(my_seq) we need to
|
|
193
|
+
# consider any remaining exprs in my_seq when creating the splicer.
|
|
194
|
+
|
|
195
|
+
if len(splice_point_stack) == 1:
|
|
196
|
+
join_expr = splice_point_stack[0]
|
|
197
|
+
else:
|
|
198
|
+
oset = ordered_set()
|
|
199
|
+
for x in splice_point_stack:
|
|
200
|
+
for r in x.ending_roles():
|
|
201
|
+
oset.add(r)
|
|
202
|
+
join_expr = UnionRoleExpr(*oset)
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
if len(my_seq) == o_seq_length:
|
|
206
|
+
return join_expr, None
|
|
207
|
+
else:
|
|
208
|
+
if len(my_seq) - o_seq_length == 1:
|
|
209
|
+
return join_expr, my_seq[o_seq_length]
|
|
210
|
+
else:
|
|
211
|
+
# Create a composer that represents what to splice onto
|
|
212
|
+
# any dimension at the join point denoted by join_expr
|
|
213
|
+
expr_seq = []
|
|
214
|
+
for i in range(o_seq_length, len(my_seq), 1):
|
|
215
|
+
expr_seq.append(my_seq[i])
|
|
216
|
+
|
|
217
|
+
return join_expr, ComposeRoleExpr(*expr_seq)
|
|
218
|
+
|
|
219
|
+
class ClosureRoleExpr(RoleExpr):
|
|
220
|
+
def __init__(self, x):
|
|
221
|
+
super().__init__()
|
|
222
|
+
if not isinstance(x, RoleExpr):
|
|
223
|
+
raise Exception(f"Tried to take the reflexive a closure of something other than a role expression: {x} of type {type(x)}")
|
|
224
|
+
self._component = x
|
|
225
|
+
|
|
226
|
+
def ending_roles(self):
|
|
227
|
+
return self._component.ending_roles()
|
|
228
|
+
|
|
229
|
+
def mandatory(self):
|
|
230
|
+
return self._component.mandatory()
|
|
231
|
+
|
|
232
|
+
def role_body(self):
|
|
233
|
+
assert(isinstance(self._component, SimpleRoleExpr))
|
|
234
|
+
return self._component._role
|
|
235
|
+
|
|
236
|
+
class StarRoleExpr(ClosureRoleExpr):
|
|
237
|
+
def __init__(self, x):
|
|
238
|
+
super().__init__(x)
|
|
239
|
+
|
|
240
|
+
def guid(self) -> int: return hash(("*", self._component.guid()))
|
|
241
|
+
|
|
242
|
+
def kleene_star(self) -> bool: return True
|
|
243
|
+
|
|
244
|
+
def pretty_print(self) -> str:
|
|
245
|
+
return f"( {self._component.pretty_print()} ) *"
|
|
246
|
+
|
|
247
|
+
def subsumes(self, other):
|
|
248
|
+
if other.kleene_star():
|
|
249
|
+
(x, _) = self._component.subsumes(other._component)
|
|
250
|
+
return (x, None) if x is not None else (None, None)
|
|
251
|
+
return super().subsumes(other)
|
|
252
|
+
|
|
253
|
+
class PlusRoleExpr(ClosureRoleExpr):
|
|
254
|
+
def __init__(self, x):
|
|
255
|
+
super().__init__(x)
|
|
256
|
+
|
|
257
|
+
def guid(self) -> int: return hash(("+", self._component.guid()))
|
|
258
|
+
|
|
259
|
+
def kleene_plus(self) -> bool: return True
|
|
260
|
+
|
|
261
|
+
def pretty_print(self) -> str:
|
|
262
|
+
return f"( {self._component.pretty_print()} ) +"
|
|
263
|
+
|
|
264
|
+
def subsumes(self, other):
|
|
265
|
+
if other.kleene_plus():
|
|
266
|
+
(x, _) = self._component.subsumes(other._component)
|
|
267
|
+
return (x, None) if x is not None else (None, None)
|
|
268
|
+
return super().subsumes(other)
|