relationalai 0.13.0.dev0__py3-none-any.whl → 0.13.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frontend/debugger/dist/.gitignore +2 -0
- frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- frontend/debugger/dist/assets/index-Cssla-O7.js +208 -0
- frontend/debugger/dist/assets/index-DlHsYx1V.css +9 -0
- frontend/debugger/dist/index.html +17 -0
- relationalai/__init__.py +256 -1
- relationalai/clients/__init__.py +18 -0
- relationalai/clients/client.py +912 -0
- relationalai/clients/config.py +673 -0
- relationalai/clients/direct_access_client.py +118 -0
- relationalai/clients/exec_txn_poller.py +91 -0
- relationalai/clients/hash_util.py +31 -0
- relationalai/clients/local.py +571 -0
- relationalai/clients/profile_polling.py +73 -0
- relationalai/clients/resources/__init__.py +8 -0
- relationalai/clients/resources/azure/azure.py +477 -0
- relationalai/clients/resources/snowflake/__init__.py +20 -0
- relationalai/clients/resources/snowflake/cli_resources.py +87 -0
- relationalai/clients/resources/snowflake/direct_access_resources.py +694 -0
- relationalai/clients/resources/snowflake/engine_state_handlers.py +309 -0
- relationalai/clients/resources/snowflake/error_handlers.py +199 -0
- relationalai/clients/resources/snowflake/export_procedure.py.jinja +249 -0
- relationalai/clients/resources/snowflake/resources_factory.py +99 -0
- relationalai/clients/resources/snowflake/snowflake.py +3190 -0
- relationalai/clients/resources/snowflake/use_index_poller.py +1019 -0
- relationalai/clients/resources/snowflake/use_index_resources.py +188 -0
- relationalai/clients/resources/snowflake/util.py +387 -0
- relationalai/clients/result_helpers.py +420 -0
- relationalai/clients/types.py +113 -0
- relationalai/clients/util.py +356 -0
- relationalai/debugging.py +389 -0
- relationalai/dsl.py +1749 -0
- relationalai/early_access/builder/__init__.py +30 -0
- relationalai/early_access/builder/builder/__init__.py +35 -0
- relationalai/early_access/builder/snowflake/__init__.py +12 -0
- relationalai/early_access/builder/std/__init__.py +25 -0
- relationalai/early_access/builder/std/decimals/__init__.py +12 -0
- relationalai/early_access/builder/std/integers/__init__.py +12 -0
- relationalai/early_access/builder/std/math/__init__.py +12 -0
- relationalai/early_access/builder/std/strings/__init__.py +14 -0
- relationalai/early_access/devtools/__init__.py +12 -0
- relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
- relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
- relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
- relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
- relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
- relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
- relationalai/early_access/dsl/bindings/common.py +402 -0
- relationalai/early_access/dsl/bindings/csv.py +170 -0
- relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
- relationalai/early_access/dsl/bindings/snowflake.py +64 -0
- relationalai/early_access/dsl/codegen/binder.py +411 -0
- relationalai/early_access/dsl/codegen/common.py +79 -0
- relationalai/early_access/dsl/codegen/helpers.py +23 -0
- relationalai/early_access/dsl/codegen/relations.py +700 -0
- relationalai/early_access/dsl/codegen/weaver.py +417 -0
- relationalai/early_access/dsl/core/builders/__init__.py +47 -0
- relationalai/early_access/dsl/core/builders/logic.py +19 -0
- relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
- relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
- relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
- relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
- relationalai/early_access/dsl/core/context.py +13 -0
- relationalai/early_access/dsl/core/cset.py +132 -0
- relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
- relationalai/early_access/dsl/core/exprs/relational.py +18 -0
- relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
- relationalai/early_access/dsl/core/instances.py +44 -0
- relationalai/early_access/dsl/core/logic/__init__.py +193 -0
- relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
- relationalai/early_access/dsl/core/logic/exists.py +223 -0
- relationalai/early_access/dsl/core/logic/helper.py +163 -0
- relationalai/early_access/dsl/core/namespaces.py +32 -0
- relationalai/early_access/dsl/core/relations.py +276 -0
- relationalai/early_access/dsl/core/rules.py +112 -0
- relationalai/early_access/dsl/core/std/__init__.py +45 -0
- relationalai/early_access/dsl/core/temporal/recall.py +6 -0
- relationalai/early_access/dsl/core/types/__init__.py +270 -0
- relationalai/early_access/dsl/core/types/concepts.py +128 -0
- relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
- relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
- relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
- relationalai/early_access/dsl/core/types/standard.py +92 -0
- relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
- relationalai/early_access/dsl/core/types/variables.py +203 -0
- relationalai/early_access/dsl/ir/compiler.py +318 -0
- relationalai/early_access/dsl/ir/executor.py +260 -0
- relationalai/early_access/dsl/ontologies/constraints.py +88 -0
- relationalai/early_access/dsl/ontologies/export.py +30 -0
- relationalai/early_access/dsl/ontologies/models.py +453 -0
- relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
- relationalai/early_access/dsl/ontologies/readings.py +60 -0
- relationalai/early_access/dsl/ontologies/relationships.py +322 -0
- relationalai/early_access/dsl/ontologies/roles.py +87 -0
- relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
- relationalai/early_access/dsl/orm/constraints.py +438 -0
- relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
- relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
- relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
- relationalai/early_access/dsl/orm/measures/measures.py +299 -0
- relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
- relationalai/early_access/dsl/orm/models.py +256 -0
- relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
- relationalai/early_access/dsl/orm/printer.py +469 -0
- relationalai/early_access/dsl/orm/reasoners.py +480 -0
- relationalai/early_access/dsl/orm/relations.py +19 -0
- relationalai/early_access/dsl/orm/relationships.py +251 -0
- relationalai/early_access/dsl/orm/types.py +42 -0
- relationalai/early_access/dsl/orm/utils.py +79 -0
- relationalai/early_access/dsl/orm/verb.py +204 -0
- relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
- relationalai/early_access/dsl/relations.py +170 -0
- relationalai/early_access/dsl/rulesets.py +69 -0
- relationalai/early_access/dsl/schemas/__init__.py +450 -0
- relationalai/early_access/dsl/schemas/builder.py +48 -0
- relationalai/early_access/dsl/schemas/comp_names.py +51 -0
- relationalai/early_access/dsl/schemas/components.py +203 -0
- relationalai/early_access/dsl/schemas/contexts.py +156 -0
- relationalai/early_access/dsl/schemas/exprs.py +89 -0
- relationalai/early_access/dsl/schemas/fragments.py +464 -0
- relationalai/early_access/dsl/serialization.py +79 -0
- relationalai/early_access/dsl/serialize/exporter.py +163 -0
- relationalai/early_access/dsl/snow/api.py +105 -0
- relationalai/early_access/dsl/snow/common.py +76 -0
- relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
- relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
- relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
- relationalai/early_access/dsl/types/__init__.py +40 -0
- relationalai/early_access/dsl/types/concepts.py +12 -0
- relationalai/early_access/dsl/types/entities.py +135 -0
- relationalai/early_access/dsl/types/values.py +17 -0
- relationalai/early_access/dsl/utils.py +102 -0
- relationalai/early_access/graphs/__init__.py +13 -0
- relationalai/early_access/lqp/__init__.py +12 -0
- relationalai/early_access/lqp/compiler/__init__.py +12 -0
- relationalai/early_access/lqp/constructors/__init__.py +18 -0
- relationalai/early_access/lqp/executor/__init__.py +12 -0
- relationalai/early_access/lqp/ir/__init__.py +12 -0
- relationalai/early_access/lqp/passes/__init__.py +12 -0
- relationalai/early_access/lqp/pragmas/__init__.py +12 -0
- relationalai/early_access/lqp/primitives/__init__.py +12 -0
- relationalai/early_access/lqp/types/__init__.py +12 -0
- relationalai/early_access/lqp/utils/__init__.py +12 -0
- relationalai/early_access/lqp/validators/__init__.py +12 -0
- relationalai/early_access/metamodel/__init__.py +58 -0
- relationalai/early_access/metamodel/builtins/__init__.py +12 -0
- relationalai/early_access/metamodel/compiler/__init__.py +12 -0
- relationalai/early_access/metamodel/dependency/__init__.py +12 -0
- relationalai/early_access/metamodel/factory/__init__.py +17 -0
- relationalai/early_access/metamodel/helpers/__init__.py +12 -0
- relationalai/early_access/metamodel/ir/__init__.py +14 -0
- relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
- relationalai/early_access/metamodel/typer/__init__.py +3 -0
- relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
- relationalai/early_access/metamodel/types/__init__.py +15 -0
- relationalai/early_access/metamodel/util/__init__.py +15 -0
- relationalai/early_access/metamodel/visitor/__init__.py +12 -0
- relationalai/early_access/rel/__init__.py +12 -0
- relationalai/early_access/rel/executor/__init__.py +12 -0
- relationalai/early_access/rel/rel_utils/__init__.py +12 -0
- relationalai/early_access/rel/rewrite/__init__.py +7 -0
- relationalai/early_access/solvers/__init__.py +19 -0
- relationalai/early_access/sql/__init__.py +11 -0
- relationalai/early_access/sql/executor/__init__.py +3 -0
- relationalai/early_access/sql/rewrite/__init__.py +3 -0
- relationalai/early_access/tests/logging/__init__.py +12 -0
- relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
- relationalai/early_access/tests/utils/__init__.py +12 -0
- relationalai/environments/__init__.py +35 -0
- relationalai/environments/base.py +381 -0
- relationalai/environments/colab.py +14 -0
- relationalai/environments/generic.py +71 -0
- relationalai/environments/ipython.py +68 -0
- relationalai/environments/jupyter.py +9 -0
- relationalai/environments/snowbook.py +169 -0
- relationalai/errors.py +2496 -0
- relationalai/experimental/SF.py +38 -0
- relationalai/experimental/inspect.py +47 -0
- relationalai/experimental/pathfinder/__init__.py +158 -0
- relationalai/experimental/pathfinder/api.py +160 -0
- relationalai/experimental/pathfinder/automaton.py +584 -0
- relationalai/experimental/pathfinder/bridge.py +226 -0
- relationalai/experimental/pathfinder/compiler.py +416 -0
- relationalai/experimental/pathfinder/datalog.py +214 -0
- relationalai/experimental/pathfinder/diagnostics.py +56 -0
- relationalai/experimental/pathfinder/filter.py +236 -0
- relationalai/experimental/pathfinder/glushkov.py +439 -0
- relationalai/experimental/pathfinder/options.py +265 -0
- relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +1951 -0
- relationalai/experimental/pathfinder/rpq.py +344 -0
- relationalai/experimental/pathfinder/transition.py +200 -0
- relationalai/experimental/pathfinder/utils.py +26 -0
- relationalai/experimental/paths/README.md +107 -0
- relationalai/experimental/paths/api.py +143 -0
- relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
- relationalai/experimental/paths/code_organization.md +2 -0
- relationalai/experimental/paths/examples/Movies.ipynb +16328 -0
- relationalai/experimental/paths/examples/basic_example.py +40 -0
- relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
- relationalai/experimental/paths/examples/movie_example.py +77 -0
- relationalai/experimental/paths/examples/movies_data/actedin.csv +193 -0
- relationalai/experimental/paths/examples/movies_data/directed.csv +45 -0
- relationalai/experimental/paths/examples/movies_data/follows.csv +7 -0
- relationalai/experimental/paths/examples/movies_data/movies.csv +39 -0
- relationalai/experimental/paths/examples/movies_data/person.csv +134 -0
- relationalai/experimental/paths/examples/movies_data/produced.csv +16 -0
- relationalai/experimental/paths/examples/movies_data/ratings.csv +10 -0
- relationalai/experimental/paths/examples/movies_data/wrote.csv +11 -0
- relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
- relationalai/experimental/paths/examples/paths_example.py +116 -0
- relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
- relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
- relationalai/experimental/paths/graph.py +185 -0
- relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
- relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
- relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
- relationalai/experimental/paths/path_algorithms/single.py +59 -0
- relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
- relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
- relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
- relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
- relationalai/experimental/paths/path_algorithms/usp.py +150 -0
- relationalai/experimental/paths/product_graph.py +93 -0
- relationalai/experimental/paths/rpq/automaton.py +584 -0
- relationalai/experimental/paths/rpq/diagnostics.py +56 -0
- relationalai/experimental/paths/rpq/rpq.py +378 -0
- relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
- relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
- relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
- relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
- relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
- relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
- relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
- relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
- relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
- relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
- relationalai/experimental/paths/tree_agg.py +168 -0
- relationalai/experimental/paths/utilities/iterators.py +27 -0
- relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
- relationalai/experimental/solvers.py +1087 -0
- relationalai/loaders/csv.py +195 -0
- relationalai/loaders/loader.py +177 -0
- relationalai/loaders/types.py +23 -0
- relationalai/rel_emitter.py +373 -0
- relationalai/rel_utils.py +185 -0
- relationalai/semantics/__init__.py +22 -146
- relationalai/semantics/designs/query_builder/identify_by.md +106 -0
- relationalai/semantics/devtools/benchmark_lqp.py +535 -0
- relationalai/semantics/devtools/compilation_manager.py +294 -0
- relationalai/semantics/devtools/extract_lqp.py +110 -0
- relationalai/semantics/internal/internal.py +3785 -0
- relationalai/semantics/internal/snowflake.py +325 -0
- relationalai/semantics/lqp/README.md +34 -0
- relationalai/semantics/lqp/builtins.py +16 -0
- relationalai/semantics/lqp/compiler.py +22 -0
- relationalai/semantics/lqp/constructors.py +68 -0
- relationalai/semantics/lqp/executor.py +469 -0
- relationalai/semantics/lqp/intrinsics.py +24 -0
- relationalai/semantics/lqp/model2lqp.py +877 -0
- relationalai/semantics/lqp/passes.py +680 -0
- relationalai/semantics/lqp/primitives.py +252 -0
- relationalai/semantics/lqp/result_helpers.py +202 -0
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
- relationalai/semantics/lqp/rewrite/cdc.py +216 -0
- relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
- relationalai/semantics/lqp/rewrite/extract_keys.py +512 -0
- relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
- relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
- relationalai/semantics/lqp/rewrite/splinter.py +76 -0
- relationalai/semantics/lqp/types.py +101 -0
- relationalai/semantics/lqp/utils.py +160 -0
- relationalai/semantics/lqp/validators.py +57 -0
- relationalai/semantics/metamodel/__init__.py +40 -6
- relationalai/semantics/metamodel/builtins.py +771 -205
- relationalai/semantics/metamodel/compiler.py +133 -0
- relationalai/semantics/metamodel/dependency.py +862 -0
- relationalai/semantics/metamodel/executor.py +61 -0
- relationalai/semantics/metamodel/factory.py +287 -0
- relationalai/semantics/metamodel/helpers.py +361 -0
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
- relationalai/semantics/metamodel/rewrite/flatten.py +554 -0
- relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
- relationalai/semantics/metamodel/typer/checker.py +353 -0
- relationalai/semantics/metamodel/typer/typer.py +1395 -0
- relationalai/semantics/metamodel/util.py +506 -0
- relationalai/semantics/reasoners/__init__.py +10 -0
- relationalai/semantics/reasoners/graph/README.md +620 -0
- relationalai/semantics/reasoners/graph/__init__.py +37 -0
- relationalai/semantics/reasoners/graph/core.py +9019 -0
- relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +797 -0
- relationalai/semantics/reasoners/graph/tests/README.md +21 -0
- relationalai/semantics/reasoners/optimization/__init__.py +68 -0
- relationalai/semantics/reasoners/optimization/common.py +88 -0
- relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
- relationalai/semantics/reasoners/optimization/solvers_pb.py +1414 -0
- relationalai/semantics/rel/builtins.py +40 -0
- relationalai/semantics/rel/compiler.py +989 -0
- relationalai/semantics/rel/executor.py +362 -0
- relationalai/semantics/rel/rel.py +482 -0
- relationalai/semantics/rel/rel_utils.py +276 -0
- relationalai/semantics/snowflake/__init__.py +3 -0
- relationalai/semantics/sql/compiler.py +2503 -0
- relationalai/semantics/sql/executor/duck_db.py +52 -0
- relationalai/semantics/sql/executor/result_helpers.py +64 -0
- relationalai/semantics/sql/executor/snowflake.py +149 -0
- relationalai/semantics/sql/rewrite/denormalize.py +222 -0
- relationalai/semantics/sql/rewrite/double_negation.py +49 -0
- relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
- relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
- relationalai/semantics/sql/sql.py +504 -0
- relationalai/semantics/std/__init__.py +40 -60
- relationalai/semantics/std/constraints.py +43 -37
- relationalai/semantics/std/datetime.py +135 -246
- relationalai/semantics/std/decimals.py +52 -45
- relationalai/semantics/std/floats.py +5 -13
- relationalai/semantics/std/integers.py +11 -26
- relationalai/semantics/std/math.py +112 -183
- relationalai/semantics/std/pragmas.py +11 -0
- relationalai/semantics/std/re.py +62 -80
- relationalai/semantics/std/std.py +14 -0
- relationalai/semantics/std/strings.py +60 -117
- relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
- relationalai/semantics/tests/test_snapshot_base.py +9 -0
- relationalai/semantics/tests/utils.py +46 -0
- relationalai/std/__init__.py +70 -0
- relationalai/tools/cli.py +1936 -0
- relationalai/tools/cli_controls.py +1826 -0
- relationalai/tools/cli_helpers.py +398 -0
- relationalai/tools/debugger.py +183 -289
- relationalai/tools/debugger_client.py +109 -0
- relationalai/tools/debugger_server.py +302 -0
- relationalai/tools/dev.py +685 -0
- relationalai/tools/notes +7 -0
- relationalai/tools/qb_debugger.py +425 -0
- relationalai/util/clean_up_databases.py +95 -0
- relationalai/util/format.py +106 -48
- relationalai/util/list_databases.py +9 -0
- relationalai/util/otel_configuration.py +26 -0
- relationalai/util/otel_handler.py +484 -0
- relationalai/util/snowflake_handler.py +88 -0
- relationalai/util/span_format_test.py +43 -0
- relationalai/util/span_tracker.py +207 -0
- relationalai/util/spans_file_handler.py +72 -0
- relationalai/util/tracing_handler.py +34 -0
- relationalai-0.13.1.dist-info/METADATA +74 -0
- relationalai-0.13.1.dist-info/RECORD +459 -0
- relationalai-0.13.1.dist-info/WHEEL +4 -0
- relationalai-0.13.1.dist-info/entry_points.txt +3 -0
- relationalai-0.13.1.dist-info/licenses/LICENSE +202 -0
- relationalai_test_util/__init__.py +4 -0
- relationalai_test_util/fixtures.py +233 -0
- relationalai_test_util/snapshot.py +252 -0
- relationalai_test_util/traceback.py +118 -0
- relationalai/config/__init__.py +0 -56
- relationalai/config/config.py +0 -289
- relationalai/config/config_fields.py +0 -86
- relationalai/config/connections/__init__.py +0 -46
- relationalai/config/connections/base.py +0 -23
- relationalai/config/connections/duckdb.py +0 -29
- relationalai/config/connections/snowflake.py +0 -243
- relationalai/config/external/__init__.py +0 -17
- relationalai/config/external/dbt_converter.py +0 -101
- relationalai/config/external/dbt_models.py +0 -93
- relationalai/config/external/snowflake_converter.py +0 -41
- relationalai/config/external/snowflake_models.py +0 -85
- relationalai/config/external/utils.py +0 -19
- relationalai/semantics/backends/lqp/annotations.py +0 -11
- relationalai/semantics/backends/sql/sql_compiler.py +0 -327
- relationalai/semantics/frontend/base.py +0 -1707
- relationalai/semantics/frontend/core.py +0 -179
- relationalai/semantics/frontend/front_compiler.py +0 -1313
- relationalai/semantics/frontend/pprint.py +0 -408
- relationalai/semantics/metamodel/metamodel.py +0 -437
- relationalai/semantics/metamodel/metamodel_analyzer.py +0 -519
- relationalai/semantics/metamodel/metamodel_compiler.py +0 -0
- relationalai/semantics/metamodel/pprint.py +0 -412
- relationalai/semantics/metamodel/rewriter.py +0 -266
- relationalai/semantics/metamodel/typer.py +0 -1378
- relationalai/semantics/std/aggregates.py +0 -149
- relationalai/semantics/std/common.py +0 -44
- relationalai/semantics/std/numbers.py +0 -86
- relationalai/shims/executor.py +0 -147
- relationalai/shims/helpers.py +0 -126
- relationalai/shims/hoister.py +0 -221
- relationalai/shims/mm2v0.py +0 -1290
- relationalai/tools/cli/__init__.py +0 -6
- relationalai/tools/cli/cli.py +0 -90
- relationalai/tools/cli/components/__init__.py +0 -5
- relationalai/tools/cli/components/progress_reader.py +0 -1524
- relationalai/tools/cli/components/utils.py +0 -58
- relationalai/tools/cli/config_template.py +0 -45
- relationalai/tools/cli/dev.py +0 -19
- relationalai/tools/typer_debugger.py +0 -93
- relationalai/util/dataclasses.py +0 -43
- relationalai/util/docutils.py +0 -40
- relationalai/util/error.py +0 -199
- relationalai/util/naming.py +0 -145
- relationalai/util/python.py +0 -35
- relationalai/util/runtime.py +0 -156
- relationalai/util/schema.py +0 -197
- relationalai/util/source.py +0 -185
- relationalai/util/structures.py +0 -163
- relationalai/util/tracing.py +0 -261
- relationalai-0.13.0.dev0.dist-info/METADATA +0 -46
- relationalai-0.13.0.dev0.dist-info/RECORD +0 -488
- relationalai-0.13.0.dev0.dist-info/WHEEL +0 -5
- relationalai-0.13.0.dev0.dist-info/entry_points.txt +0 -3
- relationalai-0.13.0.dev0.dist-info/top_level.txt +0 -2
- v0/relationalai/__init__.py +0 -216
- v0/relationalai/clients/__init__.py +0 -5
- v0/relationalai/clients/azure.py +0 -477
- v0/relationalai/clients/client.py +0 -912
- v0/relationalai/clients/config.py +0 -673
- v0/relationalai/clients/direct_access_client.py +0 -118
- v0/relationalai/clients/hash_util.py +0 -31
- v0/relationalai/clients/local.py +0 -571
- v0/relationalai/clients/profile_polling.py +0 -73
- v0/relationalai/clients/result_helpers.py +0 -420
- v0/relationalai/clients/snowflake.py +0 -3869
- v0/relationalai/clients/types.py +0 -113
- v0/relationalai/clients/use_index_poller.py +0 -980
- v0/relationalai/clients/util.py +0 -356
- v0/relationalai/debugging.py +0 -389
- v0/relationalai/dsl.py +0 -1749
- v0/relationalai/early_access/builder/__init__.py +0 -30
- v0/relationalai/early_access/builder/builder/__init__.py +0 -35
- v0/relationalai/early_access/builder/snowflake/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/__init__.py +0 -25
- v0/relationalai/early_access/builder/std/decimals/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/integers/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/math/__init__.py +0 -12
- v0/relationalai/early_access/builder/std/strings/__init__.py +0 -14
- v0/relationalai/early_access/devtools/__init__.py +0 -12
- v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
- v0/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
- v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
- v0/relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
- v0/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
- v0/relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
- v0/relationalai/early_access/dsl/bindings/common.py +0 -402
- v0/relationalai/early_access/dsl/bindings/csv.py +0 -170
- v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
- v0/relationalai/early_access/dsl/bindings/snowflake.py +0 -64
- v0/relationalai/early_access/dsl/codegen/binder.py +0 -411
- v0/relationalai/early_access/dsl/codegen/common.py +0 -79
- v0/relationalai/early_access/dsl/codegen/helpers.py +0 -23
- v0/relationalai/early_access/dsl/codegen/relations.py +0 -700
- v0/relationalai/early_access/dsl/codegen/weaver.py +0 -417
- v0/relationalai/early_access/dsl/core/builders/__init__.py +0 -47
- v0/relationalai/early_access/dsl/core/builders/logic.py +0 -19
- v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
- v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
- v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
- v0/relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
- v0/relationalai/early_access/dsl/core/context.py +0 -13
- v0/relationalai/early_access/dsl/core/cset.py +0 -132
- v0/relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
- v0/relationalai/early_access/dsl/core/exprs/relational.py +0 -18
- v0/relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
- v0/relationalai/early_access/dsl/core/instances.py +0 -44
- v0/relationalai/early_access/dsl/core/logic/__init__.py +0 -193
- v0/relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
- v0/relationalai/early_access/dsl/core/logic/exists.py +0 -223
- v0/relationalai/early_access/dsl/core/logic/helper.py +0 -163
- v0/relationalai/early_access/dsl/core/namespaces.py +0 -32
- v0/relationalai/early_access/dsl/core/relations.py +0 -276
- v0/relationalai/early_access/dsl/core/rules.py +0 -112
- v0/relationalai/early_access/dsl/core/std/__init__.py +0 -45
- v0/relationalai/early_access/dsl/core/temporal/recall.py +0 -6
- v0/relationalai/early_access/dsl/core/types/__init__.py +0 -270
- v0/relationalai/early_access/dsl/core/types/concepts.py +0 -128
- v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
- v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
- v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
- v0/relationalai/early_access/dsl/core/types/standard.py +0 -92
- v0/relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
- v0/relationalai/early_access/dsl/core/types/variables.py +0 -203
- v0/relationalai/early_access/dsl/ir/compiler.py +0 -318
- v0/relationalai/early_access/dsl/ir/executor.py +0 -260
- v0/relationalai/early_access/dsl/ontologies/constraints.py +0 -88
- v0/relationalai/early_access/dsl/ontologies/export.py +0 -30
- v0/relationalai/early_access/dsl/ontologies/models.py +0 -453
- v0/relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
- v0/relationalai/early_access/dsl/ontologies/readings.py +0 -60
- v0/relationalai/early_access/dsl/ontologies/relationships.py +0 -322
- v0/relationalai/early_access/dsl/ontologies/roles.py +0 -87
- v0/relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
- v0/relationalai/early_access/dsl/orm/constraints.py +0 -438
- v0/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
- v0/relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
- v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
- v0/relationalai/early_access/dsl/orm/measures/measures.py +0 -299
- v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
- v0/relationalai/early_access/dsl/orm/models.py +0 -256
- v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
- v0/relationalai/early_access/dsl/orm/printer.py +0 -469
- v0/relationalai/early_access/dsl/orm/reasoners.py +0 -480
- v0/relationalai/early_access/dsl/orm/relations.py +0 -19
- v0/relationalai/early_access/dsl/orm/relationships.py +0 -251
- v0/relationalai/early_access/dsl/orm/types.py +0 -42
- v0/relationalai/early_access/dsl/orm/utils.py +0 -79
- v0/relationalai/early_access/dsl/orm/verb.py +0 -204
- v0/relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
- v0/relationalai/early_access/dsl/relations.py +0 -170
- v0/relationalai/early_access/dsl/rulesets.py +0 -69
- v0/relationalai/early_access/dsl/schemas/__init__.py +0 -450
- v0/relationalai/early_access/dsl/schemas/builder.py +0 -48
- v0/relationalai/early_access/dsl/schemas/comp_names.py +0 -51
- v0/relationalai/early_access/dsl/schemas/components.py +0 -203
- v0/relationalai/early_access/dsl/schemas/contexts.py +0 -156
- v0/relationalai/early_access/dsl/schemas/exprs.py +0 -89
- v0/relationalai/early_access/dsl/schemas/fragments.py +0 -464
- v0/relationalai/early_access/dsl/serialization.py +0 -79
- v0/relationalai/early_access/dsl/serialize/exporter.py +0 -163
- v0/relationalai/early_access/dsl/snow/api.py +0 -104
- v0/relationalai/early_access/dsl/snow/common.py +0 -76
- v0/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
- v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
- v0/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
- v0/relationalai/early_access/dsl/types/__init__.py +0 -40
- v0/relationalai/early_access/dsl/types/concepts.py +0 -12
- v0/relationalai/early_access/dsl/types/entities.py +0 -135
- v0/relationalai/early_access/dsl/types/values.py +0 -17
- v0/relationalai/early_access/dsl/utils.py +0 -102
- v0/relationalai/early_access/graphs/__init__.py +0 -13
- v0/relationalai/early_access/lqp/__init__.py +0 -12
- v0/relationalai/early_access/lqp/compiler/__init__.py +0 -12
- v0/relationalai/early_access/lqp/constructors/__init__.py +0 -18
- v0/relationalai/early_access/lqp/executor/__init__.py +0 -12
- v0/relationalai/early_access/lqp/ir/__init__.py +0 -12
- v0/relationalai/early_access/lqp/passes/__init__.py +0 -12
- v0/relationalai/early_access/lqp/pragmas/__init__.py +0 -12
- v0/relationalai/early_access/lqp/primitives/__init__.py +0 -12
- v0/relationalai/early_access/lqp/types/__init__.py +0 -12
- v0/relationalai/early_access/lqp/utils/__init__.py +0 -12
- v0/relationalai/early_access/lqp/validators/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/__init__.py +0 -58
- v0/relationalai/early_access/metamodel/builtins/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/compiler/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/dependency/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/factory/__init__.py +0 -17
- v0/relationalai/early_access/metamodel/helpers/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/ir/__init__.py +0 -14
- v0/relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
- v0/relationalai/early_access/metamodel/typer/__init__.py +0 -3
- v0/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
- v0/relationalai/early_access/metamodel/types/__init__.py +0 -15
- v0/relationalai/early_access/metamodel/util/__init__.py +0 -15
- v0/relationalai/early_access/metamodel/visitor/__init__.py +0 -12
- v0/relationalai/early_access/rel/__init__.py +0 -12
- v0/relationalai/early_access/rel/executor/__init__.py +0 -12
- v0/relationalai/early_access/rel/rel_utils/__init__.py +0 -12
- v0/relationalai/early_access/rel/rewrite/__init__.py +0 -7
- v0/relationalai/early_access/solvers/__init__.py +0 -19
- v0/relationalai/early_access/sql/__init__.py +0 -11
- v0/relationalai/early_access/sql/executor/__init__.py +0 -3
- v0/relationalai/early_access/sql/rewrite/__init__.py +0 -3
- v0/relationalai/early_access/tests/logging/__init__.py +0 -12
- v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
- v0/relationalai/early_access/tests/utils/__init__.py +0 -12
- v0/relationalai/environments/__init__.py +0 -35
- v0/relationalai/environments/base.py +0 -381
- v0/relationalai/environments/colab.py +0 -14
- v0/relationalai/environments/generic.py +0 -71
- v0/relationalai/environments/ipython.py +0 -68
- v0/relationalai/environments/jupyter.py +0 -9
- v0/relationalai/environments/snowbook.py +0 -169
- v0/relationalai/errors.py +0 -2455
- v0/relationalai/experimental/SF.py +0 -38
- v0/relationalai/experimental/inspect.py +0 -47
- v0/relationalai/experimental/pathfinder/__init__.py +0 -158
- v0/relationalai/experimental/pathfinder/api.py +0 -160
- v0/relationalai/experimental/pathfinder/automaton.py +0 -584
- v0/relationalai/experimental/pathfinder/bridge.py +0 -226
- v0/relationalai/experimental/pathfinder/compiler.py +0 -416
- v0/relationalai/experimental/pathfinder/datalog.py +0 -214
- v0/relationalai/experimental/pathfinder/diagnostics.py +0 -56
- v0/relationalai/experimental/pathfinder/filter.py +0 -236
- v0/relationalai/experimental/pathfinder/glushkov.py +0 -439
- v0/relationalai/experimental/pathfinder/options.py +0 -265
- v0/relationalai/experimental/pathfinder/rpq.py +0 -344
- v0/relationalai/experimental/pathfinder/transition.py +0 -200
- v0/relationalai/experimental/pathfinder/utils.py +0 -26
- v0/relationalai/experimental/paths/api.py +0 -143
- v0/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
- v0/relationalai/experimental/paths/examples/basic_example.py +0 -40
- v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
- v0/relationalai/experimental/paths/examples/movie_example.py +0 -77
- v0/relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
- v0/relationalai/experimental/paths/examples/paths_example.py +0 -116
- v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
- v0/relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
- v0/relationalai/experimental/paths/graph.py +0 -185
- v0/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
- v0/relationalai/experimental/paths/path_algorithms/single.py +0 -59
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
- v0/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
- v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
- v0/relationalai/experimental/paths/path_algorithms/usp.py +0 -150
- v0/relationalai/experimental/paths/product_graph.py +0 -93
- v0/relationalai/experimental/paths/rpq/automaton.py +0 -584
- v0/relationalai/experimental/paths/rpq/diagnostics.py +0 -56
- v0/relationalai/experimental/paths/rpq/rpq.py +0 -378
- v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
- v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
- v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
- v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
- v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
- v0/relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
- v0/relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
- v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
- v0/relationalai/experimental/paths/tree_agg.py +0 -168
- v0/relationalai/experimental/paths/utilities/iterators.py +0 -27
- v0/relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
- v0/relationalai/experimental/solvers.py +0 -1087
- v0/relationalai/loaders/csv.py +0 -195
- v0/relationalai/loaders/loader.py +0 -177
- v0/relationalai/loaders/types.py +0 -23
- v0/relationalai/rel_emitter.py +0 -373
- v0/relationalai/rel_utils.py +0 -185
- v0/relationalai/semantics/__init__.py +0 -29
- v0/relationalai/semantics/devtools/benchmark_lqp.py +0 -536
- v0/relationalai/semantics/devtools/compilation_manager.py +0 -294
- v0/relationalai/semantics/devtools/extract_lqp.py +0 -110
- v0/relationalai/semantics/internal/internal.py +0 -3785
- v0/relationalai/semantics/internal/snowflake.py +0 -324
- v0/relationalai/semantics/lqp/builtins.py +0 -16
- v0/relationalai/semantics/lqp/compiler.py +0 -22
- v0/relationalai/semantics/lqp/constructors.py +0 -68
- v0/relationalai/semantics/lqp/executor.py +0 -469
- v0/relationalai/semantics/lqp/intrinsics.py +0 -24
- v0/relationalai/semantics/lqp/model2lqp.py +0 -839
- v0/relationalai/semantics/lqp/passes.py +0 -680
- v0/relationalai/semantics/lqp/primitives.py +0 -252
- v0/relationalai/semantics/lqp/result_helpers.py +0 -202
- v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
- v0/relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- v0/relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
- v0/relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
- v0/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
- v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
- v0/relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- v0/relationalai/semantics/lqp/types.py +0 -101
- v0/relationalai/semantics/lqp/utils.py +0 -160
- v0/relationalai/semantics/lqp/validators.py +0 -57
- v0/relationalai/semantics/metamodel/__init__.py +0 -40
- v0/relationalai/semantics/metamodel/builtins.py +0 -774
- v0/relationalai/semantics/metamodel/compiler.py +0 -133
- v0/relationalai/semantics/metamodel/dependency.py +0 -862
- v0/relationalai/semantics/metamodel/executor.py +0 -61
- v0/relationalai/semantics/metamodel/factory.py +0 -287
- v0/relationalai/semantics/metamodel/helpers.py +0 -361
- v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
- v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- v0/relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
- v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
- v0/relationalai/semantics/metamodel/typer/checker.py +0 -353
- v0/relationalai/semantics/metamodel/typer/typer.py +0 -1395
- v0/relationalai/semantics/metamodel/util.py +0 -505
- v0/relationalai/semantics/reasoners/__init__.py +0 -10
- v0/relationalai/semantics/reasoners/graph/__init__.py +0 -37
- v0/relationalai/semantics/reasoners/graph/core.py +0 -9020
- v0/relationalai/semantics/reasoners/optimization/__init__.py +0 -68
- v0/relationalai/semantics/reasoners/optimization/common.py +0 -88
- v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
- v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
- v0/relationalai/semantics/rel/builtins.py +0 -40
- v0/relationalai/semantics/rel/compiler.py +0 -989
- v0/relationalai/semantics/rel/executor.py +0 -359
- v0/relationalai/semantics/rel/rel.py +0 -482
- v0/relationalai/semantics/rel/rel_utils.py +0 -276
- v0/relationalai/semantics/snowflake/__init__.py +0 -3
- v0/relationalai/semantics/sql/compiler.py +0 -2503
- v0/relationalai/semantics/sql/executor/duck_db.py +0 -52
- v0/relationalai/semantics/sql/executor/result_helpers.py +0 -64
- v0/relationalai/semantics/sql/executor/snowflake.py +0 -145
- v0/relationalai/semantics/sql/rewrite/denormalize.py +0 -222
- v0/relationalai/semantics/sql/rewrite/double_negation.py +0 -49
- v0/relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
- v0/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
- v0/relationalai/semantics/sql/sql.py +0 -504
- v0/relationalai/semantics/std/__init__.py +0 -54
- v0/relationalai/semantics/std/constraints.py +0 -43
- v0/relationalai/semantics/std/datetime.py +0 -363
- v0/relationalai/semantics/std/decimals.py +0 -62
- v0/relationalai/semantics/std/floats.py +0 -7
- v0/relationalai/semantics/std/integers.py +0 -22
- v0/relationalai/semantics/std/math.py +0 -141
- v0/relationalai/semantics/std/pragmas.py +0 -11
- v0/relationalai/semantics/std/re.py +0 -83
- v0/relationalai/semantics/std/std.py +0 -14
- v0/relationalai/semantics/std/strings.py +0 -63
- v0/relationalai/semantics/tests/__init__.py +0 -0
- v0/relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
- v0/relationalai/semantics/tests/test_snapshot_base.py +0 -9
- v0/relationalai/semantics/tests/utils.py +0 -46
- v0/relationalai/std/__init__.py +0 -70
- v0/relationalai/tools/__init__.py +0 -0
- v0/relationalai/tools/cli.py +0 -1940
- v0/relationalai/tools/cli_controls.py +0 -1826
- v0/relationalai/tools/cli_helpers.py +0 -390
- v0/relationalai/tools/debugger.py +0 -183
- v0/relationalai/tools/debugger_client.py +0 -109
- v0/relationalai/tools/debugger_server.py +0 -302
- v0/relationalai/tools/dev.py +0 -685
- v0/relationalai/tools/qb_debugger.py +0 -425
- v0/relationalai/util/clean_up_databases.py +0 -95
- v0/relationalai/util/format.py +0 -123
- v0/relationalai/util/list_databases.py +0 -9
- v0/relationalai/util/otel_configuration.py +0 -25
- v0/relationalai/util/otel_handler.py +0 -484
- v0/relationalai/util/snowflake_handler.py +0 -88
- v0/relationalai/util/span_format_test.py +0 -43
- v0/relationalai/util/span_tracker.py +0 -207
- v0/relationalai/util/spans_file_handler.py +0 -72
- v0/relationalai/util/tracing_handler.py +0 -34
- /relationalai/{semantics/frontend → analysis}/__init__.py +0 -0
- {v0/relationalai → relationalai}/analysis/mechanistic.py +0 -0
- {v0/relationalai → relationalai}/analysis/whynot.py +0 -0
- /relationalai/{shims → auth}/__init__.py +0 -0
- {v0/relationalai → relationalai}/auth/jwt_generator.py +0 -0
- {v0/relationalai → relationalai}/auth/oauth_callback_server.py +0 -0
- {v0/relationalai → relationalai}/auth/token_handler.py +0 -0
- {v0/relationalai → relationalai}/auth/util.py +0 -0
- {v0/relationalai/clients → relationalai/clients/resources/snowflake}/cache_store.py +0 -0
- {v0/relationalai → relationalai}/compiler.py +0 -0
- {v0/relationalai → relationalai}/dependencies.py +0 -0
- {v0/relationalai → relationalai}/docutils.py +0 -0
- {v0/relationalai/analysis → relationalai/early_access}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/__init__.py +0 -0
- {v0/relationalai/auth → relationalai/early_access/dsl/adapters}/__init__.py +0 -0
- {v0/relationalai/early_access → relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
- {v0/relationalai/early_access/dsl/adapters → relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
- {v0/relationalai/early_access/dsl/adapters/orm → relationalai/early_access/dsl/bindings}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/adapters/owl → relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/bindings → relationalai/early_access/dsl/codegen}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/constants.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/stack.py +0 -0
- {v0/relationalai/early_access/dsl/bindings/legacy → relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/core/utils.py +0 -0
- {v0/relationalai/early_access/dsl/codegen → relationalai/early_access/dsl/ir}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/core/temporal → relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
- {v0/relationalai/early_access/dsl/ir → relationalai/early_access/dsl/orm}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/ontologies → relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
- {v0/relationalai/early_access/dsl/orm → relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/orm/measures → relationalai/early_access/dsl/serialize}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
- {v0/relationalai → relationalai}/early_access/dsl/serialize/model.py +0 -0
- {v0/relationalai/early_access/dsl/physical_metadata → relationalai/early_access/dsl/snow}/__init__.py +0 -0
- {v0/relationalai → relationalai}/early_access/tests/__init__.py +0 -0
- {v0/relationalai → relationalai}/environments/ci.py +0 -0
- {v0/relationalai → relationalai}/environments/hex.py +0 -0
- {v0/relationalai → relationalai}/environments/terminal.py +0 -0
- {v0/relationalai → relationalai}/experimental/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/graphs.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/filter.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/glushkov.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/rpq/transition.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/utilities/__init__.py +0 -0
- {v0/relationalai → relationalai}/experimental/paths/utilities/utilities.py +0 -0
- {v0/relationalai/early_access/dsl/serialize → relationalai/loaders}/__init__.py +0 -0
- {v0/relationalai → relationalai}/metagen.py +0 -0
- {v0/relationalai → relationalai}/metamodel.py +0 -0
- {v0/relationalai → relationalai}/rel.py +0 -0
- {v0/relationalai → relationalai}/semantics/devtools/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/internal/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/internal/annotations.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/ir.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/pragmas.py +0 -0
- {v0/relationalai → relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/dataflow.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/ir.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/typer/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/types.py +0 -0
- {v0/relationalai → relationalai}/semantics/metamodel/visitor.py +0 -0
- {v0/relationalai → relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/rel/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/sql/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/sql/executor/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/sql/rewrite/__init__.py +0 -0
- {v0/relationalai/early_access/dsl/snow → relationalai/semantics/tests}/__init__.py +0 -0
- {v0/relationalai → relationalai}/semantics/tests/logging.py +0 -0
- {v0/relationalai → relationalai}/std/aggregates.py +0 -0
- {v0/relationalai → relationalai}/std/dates.py +0 -0
- {v0/relationalai → relationalai}/std/graphs.py +0 -0
- {v0/relationalai → relationalai}/std/inspect.py +0 -0
- {v0/relationalai → relationalai}/std/math.py +0 -0
- {v0/relationalai → relationalai}/std/re.py +0 -0
- {v0/relationalai → relationalai}/std/strings.py +0 -0
- {v0/relationalai/loaders → relationalai/tools}/__init__.py +0 -0
- {v0/relationalai → relationalai}/tools/cleanup_snapshots.py +0 -0
- {v0/relationalai → relationalai}/tools/constants.py +0 -0
- {v0/relationalai → relationalai}/tools/query_utils.py +0 -0
- {v0/relationalai → relationalai}/tools/snapshot_viewer.py +0 -0
- {v0/relationalai → relationalai}/util/__init__.py +0 -0
- {v0/relationalai → relationalai}/util/constants.py +0 -0
- {v0/relationalai → relationalai}/util/graph.py +0 -0
- {v0/relationalai → relationalai}/util/timeout.py +0 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
import typing
|
|
3
|
+
from relationalai.experimental.pathfinder.glushkov import Glushkov
|
|
4
|
+
from relationalai.experimental.pathfinder.filter import (
|
|
5
|
+
NodeFilter, NodeLabel, AnonymousNodeFilter, EdgeLabel, AnonymousEdgeFilter
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
# =========================================================================================
|
|
9
|
+
# Regular Path Queries (RPQs) with local filters
|
|
10
|
+
# =========================================================================================
|
|
11
|
+
#
|
|
12
|
+
# Regular Path Queries with local filters are represented as ASTs defined with this grammar.
|
|
13
|
+
#
|
|
14
|
+
# expr ::= Node([NodeLabel], [AnonymousNodeFilter])
|
|
15
|
+
# | Edge(EdgeLabel, [AnonymousEdgeFilter])
|
|
16
|
+
# | Concat(expr₁, expr₂)
|
|
17
|
+
# | Union(expr₁, expr₂)
|
|
18
|
+
# | Star(expr)
|
|
19
|
+
# | Plus(expr)
|
|
20
|
+
# | Optional(expr)
|
|
21
|
+
# | Void
|
|
22
|
+
#
|
|
23
|
+
# Every Edge leaf of an RPQ is automatically assigned a unique position `pos` value i.e.,
|
|
24
|
+
# the `Edge` constructor uses a class variable `_id_counter` to generate a fresh value for
|
|
25
|
+
# each new instance of `Edge`. The positions are used to provide the user with clear
|
|
26
|
+
# feedback (error and warnings) that refers to specific places in the input RPQ.
|
|
27
|
+
#
|
|
28
|
+
# An important requirement is that an RPQ does not use two Edge leaves with the same
|
|
29
|
+
# position. With a natural use of the RPQ constructors, this requirement is not violated
|
|
30
|
+
# unless a subexpression is reused. Consequently, the `clone` method is provided to create a
|
|
31
|
+
# copy of an RPQ subexpression with fresh edge positions. For further safety, we ensure that
|
|
32
|
+
# no two Edges with the same position are present, by constructing the set of positions of
|
|
33
|
+
# an expression. If during the construction of a complex RPQ (`Concat` or `Union`) we find
|
|
34
|
+
# repeating positions, we clone one of the expressions to ensure that the positions are
|
|
35
|
+
# unique in the whole RPQ.
|
|
36
|
+
# =========================================================================================
|
|
37
|
+
|
|
38
|
+
#------------------------------------------------------------------------------------------
|
|
39
|
+
# Auxiliary function for repeating `expr{n:m}` used to implement slicing operator of RPQ
|
|
40
|
+
#------------------------------------------------------------------------------------------
|
|
41
|
+
def _repeat(pattern: 'RPQ', n:typing.Union[int,None], m:typing.Union[int,None]) -> 'RPQ':
|
|
42
|
+
n = n if n is not None else 0
|
|
43
|
+
assert n >= 0, f"Negative start range [{n}:{m}]"
|
|
44
|
+
assert (m is None or m >= n), f"Invalid repeat range [{n}:{m}]"
|
|
45
|
+
if m is None:
|
|
46
|
+
if n == 0:
|
|
47
|
+
return Star(pattern)
|
|
48
|
+
elif n == 1:
|
|
49
|
+
return Plus(pattern)
|
|
50
|
+
else:
|
|
51
|
+
result = pattern.clone()
|
|
52
|
+
for _ in range(n-2):
|
|
53
|
+
result = Concat(result, pattern.clone())
|
|
54
|
+
return Concat(result, Plus(pattern))
|
|
55
|
+
else:
|
|
56
|
+
if n == 0:
|
|
57
|
+
if m == 0:
|
|
58
|
+
return Node()
|
|
59
|
+
else:
|
|
60
|
+
result = Optional(pattern)
|
|
61
|
+
for _ in range(m-1):
|
|
62
|
+
result = Concat(result, Optional(pattern.clone()))
|
|
63
|
+
return result
|
|
64
|
+
else:
|
|
65
|
+
result = pattern
|
|
66
|
+
for _ in range(n-1):
|
|
67
|
+
result = Concat(result, pattern.clone())
|
|
68
|
+
for _ in range(m-n):
|
|
69
|
+
result = Concat(result, Optional(pattern.clone()))
|
|
70
|
+
return result
|
|
71
|
+
|
|
72
|
+
class RPQ(ABC):
|
|
73
|
+
_id_counter = 0
|
|
74
|
+
|
|
75
|
+
@classmethod
|
|
76
|
+
def next_id(cls) -> int:
|
|
77
|
+
cls._id_counter += 1
|
|
78
|
+
return cls._id_counter
|
|
79
|
+
|
|
80
|
+
def __init__(self, positions: typing.FrozenSet[int] = frozenset()):
|
|
81
|
+
self._positions = positions
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def positions(self) -> typing.FrozenSet[int]:
|
|
85
|
+
return self._positions
|
|
86
|
+
|
|
87
|
+
@abstractmethod
|
|
88
|
+
def clone(self) -> 'RPQ':
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
@abstractmethod
|
|
92
|
+
def glushkov(self) -> Glushkov:
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
@abstractmethod
|
|
96
|
+
def pprint(self, ind) -> str:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
def __str__(self):
|
|
100
|
+
return self.pprint("")
|
|
101
|
+
|
|
102
|
+
@abstractmethod
|
|
103
|
+
def to_dict(self) -> dict:
|
|
104
|
+
pass
|
|
105
|
+
|
|
106
|
+
def __len__(self) -> int:
|
|
107
|
+
return len(self.positions)
|
|
108
|
+
|
|
109
|
+
# expr[n:m]
|
|
110
|
+
def __getitem__(self, key):
|
|
111
|
+
if isinstance(key, int):
|
|
112
|
+
return _repeat(self, key, key)
|
|
113
|
+
elif isinstance(key, slice):
|
|
114
|
+
return _repeat(self, key.start, key.stop)
|
|
115
|
+
else:
|
|
116
|
+
return NotImplemented
|
|
117
|
+
|
|
118
|
+
# expr₁ | expr₂
|
|
119
|
+
def __or__(self, other):
|
|
120
|
+
if isinstance(self, Void):
|
|
121
|
+
return other
|
|
122
|
+
elif isinstance(other, Void):
|
|
123
|
+
return self
|
|
124
|
+
else:
|
|
125
|
+
return Union(self, other)
|
|
126
|
+
|
|
127
|
+
# expr₁ ⋅ expr₂
|
|
128
|
+
def __mul__(self, other):
|
|
129
|
+
return Concat(self, other)
|
|
130
|
+
|
|
131
|
+
# ∅
|
|
132
|
+
class Void(RPQ):
|
|
133
|
+
def __init__(self):
|
|
134
|
+
super().__init__()
|
|
135
|
+
|
|
136
|
+
def clone(self):
|
|
137
|
+
return Void()
|
|
138
|
+
|
|
139
|
+
def glushkov(self):
|
|
140
|
+
return Glushkov.void()
|
|
141
|
+
|
|
142
|
+
def pprint(self, ind):
|
|
143
|
+
return ind + "⋅ ∅"
|
|
144
|
+
|
|
145
|
+
def to_dict(self):
|
|
146
|
+
return {"type": "Void"}
|
|
147
|
+
|
|
148
|
+
# ε(label {filter})
|
|
149
|
+
class Node(RPQ):
|
|
150
|
+
def __init__(self,
|
|
151
|
+
label: typing.Optional[NodeLabel]=None,
|
|
152
|
+
filter: typing.Optional[AnonymousNodeFilter]=None):
|
|
153
|
+
super().__init__()
|
|
154
|
+
self.label = label
|
|
155
|
+
self.filter = filter
|
|
156
|
+
|
|
157
|
+
def clone(self):
|
|
158
|
+
return Node(self.label, self.filter)
|
|
159
|
+
|
|
160
|
+
def glushkov(self):
|
|
161
|
+
filters: typing.List[NodeFilter] = []
|
|
162
|
+
if self.label is not None:
|
|
163
|
+
filters.append(self.label)
|
|
164
|
+
if self.filter is not None:
|
|
165
|
+
filters.append(self.filter)
|
|
166
|
+
return Glushkov.node_transition(*filters)
|
|
167
|
+
|
|
168
|
+
def pprint(self, ind):
|
|
169
|
+
res = ind + "⋅ Node("
|
|
170
|
+
if self.label is not None:
|
|
171
|
+
res += f"{self.label}"
|
|
172
|
+
if self.filter is not None:
|
|
173
|
+
res += " {" if self.label is not None else "{"
|
|
174
|
+
res += f"{self.filter}"
|
|
175
|
+
res += "}"
|
|
176
|
+
res += ")"
|
|
177
|
+
return res
|
|
178
|
+
|
|
179
|
+
def to_dict(self) -> dict:
|
|
180
|
+
d = {"type": "Node"}
|
|
181
|
+
if self.label is not None:
|
|
182
|
+
d["label"] = self.label.to_dict() # type: ignore
|
|
183
|
+
if self.filter is not None:
|
|
184
|
+
d["filter"] = self.filter.to_dict() # type: ignore
|
|
185
|
+
return d
|
|
186
|
+
|
|
187
|
+
# -[label {filter}]->
|
|
188
|
+
class Edge(RPQ):
|
|
189
|
+
def __init__(self,
|
|
190
|
+
label: EdgeLabel,
|
|
191
|
+
filter: typing.Optional[AnonymousEdgeFilter] = None):
|
|
192
|
+
self.pos = self.next_id()
|
|
193
|
+
super().__init__(frozenset([self.pos]))
|
|
194
|
+
self.label = label
|
|
195
|
+
self.filter = filter
|
|
196
|
+
|
|
197
|
+
def clone(self):
|
|
198
|
+
return Edge(self.label, self.filter)
|
|
199
|
+
|
|
200
|
+
def glushkov(self):
|
|
201
|
+
return Glushkov.edge_transition(self.pos, self.label, self.filter)
|
|
202
|
+
|
|
203
|
+
# we avoid using `[...]` which can be mistaken for control sequence by rich-text loggers
|
|
204
|
+
def pprint(self, ind):
|
|
205
|
+
res = ind + "⋅ "
|
|
206
|
+
filter_str = ""
|
|
207
|
+
if self.filter is not None:
|
|
208
|
+
filter_str += f" {{ {self.filter} }}"
|
|
209
|
+
if self.label.direction == "forward":
|
|
210
|
+
res += f"-⟨{self.label.label}{filter_str}⟩→"
|
|
211
|
+
else:
|
|
212
|
+
res += f"←⟨{self.label.label}{filter_str}⟩-"
|
|
213
|
+
res += f" pos={self.pos} "
|
|
214
|
+
return res
|
|
215
|
+
|
|
216
|
+
def to_dict(self) -> dict:
|
|
217
|
+
return {
|
|
218
|
+
"type": "Edge",
|
|
219
|
+
"pos": self.pos,
|
|
220
|
+
"label": self.label.to_dict() # type: ignore
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
# expr₁ ⋅ expr₂
|
|
224
|
+
class Concat(RPQ):
|
|
225
|
+
def __init__(self, expr1:RPQ, expr2:RPQ):
|
|
226
|
+
if not expr1.positions.isdisjoint(expr2.positions):
|
|
227
|
+
expr2 = expr2.clone()
|
|
228
|
+
super().__init__(expr1.positions | expr2.positions)
|
|
229
|
+
self.expr1 = expr1
|
|
230
|
+
self.expr2 = expr2
|
|
231
|
+
|
|
232
|
+
def clone(self):
|
|
233
|
+
return Concat(self.expr1.clone(), self.expr2.clone())
|
|
234
|
+
|
|
235
|
+
def glushkov(self):
|
|
236
|
+
g = self.expr1.glushkov()
|
|
237
|
+
g *= self.expr2.glushkov()
|
|
238
|
+
return g
|
|
239
|
+
|
|
240
|
+
def pprint(self, ind):
|
|
241
|
+
res = ind + "⋅ Concat\n"
|
|
242
|
+
res += self.expr1.pprint(ind + " ") + "\n"
|
|
243
|
+
res += self.expr2.pprint(ind + " ")
|
|
244
|
+
return res
|
|
245
|
+
|
|
246
|
+
def to_dict(self) -> dict:
|
|
247
|
+
return {
|
|
248
|
+
"type": "Concat",
|
|
249
|
+
"expr1": self.expr1.to_dict(), # type: ignore
|
|
250
|
+
"expr2": self.expr2.to_dict() # type: ignore
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
# expr ₁ | expr₂
|
|
254
|
+
class Union(RPQ):
|
|
255
|
+
def __init__(self, expr1:RPQ, expr2:RPQ):
|
|
256
|
+
if not expr1.positions.isdisjoint(expr2.positions):
|
|
257
|
+
expr2 = expr2.clone()
|
|
258
|
+
super().__init__(expr1.positions | expr2.positions)
|
|
259
|
+
self.expr1 = expr1
|
|
260
|
+
self.expr2 = expr2
|
|
261
|
+
|
|
262
|
+
def clone(self):
|
|
263
|
+
return Union(self.expr1.clone(), self.expr2.clone())
|
|
264
|
+
|
|
265
|
+
def glushkov(self):
|
|
266
|
+
g = self.expr1.glushkov()
|
|
267
|
+
g |= self.expr2.glushkov()
|
|
268
|
+
return g
|
|
269
|
+
|
|
270
|
+
def pprint(self, ind):
|
|
271
|
+
res = ind + "⋅ Union\n"
|
|
272
|
+
res += self.expr1.pprint(ind + " ") + "\n"
|
|
273
|
+
res += self.expr2.pprint(ind + " ")
|
|
274
|
+
return res
|
|
275
|
+
|
|
276
|
+
def to_dict(self) -> dict:
|
|
277
|
+
return {
|
|
278
|
+
"type": "Union",
|
|
279
|
+
"expr1": self.expr1.to_dict(), # type: ignore
|
|
280
|
+
"expr2": self.expr2.to_dict() # type: ignore
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
# expr*
|
|
284
|
+
class Star(RPQ):
|
|
285
|
+
def __init__(self, expr:RPQ):
|
|
286
|
+
super().__init__(expr.positions)
|
|
287
|
+
self.expr = expr
|
|
288
|
+
|
|
289
|
+
def clone(self):
|
|
290
|
+
return Star(self.expr.clone())
|
|
291
|
+
|
|
292
|
+
def glushkov(self):
|
|
293
|
+
return self.expr.glushkov().star()
|
|
294
|
+
|
|
295
|
+
def pprint(self, ind):
|
|
296
|
+
return ind + "⋅ Star\n" + self.expr.pprint(ind + ' ')
|
|
297
|
+
|
|
298
|
+
def to_dict(self) -> dict:
|
|
299
|
+
return {
|
|
300
|
+
"type": "Star",
|
|
301
|
+
"expr": self.expr.to_dict() # type: ignore
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
# expr+
|
|
305
|
+
class Plus(RPQ):
|
|
306
|
+
def __init__(self, expr:RPQ):
|
|
307
|
+
super().__init__(expr.positions)
|
|
308
|
+
self.expr = expr
|
|
309
|
+
|
|
310
|
+
def clone(self):
|
|
311
|
+
return Plus(self.expr.clone())
|
|
312
|
+
|
|
313
|
+
def glushkov(self):
|
|
314
|
+
return self.expr.glushkov().plus()
|
|
315
|
+
|
|
316
|
+
def pprint(self, ind):
|
|
317
|
+
return ind + "⋅ Plus\n" + self.expr.pprint(ind + ' ')
|
|
318
|
+
|
|
319
|
+
def to_dict(self) -> dict:
|
|
320
|
+
return {
|
|
321
|
+
"type": "Plus",
|
|
322
|
+
"expr": self.expr.to_dict() # type: ignore
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
# expr?
|
|
326
|
+
class Optional(RPQ):
|
|
327
|
+
def __init__(self, expr:RPQ):
|
|
328
|
+
super().__init__(expr.positions)
|
|
329
|
+
self.expr = expr
|
|
330
|
+
|
|
331
|
+
def clone(self):
|
|
332
|
+
return Optional(self.expr.clone())
|
|
333
|
+
|
|
334
|
+
def glushkov(self):
|
|
335
|
+
return self.expr.glushkov().optional()
|
|
336
|
+
|
|
337
|
+
def pprint(self, ind):
|
|
338
|
+
return ind + "⋅ Optional\n" + self.expr.pprint(ind + ' ')
|
|
339
|
+
|
|
340
|
+
def to_dict(self) -> dict:
|
|
341
|
+
return {
|
|
342
|
+
"type": "Optional",
|
|
343
|
+
"expr": self.expr.to_dict() # type: ignore
|
|
344
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
|
|
2
|
+
from typing import List, FrozenSet, Union, Iterable
|
|
3
|
+
from relationalai.experimental.pathfinder.filter import (
|
|
4
|
+
NodeFilter, EdgeFilter, EdgeLabel, AnonymousEdgeFilter
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
# =========================================================================================
|
|
8
|
+
# Transitions
|
|
9
|
+
# =========================================================================================
|
|
10
|
+
#
|
|
11
|
+
# Transitions are the building blocks of automata for paths in a labeled knowledge graph.
|
|
12
|
+
# There are two types of transitions: node transitions and edge transitions.
|
|
13
|
+
#
|
|
14
|
+
# * a _node transition_ `-(ψ₁ ∧ … ∧ ψ ₖ)->` does not advance on the path but only asserts
|
|
15
|
+
# the node filters ψ₁,..., ψ ₖ on the current node.
|
|
16
|
+
#
|
|
17
|
+
# * an _edge transition_ `-(ψ₁ ∧ … ∧ ψₖ)-[φ₁ ∧ … ∧ φₙ]-(ρ₁ ∧ … ρₘ)->` that asserts the
|
|
18
|
+
# source node filters ψ₁, ..., ψₖ on the current node, traverses an edge satisfying the
|
|
19
|
+
# edge filters φ₁, ..., φₙ, and asserts the node filters ρ₁, ..., ρₘ on the arriving node.
|
|
20
|
+
# NOTE: We only use edge transitions that have at least one edge label.
|
|
21
|
+
#
|
|
22
|
+
# A transition `t` is _trivial_ if it has no filters. A transition is _grounded_ if it
|
|
23
|
+
# contains a grounded filter (a label). Note that an edge transition is always grounded
|
|
24
|
+
# since it contains at least one edge label filter (that is grounded).
|
|
25
|
+
#
|
|
26
|
+
# Two transitions t₁ and t₂ can be _composed_ `t₁ * t₂` with the multiplication operator:
|
|
27
|
+
# 1. two node transitions can be composed by taking the union of their filters.
|
|
28
|
+
# 2. an node transition can be composed with and edge transition on the left or right by
|
|
29
|
+
# adding its filters to the source or destination node filters of the edge transition.
|
|
30
|
+
# 3. Two edge-transitions CANNOT be composed!
|
|
31
|
+
#
|
|
32
|
+
# To ensure rudimentary equality and hashing, the collection of filters are stored as
|
|
33
|
+
# immutable frozen sets; A transition once created must not have its filters modified in any
|
|
34
|
+
# way.
|
|
35
|
+
#
|
|
36
|
+
# For the purposes of automata simplification, we define a simulation relation between
|
|
37
|
+
# transitions: `t₁ simulates t₂` if any path fragment that matches t₂ also matches t₁.
|
|
38
|
+
# =========================================================================================
|
|
39
|
+
|
|
40
|
+
class NodeTransition:
|
|
41
|
+
def __init__(self, filters: Iterable[NodeFilter] = set()):
|
|
42
|
+
self._filters: FrozenSet = frozenset(filters)
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def filters(self) -> FrozenSet[NodeFilter]:
|
|
46
|
+
return self._filters
|
|
47
|
+
|
|
48
|
+
def is_trivial(self):
|
|
49
|
+
return len(self._filters) == 0
|
|
50
|
+
|
|
51
|
+
def is_grounded(self):
|
|
52
|
+
return any(f.is_grounded() for f in self._filters)
|
|
53
|
+
|
|
54
|
+
def __repr__(self):
|
|
55
|
+
return f"⊨⸨{' ∧ '.join(map(str, self._filters))}⸩⇒"
|
|
56
|
+
|
|
57
|
+
def to_dict(self) -> dict:
|
|
58
|
+
d = {"type": "NodeTransition"}
|
|
59
|
+
if self._filters:
|
|
60
|
+
d["filters"] = [f.to_dict() for f in self._filters] # type: ignore
|
|
61
|
+
return d
|
|
62
|
+
|
|
63
|
+
def __eq__(self, other):
|
|
64
|
+
if isinstance(other, NodeTransition):
|
|
65
|
+
return self._filters == other._filters
|
|
66
|
+
else:
|
|
67
|
+
return NotImplemented
|
|
68
|
+
|
|
69
|
+
def __hash__(self):
|
|
70
|
+
return hash(self._filters)
|
|
71
|
+
|
|
72
|
+
def __mul__(self, other: 'NodeTransition') -> 'NodeTransition':
|
|
73
|
+
if isinstance(other, NodeTransition):
|
|
74
|
+
return NodeTransition(self._filters | other._filters)
|
|
75
|
+
else:
|
|
76
|
+
return NotImplemented
|
|
77
|
+
|
|
78
|
+
# if `t₁ simulates t₂`, then any node on a path that matches t₂ also matches t₁
|
|
79
|
+
def simulates(self, other: 'NodeTransition') -> bool:
|
|
80
|
+
if isinstance(other, NodeTransition):
|
|
81
|
+
return self._filters <= other._filters
|
|
82
|
+
else:
|
|
83
|
+
return NotImplemented
|
|
84
|
+
|
|
85
|
+
class EdgeTransition:
|
|
86
|
+
def __init__(self,
|
|
87
|
+
src_filters: Iterable[NodeFilter],
|
|
88
|
+
edge_filters: Iterable[EdgeFilter],
|
|
89
|
+
trg_filters: Iterable[NodeFilter]):
|
|
90
|
+
assert any(isinstance(f, EdgeLabel) for f in edge_filters), "An edge transition must have at least one edge label"
|
|
91
|
+
self._src_filters: FrozenSet[NodeFilter] = frozenset(src_filters)
|
|
92
|
+
self._edge_filters: FrozenSet[EdgeFilter] = frozenset(edge_filters)
|
|
93
|
+
self._trg_filters: FrozenSet[NodeFilter] = frozenset(trg_filters)
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def src_filters(self) -> FrozenSet[NodeFilter]:
|
|
97
|
+
return self._src_filters
|
|
98
|
+
|
|
99
|
+
@property
|
|
100
|
+
def edge_filters(self) -> FrozenSet[EdgeFilter]:
|
|
101
|
+
return self._edge_filters
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def trg_filters(self) -> FrozenSet[NodeFilter]:
|
|
105
|
+
return self._trg_filters
|
|
106
|
+
|
|
107
|
+
def __repr__(self):
|
|
108
|
+
res = f"⊨⸨{' ∧ '.join(map(str, self._src_filters))}⸩"
|
|
109
|
+
res += f"═⟦{' ∧ '.join(map(str, self._edge_filters))}⟧═"
|
|
110
|
+
res += f"⸨{' ∧ '.join(map(str, self._trg_filters))}⸩⇒"
|
|
111
|
+
return res
|
|
112
|
+
|
|
113
|
+
def to_dict(self):
|
|
114
|
+
d = {"type": "EdgeTransition"}
|
|
115
|
+
if self._src_filters:
|
|
116
|
+
d["src_filters"] = [f.to_dict() for f in self._src_filters] # type: ignore
|
|
117
|
+
d["edge_filters"] = [f.to_dict() for f in self._edge_filters] # type: ignore
|
|
118
|
+
if self._trg_filters:
|
|
119
|
+
d["trg_filters"] = [f.to_dict() for f in self._trg_filters] # type: ignore
|
|
120
|
+
return d
|
|
121
|
+
|
|
122
|
+
def has_src_filters(self):
|
|
123
|
+
return len(self._src_filters) > 0
|
|
124
|
+
|
|
125
|
+
def has_trg_filters(self):
|
|
126
|
+
return len(self._trg_filters) > 0
|
|
127
|
+
|
|
128
|
+
def has_grounded_trg_filters(self):
|
|
129
|
+
return any(f.is_grounded() for f in self._trg_filters)
|
|
130
|
+
|
|
131
|
+
def has_grounded_src_filters(self):
|
|
132
|
+
return any(f.is_grounded() for f in self._src_filters)
|
|
133
|
+
|
|
134
|
+
def has_anon_edge_filters(self):
|
|
135
|
+
return any(not f.is_grounded() for f in self._edge_filters)
|
|
136
|
+
|
|
137
|
+
def get_label(self) -> EdgeLabel:
|
|
138
|
+
for f in self._edge_filters:
|
|
139
|
+
if isinstance(f, EdgeLabel):
|
|
140
|
+
return f
|
|
141
|
+
raise ValueError("No edge label filter in the transition")
|
|
142
|
+
|
|
143
|
+
def get_anon_edge_filters(self) -> List[AnonymousEdgeFilter]:
|
|
144
|
+
return [f for f in self._edge_filters if isinstance(f, AnonymousEdgeFilter)]
|
|
145
|
+
|
|
146
|
+
def __eq__(self, other):
|
|
147
|
+
if isinstance(other, EdgeTransition):
|
|
148
|
+
return (self._src_filters == other._src_filters and
|
|
149
|
+
self._edge_filters == other._edge_filters and
|
|
150
|
+
self._trg_filters == other._trg_filters)
|
|
151
|
+
else:
|
|
152
|
+
return NotImplemented
|
|
153
|
+
|
|
154
|
+
# If `t₁ simulates t₂`, then then any edge on a path that matches t₂ also matches t₁.
|
|
155
|
+
def simulates(self, other: 'EdgeTransition') -> bool:
|
|
156
|
+
if isinstance(other, EdgeTransition):
|
|
157
|
+
return (self._src_filters <= other._src_filters and
|
|
158
|
+
self._edge_filters <= other._edge_filters and
|
|
159
|
+
self._trg_filters <= other._trg_filters)
|
|
160
|
+
else:
|
|
161
|
+
return NotImplemented
|
|
162
|
+
|
|
163
|
+
def __hash__(self):
|
|
164
|
+
return hash((hash(self._src_filters),
|
|
165
|
+
hash(self._edge_filters),
|
|
166
|
+
hash(self._trg_filters)))
|
|
167
|
+
|
|
168
|
+
def __mul__(self, other: 'NodeTransition') -> 'EdgeTransition':
|
|
169
|
+
if isinstance(other, NodeTransition):
|
|
170
|
+
return EdgeTransition(
|
|
171
|
+
self._src_filters,
|
|
172
|
+
self._edge_filters,
|
|
173
|
+
self._trg_filters | other._filters
|
|
174
|
+
)
|
|
175
|
+
else:
|
|
176
|
+
return NotImplemented
|
|
177
|
+
|
|
178
|
+
def __rmul__(self, other: 'NodeTransition') -> 'EdgeTransition':
|
|
179
|
+
if isinstance(other, NodeTransition):
|
|
180
|
+
return EdgeTransition(
|
|
181
|
+
self._src_filters | other._filters,
|
|
182
|
+
self._edge_filters,
|
|
183
|
+
self._trg_filters
|
|
184
|
+
)
|
|
185
|
+
else:
|
|
186
|
+
return NotImplemented
|
|
187
|
+
|
|
188
|
+
# -----------------------------------------------------------------------------------------
|
|
189
|
+
# Function on sets of transitions
|
|
190
|
+
# -----------------------------------------------------------------------------------------
|
|
191
|
+
|
|
192
|
+
# T₁ _simulate_ T₂, if for any t₂ in T₂ there is t₁ in T₁ such that t₁ simulates t₂.
|
|
193
|
+
# When T₁ _simulate_ T₂ a path fragment that matches all of T₂ also matches all of T₁.
|
|
194
|
+
def simulate(T1: Union[Iterable[EdgeTransition], Iterable[NodeTransition]],
|
|
195
|
+
T2: Union[Iterable[EdgeTransition], Iterable[NodeTransition]]) -> bool:
|
|
196
|
+
return all(any(t1.simulates(t2) for t1 in T1) for t2 in T2) # type: ignore
|
|
197
|
+
|
|
198
|
+
# Gets the list of all labels from a collection of edge transitions (with repetitions)
|
|
199
|
+
def labels(T: Iterable[EdgeTransition]) -> List[EdgeLabel]:
|
|
200
|
+
return [t.get_label() for t in T]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from typing import Callable
|
|
2
|
+
from relationalai.dsl import get_graph, Graph
|
|
3
|
+
# -----------------------------------------------------------------------------------------
|
|
4
|
+
# Utility functions
|
|
5
|
+
# -----------------------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# Get the string representation of a lambda function (with moderate effort).
|
|
9
|
+
#
|
|
10
|
+
def get_lambda_str(f: Callable) -> str:
|
|
11
|
+
try:
|
|
12
|
+
if f.__name__ == '<lambda>':
|
|
13
|
+
return f"λ{','.join(f.__code__.co_varnames)}:... @{hex(id(f))}"
|
|
14
|
+
else:
|
|
15
|
+
return f"{f.__name__}({','.join(f.__code__.co_varnames)}):... @{hex(id(f))}"
|
|
16
|
+
except Exception as _:
|
|
17
|
+
return str(f)
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Returns the model to use for emitting the logic defining paths and calling the Pathfinder.
|
|
21
|
+
#
|
|
22
|
+
def get_model(options) -> Graph:
|
|
23
|
+
if options['model'] is not None:
|
|
24
|
+
return options['model']
|
|
25
|
+
else:
|
|
26
|
+
return get_graph()
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# RelationalAI `paths` library
|
|
2
|
+
|
|
3
|
+
The RelationalAI `paths` library provides functionality for finding paths in a labeled
|
|
4
|
+
property graph that **match** a certain **pattern**, specified by a so-called
|
|
5
|
+
**regular path query** (RPQ).
|
|
6
|
+
|
|
7
|
+
## Basic usage: Example
|
|
8
|
+
|
|
9
|
+
The following is a minimal working example:
|
|
10
|
+
|
|
11
|
+
```py
|
|
12
|
+
from relationalai.semantics import Model, Integer, select, String, where, define
|
|
13
|
+
from relationalai.semantics.std import strings
|
|
14
|
+
|
|
15
|
+
from relationalai.experimental.paths.graph import Graph
|
|
16
|
+
from relationalai.experimental.paths.api import node, edge, path, star, match
|
|
17
|
+
|
|
18
|
+
model = Model("my_paths")
|
|
19
|
+
|
|
20
|
+
# create a labeled graph from an edge list:
|
|
21
|
+
edge_list = [(1, 2, "A"), (2, 3, "A"), (3, 4, "A"), (4, 5, "B"), (1, 5, "A")]
|
|
22
|
+
graph = Graph.from_edge_list(model, edge_list)
|
|
23
|
+
|
|
24
|
+
# specify a path pattern to match in terms of string labels:
|
|
25
|
+
pattern = path("A", star("A"), "B")
|
|
26
|
+
|
|
27
|
+
# specify source and target sets (optional):
|
|
28
|
+
sources = [1]
|
|
29
|
+
targets = [5]
|
|
30
|
+
|
|
31
|
+
Node = graph.Node
|
|
32
|
+
|
|
33
|
+
Source = model.Relationship("{Node} is a source node")
|
|
34
|
+
Target = model.Relationship("{Node} is a target node")
|
|
35
|
+
|
|
36
|
+
for src in sources:
|
|
37
|
+
define(Source(Node.new(id=src)))
|
|
38
|
+
|
|
39
|
+
for tgt in targets:
|
|
40
|
+
define(Target(Node.new(id=tgt)))
|
|
41
|
+
|
|
42
|
+
# specify setup for the path-finding algorithm:
|
|
43
|
+
paths = match(graph, pattern, Source, Target)
|
|
44
|
+
|
|
45
|
+
# convert path representation to use node IDs instead of opaque hashes:
|
|
46
|
+
i, k = Integer.ref(), Integer.ref()
|
|
47
|
+
node = graph.Node.ref()
|
|
48
|
+
label = String.ref()
|
|
49
|
+
|
|
50
|
+
result = select(i, k, label, node.id).where(
|
|
51
|
+
paths(i, k, label, node)
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# run the computation and display the result:
|
|
55
|
+
result.inspect()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## API
|
|
59
|
+
|
|
60
|
+
### Specifying a path pattern
|
|
61
|
+
|
|
62
|
+
A path is specified by a regular expression on edge labels, built using the following components:
|
|
63
|
+
- `path`: A concatenation of its arguments (separated by commas)
|
|
64
|
+
- `star`: Zero or more repetitions of its argument
|
|
65
|
+
- `plus`: One or more repetitions of its argument
|
|
66
|
+
- `union`: Allows any of its arguments (a single time)
|
|
67
|
+
|
|
68
|
+
### Matching a pattern
|
|
69
|
+
The API for matching a pattern is as follows:
|
|
70
|
+
```
|
|
71
|
+
match(graph, pattern, [Source], [Target], **kw)
|
|
72
|
+
```
|
|
73
|
+
The `Source` and `Target` sets should be `Concept`s or unary `Relationship`s containing
|
|
74
|
+
sets of source / target nodes, respectively. If they are not specified then all nodes are used.
|
|
75
|
+
|
|
76
|
+
The allowed keyword arguments are as follows:
|
|
77
|
+
- `type`
|
|
78
|
+
- The type (semantics) of paths
|
|
79
|
+
- Possible values:
|
|
80
|
+
- `shortest`: Shortest paths
|
|
81
|
+
- `walks`: Walks (all paths)
|
|
82
|
+
- Default value is `shortest`
|
|
83
|
+
|
|
84
|
+
- `num_paths`
|
|
85
|
+
- Specifies the maximum number of paths to return.
|
|
86
|
+
- Default value is `None`, corresponding to all paths.
|
|
87
|
+
|
|
88
|
+
- `max_length`
|
|
89
|
+
- Maximum length of path to return
|
|
90
|
+
- Default value is 1000
|
|
91
|
+
|
|
92
|
+
## Implementation sketch
|
|
93
|
+
|
|
94
|
+
- The user's input `pattern` is converted into a finite automaton.
|
|
95
|
+
- We create the **product graph**, consisting of nodes of the form `(state, orig_node)`,
|
|
96
|
+
where `state` is a state of the automaton and `orig_node` is a node in the original graph.
|
|
97
|
+
- We find paths in the product graph between nodes having the automaton's initial and
|
|
98
|
+
final state.
|
|
99
|
+
- These paths are projected back down to the user's graph.
|
|
100
|
+
|
|
101
|
+
## Notes
|
|
102
|
+
- Currently we use our own `Graph` `class`. This will soon be replaced by the one from the
|
|
103
|
+
`graphs` library.
|
|
104
|
+
|
|
105
|
+
## Not yet implemented
|
|
106
|
+
- Reverse edges
|
|
107
|
+
- Group-by operations over source and target sets (e.g. "find shortest paths from *each* node in this source set to this target node)
|