relationalai 0.12.13__py3-none-any.whl → 0.13.0.dev0__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.
- relationalai/__init__.py +1 -209
- relationalai/config/__init__.py +56 -0
- relationalai/config/config.py +289 -0
- relationalai/config/config_fields.py +86 -0
- relationalai/config/connections/__init__.py +46 -0
- relationalai/config/connections/base.py +23 -0
- relationalai/config/connections/duckdb.py +29 -0
- relationalai/config/connections/snowflake.py +243 -0
- relationalai/config/external/__init__.py +17 -0
- relationalai/config/external/dbt_converter.py +101 -0
- relationalai/config/external/dbt_models.py +93 -0
- relationalai/config/external/snowflake_converter.py +41 -0
- relationalai/config/external/snowflake_models.py +85 -0
- relationalai/config/external/utils.py +19 -0
- relationalai/semantics/__init__.py +146 -22
- relationalai/semantics/backends/lqp/annotations.py +11 -0
- relationalai/semantics/backends/sql/sql_compiler.py +327 -0
- relationalai/semantics/frontend/base.py +1707 -0
- relationalai/semantics/frontend/core.py +179 -0
- relationalai/semantics/frontend/front_compiler.py +1313 -0
- relationalai/semantics/frontend/pprint.py +408 -0
- relationalai/semantics/metamodel/__init__.py +6 -40
- relationalai/semantics/metamodel/builtins.py +205 -769
- relationalai/semantics/metamodel/metamodel.py +437 -0
- relationalai/semantics/metamodel/metamodel_analyzer.py +519 -0
- relationalai/semantics/metamodel/pprint.py +412 -0
- relationalai/semantics/metamodel/rewriter.py +266 -0
- relationalai/semantics/metamodel/typer.py +1378 -0
- relationalai/semantics/std/__init__.py +60 -40
- relationalai/semantics/std/aggregates.py +149 -0
- relationalai/semantics/std/common.py +44 -0
- relationalai/semantics/std/constraints.py +37 -43
- relationalai/semantics/std/datetime.py +246 -135
- relationalai/semantics/std/decimals.py +45 -52
- relationalai/semantics/std/floats.py +13 -5
- relationalai/semantics/std/integers.py +26 -11
- relationalai/semantics/std/math.py +183 -112
- relationalai/semantics/std/numbers.py +86 -0
- relationalai/semantics/std/re.py +80 -62
- relationalai/semantics/std/strings.py +117 -60
- relationalai/shims/executor.py +147 -0
- relationalai/shims/helpers.py +126 -0
- relationalai/shims/hoister.py +221 -0
- relationalai/shims/mm2v0.py +1290 -0
- relationalai/tools/cli/__init__.py +6 -0
- relationalai/tools/cli/cli.py +90 -0
- relationalai/tools/cli/components/__init__.py +5 -0
- relationalai/tools/cli/components/progress_reader.py +1524 -0
- relationalai/tools/cli/components/utils.py +58 -0
- relationalai/tools/cli/config_template.py +45 -0
- relationalai/tools/cli/dev.py +19 -0
- relationalai/tools/debugger.py +289 -183
- relationalai/tools/typer_debugger.py +93 -0
- relationalai/util/dataclasses.py +43 -0
- relationalai/util/docutils.py +40 -0
- relationalai/util/error.py +199 -0
- relationalai/util/format.py +48 -106
- relationalai/util/naming.py +145 -0
- relationalai/util/python.py +35 -0
- relationalai/util/runtime.py +156 -0
- relationalai/util/schema.py +197 -0
- relationalai/util/source.py +185 -0
- relationalai/util/structures.py +163 -0
- relationalai/util/tracing.py +261 -0
- relationalai-0.13.0.dev0.dist-info/METADATA +46 -0
- relationalai-0.13.0.dev0.dist-info/RECORD +488 -0
- relationalai-0.13.0.dev0.dist-info/WHEEL +5 -0
- relationalai-0.13.0.dev0.dist-info/entry_points.txt +3 -0
- relationalai-0.13.0.dev0.dist-info/top_level.txt +2 -0
- v0/relationalai/__init__.py +216 -0
- v0/relationalai/clients/azure.py +477 -0
- v0/relationalai/clients/client.py +912 -0
- v0/relationalai/clients/config.py +673 -0
- v0/relationalai/clients/direct_access_client.py +118 -0
- v0/relationalai/clients/hash_util.py +31 -0
- v0/relationalai/clients/local.py +571 -0
- v0/relationalai/clients/profile_polling.py +73 -0
- v0/relationalai/clients/result_helpers.py +420 -0
- v0/relationalai/clients/snowflake.py +3869 -0
- v0/relationalai/clients/types.py +113 -0
- v0/relationalai/clients/use_index_poller.py +980 -0
- v0/relationalai/clients/util.py +356 -0
- v0/relationalai/debugging.py +389 -0
- v0/relationalai/dsl.py +1749 -0
- v0/relationalai/early_access/builder/__init__.py +30 -0
- v0/relationalai/early_access/builder/builder/__init__.py +35 -0
- v0/relationalai/early_access/builder/snowflake/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/__init__.py +25 -0
- v0/relationalai/early_access/builder/std/decimals/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/integers/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/math/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/strings/__init__.py +14 -0
- v0/relationalai/early_access/devtools/__init__.py +12 -0
- v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
- v0/relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
- v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
- v0/relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
- v0/relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
- v0/relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
- v0/relationalai/early_access/dsl/bindings/common.py +402 -0
- v0/relationalai/early_access/dsl/bindings/csv.py +170 -0
- v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
- v0/relationalai/early_access/dsl/bindings/snowflake.py +64 -0
- v0/relationalai/early_access/dsl/codegen/binder.py +411 -0
- v0/relationalai/early_access/dsl/codegen/common.py +79 -0
- v0/relationalai/early_access/dsl/codegen/helpers.py +23 -0
- v0/relationalai/early_access/dsl/codegen/relations.py +700 -0
- v0/relationalai/early_access/dsl/codegen/weaver.py +417 -0
- v0/relationalai/early_access/dsl/core/builders/__init__.py +47 -0
- v0/relationalai/early_access/dsl/core/builders/logic.py +19 -0
- v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
- v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
- v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
- v0/relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
- v0/relationalai/early_access/dsl/core/context.py +13 -0
- v0/relationalai/early_access/dsl/core/cset.py +132 -0
- v0/relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
- v0/relationalai/early_access/dsl/core/exprs/relational.py +18 -0
- v0/relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
- v0/relationalai/early_access/dsl/core/instances.py +44 -0
- v0/relationalai/early_access/dsl/core/logic/__init__.py +193 -0
- v0/relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
- v0/relationalai/early_access/dsl/core/logic/exists.py +223 -0
- v0/relationalai/early_access/dsl/core/logic/helper.py +163 -0
- v0/relationalai/early_access/dsl/core/namespaces.py +32 -0
- v0/relationalai/early_access/dsl/core/relations.py +276 -0
- v0/relationalai/early_access/dsl/core/rules.py +112 -0
- v0/relationalai/early_access/dsl/core/std/__init__.py +45 -0
- v0/relationalai/early_access/dsl/core/temporal/recall.py +6 -0
- v0/relationalai/early_access/dsl/core/types/__init__.py +270 -0
- v0/relationalai/early_access/dsl/core/types/concepts.py +128 -0
- v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
- v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
- v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
- v0/relationalai/early_access/dsl/core/types/standard.py +92 -0
- v0/relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
- v0/relationalai/early_access/dsl/core/types/variables.py +203 -0
- v0/relationalai/early_access/dsl/ir/compiler.py +318 -0
- v0/relationalai/early_access/dsl/ir/executor.py +260 -0
- v0/relationalai/early_access/dsl/ontologies/constraints.py +88 -0
- v0/relationalai/early_access/dsl/ontologies/export.py +30 -0
- v0/relationalai/early_access/dsl/ontologies/models.py +453 -0
- v0/relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
- v0/relationalai/early_access/dsl/ontologies/readings.py +60 -0
- v0/relationalai/early_access/dsl/ontologies/relationships.py +322 -0
- v0/relationalai/early_access/dsl/ontologies/roles.py +87 -0
- v0/relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
- v0/relationalai/early_access/dsl/orm/constraints.py +438 -0
- v0/relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
- v0/relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
- v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
- v0/relationalai/early_access/dsl/orm/measures/measures.py +299 -0
- v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
- v0/relationalai/early_access/dsl/orm/models.py +256 -0
- v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
- v0/relationalai/early_access/dsl/orm/printer.py +469 -0
- v0/relationalai/early_access/dsl/orm/reasoners.py +480 -0
- v0/relationalai/early_access/dsl/orm/relations.py +19 -0
- v0/relationalai/early_access/dsl/orm/relationships.py +251 -0
- v0/relationalai/early_access/dsl/orm/types.py +42 -0
- v0/relationalai/early_access/dsl/orm/utils.py +79 -0
- v0/relationalai/early_access/dsl/orm/verb.py +204 -0
- v0/relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
- v0/relationalai/early_access/dsl/relations.py +170 -0
- v0/relationalai/early_access/dsl/rulesets.py +69 -0
- v0/relationalai/early_access/dsl/schemas/__init__.py +450 -0
- v0/relationalai/early_access/dsl/schemas/builder.py +48 -0
- v0/relationalai/early_access/dsl/schemas/comp_names.py +51 -0
- v0/relationalai/early_access/dsl/schemas/components.py +203 -0
- v0/relationalai/early_access/dsl/schemas/contexts.py +156 -0
- v0/relationalai/early_access/dsl/schemas/exprs.py +89 -0
- v0/relationalai/early_access/dsl/schemas/fragments.py +464 -0
- v0/relationalai/early_access/dsl/serialization.py +79 -0
- v0/relationalai/early_access/dsl/serialize/exporter.py +163 -0
- v0/relationalai/early_access/dsl/snow/api.py +104 -0
- v0/relationalai/early_access/dsl/snow/common.py +76 -0
- v0/relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
- v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
- v0/relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
- v0/relationalai/early_access/dsl/types/__init__.py +40 -0
- v0/relationalai/early_access/dsl/types/concepts.py +12 -0
- v0/relationalai/early_access/dsl/types/entities.py +135 -0
- v0/relationalai/early_access/dsl/types/values.py +17 -0
- v0/relationalai/early_access/dsl/utils.py +102 -0
- v0/relationalai/early_access/graphs/__init__.py +13 -0
- v0/relationalai/early_access/lqp/__init__.py +12 -0
- v0/relationalai/early_access/lqp/compiler/__init__.py +12 -0
- v0/relationalai/early_access/lqp/constructors/__init__.py +18 -0
- v0/relationalai/early_access/lqp/executor/__init__.py +12 -0
- v0/relationalai/early_access/lqp/ir/__init__.py +12 -0
- v0/relationalai/early_access/lqp/passes/__init__.py +12 -0
- v0/relationalai/early_access/lqp/pragmas/__init__.py +12 -0
- v0/relationalai/early_access/lqp/primitives/__init__.py +12 -0
- v0/relationalai/early_access/lqp/types/__init__.py +12 -0
- v0/relationalai/early_access/lqp/utils/__init__.py +12 -0
- v0/relationalai/early_access/lqp/validators/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/__init__.py +58 -0
- v0/relationalai/early_access/metamodel/builtins/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/compiler/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/dependency/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/factory/__init__.py +17 -0
- v0/relationalai/early_access/metamodel/helpers/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/ir/__init__.py +14 -0
- v0/relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
- v0/relationalai/early_access/metamodel/typer/__init__.py +3 -0
- v0/relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/types/__init__.py +15 -0
- v0/relationalai/early_access/metamodel/util/__init__.py +15 -0
- v0/relationalai/early_access/metamodel/visitor/__init__.py +12 -0
- v0/relationalai/early_access/rel/__init__.py +12 -0
- v0/relationalai/early_access/rel/executor/__init__.py +12 -0
- v0/relationalai/early_access/rel/rel_utils/__init__.py +12 -0
- v0/relationalai/early_access/rel/rewrite/__init__.py +7 -0
- v0/relationalai/early_access/solvers/__init__.py +19 -0
- v0/relationalai/early_access/sql/__init__.py +11 -0
- v0/relationalai/early_access/sql/executor/__init__.py +3 -0
- v0/relationalai/early_access/sql/rewrite/__init__.py +3 -0
- v0/relationalai/early_access/tests/logging/__init__.py +12 -0
- v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
- v0/relationalai/early_access/tests/utils/__init__.py +12 -0
- v0/relationalai/environments/__init__.py +35 -0
- v0/relationalai/environments/base.py +381 -0
- v0/relationalai/environments/colab.py +14 -0
- v0/relationalai/environments/generic.py +71 -0
- v0/relationalai/environments/ipython.py +68 -0
- v0/relationalai/environments/jupyter.py +9 -0
- v0/relationalai/environments/snowbook.py +169 -0
- v0/relationalai/errors.py +2455 -0
- v0/relationalai/experimental/SF.py +38 -0
- v0/relationalai/experimental/inspect.py +47 -0
- v0/relationalai/experimental/pathfinder/__init__.py +158 -0
- v0/relationalai/experimental/pathfinder/api.py +160 -0
- v0/relationalai/experimental/pathfinder/automaton.py +584 -0
- v0/relationalai/experimental/pathfinder/bridge.py +226 -0
- v0/relationalai/experimental/pathfinder/compiler.py +416 -0
- v0/relationalai/experimental/pathfinder/datalog.py +214 -0
- v0/relationalai/experimental/pathfinder/diagnostics.py +56 -0
- v0/relationalai/experimental/pathfinder/filter.py +236 -0
- v0/relationalai/experimental/pathfinder/glushkov.py +439 -0
- v0/relationalai/experimental/pathfinder/options.py +265 -0
- v0/relationalai/experimental/pathfinder/rpq.py +344 -0
- v0/relationalai/experimental/pathfinder/transition.py +200 -0
- v0/relationalai/experimental/pathfinder/utils.py +26 -0
- v0/relationalai/experimental/paths/api.py +143 -0
- v0/relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
- v0/relationalai/experimental/paths/examples/basic_example.py +40 -0
- v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
- v0/relationalai/experimental/paths/examples/movie_example.py +77 -0
- v0/relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
- v0/relationalai/experimental/paths/examples/paths_example.py +116 -0
- v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
- v0/relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
- v0/relationalai/experimental/paths/graph.py +185 -0
- v0/relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
- v0/relationalai/experimental/paths/path_algorithms/single.py +59 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
- v0/relationalai/experimental/paths/path_algorithms/usp.py +150 -0
- v0/relationalai/experimental/paths/product_graph.py +93 -0
- v0/relationalai/experimental/paths/rpq/automaton.py +584 -0
- v0/relationalai/experimental/paths/rpq/diagnostics.py +56 -0
- v0/relationalai/experimental/paths/rpq/rpq.py +378 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
- v0/relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
- v0/relationalai/experimental/paths/tree_agg.py +168 -0
- v0/relationalai/experimental/paths/utilities/iterators.py +27 -0
- v0/relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
- v0/relationalai/experimental/solvers.py +1087 -0
- v0/relationalai/loaders/__init__.py +0 -0
- v0/relationalai/loaders/csv.py +195 -0
- v0/relationalai/loaders/loader.py +177 -0
- v0/relationalai/loaders/types.py +23 -0
- v0/relationalai/rel_emitter.py +373 -0
- v0/relationalai/rel_utils.py +185 -0
- v0/relationalai/semantics/__init__.py +29 -0
- v0/relationalai/semantics/devtools/benchmark_lqp.py +536 -0
- v0/relationalai/semantics/devtools/compilation_manager.py +294 -0
- v0/relationalai/semantics/devtools/extract_lqp.py +110 -0
- v0/relationalai/semantics/internal/internal.py +3785 -0
- v0/relationalai/semantics/internal/snowflake.py +324 -0
- v0/relationalai/semantics/lqp/builtins.py +16 -0
- v0/relationalai/semantics/lqp/compiler.py +22 -0
- v0/relationalai/semantics/lqp/constructors.py +68 -0
- v0/relationalai/semantics/lqp/executor.py +469 -0
- v0/relationalai/semantics/lqp/intrinsics.py +24 -0
- v0/relationalai/semantics/lqp/model2lqp.py +839 -0
- v0/relationalai/semantics/lqp/passes.py +680 -0
- v0/relationalai/semantics/lqp/primitives.py +252 -0
- v0/relationalai/semantics/lqp/result_helpers.py +202 -0
- v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
- v0/relationalai/semantics/lqp/rewrite/cdc.py +216 -0
- v0/relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
- v0/relationalai/semantics/lqp/rewrite/extract_keys.py +449 -0
- v0/relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
- v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
- v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
- v0/relationalai/semantics/lqp/rewrite/splinter.py +76 -0
- v0/relationalai/semantics/lqp/types.py +101 -0
- v0/relationalai/semantics/lqp/utils.py +160 -0
- v0/relationalai/semantics/lqp/validators.py +57 -0
- v0/relationalai/semantics/metamodel/__init__.py +40 -0
- v0/relationalai/semantics/metamodel/builtins.py +774 -0
- v0/relationalai/semantics/metamodel/compiler.py +133 -0
- v0/relationalai/semantics/metamodel/dependency.py +862 -0
- v0/relationalai/semantics/metamodel/executor.py +61 -0
- v0/relationalai/semantics/metamodel/factory.py +287 -0
- v0/relationalai/semantics/metamodel/helpers.py +361 -0
- v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
- v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
- v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
- v0/relationalai/semantics/metamodel/rewrite/flatten.py +549 -0
- v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
- v0/relationalai/semantics/metamodel/typer/checker.py +353 -0
- v0/relationalai/semantics/metamodel/typer/typer.py +1395 -0
- v0/relationalai/semantics/reasoners/__init__.py +10 -0
- v0/relationalai/semantics/reasoners/graph/__init__.py +37 -0
- v0/relationalai/semantics/reasoners/graph/core.py +9020 -0
- v0/relationalai/semantics/reasoners/optimization/__init__.py +68 -0
- v0/relationalai/semantics/reasoners/optimization/common.py +88 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +1163 -0
- v0/relationalai/semantics/rel/builtins.py +40 -0
- v0/relationalai/semantics/rel/compiler.py +989 -0
- v0/relationalai/semantics/rel/executor.py +359 -0
- v0/relationalai/semantics/rel/rel.py +482 -0
- v0/relationalai/semantics/rel/rel_utils.py +276 -0
- v0/relationalai/semantics/snowflake/__init__.py +3 -0
- v0/relationalai/semantics/sql/compiler.py +2503 -0
- v0/relationalai/semantics/sql/executor/duck_db.py +52 -0
- v0/relationalai/semantics/sql/executor/result_helpers.py +64 -0
- v0/relationalai/semantics/sql/executor/snowflake.py +145 -0
- v0/relationalai/semantics/sql/rewrite/denormalize.py +222 -0
- v0/relationalai/semantics/sql/rewrite/double_negation.py +49 -0
- v0/relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
- v0/relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
- v0/relationalai/semantics/sql/sql.py +504 -0
- v0/relationalai/semantics/std/__init__.py +54 -0
- v0/relationalai/semantics/std/constraints.py +43 -0
- v0/relationalai/semantics/std/datetime.py +363 -0
- v0/relationalai/semantics/std/decimals.py +62 -0
- v0/relationalai/semantics/std/floats.py +7 -0
- v0/relationalai/semantics/std/integers.py +22 -0
- v0/relationalai/semantics/std/math.py +141 -0
- v0/relationalai/semantics/std/pragmas.py +11 -0
- v0/relationalai/semantics/std/re.py +83 -0
- v0/relationalai/semantics/std/std.py +14 -0
- v0/relationalai/semantics/std/strings.py +63 -0
- v0/relationalai/semantics/tests/__init__.py +0 -0
- v0/relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
- v0/relationalai/semantics/tests/test_snapshot_base.py +9 -0
- v0/relationalai/semantics/tests/utils.py +46 -0
- v0/relationalai/std/__init__.py +70 -0
- v0/relationalai/tools/__init__.py +0 -0
- v0/relationalai/tools/cli.py +1940 -0
- v0/relationalai/tools/cli_controls.py +1826 -0
- v0/relationalai/tools/cli_helpers.py +390 -0
- v0/relationalai/tools/debugger.py +183 -0
- v0/relationalai/tools/debugger_client.py +109 -0
- v0/relationalai/tools/debugger_server.py +302 -0
- v0/relationalai/tools/dev.py +685 -0
- v0/relationalai/tools/qb_debugger.py +425 -0
- v0/relationalai/util/clean_up_databases.py +95 -0
- v0/relationalai/util/format.py +123 -0
- v0/relationalai/util/list_databases.py +9 -0
- v0/relationalai/util/otel_configuration.py +25 -0
- v0/relationalai/util/otel_handler.py +484 -0
- v0/relationalai/util/snowflake_handler.py +88 -0
- v0/relationalai/util/span_format_test.py +43 -0
- v0/relationalai/util/span_tracker.py +207 -0
- v0/relationalai/util/spans_file_handler.py +72 -0
- v0/relationalai/util/tracing_handler.py +34 -0
- frontend/debugger/dist/.gitignore +0 -2
- frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- frontend/debugger/dist/assets/index-Cssla-O7.js +0 -208
- frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -9
- frontend/debugger/dist/index.html +0 -17
- relationalai/clients/azure.py +0 -477
- relationalai/clients/client.py +0 -912
- relationalai/clients/config.py +0 -673
- relationalai/clients/direct_access_client.py +0 -118
- relationalai/clients/export_procedure.py.jinja +0 -249
- relationalai/clients/hash_util.py +0 -31
- relationalai/clients/local.py +0 -571
- relationalai/clients/profile_polling.py +0 -73
- relationalai/clients/result_helpers.py +0 -420
- relationalai/clients/snowflake.py +0 -3869
- relationalai/clients/types.py +0 -113
- relationalai/clients/use_index_poller.py +0 -980
- relationalai/clients/util.py +0 -356
- relationalai/debugging.py +0 -389
- relationalai/dsl.py +0 -1749
- relationalai/early_access/builder/__init__.py +0 -30
- relationalai/early_access/builder/builder/__init__.py +0 -35
- relationalai/early_access/builder/snowflake/__init__.py +0 -12
- relationalai/early_access/builder/std/__init__.py +0 -25
- relationalai/early_access/builder/std/decimals/__init__.py +0 -12
- relationalai/early_access/builder/std/integers/__init__.py +0 -12
- relationalai/early_access/builder/std/math/__init__.py +0 -12
- relationalai/early_access/builder/std/strings/__init__.py +0 -14
- relationalai/early_access/devtools/__init__.py +0 -12
- relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
- relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
- relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
- relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
- relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
- relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
- relationalai/early_access/dsl/bindings/common.py +0 -402
- relationalai/early_access/dsl/bindings/csv.py +0 -170
- relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
- relationalai/early_access/dsl/bindings/snowflake.py +0 -64
- relationalai/early_access/dsl/codegen/binder.py +0 -411
- relationalai/early_access/dsl/codegen/common.py +0 -79
- relationalai/early_access/dsl/codegen/helpers.py +0 -23
- relationalai/early_access/dsl/codegen/relations.py +0 -700
- relationalai/early_access/dsl/codegen/weaver.py +0 -417
- relationalai/early_access/dsl/core/builders/__init__.py +0 -47
- relationalai/early_access/dsl/core/builders/logic.py +0 -19
- relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
- relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
- relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
- relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
- relationalai/early_access/dsl/core/context.py +0 -13
- relationalai/early_access/dsl/core/cset.py +0 -132
- relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
- relationalai/early_access/dsl/core/exprs/relational.py +0 -18
- relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
- relationalai/early_access/dsl/core/instances.py +0 -44
- relationalai/early_access/dsl/core/logic/__init__.py +0 -193
- relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
- relationalai/early_access/dsl/core/logic/exists.py +0 -223
- relationalai/early_access/dsl/core/logic/helper.py +0 -163
- relationalai/early_access/dsl/core/namespaces.py +0 -32
- relationalai/early_access/dsl/core/relations.py +0 -276
- relationalai/early_access/dsl/core/rules.py +0 -112
- relationalai/early_access/dsl/core/std/__init__.py +0 -45
- relationalai/early_access/dsl/core/temporal/recall.py +0 -6
- relationalai/early_access/dsl/core/types/__init__.py +0 -270
- relationalai/early_access/dsl/core/types/concepts.py +0 -128
- relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
- relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
- relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
- relationalai/early_access/dsl/core/types/standard.py +0 -92
- relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
- relationalai/early_access/dsl/core/types/variables.py +0 -203
- relationalai/early_access/dsl/ir/compiler.py +0 -318
- relationalai/early_access/dsl/ir/executor.py +0 -260
- relationalai/early_access/dsl/ontologies/constraints.py +0 -88
- relationalai/early_access/dsl/ontologies/export.py +0 -30
- relationalai/early_access/dsl/ontologies/models.py +0 -453
- relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
- relationalai/early_access/dsl/ontologies/readings.py +0 -60
- relationalai/early_access/dsl/ontologies/relationships.py +0 -322
- relationalai/early_access/dsl/ontologies/roles.py +0 -87
- relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
- relationalai/early_access/dsl/orm/constraints.py +0 -438
- relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
- relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
- relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
- relationalai/early_access/dsl/orm/measures/measures.py +0 -299
- relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
- relationalai/early_access/dsl/orm/models.py +0 -256
- relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
- relationalai/early_access/dsl/orm/printer.py +0 -469
- relationalai/early_access/dsl/orm/reasoners.py +0 -480
- relationalai/early_access/dsl/orm/relations.py +0 -19
- relationalai/early_access/dsl/orm/relationships.py +0 -251
- relationalai/early_access/dsl/orm/types.py +0 -42
- relationalai/early_access/dsl/orm/utils.py +0 -79
- relationalai/early_access/dsl/orm/verb.py +0 -204
- relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
- relationalai/early_access/dsl/relations.py +0 -170
- relationalai/early_access/dsl/rulesets.py +0 -69
- relationalai/early_access/dsl/schemas/__init__.py +0 -450
- relationalai/early_access/dsl/schemas/builder.py +0 -48
- relationalai/early_access/dsl/schemas/comp_names.py +0 -51
- relationalai/early_access/dsl/schemas/components.py +0 -203
- relationalai/early_access/dsl/schemas/contexts.py +0 -156
- relationalai/early_access/dsl/schemas/exprs.py +0 -89
- relationalai/early_access/dsl/schemas/fragments.py +0 -464
- relationalai/early_access/dsl/serialization.py +0 -79
- relationalai/early_access/dsl/serialize/exporter.py +0 -163
- relationalai/early_access/dsl/snow/api.py +0 -104
- relationalai/early_access/dsl/snow/common.py +0 -76
- relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
- relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
- relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
- relationalai/early_access/dsl/types/__init__.py +0 -40
- relationalai/early_access/dsl/types/concepts.py +0 -12
- relationalai/early_access/dsl/types/entities.py +0 -135
- relationalai/early_access/dsl/types/values.py +0 -17
- relationalai/early_access/dsl/utils.py +0 -102
- relationalai/early_access/graphs/__init__.py +0 -13
- relationalai/early_access/lqp/__init__.py +0 -12
- relationalai/early_access/lqp/compiler/__init__.py +0 -12
- relationalai/early_access/lqp/constructors/__init__.py +0 -18
- relationalai/early_access/lqp/executor/__init__.py +0 -12
- relationalai/early_access/lqp/ir/__init__.py +0 -12
- relationalai/early_access/lqp/passes/__init__.py +0 -12
- relationalai/early_access/lqp/pragmas/__init__.py +0 -12
- relationalai/early_access/lqp/primitives/__init__.py +0 -12
- relationalai/early_access/lqp/types/__init__.py +0 -12
- relationalai/early_access/lqp/utils/__init__.py +0 -12
- relationalai/early_access/lqp/validators/__init__.py +0 -12
- relationalai/early_access/metamodel/__init__.py +0 -58
- relationalai/early_access/metamodel/builtins/__init__.py +0 -12
- relationalai/early_access/metamodel/compiler/__init__.py +0 -12
- relationalai/early_access/metamodel/dependency/__init__.py +0 -12
- relationalai/early_access/metamodel/factory/__init__.py +0 -17
- relationalai/early_access/metamodel/helpers/__init__.py +0 -12
- relationalai/early_access/metamodel/ir/__init__.py +0 -14
- relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
- relationalai/early_access/metamodel/typer/__init__.py +0 -3
- relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
- relationalai/early_access/metamodel/types/__init__.py +0 -15
- relationalai/early_access/metamodel/util/__init__.py +0 -15
- relationalai/early_access/metamodel/visitor/__init__.py +0 -12
- relationalai/early_access/rel/__init__.py +0 -12
- relationalai/early_access/rel/executor/__init__.py +0 -12
- relationalai/early_access/rel/rel_utils/__init__.py +0 -12
- relationalai/early_access/rel/rewrite/__init__.py +0 -7
- relationalai/early_access/solvers/__init__.py +0 -19
- relationalai/early_access/sql/__init__.py +0 -11
- relationalai/early_access/sql/executor/__init__.py +0 -3
- relationalai/early_access/sql/rewrite/__init__.py +0 -3
- relationalai/early_access/tests/logging/__init__.py +0 -12
- relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
- relationalai/early_access/tests/utils/__init__.py +0 -12
- relationalai/environments/__init__.py +0 -35
- relationalai/environments/base.py +0 -381
- relationalai/environments/colab.py +0 -14
- relationalai/environments/generic.py +0 -71
- relationalai/environments/ipython.py +0 -68
- relationalai/environments/jupyter.py +0 -9
- relationalai/environments/snowbook.py +0 -169
- relationalai/errors.py +0 -2455
- relationalai/experimental/SF.py +0 -38
- relationalai/experimental/inspect.py +0 -47
- relationalai/experimental/pathfinder/__init__.py +0 -158
- relationalai/experimental/pathfinder/api.py +0 -160
- relationalai/experimental/pathfinder/automaton.py +0 -584
- relationalai/experimental/pathfinder/bridge.py +0 -226
- relationalai/experimental/pathfinder/compiler.py +0 -416
- relationalai/experimental/pathfinder/datalog.py +0 -214
- relationalai/experimental/pathfinder/diagnostics.py +0 -56
- relationalai/experimental/pathfinder/filter.py +0 -236
- relationalai/experimental/pathfinder/glushkov.py +0 -439
- relationalai/experimental/pathfinder/options.py +0 -265
- relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -1951
- relationalai/experimental/pathfinder/rpq.py +0 -344
- relationalai/experimental/pathfinder/transition.py +0 -200
- relationalai/experimental/pathfinder/utils.py +0 -26
- relationalai/experimental/paths/README.md +0 -107
- relationalai/experimental/paths/api.py +0 -143
- relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
- relationalai/experimental/paths/code_organization.md +0 -2
- relationalai/experimental/paths/examples/Movies.ipynb +0 -16328
- relationalai/experimental/paths/examples/basic_example.py +0 -40
- relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
- relationalai/experimental/paths/examples/movie_example.py +0 -77
- relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -193
- relationalai/experimental/paths/examples/movies_data/directed.csv +0 -45
- relationalai/experimental/paths/examples/movies_data/follows.csv +0 -7
- relationalai/experimental/paths/examples/movies_data/movies.csv +0 -39
- relationalai/experimental/paths/examples/movies_data/person.csv +0 -134
- relationalai/experimental/paths/examples/movies_data/produced.csv +0 -16
- relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -10
- relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -11
- relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
- relationalai/experimental/paths/examples/paths_example.py +0 -116
- relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
- relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
- relationalai/experimental/paths/graph.py +0 -185
- relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
- relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
- relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
- relationalai/experimental/paths/path_algorithms/single.py +0 -59
- relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
- relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
- relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
- relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
- relationalai/experimental/paths/path_algorithms/usp.py +0 -150
- relationalai/experimental/paths/product_graph.py +0 -93
- relationalai/experimental/paths/rpq/automaton.py +0 -584
- relationalai/experimental/paths/rpq/diagnostics.py +0 -56
- relationalai/experimental/paths/rpq/rpq.py +0 -378
- relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
- relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
- relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
- relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
- relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
- relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
- relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
- relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
- relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
- relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
- relationalai/experimental/paths/tree_agg.py +0 -168
- relationalai/experimental/paths/utilities/iterators.py +0 -27
- relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
- relationalai/experimental/solvers.py +0 -1087
- relationalai/loaders/csv.py +0 -195
- relationalai/loaders/loader.py +0 -177
- relationalai/loaders/types.py +0 -23
- relationalai/rel_emitter.py +0 -373
- relationalai/rel_utils.py +0 -185
- relationalai/semantics/designs/query_builder/identify_by.md +0 -106
- relationalai/semantics/devtools/benchmark_lqp.py +0 -536
- relationalai/semantics/devtools/compilation_manager.py +0 -294
- relationalai/semantics/devtools/extract_lqp.py +0 -110
- relationalai/semantics/internal/internal.py +0 -3785
- relationalai/semantics/internal/snowflake.py +0 -324
- relationalai/semantics/lqp/README.md +0 -34
- relationalai/semantics/lqp/builtins.py +0 -16
- relationalai/semantics/lqp/compiler.py +0 -22
- relationalai/semantics/lqp/constructors.py +0 -68
- relationalai/semantics/lqp/executor.py +0 -469
- relationalai/semantics/lqp/intrinsics.py +0 -24
- relationalai/semantics/lqp/model2lqp.py +0 -839
- relationalai/semantics/lqp/passes.py +0 -680
- relationalai/semantics/lqp/primitives.py +0 -252
- relationalai/semantics/lqp/result_helpers.py +0 -202
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
- relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
- relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
- relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
- relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
- relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- relationalai/semantics/lqp/types.py +0 -101
- relationalai/semantics/lqp/utils.py +0 -160
- relationalai/semantics/lqp/validators.py +0 -57
- relationalai/semantics/metamodel/compiler.py +0 -133
- relationalai/semantics/metamodel/dependency.py +0 -862
- relationalai/semantics/metamodel/executor.py +0 -61
- relationalai/semantics/metamodel/factory.py +0 -287
- relationalai/semantics/metamodel/helpers.py +0 -361
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
- relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
- relationalai/semantics/metamodel/typer/checker.py +0 -353
- relationalai/semantics/metamodel/typer/typer.py +0 -1395
- relationalai/semantics/reasoners/__init__.py +0 -10
- relationalai/semantics/reasoners/graph/README.md +0 -620
- relationalai/semantics/reasoners/graph/__init__.py +0 -37
- relationalai/semantics/reasoners/graph/core.py +0 -9020
- relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -797
- relationalai/semantics/reasoners/graph/tests/README.md +0 -21
- relationalai/semantics/reasoners/optimization/__init__.py +0 -68
- relationalai/semantics/reasoners/optimization/common.py +0 -88
- relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
- relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
- relationalai/semantics/rel/builtins.py +0 -40
- relationalai/semantics/rel/compiler.py +0 -989
- relationalai/semantics/rel/executor.py +0 -359
- relationalai/semantics/rel/rel.py +0 -482
- relationalai/semantics/rel/rel_utils.py +0 -276
- relationalai/semantics/snowflake/__init__.py +0 -3
- relationalai/semantics/sql/compiler.py +0 -2503
- relationalai/semantics/sql/executor/duck_db.py +0 -52
- relationalai/semantics/sql/executor/result_helpers.py +0 -64
- relationalai/semantics/sql/executor/snowflake.py +0 -145
- relationalai/semantics/sql/rewrite/denormalize.py +0 -222
- relationalai/semantics/sql/rewrite/double_negation.py +0 -49
- relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
- relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
- relationalai/semantics/sql/sql.py +0 -504
- relationalai/semantics/std/pragmas.py +0 -11
- relationalai/semantics/std/std.py +0 -14
- relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
- relationalai/semantics/tests/test_snapshot_base.py +0 -9
- relationalai/semantics/tests/utils.py +0 -46
- relationalai/std/__init__.py +0 -70
- relationalai/tools/cli.py +0 -1940
- relationalai/tools/cli_controls.py +0 -1826
- relationalai/tools/cli_helpers.py +0 -390
- relationalai/tools/debugger_client.py +0 -109
- relationalai/tools/debugger_server.py +0 -302
- relationalai/tools/dev.py +0 -685
- relationalai/tools/notes +0 -7
- relationalai/tools/qb_debugger.py +0 -425
- relationalai/util/clean_up_databases.py +0 -95
- relationalai/util/list_databases.py +0 -9
- relationalai/util/otel_configuration.py +0 -25
- relationalai/util/otel_handler.py +0 -484
- relationalai/util/snowflake_handler.py +0 -88
- relationalai/util/span_format_test.py +0 -43
- relationalai/util/span_tracker.py +0 -207
- relationalai/util/spans_file_handler.py +0 -72
- relationalai/util/tracing_handler.py +0 -34
- relationalai-0.12.13.dist-info/METADATA +0 -74
- relationalai-0.12.13.dist-info/RECORD +0 -449
- relationalai-0.12.13.dist-info/WHEEL +0 -4
- relationalai-0.12.13.dist-info/entry_points.txt +0 -3
- relationalai-0.12.13.dist-info/licenses/LICENSE +0 -202
- relationalai_test_util/__init__.py +0 -4
- relationalai_test_util/fixtures.py +0 -228
- relationalai_test_util/snapshot.py +0 -252
- relationalai_test_util/traceback.py +0 -118
- /relationalai/{analysis → semantics/frontend}/__init__.py +0 -0
- /relationalai/{auth/__init__.py → semantics/metamodel/metamodel_compiler.py} +0 -0
- /relationalai/{early_access → shims}/__init__.py +0 -0
- {relationalai/early_access/dsl/adapters → v0/relationalai/analysis}/__init__.py +0 -0
- {relationalai → v0/relationalai}/analysis/mechanistic.py +0 -0
- {relationalai → v0/relationalai}/analysis/whynot.py +0 -0
- {relationalai/early_access/dsl/adapters/orm → v0/relationalai/auth}/__init__.py +0 -0
- {relationalai → v0/relationalai}/auth/jwt_generator.py +0 -0
- {relationalai → v0/relationalai}/auth/oauth_callback_server.py +0 -0
- {relationalai → v0/relationalai}/auth/token_handler.py +0 -0
- {relationalai → v0/relationalai}/auth/util.py +0 -0
- {relationalai → v0/relationalai}/clients/__init__.py +0 -0
- {relationalai → v0/relationalai}/clients/cache_store.py +0 -0
- {relationalai → v0/relationalai}/compiler.py +0 -0
- {relationalai → v0/relationalai}/dependencies.py +0 -0
- {relationalai → v0/relationalai}/docutils.py +0 -0
- {relationalai/early_access/dsl/adapters/owl → v0/relationalai/early_access}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings → v0/relationalai/early_access/dsl/adapters}/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings/legacy → v0/relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
- {relationalai/early_access/dsl/codegen → v0/relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
- {relationalai/early_access/dsl/core/temporal → v0/relationalai/early_access/dsl/bindings}/__init__.py +0 -0
- {relationalai/early_access/dsl/ir → v0/relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
- {relationalai/early_access/dsl/ontologies → v0/relationalai/early_access/dsl/codegen}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/constants.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/stack.py +0 -0
- {relationalai/early_access/dsl/orm → v0/relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/utils.py +0 -0
- {relationalai/early_access/dsl/orm/measures → v0/relationalai/early_access/dsl/ir}/__init__.py +0 -0
- {relationalai/early_access/dsl/physical_metadata → v0/relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
- {relationalai/early_access/dsl/serialize → v0/relationalai/early_access/dsl/orm}/__init__.py +0 -0
- {relationalai/early_access/dsl/snow → v0/relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
- {relationalai/loaders → v0/relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
- {relationalai/semantics/tests → v0/relationalai/early_access/dsl/serialize}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/model.py +0 -0
- {relationalai/tools → v0/relationalai/early_access/dsl/snow}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/tests/__init__.py +0 -0
- {relationalai → v0/relationalai}/environments/ci.py +0 -0
- {relationalai → v0/relationalai}/environments/hex.py +0 -0
- {relationalai → v0/relationalai}/environments/terminal.py +0 -0
- {relationalai → v0/relationalai}/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/graphs.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/filter.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/glushkov.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/transition.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/utilities.py +0 -0
- {relationalai → v0/relationalai}/metagen.py +0 -0
- {relationalai → v0/relationalai}/metamodel.py +0 -0
- {relationalai → v0/relationalai}/rel.py +0 -0
- {relationalai → v0/relationalai}/semantics/devtools/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/annotations.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/ir.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/pragmas.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/dataflow.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/ir.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/typer/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/types.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/util.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/visitor.py +0 -0
- {relationalai → v0/relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/rel/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/executor/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/tests/logging.py +0 -0
- {relationalai → v0/relationalai}/std/aggregates.py +0 -0
- {relationalai → v0/relationalai}/std/dates.py +0 -0
- {relationalai → v0/relationalai}/std/graphs.py +0 -0
- {relationalai → v0/relationalai}/std/inspect.py +0 -0
- {relationalai → v0/relationalai}/std/math.py +0 -0
- {relationalai → v0/relationalai}/std/re.py +0 -0
- {relationalai → v0/relationalai}/std/strings.py +0 -0
- {relationalai → v0/relationalai}/tools/cleanup_snapshots.py +0 -0
- {relationalai → v0/relationalai}/tools/constants.py +0 -0
- {relationalai → v0/relationalai}/tools/query_utils.py +0 -0
- {relationalai → v0/relationalai}/tools/snapshot_viewer.py +0 -0
- {relationalai → v0/relationalai}/util/__init__.py +0 -0
- {relationalai → v0/relationalai}/util/constants.py +0 -0
- {relationalai → v0/relationalai}/util/graph.py +0 -0
- {relationalai → v0/relationalai}/util/timeout.py +0 -0
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
from typing import Tuple
|
|
3
|
-
|
|
4
|
-
from relationalai.semantics.metamodel import builtins, ir, factory as f, types, visitor
|
|
5
|
-
from relationalai.semantics.metamodel.compiler import Pass, group_tasks
|
|
6
|
-
from relationalai.semantics.metamodel.util import OrderedSet
|
|
7
|
-
from relationalai.semantics.metamodel.util import FrozenOrderedSet
|
|
8
|
-
from relationalai.semantics.metamodel.typer.typer import is_primitive
|
|
9
|
-
|
|
10
|
-
class FormatOutputs(Pass):
|
|
11
|
-
def __init__(self, handle_outputs: bool=True):
|
|
12
|
-
super().__init__()
|
|
13
|
-
self._handle_outputs = handle_outputs
|
|
14
|
-
|
|
15
|
-
#--------------------------------------------------
|
|
16
|
-
# Public API
|
|
17
|
-
#--------------------------------------------------
|
|
18
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
19
|
-
wide_outputs = options.get("wide_outputs", False)
|
|
20
|
-
return self.OutputRewriter(wide_outputs).walk(model)
|
|
21
|
-
|
|
22
|
-
class OutputRewriter(visitor.Rewriter):
|
|
23
|
-
def __init__(self, wide_outputs: bool = False):
|
|
24
|
-
super().__init__()
|
|
25
|
-
self.wide_outputs = wide_outputs
|
|
26
|
-
|
|
27
|
-
def handle_logical(self, node: ir.Logical, parent: ir.Node):
|
|
28
|
-
# Rewrite children first
|
|
29
|
-
node = super().handle_logical(node, parent)
|
|
30
|
-
|
|
31
|
-
groups = group_tasks(node.body, {
|
|
32
|
-
"outputs": ir.Output,
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
# If no outputs, return as is
|
|
36
|
-
if not groups["outputs"]:
|
|
37
|
-
return node
|
|
38
|
-
|
|
39
|
-
return adjust_outputs(node, groups["outputs"], self.wide_outputs)
|
|
40
|
-
|
|
41
|
-
#--------------------------------------------------
|
|
42
|
-
# GNF vs wide output support
|
|
43
|
-
#--------------------------------------------------
|
|
44
|
-
def adjust_outputs(task: ir.Logical, outputs: OrderedSet[ir.Task], wide_outputs: bool = False):
|
|
45
|
-
|
|
46
|
-
body = list(task.body)
|
|
47
|
-
|
|
48
|
-
# For wide outputs, only adjust the output task to include the keys.
|
|
49
|
-
if wide_outputs:
|
|
50
|
-
for output in outputs:
|
|
51
|
-
assert(isinstance(output, ir.Output))
|
|
52
|
-
if output.keys:
|
|
53
|
-
body.remove(output)
|
|
54
|
-
body.append(rewrite_wide_output(output))
|
|
55
|
-
return ir.Logical(task.engine, task.hoisted, tuple(body), task.annotations)
|
|
56
|
-
|
|
57
|
-
# For GNF outputs we need to generate a rule for each "column" in the output
|
|
58
|
-
else:
|
|
59
|
-
# First split outputs in potentially multiple outputs, one for each "column"
|
|
60
|
-
for output in outputs:
|
|
61
|
-
assert(isinstance(output, ir.Output))
|
|
62
|
-
if output.keys:
|
|
63
|
-
# Remove the original output. This is replaced by per-column outputs below
|
|
64
|
-
body.remove(output)
|
|
65
|
-
|
|
66
|
-
is_export = builtins.export_annotation in output.annotations
|
|
67
|
-
|
|
68
|
-
# Generate an output for each "column"
|
|
69
|
-
# output looks like def output(:cols, :col000, key0, key1, value):
|
|
70
|
-
original_cols = OrderedSet()
|
|
71
|
-
for idx, alias in enumerate(output.aliases):
|
|
72
|
-
# Skip None values which are used as a placeholder for missing values
|
|
73
|
-
if alias[1] is None:
|
|
74
|
-
continue
|
|
75
|
-
original_cols.add(alias[1])
|
|
76
|
-
body.extend(_generate_output_column(output, idx, alias, is_export))
|
|
77
|
-
|
|
78
|
-
idx = len(output.aliases)
|
|
79
|
-
for key in output.keys:
|
|
80
|
-
if key not in original_cols:
|
|
81
|
-
body.extend(_generate_output_column(output, idx, (key.name, key), is_export))
|
|
82
|
-
idx += 1
|
|
83
|
-
|
|
84
|
-
return ir.Logical(task.engine, task.hoisted, tuple(body), task.annotations)
|
|
85
|
-
|
|
86
|
-
# TODO: return non list?
|
|
87
|
-
def _generate_output_column(output: ir.Output, idx: int, alias: tuple[str, ir.Value], is_export: bool):
|
|
88
|
-
if not output.keys:
|
|
89
|
-
return [output]
|
|
90
|
-
|
|
91
|
-
aliases = [("cols", f.literal("cols", types.Symbol))] if not is_export else []
|
|
92
|
-
aliases.append(("col", f.literal(f"col{idx:03}", types.Symbol)))
|
|
93
|
-
|
|
94
|
-
# Append all keys at the start
|
|
95
|
-
for k in output.keys:
|
|
96
|
-
aliases.append((f"key_{k.name}_{idx}", k))
|
|
97
|
-
|
|
98
|
-
if (is_export and
|
|
99
|
-
isinstance(alias[1], ir.Var) and
|
|
100
|
-
(not is_primitive(alias[1].type) or alias[1].type == types.Hash)):
|
|
101
|
-
|
|
102
|
-
uuid = f.var(f"{alias[0]}_{idx}_uuid", types.String)
|
|
103
|
-
aliases.append((uuid.name, uuid))
|
|
104
|
-
|
|
105
|
-
return [
|
|
106
|
-
ir.Lookup(None, builtins.uuid_to_string, (alias[1], uuid)),
|
|
107
|
-
ir.Output(
|
|
108
|
-
output.engine,
|
|
109
|
-
FrozenOrderedSet.from_iterable(aliases),
|
|
110
|
-
output.keys,
|
|
111
|
-
output.annotations
|
|
112
|
-
)
|
|
113
|
-
]
|
|
114
|
-
else:
|
|
115
|
-
aliases.append(alias)
|
|
116
|
-
|
|
117
|
-
return [
|
|
118
|
-
ir.Output(
|
|
119
|
-
output.engine,
|
|
120
|
-
FrozenOrderedSet.from_iterable(aliases),
|
|
121
|
-
output.keys,
|
|
122
|
-
output.annotations
|
|
123
|
-
)
|
|
124
|
-
]
|
|
125
|
-
|
|
126
|
-
def rewrite_wide_output(output: ir.Output):
|
|
127
|
-
assert(output.keys)
|
|
128
|
-
|
|
129
|
-
# Only append keys that are not already in the output
|
|
130
|
-
suffix_keys = []
|
|
131
|
-
for key in output.keys:
|
|
132
|
-
if all([val is not key for _, val in output.aliases]):
|
|
133
|
-
suffix_keys.append(key)
|
|
134
|
-
|
|
135
|
-
aliases: OrderedSet[Tuple[str, ir.Value]] = OrderedSet()
|
|
136
|
-
|
|
137
|
-
# Add the remaining args, unless it is already a key
|
|
138
|
-
for name, val in output.aliases:
|
|
139
|
-
if not isinstance(val, ir.Var) or val not in suffix_keys:
|
|
140
|
-
aliases.add((name, val))
|
|
141
|
-
|
|
142
|
-
# Add the keys to the output
|
|
143
|
-
for key in suffix_keys:
|
|
144
|
-
aliases.add((key.name, key))
|
|
145
|
-
|
|
146
|
-
# TODO - we are assuming that the Rel compiler will translate nullable lookups
|
|
147
|
-
# properly, returning a `Missing` if necessary, like this:
|
|
148
|
-
# (nested_192(_adult, _adult_name) or (not nested_192(_adult, _) and _adult_name = Missing)) and
|
|
149
|
-
return ir.Output(
|
|
150
|
-
output.engine,
|
|
151
|
-
aliases.frozen(),
|
|
152
|
-
output.keys,
|
|
153
|
-
output.annotations
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
# TODO: in the rel compiler, see if we can do this outer join
|
|
157
|
-
# 1. number of keys
|
|
158
|
-
# 2. each relation
|
|
159
|
-
# 3. each variable, starting with the keys
|
|
160
|
-
# 4. tag output with @arrow
|
|
161
|
-
|
|
162
|
-
# @arrow def output(_book, _book_title, _author_name):
|
|
163
|
-
# rel_primitive_outer_join(#1, book_title, author_name, _book, _book_title, _author_name)
|
|
164
|
-
# def output(p, n, c):
|
|
165
|
-
# rel_primitive_outer_join(#1, name, coolness, p, n, c)
|
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Type checking for the IR.
|
|
3
|
-
"""
|
|
4
|
-
from dataclasses import dataclass, field
|
|
5
|
-
from typing import Optional, List, Union as PyUnion, Tuple, cast
|
|
6
|
-
|
|
7
|
-
from relationalai.semantics.metamodel.util import OrderedSet, ordered_set
|
|
8
|
-
from relationalai.semantics.metamodel import ir, types, visitor, compiler
|
|
9
|
-
import rich
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@dataclass
|
|
13
|
-
class CheckError:
|
|
14
|
-
"""A model well-formedness error."""
|
|
15
|
-
msg: str
|
|
16
|
-
node: ir.Node
|
|
17
|
-
|
|
18
|
-
def __str__(self):
|
|
19
|
-
return f"[red bold][Model Error][/red bold] {self.msg}: [white]{str(self.node).strip()}[/white]"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@dataclass
|
|
23
|
-
class CheckEnv:
|
|
24
|
-
"""Environment for checking that a model is well-formed."""
|
|
25
|
-
|
|
26
|
-
# The model being type-checked.
|
|
27
|
-
model: ir.Model
|
|
28
|
-
|
|
29
|
-
# Diagnostics. For now, this is just strings.
|
|
30
|
-
diags: List[CheckError]
|
|
31
|
-
|
|
32
|
-
# How verbose to be with debug info, 0 for off.
|
|
33
|
-
verbosity: int
|
|
34
|
-
|
|
35
|
-
def __init__(self, model: ir.Model, verbosity: int=0):
|
|
36
|
-
self.model = model
|
|
37
|
-
self.diags = []
|
|
38
|
-
self.verbosity = verbosity
|
|
39
|
-
|
|
40
|
-
def _complain(self, node: ir.Node, msg: str):
|
|
41
|
-
"""Report an error."""
|
|
42
|
-
self.diags.append(CheckError(msg, node))
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
@dataclass
|
|
46
|
-
class Checker(compiler.Pass):
|
|
47
|
-
"""
|
|
48
|
-
A pass that checks that a model is well-formed.
|
|
49
|
-
Diagnostics are reported for ill-formed models.
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
# How verbose to be with debug output, 0 is off.
|
|
53
|
-
verbosity: int = field(default=0, init=False)
|
|
54
|
-
|
|
55
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
56
|
-
# Type checking.
|
|
57
|
-
env = CheckEnv(model, self.verbosity)
|
|
58
|
-
checker = CheckModel(env)
|
|
59
|
-
model.accept(checker)
|
|
60
|
-
|
|
61
|
-
# Report any well-formedness errors
|
|
62
|
-
if env.diags:
|
|
63
|
-
for diag in env.diags:
|
|
64
|
-
rich.print(str(diag))
|
|
65
|
-
if self.verbosity:
|
|
66
|
-
rich.print("[dim]-----[/dim]")
|
|
67
|
-
rich.print(str(model))
|
|
68
|
-
|
|
69
|
-
return model
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
@dataclass
|
|
73
|
-
class CheckModel(visitor.DAGVisitor):
|
|
74
|
-
"""
|
|
75
|
-
A visitor that checks that a model is well-formed.
|
|
76
|
-
"""
|
|
77
|
-
def __init__(self, env: CheckEnv):
|
|
78
|
-
super().__init__()
|
|
79
|
-
self.env = env
|
|
80
|
-
|
|
81
|
-
def visit_model(self, node: ir.Model, parent: Optional[ir.Node]=None) -> None:
|
|
82
|
-
env = self.env
|
|
83
|
-
model = node
|
|
84
|
-
|
|
85
|
-
# Check that all types are present in the model.
|
|
86
|
-
@dataclass
|
|
87
|
-
class CheckPresence(visitor.Visitor):
|
|
88
|
-
model: ir.Model = field(init=True)
|
|
89
|
-
env: CheckEnv = field(init=True)
|
|
90
|
-
def visit_scalartype(self, node: ir.ScalarType, parent: Optional[ir.Node]=None) -> None:
|
|
91
|
-
if node not in self.model.types:
|
|
92
|
-
self.env.diags.append(CheckError(f"Type {ir.node_to_string(node).strip()} not found in the model.", node))
|
|
93
|
-
def visit_decimaltype(self, node: ir.DecimalType, parent: Optional[ir.Node]=None) -> None:
|
|
94
|
-
if node not in self.model.types:
|
|
95
|
-
self.env.diags.append(CheckError(f"Type {ir.node_to_string(node).strip()} not found in the model.", node))
|
|
96
|
-
def visit_listtype(self, node: ir.ListType, parent: Optional[ir.Node]=None) -> None:
|
|
97
|
-
if node not in self.model.types:
|
|
98
|
-
self.env.diags.append(CheckError(f"Type {ir.node_to_string(node).strip()} not found in the model.", node))
|
|
99
|
-
def visit_uniontype(self, node: ir.UnionType, parent: Optional[ir.Node]=None) -> None:
|
|
100
|
-
if node not in self.model.types:
|
|
101
|
-
self.env.diags.append(CheckError(f"Type {ir.node_to_string(node).strip()} not found in the model.", node))
|
|
102
|
-
def visit_tupletype(self, node: ir.TupleType, parent: Optional[ir.Node]=None) -> None:
|
|
103
|
-
if node not in self.model.types:
|
|
104
|
-
self.env.diags.append(CheckError(f"Type {ir.node_to_string(node).strip()} not found in the model.", node))
|
|
105
|
-
|
|
106
|
-
for t in model.types:
|
|
107
|
-
t.accept(CheckPresence(model, env))
|
|
108
|
-
|
|
109
|
-
# Check that the types are acyclic and that the supertype relation is acyclic.
|
|
110
|
-
def check_type_cycles(t: ir.Type, subtypes: OrderedSet[ir.Type]=ordered_set(), containers: OrderedSet[ir.Type]=ordered_set()) -> None:
|
|
111
|
-
if t in subtypes:
|
|
112
|
-
env.diags.append(CheckError(f"Type {t} is involved in a subtyping cycle with {', '.join(str(s) for s in (subtypes - {t}))}.", t))
|
|
113
|
-
if t in containers:
|
|
114
|
-
env.diags.append(CheckError(f"Type {t} is infinitely recursive. It is contained within itself.", t))
|
|
115
|
-
if isinstance(t, ir.ScalarType):
|
|
116
|
-
for s in t.super_types:
|
|
117
|
-
check_type_cycles(s, subtypes | {t}, containers)
|
|
118
|
-
if isinstance(t, ir.ListType):
|
|
119
|
-
check_type_cycles(t.element_type, subtypes, containers | {t})
|
|
120
|
-
if isinstance(t, ir.UnionType):
|
|
121
|
-
for s in t.types:
|
|
122
|
-
check_type_cycles(s, subtypes, containers | {t})
|
|
123
|
-
if isinstance(t, ir.TupleType):
|
|
124
|
-
for s in t.types:
|
|
125
|
-
check_type_cycles(s, subtypes, containers | {t})
|
|
126
|
-
|
|
127
|
-
# Check that the types are well-formed and acyclic.
|
|
128
|
-
for t in model.types:
|
|
129
|
-
check_type_cycles(t)
|
|
130
|
-
# Lists must have scalar element types.
|
|
131
|
-
if isinstance(t, ir.ListType):
|
|
132
|
-
if not isinstance(t.element_type, ir.ScalarType):
|
|
133
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an list type, but extends non-scalar element type {ir.type_to_string(t.element_type)}.", t))
|
|
134
|
-
# Tuples must have scalar element types.
|
|
135
|
-
elif isinstance(t, ir.TupleType):
|
|
136
|
-
for s in t.types:
|
|
137
|
-
if not isinstance(s, ir.ScalarType):
|
|
138
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an tuple type, but extends non-scalar element type {ir.type_to_string(s)}.", t))
|
|
139
|
-
# Union types must have scalar element types.
|
|
140
|
-
elif isinstance(t, ir.UnionType):
|
|
141
|
-
for s in t.types:
|
|
142
|
-
if not isinstance(s, ir.ScalarType):
|
|
143
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an union type, but extends non-scalar element type {ir.type_to_string(s)}.", t))
|
|
144
|
-
elif isinstance(t, ir.ScalarType):
|
|
145
|
-
# Supertypes of scalar types must be scalar types.
|
|
146
|
-
for s in t.super_types:
|
|
147
|
-
if not isinstance(s, ir.ScalarType):
|
|
148
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an scalar type, but extends a non-scalar type {ir.type_to_string(s)}.", t))
|
|
149
|
-
if types.is_any(t):
|
|
150
|
-
# The Any type should not have supertypes.
|
|
151
|
-
if len(t.super_types) > 0:
|
|
152
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is the Any type, but extends some supertypes. The Any type should not have supertypes.", t))
|
|
153
|
-
elif types.is_value_base_type(t):
|
|
154
|
-
# Value base types should not have supertypes.
|
|
155
|
-
if len(t.super_types) > 0:
|
|
156
|
-
if len(t.super_types) != 1 or (t.super_types[0] != types.Number and t.super_types[0] != types.String and t.super_types[0] != types.GenericDecimal):
|
|
157
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an value base type, but extends one or more supertypes. Value base types should not have supertypes (except for Number, GenericDecimal or String).", t))
|
|
158
|
-
elif types.is_value_type(t):
|
|
159
|
-
# By construction, a value type should either be a value base type or extend a value base type, so there's no need to check that.
|
|
160
|
-
# Value types should have exactly one supertype.
|
|
161
|
-
if len(t.super_types) > 1:
|
|
162
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an value type, but extends multiple supertypes. User-defined value types must have exactly one supertype.", t))
|
|
163
|
-
# Value types cannot extend Hash.
|
|
164
|
-
if types.is_subtype(t, types.Hash):
|
|
165
|
-
env.diags.append(CheckError(f"Type {ir.type_to_string(t)} is an value type, but extends the entity type `Hash`. Entity types and value types must be disjoint.", t))
|
|
166
|
-
|
|
167
|
-
# Recurse to check the rest of the model.
|
|
168
|
-
return super().visit_model(node, parent)
|
|
169
|
-
|
|
170
|
-
def visit_engine(self, node: ir.Engine, parent: Optional[ir.Node]=None):
|
|
171
|
-
# Check that each relation requires a subset of the engine capabilities.
|
|
172
|
-
for r in node.relations:
|
|
173
|
-
for c in r.requires:
|
|
174
|
-
if c not in node.capabilities:
|
|
175
|
-
self.env._complain(node, f"Relation `{r.name}` requires capability {c}, but engine `{node.name}` only has {', '.join([str(x) for x in node.capabilities])}.")
|
|
176
|
-
# Do not recurse. We already checked the relations at the model level.
|
|
177
|
-
pass
|
|
178
|
-
|
|
179
|
-
def visit_scalartype(self, node: ir.Type, parent: Optional[ir.Node]=None):
|
|
180
|
-
# Do not recurse.
|
|
181
|
-
pass
|
|
182
|
-
|
|
183
|
-
def visit_listtype(self, node: ir.ListType, parent: Optional[ir.Node]=None):
|
|
184
|
-
# List types are allowed before type inference.
|
|
185
|
-
# Type inference will complain if the element is inferred to be a list type.
|
|
186
|
-
# Do not recurse.
|
|
187
|
-
pass
|
|
188
|
-
|
|
189
|
-
def visit_relation(self, node: ir.Relation, parent: Optional[ir.Node]=None):
|
|
190
|
-
# don't check relations used in annotations
|
|
191
|
-
if parent and isinstance(parent, ir.Annotation):
|
|
192
|
-
return
|
|
193
|
-
|
|
194
|
-
if node not in self.env.model.relations:
|
|
195
|
-
self.env._complain(node, f"Relation `{node.name}` (id={node.id}) is not declared in the model.")
|
|
196
|
-
field_names = [f.name for f in node.fields]
|
|
197
|
-
duplicate_names = [name for name in field_names if field_names.count(name) > 1]
|
|
198
|
-
if duplicate_names:
|
|
199
|
-
self.env._complain(node, f"Relation `{node.name}` has duplicate field names: {', '.join(duplicate_names)}.")
|
|
200
|
-
# Check that all overloads are proper subtypes of the original relation
|
|
201
|
-
for r in node.overloads:
|
|
202
|
-
if r is node:
|
|
203
|
-
self.env._complain(node, f"Relation `{node.name}` has an overload that is itself.")
|
|
204
|
-
if r.name != node.name:
|
|
205
|
-
self.env._complain(r, f"Relation `{node.name}` has an overload that has a different name.")
|
|
206
|
-
if len(r.fields) != len(node.fields):
|
|
207
|
-
self.env._complain(r, f"Relation `{node.name}` has an overload that has a different number of fields.")
|
|
208
|
-
# TODO this test is disabled until we add back Int <: Number
|
|
209
|
-
# from relationalai.semantics.metamodel import helpers
|
|
210
|
-
# if not helpers.relation_is_proper_subtype(r, node):
|
|
211
|
-
# self.env._complain(r, f"Relation `{r.name}` is an overload but is not a proper subtype of the original relation.")
|
|
212
|
-
if r.overloads:
|
|
213
|
-
self.env._complain(r, f"Relation `{r.name}` has an overload that has an overload.")
|
|
214
|
-
for f1, f2 in zip(r.fields, node.fields):
|
|
215
|
-
if f1.input and not f2.input:
|
|
216
|
-
self.env._complain(r, f"Relation `{r.name}` has an overload that has an input field that is not present in the original relation.")
|
|
217
|
-
if not f1.input and f2.input:
|
|
218
|
-
self.env._complain(r, f"Relation `{node.name}` has an input field that is not present in the overload.")
|
|
219
|
-
|
|
220
|
-
# Recurse to visit the fields.
|
|
221
|
-
return super().visit_relation(node, parent)
|
|
222
|
-
|
|
223
|
-
def visit_var(self, node: ir.Var, parent: Optional[ir.Node]=None):
|
|
224
|
-
# Do not constrain field types to be <: Any.
|
|
225
|
-
if not isinstance(node.type, ir.UnionType) and not isinstance(node.type, ir.ScalarType):
|
|
226
|
-
self.env._complain(node, f"Variable `{node.name}` has type {ir.type_to_string(node.type)}, which is not a scalar or union type.")
|
|
227
|
-
# Do not recurse. No need to visit the type.
|
|
228
|
-
return super().visit_var(node, parent)
|
|
229
|
-
|
|
230
|
-
def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]=None):
|
|
231
|
-
# The hoisted variables should occur in the body.
|
|
232
|
-
for x in node.hoisted:
|
|
233
|
-
if not CheckModel._variable_occurs_in(x, node.body):
|
|
234
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
235
|
-
return super().visit_logical(node, parent)
|
|
236
|
-
|
|
237
|
-
def visit_union(self, node: ir.Union, parent: Optional[ir.Node]=None):
|
|
238
|
-
# The hoisted variables should occur in the body.
|
|
239
|
-
for x in node.hoisted:
|
|
240
|
-
if not CheckModel._variable_occurs_in(x, node.tasks):
|
|
241
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
242
|
-
return super().visit_union(node, parent)
|
|
243
|
-
|
|
244
|
-
def visit_sequence(self, node: ir.Sequence, parent: Optional[ir.Node]=None):
|
|
245
|
-
# The hoisted variables should occur in the body.
|
|
246
|
-
for x in node.hoisted:
|
|
247
|
-
if not CheckModel._variable_occurs_in(x, node.tasks):
|
|
248
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
249
|
-
return super().visit_sequence(node, parent)
|
|
250
|
-
|
|
251
|
-
def visit_match(self, node: ir.Match, parent: Optional[ir.Node]=None):
|
|
252
|
-
# The hoisted variables should occur in the body.
|
|
253
|
-
for x in node.hoisted:
|
|
254
|
-
if not CheckModel._variable_occurs_in(x, node.tasks):
|
|
255
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
256
|
-
return super().visit_match(node, parent)
|
|
257
|
-
|
|
258
|
-
def visit_until(self, node: ir.Until, parent: Optional[ir.Node]=None):
|
|
259
|
-
# The hoisted variables should occur in the body.
|
|
260
|
-
for x in node.hoisted:
|
|
261
|
-
if not CheckModel._variable_occurs_in(x, node.body):
|
|
262
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
263
|
-
return super().visit_until(node, parent)
|
|
264
|
-
|
|
265
|
-
def visit_wait(self, node: ir.Wait, parent: Optional[ir.Node]=None):
|
|
266
|
-
# The hoisted variables should occur in the body.
|
|
267
|
-
for x in node.hoisted:
|
|
268
|
-
if not CheckModel._variable_occurs_in(x, node.check):
|
|
269
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
270
|
-
return super().visit_wait(node, parent)
|
|
271
|
-
|
|
272
|
-
def visit_exists(self, node: ir.Exists, parent: Optional[ir.Node]=None):
|
|
273
|
-
# The quantified variables should occur in the body.
|
|
274
|
-
for x in node.vars:
|
|
275
|
-
if not CheckModel._variable_occurs_in(x, node.task):
|
|
276
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is quantified but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
277
|
-
return super().visit_exists(node, parent)
|
|
278
|
-
|
|
279
|
-
def visit_forall(self, node: ir.ForAll, parent: Optional[ir.Node]=None):
|
|
280
|
-
# The quantified variables should occur in the body.
|
|
281
|
-
for x in node.vars:
|
|
282
|
-
if not CheckModel._variable_occurs_in(x, node.task):
|
|
283
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is quantified but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
284
|
-
return super().visit_forall(node, parent)
|
|
285
|
-
|
|
286
|
-
def visit_output(self, node: ir.Output, parent: Optional[ir.Node]):
|
|
287
|
-
# Outputs are expected to be children of Logicals.
|
|
288
|
-
if not isinstance(parent, ir.Logical):
|
|
289
|
-
self.env._complain(node, f"Output is not a child of a Logical, but a {type(parent)}.")
|
|
290
|
-
|
|
291
|
-
super().visit_output(node, parent)
|
|
292
|
-
|
|
293
|
-
@staticmethod
|
|
294
|
-
def _variable_occurs_in(node: ir.VarOrDefault, body: PyUnion[ir.Task, Tuple[ir.Task, ...]]) -> bool:
|
|
295
|
-
if isinstance(body, tuple):
|
|
296
|
-
return any(CheckModel._variable_occurs_in(node, b) for b in body)
|
|
297
|
-
if isinstance(node, ir.Var):
|
|
298
|
-
return node in visitor.collect_by_type(ir.Var, cast(ir.Node, body))
|
|
299
|
-
elif isinstance(node, ir.Default):
|
|
300
|
-
return node.var in visitor.collect_by_type(ir.Var, cast(ir.Node, body))
|
|
301
|
-
else:
|
|
302
|
-
return False
|
|
303
|
-
|
|
304
|
-
def visit_loop(self, node: ir.Loop, parent: Optional[ir.Node]=None):
|
|
305
|
-
# The hoisted variables should occur in the body.
|
|
306
|
-
for x in node.hoisted:
|
|
307
|
-
if not CheckModel._variable_occurs_in(x, node.body):
|
|
308
|
-
self.env._complain(node, f"Variable {ir.node_to_string(x).strip()} is hoisted but not used in the body of {ir.node_to_string(node).strip()}.")
|
|
309
|
-
if not CheckModel._variable_occurs_in(node.iter, node.body):
|
|
310
|
-
self.env._complain(node, f"Variable {node.iter} is the loop iterator but is not used in the body of {ir.node_to_string(node).strip()}.")
|
|
311
|
-
return super().visit_loop(node, parent)
|
|
312
|
-
|
|
313
|
-
def visit_update(self, node: ir.Update, parent: Optional[ir.Node]=None):
|
|
314
|
-
if len(node.args) != len(node.relation.fields):
|
|
315
|
-
self.env._complain(node, f"{ir.node_to_string(node).strip()} has {len(node.args)} arguments but relation {node.relation.name} has {len(node.relation.fields)} fields")
|
|
316
|
-
# Updates are expected to be children of Logicals.
|
|
317
|
-
if not isinstance(parent, ir.Logical):
|
|
318
|
-
self.env._complain(node, f"Update is not a child of a Logical, but a {type(parent)}.")
|
|
319
|
-
return super().visit_update(node, parent)
|
|
320
|
-
|
|
321
|
-
def visit_lookup(self, node: ir.Lookup, parent: Optional[ir.Node]=None):
|
|
322
|
-
if len(node.args) != len(node.relation.fields):
|
|
323
|
-
self.env._complain(node, f"{ir.node_to_string(node).strip()} has {len(node.args)} arguments but relation {node.relation.name} has {len(node.relation.fields)} fields")
|
|
324
|
-
return super().visit_lookup(node, parent)
|
|
325
|
-
|
|
326
|
-
def visit_construct(self, node: ir.Construct, parent: Optional[ir.Node]=None):
|
|
327
|
-
if not node.values:
|
|
328
|
-
self.env._complain(node, f"Construct {ir.node_to_string(node).strip()} should have at least 1 value. You cannot construct something from nothing.")
|
|
329
|
-
return super().visit_construct(node, parent)
|
|
330
|
-
|
|
331
|
-
def visit_aggregate(self, node: ir.Aggregate, parent: Optional[ir.Node]=None):
|
|
332
|
-
agg = node.aggregation
|
|
333
|
-
if len(agg.fields) < 1:
|
|
334
|
-
self.env._complain(node, f"Aggregation `{agg.name}` should have at least 1 field, found {len(agg.fields)}.")
|
|
335
|
-
return
|
|
336
|
-
|
|
337
|
-
inputs = []
|
|
338
|
-
outputs = []
|
|
339
|
-
for f in agg.fields:
|
|
340
|
-
if f.input:
|
|
341
|
-
if outputs:
|
|
342
|
-
self.env._complain(node, f"Aggregation `{agg.name}` should declare all input fields before any output fields.")
|
|
343
|
-
inputs.append(f)
|
|
344
|
-
else:
|
|
345
|
-
outputs.append(f)
|
|
346
|
-
|
|
347
|
-
# Now let's wire up the types.
|
|
348
|
-
|
|
349
|
-
# Inputs and outputs.
|
|
350
|
-
if len(node.args) != len(inputs) + len(outputs):
|
|
351
|
-
self.env._complain(node, f"Aggregation `{agg.name}` expects {len(inputs) + len(outputs)} arguments, but has {len(node.args)} arguments instead.")
|
|
352
|
-
|
|
353
|
-
return super().visit_aggregate(node, parent)
|