relationalai 0.13.5__py3-none-any.whl → 1.0.0a1__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 -256
- 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/config/shims.py +1 -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 +1716 -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 -772
- 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 +1186 -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 +101 -46
- relationalai/shims/executor.py +161 -0
- relationalai/shims/helpers.py +126 -0
- relationalai/shims/hoister.py +221 -0
- relationalai/shims/mm2v0.py +1324 -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 -109
- 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-1.0.0a1.dist-info/METADATA +44 -0
- relationalai-1.0.0a1.dist-info/RECORD +489 -0
- relationalai-1.0.0a1.dist-info/WHEEL +5 -0
- relationalai-1.0.0a1.dist-info/entry_points.txt +3 -0
- relationalai-1.0.0a1.dist-info/top_level.txt +2 -0
- v0/relationalai/__init__.py +216 -0
- v0/relationalai/clients/__init__.py +5 -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/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/ir.py +124 -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/__init__.py +18 -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/ir.py +923 -0
- v0/relationalai/semantics/metamodel/rewrite/__init__.py +7 -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/metamodel/util.py +505 -0
- v0/relationalai/semantics/metamodel/visitor.py +944 -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/__init__.py +0 -18
- relationalai/clients/client.py +0 -946
- relationalai/clients/config.py +0 -673
- relationalai/clients/direct_access_client.py +0 -118
- relationalai/clients/exec_txn_poller.py +0 -153
- relationalai/clients/hash_util.py +0 -31
- relationalai/clients/local.py +0 -594
- relationalai/clients/profile_polling.py +0 -73
- relationalai/clients/resources/__init__.py +0 -8
- relationalai/clients/resources/azure/azure.py +0 -502
- relationalai/clients/resources/snowflake/__init__.py +0 -20
- relationalai/clients/resources/snowflake/cli_resources.py +0 -98
- relationalai/clients/resources/snowflake/direct_access_resources.py +0 -739
- relationalai/clients/resources/snowflake/engine_service.py +0 -381
- relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -315
- relationalai/clients/resources/snowflake/error_handlers.py +0 -240
- relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -249
- relationalai/clients/resources/snowflake/resources_factory.py +0 -99
- relationalai/clients/resources/snowflake/snowflake.py +0 -3193
- relationalai/clients/resources/snowflake/use_index_poller.py +0 -1019
- relationalai/clients/resources/snowflake/use_index_resources.py +0 -188
- relationalai/clients/resources/snowflake/util.py +0 -387
- relationalai/clients/result_helpers.py +0 -420
- relationalai/clients/types.py +0 -118
- 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 -105
- 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 -2496
- 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 -1095
- 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 -535
- 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 -329
- relationalai/semantics/lqp/README.md +0 -34
- relationalai/semantics/lqp/algorithms.py +0 -173
- relationalai/semantics/lqp/builtins.py +0 -213
- relationalai/semantics/lqp/compiler.py +0 -22
- relationalai/semantics/lqp/constructors.py +0 -68
- relationalai/semantics/lqp/executor.py +0 -518
- relationalai/semantics/lqp/export_rewriter.py +0 -40
- relationalai/semantics/lqp/intrinsics.py +0 -24
- relationalai/semantics/lqp/ir.py +0 -150
- relationalai/semantics/lqp/model2lqp.py +0 -1056
- relationalai/semantics/lqp/passes.py +0 -38
- relationalai/semantics/lqp/primitives.py +0 -252
- relationalai/semantics/lqp/result_helpers.py +0 -266
- relationalai/semantics/lqp/rewrite/__init__.py +0 -32
- relationalai/semantics/lqp/rewrite/algorithm.py +0 -385
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -69
- relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- relationalai/semantics/lqp/rewrite/constants_to_vars.py +0 -70
- relationalai/semantics/lqp/rewrite/deduplicate_vars.py +0 -104
- relationalai/semantics/lqp/rewrite/eliminate_data.py +0 -108
- relationalai/semantics/lqp/rewrite/extract_common.py +0 -340
- relationalai/semantics/lqp/rewrite/extract_keys.py +0 -577
- relationalai/semantics/lqp/rewrite/flatten_script.py +0 -301
- relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -348
- relationalai/semantics/lqp/rewrite/period_math.py +0 -77
- relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -339
- relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- relationalai/semantics/lqp/rewrite/unify_definitions.py +0 -323
- relationalai/semantics/lqp/types.py +0 -101
- relationalai/semantics/lqp/utils.py +0 -170
- relationalai/semantics/lqp/validators.py +0 -70
- relationalai/semantics/metamodel/compiler.py +0 -134
- relationalai/semantics/metamodel/dependency.py +0 -880
- relationalai/semantics/metamodel/executor.py +0 -78
- relationalai/semantics/metamodel/factory.py +0 -287
- relationalai/semantics/metamodel/helpers.py +0 -368
- relationalai/semantics/metamodel/ir.py +0 -924
- relationalai/semantics/metamodel/rewrite/__init__.py +0 -8
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -220
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- relationalai/semantics/metamodel/rewrite/flatten.py +0 -590
- relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -256
- relationalai/semantics/metamodel/rewrite/handle_aggregations_and_ranks.py +0 -237
- relationalai/semantics/metamodel/typer/checker.py +0 -355
- relationalai/semantics/metamodel/typer/typer.py +0 -1396
- relationalai/semantics/metamodel/util.py +0 -506
- relationalai/semantics/metamodel/visitor.py +0 -945
- 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 -9019
- 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 -1407
- relationalai/semantics/rel/builtins.py +0 -40
- relationalai/semantics/rel/compiler.py +0 -994
- relationalai/semantics/rel/executor.py +0 -363
- 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 -149
- 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/lqp/algorithms.py +0 -345
- relationalai/semantics/tests/test_snapshot_abstract.py +0 -144
- 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 -2089
- relationalai/tools/cli_controls.py +0 -1975
- relationalai/tools/cli_helpers.py +0 -802
- 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/tools/txn_progress.py +0 -188
- relationalai/util/clean_up_databases.py +0 -95
- relationalai/util/list_databases.py +0 -9
- relationalai/util/otel_configuration.py +0 -26
- 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.13.5.dist-info/METADATA +0 -74
- relationalai-0.13.5.dist-info/RECORD +0 -473
- relationalai-0.13.5.dist-info/WHEEL +0 -4
- relationalai-0.13.5.dist-info/entry_points.txt +0 -3
- relationalai-0.13.5.dist-info/licenses/LICENSE +0 -202
- relationalai_test_util/__init__.py +0 -4
- relationalai_test_util/fixtures.py +0 -233
- 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/clients/resources/snowflake → 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/semantics/tests/lqp → 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/tools → v0/relationalai/loaders}/__init__.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/pragmas.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/dataflow.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/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,385 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from typing import Optional, TypeGuard, Union, cast
|
|
3
|
-
from relationalai.semantics.metamodel import ir, helpers, factory
|
|
4
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
5
|
-
from relationalai.semantics.metamodel.visitor import Visitor, Rewriter, collect_by_type
|
|
6
|
-
from relationalai.semantics.lqp.algorithms import (
|
|
7
|
-
is_script, is_algorithm_script,is_logical_instruction, is_update_instruction,
|
|
8
|
-
get_instruction_head_rels, get_instruction_body_rels, mk_assign, split_instruction
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
class AlgorithmPass(Pass):
|
|
12
|
-
"""
|
|
13
|
-
Transforms algorithm scripts by normalizing Loopy constructs (iterative algorithm).
|
|
14
|
-
|
|
15
|
-
This pass applies three main rewriting transformations to Metamodel IR that prepare
|
|
16
|
-
algorithm scripts for execution, in the order listed below:
|
|
17
|
-
|
|
18
|
-
1. *Intermediate Rescoping*: Moves nested logical intermediate relations from their
|
|
19
|
-
original logical scope into algorithm scripts, placing them immediately before each
|
|
20
|
-
instruction that uses them (which can include Break instructions). Removes
|
|
21
|
-
intermediates from the logical scope if they're only used within algorithms.
|
|
22
|
-
TODO: Monitor https://github.com/RelationalAI/relationalai-python/pull/3187
|
|
23
|
-
|
|
24
|
-
Example (Metamodel IR):
|
|
25
|
-
BEFORE:
|
|
26
|
-
Logical
|
|
27
|
-
Logical
|
|
28
|
-
R(x::Int128, y::Int128)
|
|
29
|
-
→ derive _nested_logical_1(x::Int128, y::Int128) @assign
|
|
30
|
-
Sequence @script @algorithm
|
|
31
|
-
Logical
|
|
32
|
-
_nested_logical_1(a::Int128, b::Int128)
|
|
33
|
-
→ derive S(a::Int128, b::Int128) @assign
|
|
34
|
-
|
|
35
|
-
AFTER:
|
|
36
|
-
Logical
|
|
37
|
-
Sequence @script @algorithm
|
|
38
|
-
Logical
|
|
39
|
-
R(x::Int128, y::Int128)
|
|
40
|
-
→ derive _nested_logical_1(x::Int128, y::Int128) @assign
|
|
41
|
-
Logical
|
|
42
|
-
_nested_logical_1(a::Int128, b::Int128)
|
|
43
|
-
→ derive S(a::Int128, b::Int128) @assign
|
|
44
|
-
|
|
45
|
-
2. **Update Normalization**: Transforms Loopy update operations (@upsert, @monoid, @monus)
|
|
46
|
-
to use a single body atom. Complex bodies with multiple lookups or additional
|
|
47
|
-
operations are normalized by introducing intermediate relations.
|
|
48
|
-
|
|
49
|
-
Example (Metamodel IR):
|
|
50
|
-
BEFORE:
|
|
51
|
-
Logical
|
|
52
|
-
R(x::Int128, y::Int128)
|
|
53
|
-
S(y::Int128, z::Int128)
|
|
54
|
-
→ derive T(x::Int128, z::Int128) @upsert
|
|
55
|
-
|
|
56
|
-
AFTER:
|
|
57
|
-
Logical
|
|
58
|
-
R(x::Int128, y::Int128)
|
|
59
|
-
S(y::Int128, z::Int128)
|
|
60
|
-
→ derive _loopy_update_intermediate_1(x::Int128, z::Int128) @assign
|
|
61
|
-
|
|
62
|
-
Logical
|
|
63
|
-
_loopy_update_intermediate_1(x::Int128, z::Int128)
|
|
64
|
-
→ derive T(x::Int128, z::Int128) @upsert
|
|
65
|
-
|
|
66
|
-
3. **Recursive Assignment Decoupling**: Decouples self-referential assignments where the
|
|
67
|
-
head relation appears in the body by introducing a copy relation. This transformation
|
|
68
|
-
is required for BackIR analysis compatibility.
|
|
69
|
-
|
|
70
|
-
Example (Metamodel IR):
|
|
71
|
-
BEFORE:
|
|
72
|
-
Logical
|
|
73
|
-
iter(i::Int128)
|
|
74
|
-
rel_primitive_int128_add(i::Int128, 1::Int128, i_plus_1::Int128)
|
|
75
|
-
→ derive iter(i_plus_1::Int128) @assign
|
|
76
|
-
|
|
77
|
-
AFTER:
|
|
78
|
-
Logical
|
|
79
|
-
iter(i::Int128)
|
|
80
|
-
→ derive _loopy_iter_copy_1(i::Int128) @assign
|
|
81
|
-
|
|
82
|
-
Logical
|
|
83
|
-
_loopy_iter_copy_1(i::Int128)
|
|
84
|
-
rel_primitive_int128_add(i::Int128, 1::Int128, i_plus_1::Int128)
|
|
85
|
-
→ derive iter(i_plus_1::Int128) @assign
|
|
86
|
-
"""
|
|
87
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
88
|
-
# Find all nested logical intermediates
|
|
89
|
-
intermediate_finder = FindIntermediates()
|
|
90
|
-
model.accept(intermediate_finder)
|
|
91
|
-
|
|
92
|
-
intermediate_analyzer = AnalyzeIntermediateUse(set(intermediate_finder.intermediates.keys()))
|
|
93
|
-
model.accept(intermediate_analyzer)
|
|
94
|
-
|
|
95
|
-
# Determine which intermediates to move and which to remove
|
|
96
|
-
uses_intermediates: dict[Union[ir.Logical, ir.Break], set[ir.Logical]] = defaultdict(set)
|
|
97
|
-
remove_declarations: set[ir.Logical] = set()
|
|
98
|
-
for rel, decl in intermediate_finder.intermediates.items():
|
|
99
|
-
if rel not in intermediate_analyzer.used_outside_algorithm:
|
|
100
|
-
remove_declarations.add(decl)
|
|
101
|
-
for instr in intermediate_analyzer.used_in_alg_instruction[rel]:
|
|
102
|
-
uses_intermediates[instr].add(decl)
|
|
103
|
-
|
|
104
|
-
# Rescope intermediates
|
|
105
|
-
rescoper = IntermediateRescoper(uses_intermediates, remove_declarations)
|
|
106
|
-
model = rescoper.walk(model)
|
|
107
|
-
|
|
108
|
-
# Normalize Loopy updates
|
|
109
|
-
normalizer = UpdateNormalizer()
|
|
110
|
-
model = normalizer.walk(model)
|
|
111
|
-
|
|
112
|
-
# Decompose recursive assignments
|
|
113
|
-
decomposer = RecursiveAssignmentDecoupling()
|
|
114
|
-
model = decomposer.walk(model)
|
|
115
|
-
|
|
116
|
-
return model
|
|
117
|
-
|
|
118
|
-
class FindIntermediates(Visitor):
|
|
119
|
-
"""
|
|
120
|
-
Gathers all `_nested_logical.*` intermediates defined in a Logical scope (where order
|
|
121
|
-
doesn't matter); in particular DOES NOT gather any intermediates declared in the scope
|
|
122
|
-
of a Sequence.
|
|
123
|
-
"""
|
|
124
|
-
def __init__(self):
|
|
125
|
-
self.intermediates: dict[ir.Relation, ir.Logical] = dict()
|
|
126
|
-
self._inside_algorithm: bool = False
|
|
127
|
-
|
|
128
|
-
def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]):
|
|
129
|
-
if is_logical_instruction(node):
|
|
130
|
-
heads = get_instruction_head_rels(node)
|
|
131
|
-
for rel in heads:
|
|
132
|
-
if rel.name.startswith("_nested_logical"):
|
|
133
|
-
self.intermediates[rel] = node
|
|
134
|
-
else:
|
|
135
|
-
super().visit_logical(node, parent)
|
|
136
|
-
|
|
137
|
-
def visit_sequence(self, node: ir.Sequence, parent: Optional[ir.Node]):
|
|
138
|
-
if is_algorithm_script(node):
|
|
139
|
-
self._inside_algorithm = True
|
|
140
|
-
super().visit_sequence(node, parent)
|
|
141
|
-
if is_algorithm_script(node):
|
|
142
|
-
self._inside_algorithm = False
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
class AnalyzeIntermediateUse(Visitor):
|
|
146
|
-
"""
|
|
147
|
-
Identifies, for each nested logical intermediate, the algorithm instructions that
|
|
148
|
-
use it. Additionally, determines whether the intermediate is used anywhere
|
|
149
|
-
outside of an algorithm.
|
|
150
|
-
"""
|
|
151
|
-
def __init__(self, intermediate_relations: set[ir.Relation]):
|
|
152
|
-
self.intermediates = intermediate_relations
|
|
153
|
-
self.used_in_algorithm: set[ir.Relation] = set()
|
|
154
|
-
self.used_in_alg_instruction: dict[ir.Relation, set[Union[ir.Logical, ir.Break]]] = {rel: set() for rel in intermediate_relations}
|
|
155
|
-
self.used_outside_algorithm: set[ir.Relation] = set()
|
|
156
|
-
|
|
157
|
-
self._current_algorithm: Optional[ir.Sequence] = None
|
|
158
|
-
|
|
159
|
-
def register_use(self, instr: Union[ir.Logical, ir.Break], uses_intermediates: set[ir.Relation]):
|
|
160
|
-
# this instruction uses intermediates
|
|
161
|
-
if self._current_algorithm is not None:
|
|
162
|
-
# instruction is inside an algorithm
|
|
163
|
-
for rel in uses_intermediates:
|
|
164
|
-
self.used_in_algorithm.add(rel)
|
|
165
|
-
self.used_in_alg_instruction[rel].add(instr)
|
|
166
|
-
else:
|
|
167
|
-
self.used_outside_algorithm.update(uses_intermediates)
|
|
168
|
-
|
|
169
|
-
def visit_break(self, node: ir.Break, parent: Optional[ir.Node]):
|
|
170
|
-
lookups = collect_by_type(ir.Lookup, node)
|
|
171
|
-
lookup_rels = {lookup.relation for lookup in lookups}
|
|
172
|
-
uses_intermediates = lookup_rels.intersection(self.intermediates)
|
|
173
|
-
self.register_use(node, uses_intermediates)
|
|
174
|
-
super().visit_break(node, parent)
|
|
175
|
-
|
|
176
|
-
def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]):
|
|
177
|
-
if is_logical_instruction(node):
|
|
178
|
-
body = get_instruction_body_rels(node)
|
|
179
|
-
uses_intermediates = body.intersection(self.intermediates)
|
|
180
|
-
self.register_use(node, uses_intermediates)
|
|
181
|
-
else:
|
|
182
|
-
super().visit_logical(node, parent)
|
|
183
|
-
|
|
184
|
-
def visit_sequence(self, node: ir.Sequence, parent: Optional[ir.Node]):
|
|
185
|
-
if is_algorithm_script(node):
|
|
186
|
-
self._current_algorithm = node
|
|
187
|
-
super().visit_sequence(node, parent)
|
|
188
|
-
if is_algorithm_script(node):
|
|
189
|
-
self._current_algorithm = None
|
|
190
|
-
|
|
191
|
-
class IntermediateRescoper(Rewriter):
|
|
192
|
-
"""
|
|
193
|
-
Moves nested logical intermediates used in algorithm instructions from the logical scope
|
|
194
|
-
to any algorithm using the instruction before every instruction that uses them. Removes
|
|
195
|
-
an intermediate from the logical scope if it is not used anywhere else.
|
|
196
|
-
|
|
197
|
-
* `uses_intermediates`: a mapping from algorithm instructions to the set of nested logical
|
|
198
|
-
intermediates they use.
|
|
199
|
-
* `remove_declarations`: the set of nested logical intermediates to remove from the
|
|
200
|
-
logical scope because they are not used anywhere else.
|
|
201
|
-
"""
|
|
202
|
-
def __init__(self,
|
|
203
|
-
uses_intermediates: dict[Union[ir.Logical, ir.Break], set[ir.Logical]],
|
|
204
|
-
remove_declarations: set[ir.Logical]):
|
|
205
|
-
super().__init__()
|
|
206
|
-
self.uses_intermediates = uses_intermediates
|
|
207
|
-
self.remove_declarations = remove_declarations
|
|
208
|
-
|
|
209
|
-
def handle_logical(self, node: ir.Logical, parent: ir.Node) -> ir.Logical:
|
|
210
|
-
body = []
|
|
211
|
-
for child in node.body:
|
|
212
|
-
if child in self.remove_declarations:
|
|
213
|
-
continue
|
|
214
|
-
child = self.walk(child, node)
|
|
215
|
-
body.append(child)
|
|
216
|
-
return node.reconstruct(node.engine, node.hoisted, tuple(body), node.annotations)
|
|
217
|
-
|
|
218
|
-
def handle_sequence(self, node: ir.Sequence, parent: ir.Node) -> ir.Sequence:
|
|
219
|
-
tasks = []
|
|
220
|
-
for child in node.tasks:
|
|
221
|
-
if child in self.uses_intermediates:
|
|
222
|
-
assert isinstance(child, (ir.Logical, ir.Break))
|
|
223
|
-
for intermediate in self.uses_intermediates[child]:
|
|
224
|
-
tasks.append(mk_assign(intermediate))
|
|
225
|
-
child = self.walk(child, node)
|
|
226
|
-
tasks.append(child)
|
|
227
|
-
return node.reconstruct(node.engine, node.hoisted, tuple(tasks), node.annotations)
|
|
228
|
-
|
|
229
|
-
class UpdateNormalizer(Rewriter):
|
|
230
|
-
"""
|
|
231
|
-
This pass normalizes Loopy Update operations (upsert, monoid, and monus) to use a single
|
|
232
|
-
atom in their body. For any Update operation with more complex body, it introduces a new
|
|
233
|
-
intermediate relation to hold the body results.
|
|
234
|
-
"""
|
|
235
|
-
def __init__(self):
|
|
236
|
-
super().__init__()
|
|
237
|
-
self._inside_algorithm: bool = False
|
|
238
|
-
self._intermediate_counter: int = 0
|
|
239
|
-
|
|
240
|
-
# Tests if the given Update operation requires normalization
|
|
241
|
-
# * the body has more than one Lookup operation, or
|
|
242
|
-
# * the body has other tasks than Lookup and Update
|
|
243
|
-
def _requires_update_normalization(self, update: ir.Task) -> bool:
|
|
244
|
-
if not isinstance(update, ir.Logical):
|
|
245
|
-
return False
|
|
246
|
-
if not is_update_instruction(update):
|
|
247
|
-
return False
|
|
248
|
-
_, lookups, others = split_instruction(update)
|
|
249
|
-
return len(lookups) > 1 or len(others) > 0
|
|
250
|
-
|
|
251
|
-
def handle_sequence(self, node: ir.Sequence, parent: ir.Node) -> ir.Sequence:
|
|
252
|
-
if is_algorithm_script(node):
|
|
253
|
-
self._inside_algorithm = True
|
|
254
|
-
|
|
255
|
-
if self._inside_algorithm:
|
|
256
|
-
new_tasks = []
|
|
257
|
-
for task in node.tasks:
|
|
258
|
-
if self._requires_update_normalization(task):
|
|
259
|
-
assert isinstance(task, ir.Logical)
|
|
260
|
-
intermediate, normalized_update = self._normalize_update_instruction(task)
|
|
261
|
-
new_tasks.extend((intermediate, normalized_update))
|
|
262
|
-
else:
|
|
263
|
-
new_tasks.append(self.walk(task, node))
|
|
264
|
-
result = node.reconstruct(node.engine, node.hoisted, tuple(new_tasks), node.annotations)
|
|
265
|
-
else:
|
|
266
|
-
result = super().handle_sequence(node, parent)
|
|
267
|
-
|
|
268
|
-
if is_algorithm_script(node):
|
|
269
|
-
self._inside_algorithm = False
|
|
270
|
-
|
|
271
|
-
return result
|
|
272
|
-
|
|
273
|
-
def _normalize_update_instruction(self, update_instr: ir.Logical) -> tuple[ir.Logical, ir.Logical]:
|
|
274
|
-
update, lookups, others = split_instruction(update_instr)
|
|
275
|
-
normalized_update = []
|
|
276
|
-
|
|
277
|
-
var_list = helpers.vars(update.args)
|
|
278
|
-
|
|
279
|
-
intermediate_rel = factory.relation(
|
|
280
|
-
self._fresh_intermediate_name(), [
|
|
281
|
-
factory.field(f"arg_{i}", var.type) for i, var in enumerate(var_list)
|
|
282
|
-
]
|
|
283
|
-
)
|
|
284
|
-
|
|
285
|
-
intermediate_derive = factory.derive(intermediate_rel, var_list)
|
|
286
|
-
intermediate_logical = mk_assign(factory.logical(
|
|
287
|
-
engine=update_instr.engine,
|
|
288
|
-
hoisted=update_instr.hoisted,
|
|
289
|
-
body=(*lookups, *others, intermediate_derive),
|
|
290
|
-
annos=list(update_instr.annotations)
|
|
291
|
-
))
|
|
292
|
-
assert isinstance(intermediate_logical, ir.Logical)
|
|
293
|
-
|
|
294
|
-
intermediate_lookup = factory.lookup(
|
|
295
|
-
intermediate_rel,
|
|
296
|
-
var_list
|
|
297
|
-
)
|
|
298
|
-
|
|
299
|
-
normalized_update = factory.logical(
|
|
300
|
-
engine=update_instr.engine,
|
|
301
|
-
hoisted=update_instr.hoisted,
|
|
302
|
-
body=(intermediate_lookup, update),
|
|
303
|
-
annos=list(update_instr.annotations)
|
|
304
|
-
)
|
|
305
|
-
|
|
306
|
-
return (intermediate_logical, normalized_update)
|
|
307
|
-
|
|
308
|
-
def _fresh_intermediate_name(self) -> str:
|
|
309
|
-
self._intermediate_counter += 1
|
|
310
|
-
return f"_loopy_update_intermediate_{self._intermediate_counter}"
|
|
311
|
-
|
|
312
|
-
class RecursiveAssignmentDecoupling(Rewriter):
|
|
313
|
-
"""
|
|
314
|
-
Decouples assignments whose definition is "recursive", i.e., the body contain the head
|
|
315
|
-
e.g., `assign iter = iter + 1`. Currently, BackIR analysis cannot handle properly such
|
|
316
|
-
assignments. Such assignments are decoupled by introducing a new intermediate copy
|
|
317
|
-
relation; in the example above, `assign iter_copy = iter; assign iter = iter_copy + 1`.
|
|
318
|
-
The performance is not affected because the backend can identify the new assignment as a
|
|
319
|
-
copy operation and the execution will not lead to materialization of the intermediate
|
|
320
|
-
relation.
|
|
321
|
-
"""
|
|
322
|
-
def __init__(self):
|
|
323
|
-
super().__init__()
|
|
324
|
-
self._intermediate_copy_counter: int = 0
|
|
325
|
-
# control of head_rel -> copy_rel substitution in traversal
|
|
326
|
-
self._perform_substitution: bool = False
|
|
327
|
-
self._head_rel: Optional[ir.Relation] = None
|
|
328
|
-
self._copy_rel: Optional[ir.Relation] = None
|
|
329
|
-
|
|
330
|
-
def _fresh_copy_rel_name(self, rel_name:str) -> str:
|
|
331
|
-
self._intermediate_copy_counter += 1
|
|
332
|
-
return f"_loopy_{rel_name}_copy_{self._intermediate_copy_counter}"
|
|
333
|
-
|
|
334
|
-
def handle_sequence(self, node: ir.Sequence, parent: ir.Node) -> ir.Sequence:
|
|
335
|
-
if is_script(node):
|
|
336
|
-
new_tasks = []
|
|
337
|
-
for task in node.tasks:
|
|
338
|
-
if self._is_recursive_assignment(task):
|
|
339
|
-
assert isinstance(task, ir.Logical)
|
|
340
|
-
intermediate_copy, decomposed_assign = self._decouple_recursive_assignment(task, parent)
|
|
341
|
-
new_tasks.extend((intermediate_copy, decomposed_assign))
|
|
342
|
-
else:
|
|
343
|
-
new_tasks.append(self.walk(task, node))
|
|
344
|
-
return node.reconstruct(node.engine, node.hoisted, tuple(new_tasks), node.annotations)
|
|
345
|
-
else:
|
|
346
|
-
return super().handle_sequence(node, parent)
|
|
347
|
-
|
|
348
|
-
def _is_recursive_assignment(self, task: ir.Task) -> TypeGuard[ir.Logical]:
|
|
349
|
-
if is_logical_instruction(task):
|
|
350
|
-
heads = get_instruction_head_rels(task)
|
|
351
|
-
body = get_instruction_body_rels(task)
|
|
352
|
-
return len(body & heads) > 0
|
|
353
|
-
return False
|
|
354
|
-
|
|
355
|
-
def _decouple_recursive_assignment(self, rule: ir.Logical, parent: ir.Node) -> tuple[ir.Logical, ir.Logical]:
|
|
356
|
-
# we have `assign rel(x,...) = ..., rel(y,...), ...`
|
|
357
|
-
update, _, _ = split_instruction(rule)
|
|
358
|
-
self._head_rel = update.relation
|
|
359
|
-
|
|
360
|
-
copy_rel_name = self._fresh_copy_rel_name(self._head_rel.name)
|
|
361
|
-
|
|
362
|
-
self._copy_rel = factory.relation(copy_rel_name, list(self._head_rel.fields))
|
|
363
|
-
# build `assign copy_rel(x,...) = rel(x,...)`
|
|
364
|
-
copy_rule = cast(ir.Logical, mk_assign(
|
|
365
|
-
factory.logical([
|
|
366
|
-
factory.lookup(self._head_rel,update.args),
|
|
367
|
-
factory.update(self._copy_rel, update.args, update.effect)
|
|
368
|
-
])
|
|
369
|
-
))
|
|
370
|
-
|
|
371
|
-
# build `assign rel(x,...) = ..., copy_rel(y,...), ...``
|
|
372
|
-
self._perform_substitution = True
|
|
373
|
-
rewritten_rule = self.walk(rule, parent)
|
|
374
|
-
self._perform_substitution = False
|
|
375
|
-
|
|
376
|
-
self._head_rel = None
|
|
377
|
-
self._copy_rel = None
|
|
378
|
-
|
|
379
|
-
return (copy_rule, rewritten_rule)
|
|
380
|
-
|
|
381
|
-
def handle_lookup(self, node: ir.Lookup, parent: ir.Node) -> ir.Lookup:
|
|
382
|
-
if self._perform_substitution and node.relation == self._head_rel:
|
|
383
|
-
assert self._copy_rel is not None
|
|
384
|
-
return factory.lookup(self._copy_rel, node.args)
|
|
385
|
-
return super().handle_lookup(node, parent)
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
from dataclasses import dataclass, field
|
|
3
|
-
from relationalai.clients.config import Config
|
|
4
|
-
from relationalai.semantics.metamodel import builtins
|
|
5
|
-
from relationalai.semantics.metamodel.ir import Node, Model, Require
|
|
6
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
7
|
-
from relationalai.semantics.metamodel.rewrite.discharge_constraints import (
|
|
8
|
-
DischargeConstraintsVisitor
|
|
9
|
-
)
|
|
10
|
-
from relationalai.semantics.lqp.rewrite.functional_dependencies import (
|
|
11
|
-
is_valid_unique_constraint, normalized_fd
|
|
12
|
-
)
|
|
13
|
-
|
|
14
|
-
class AnnotateConstraints(Pass):
|
|
15
|
-
"""
|
|
16
|
-
Extends `DischargeConstraints` pass by discharging only those Require nodes that cannot
|
|
17
|
-
be declared as constraints in LQP.
|
|
18
|
-
|
|
19
|
-
More precisely, the pass annotates Require nodes depending on how they should be
|
|
20
|
-
treated when generating code:
|
|
21
|
-
* `@declare_constraint` if the Require represents a constraint that can be declared in LQP.
|
|
22
|
-
* `@discharge` if the Require represents a constraint that should be dismissed during
|
|
23
|
-
code generation. Namely, when it cannot be declared in LQP and uses one of the
|
|
24
|
-
`unique`, `exclusive`, `anyof` builtins. These nodes are removed from the IR model
|
|
25
|
-
in the Flatten pass.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
def rewrite(self, model: Model, options: dict = {}) -> Model:
|
|
29
|
-
return AnnotateConstraintsRewriter().walk(model)
|
|
30
|
-
|
|
31
|
-
@dataclass
|
|
32
|
-
class AnnotateConstraintsRewriter(DischargeConstraintsVisitor):
|
|
33
|
-
emit_constraints: bool = field(default=False)
|
|
34
|
-
"""
|
|
35
|
-
Visitor marks Require nodes with
|
|
36
|
-
- `discharge` if they should be discharged from the metamodel
|
|
37
|
-
- `declare_constraint` if they should be kept and emitted as LQP constraint declarations
|
|
38
|
-
|
|
39
|
-
By default, all constraints are discharged. To enable emitting constraints, set the
|
|
40
|
-
`reasoner.rule.emit_constraints` flag to True in the config file.
|
|
41
|
-
```toml
|
|
42
|
-
[reasoner.rule]
|
|
43
|
-
emit_constraints = true
|
|
44
|
-
```
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
def __post_init__(self):
|
|
48
|
-
from relationalai.semantics.internal.internal import overridable_flag
|
|
49
|
-
self.emit_constraints = overridable_flag('reasoner.rule.emit_constraints', Config(), None, False)
|
|
50
|
-
|
|
51
|
-
def _should_declare_constraint(self, node: Require) -> bool:
|
|
52
|
-
if not self.emit_constraints:
|
|
53
|
-
return False
|
|
54
|
-
if not is_valid_unique_constraint(node):
|
|
55
|
-
return False
|
|
56
|
-
# Currently, we only declare non-structural functional dependencies.
|
|
57
|
-
fd = normalized_fd(node)
|
|
58
|
-
return fd is not None and not fd.is_structural
|
|
59
|
-
|
|
60
|
-
def handle_require(self, node: Require, parent: Node):
|
|
61
|
-
if self._should_declare_constraint(node):
|
|
62
|
-
return node.reconstruct(
|
|
63
|
-
node.engine,
|
|
64
|
-
node.domain,
|
|
65
|
-
node.checks,
|
|
66
|
-
node.annotations | [builtins.declare_constraint_annotation]
|
|
67
|
-
)
|
|
68
|
-
|
|
69
|
-
return super().handle_require(node, parent)
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
from typing import Optional
|
|
3
|
-
|
|
4
|
-
from relationalai.semantics.metamodel import ir, factory as f, builtins as bt, types, helpers
|
|
5
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
6
|
-
from relationalai.semantics.metamodel.util import OrderedSet, ordered_set
|
|
7
|
-
from relationalai.semantics.metamodel import dependency
|
|
8
|
-
|
|
9
|
-
class CDC(Pass):
|
|
10
|
-
"""
|
|
11
|
-
Pass to process tables brought to Relational AI logical engines by CDC. When CDC occurs,
|
|
12
|
-
wide snowflake tables are shredded into smaller tables. This pass ensures that code that
|
|
13
|
-
reads from the wide relation is changed to read from the smaller tables. Furthermore,
|
|
14
|
-
it attaches the @function annotation to the property lookups, as an optimization.
|
|
15
|
-
|
|
16
|
-
Beware that this pass makes assumptions about the names and types of CDC relations and
|
|
17
|
-
columns!
|
|
18
|
-
|
|
19
|
-
From:
|
|
20
|
-
Logical
|
|
21
|
-
TPCH.SF1.LINEITEM(l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment)
|
|
22
|
-
construct(LineItem, "l_orderkey", l_orderkey, "l_linenumber", l_linenumber, lineitem)
|
|
23
|
-
-> derive LineItem(lineitem)
|
|
24
|
-
-> derive l_orderkey(lineitem, l_orderkey)
|
|
25
|
-
-> derive l_linenumber(lineitem, l_linenumber)
|
|
26
|
-
To:
|
|
27
|
-
Logical
|
|
28
|
-
tpch_sf1_lineitem("L_ORDERKEY", row_id, l_orderkey)
|
|
29
|
-
tpch_sf1_lineitem("L_LINENUMBER", row_id, l_linenumber)
|
|
30
|
-
construct(LineItem, "l_orderkey", l_orderkey, "l_linenumber", l_linenumber, lineitem)
|
|
31
|
-
-> derive LineItem(lineitem)
|
|
32
|
-
-> derive l_orderkey(lineitem, l_orderkey) (@function)
|
|
33
|
-
-> derive l_linenumber(lineitem, l_linenumber) (@function)
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
#--------------------------------------------------
|
|
37
|
-
# Public API
|
|
38
|
-
#--------------------------------------------------
|
|
39
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
40
|
-
# create the dependency analysis context
|
|
41
|
-
ctx = CDC.CDCContext(model)
|
|
42
|
-
|
|
43
|
-
# rewrite the root
|
|
44
|
-
replacement = self.handle(model.root, ctx)
|
|
45
|
-
|
|
46
|
-
# the new root contains the extracted top level logicals and the rewritten root
|
|
47
|
-
if ctx.rewrite_ctx.top_level:
|
|
48
|
-
new_root = ir.Logical(model.root.engine, tuple(), tuple(ctx.rewrite_ctx.top_level + [replacement]))
|
|
49
|
-
else:
|
|
50
|
-
new_root = replacement
|
|
51
|
-
|
|
52
|
-
# create the new model, updating relations and root
|
|
53
|
-
return ir.Model(
|
|
54
|
-
model.engines,
|
|
55
|
-
OrderedSet.from_iterable(model.relations).update(ctx.rewrite_ctx.relations).frozen(),
|
|
56
|
-
model.types,
|
|
57
|
-
new_root
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
class CDCContext():
|
|
61
|
-
def __init__(self, model: ir.Model):
|
|
62
|
-
self.model = model
|
|
63
|
-
self.rewrite_ctx = helpers.RewriteContext()
|
|
64
|
-
self.cdc_relations = dict()
|
|
65
|
-
self.info: Optional[dependency.DependencyInfo] = None
|
|
66
|
-
|
|
67
|
-
def get_info(self):
|
|
68
|
-
""" Lazily compute info as needed. """
|
|
69
|
-
if self.info is None:
|
|
70
|
-
# no need for dependency analsyis, only inputs/outputs
|
|
71
|
-
self.info = dependency.analyze_bindings(self.model.root)
|
|
72
|
-
return self.info
|
|
73
|
-
|
|
74
|
-
#--------------------------------------------------
|
|
75
|
-
# IR handlers
|
|
76
|
-
#--------------------------------------------------
|
|
77
|
-
|
|
78
|
-
def handle(self, task: ir.Task, ctx: CDC.CDCContext):
|
|
79
|
-
# currently we only extract if it's a sequence of Logicals, but we could in the
|
|
80
|
-
# future support other intermediate nodes
|
|
81
|
-
if isinstance(task, ir.Logical):
|
|
82
|
-
return self.handle_logical(task, ctx)
|
|
83
|
-
elif isinstance(task, ir.Not):
|
|
84
|
-
return self.handle_not(task, ctx)
|
|
85
|
-
else:
|
|
86
|
-
return task
|
|
87
|
-
|
|
88
|
-
def handle_logical(self, task: ir.Logical, ctx: CDC.CDCContext):
|
|
89
|
-
|
|
90
|
-
wide_cdc_table_lookups = ordered_set()
|
|
91
|
-
for child in task.body:
|
|
92
|
-
if isinstance(child, ir.Lookup) and bt.from_cdc_annotation in child.relation.annotations:
|
|
93
|
-
wide_cdc_table_lookups.add(child)
|
|
94
|
-
|
|
95
|
-
# optimization to avoid creating a frame if unnecessary
|
|
96
|
-
if not wide_cdc_table_lookups:
|
|
97
|
-
# no need to analyze dependencies, just handle children recursively and
|
|
98
|
-
# reconstruct the logical
|
|
99
|
-
body:OrderedSet[ir.Task] = ordered_set()
|
|
100
|
-
for child in task.body:
|
|
101
|
-
body.add(self.handle(child, ctx))
|
|
102
|
-
return ir.Logical(task.engine, task.hoisted, tuple(body), task.annotations)
|
|
103
|
-
|
|
104
|
-
# ensure function annotation is in the model
|
|
105
|
-
# TODO: need to revisit this to add @function annotations only when we really need them
|
|
106
|
-
# ctx.analysis_ctx.relations.append(rel_bt.function)
|
|
107
|
-
|
|
108
|
-
# process the children
|
|
109
|
-
body:OrderedSet[ir.Task] = ordered_set()
|
|
110
|
-
|
|
111
|
-
# find variables required by the other tasks
|
|
112
|
-
required_vars = ordered_set()
|
|
113
|
-
for child in task.body:
|
|
114
|
-
if child not in wide_cdc_table_lookups:
|
|
115
|
-
required_vars.update(ctx.get_info().task_inputs(child))
|
|
116
|
-
#
|
|
117
|
-
# Vars used in atoms (outputs) may be column variables:
|
|
118
|
-
# e.g.:
|
|
119
|
-
# Transaction.type(source.COLUMN)
|
|
120
|
-
# or
|
|
121
|
-
# Transaction.type = source.COLUMN
|
|
122
|
-
#
|
|
123
|
-
# Neither of these mark their vars as inputs, so we pull from the outputs as well.
|
|
124
|
-
# The only exception is RowId, since there's no need to join on `METADATA$KEY` if
|
|
125
|
-
# a non-table atom has `RowId` in keys.
|
|
126
|
-
#
|
|
127
|
-
output_vars = ctx.get_info().task_outputs(child) or []
|
|
128
|
-
output_vars = [var for var in output_vars if not types.matches(var.type, types.RowId)]
|
|
129
|
-
required_vars.update(output_vars)
|
|
130
|
-
|
|
131
|
-
# We must return anything that's hoisted
|
|
132
|
-
required_vars.update(helpers.hoisted_vars(task.hoisted))
|
|
133
|
-
|
|
134
|
-
# rewrite the cdc table lookup into lookups for each required variable
|
|
135
|
-
for child in task.body:
|
|
136
|
-
if child in wide_cdc_table_lookups:
|
|
137
|
-
assert isinstance(child, ir.Lookup)
|
|
138
|
-
wide_relation = child.relation
|
|
139
|
-
properties = required_vars & ctx.get_info().task_outputs(child)
|
|
140
|
-
if properties:
|
|
141
|
-
assert isinstance(child.args[0], ir.Var) and types.matches(child.args[0].type, types.RowId)
|
|
142
|
-
row_id = child.args[0]
|
|
143
|
-
for property in properties:
|
|
144
|
-
if types.matches(property.type, types.RowId) and len(properties) > 1:
|
|
145
|
-
continue
|
|
146
|
-
|
|
147
|
-
relation = self._get_property_cdc_relation(wide_relation, property, ctx)
|
|
148
|
-
field_name = ir.Literal(types.Symbol, property.name)
|
|
149
|
-
if types.matches(property.type, types.RowId):
|
|
150
|
-
field_name = ir.Literal(types.Symbol, "METADATA$KEY")
|
|
151
|
-
property = ir.Var(type=types.RowId, name=property.name)
|
|
152
|
-
|
|
153
|
-
# METADATA$KEY is unary
|
|
154
|
-
relation = f.relation(
|
|
155
|
-
relation.name,
|
|
156
|
-
[f.field("symbol", types.Symbol), f.field("row_id", types.RowId)],
|
|
157
|
-
annos=[*relation.annotations],
|
|
158
|
-
)
|
|
159
|
-
body.add(ir.Lookup(
|
|
160
|
-
task.engine,
|
|
161
|
-
relation,
|
|
162
|
-
tuple([field_name, row_id])
|
|
163
|
-
))
|
|
164
|
-
else:
|
|
165
|
-
body.add(ir.Lookup(
|
|
166
|
-
task.engine,
|
|
167
|
-
relation,
|
|
168
|
-
tuple([field_name, row_id, property])
|
|
169
|
-
))
|
|
170
|
-
|
|
171
|
-
# handle non cdc table children, adding @function to the updates
|
|
172
|
-
for child in task.body:
|
|
173
|
-
if child not in wide_cdc_table_lookups:
|
|
174
|
-
body.add(self.handle(child, ctx))
|
|
175
|
-
|
|
176
|
-
# TODO: need to revisit this to add @function annotations only when we really need them
|
|
177
|
-
# replacement = self.handle(child, ctx)
|
|
178
|
-
# if isinstance(replacement, ir.Update):
|
|
179
|
-
# if len(replacement.args) == 1:
|
|
180
|
-
# body.add(replacement)
|
|
181
|
-
# else:
|
|
182
|
-
# body.add(replacement.reconstruct(
|
|
183
|
-
# replacement.engine,
|
|
184
|
-
# replacement.relation,
|
|
185
|
-
# replacement.args,
|
|
186
|
-
# replacement.effect,
|
|
187
|
-
# replacement.annotations | [rel_bt.function_annotation]
|
|
188
|
-
# ))
|
|
189
|
-
# else:
|
|
190
|
-
# body.add(replacement)
|
|
191
|
-
|
|
192
|
-
return ir.Logical(task.engine, task.hoisted, tuple(body), task.annotations)
|
|
193
|
-
|
|
194
|
-
def handle_not(self, not_task: ir.Not, ctx: CDC.CDCContext):
|
|
195
|
-
sub_task = self.handle(not_task.task, ctx)
|
|
196
|
-
return ir.Not(not_task.engine, sub_task, not_task.annotations)
|
|
197
|
-
|
|
198
|
-
def _get_property_cdc_relation(self, wide_cdc_relation: ir.Relation, property: ir.Var, ctx: CDC.CDCContext):
|
|
199
|
-
"""
|
|
200
|
-
Get the relation that represents this property var in this wide_cdc_relation. If the
|
|
201
|
-
relation is not yet available in the context, this method will create and register it.
|
|
202
|
-
"""
|
|
203
|
-
relation_name = helpers.sanitize(wide_cdc_relation.name).replace("-", "_")
|
|
204
|
-
key = (relation_name, property.name)
|
|
205
|
-
if key not in ctx.cdc_relations:
|
|
206
|
-
# the property relation is overloaded for all properties of the same wide cdc relation, so they have
|
|
207
|
-
# the same name, but potentially a different type in the value column; also note that they are
|
|
208
|
-
# annotated as external to avoid renaming.
|
|
209
|
-
relation = f.relation(
|
|
210
|
-
relation_name,
|
|
211
|
-
[f.field("symbol", types.Symbol), f.field("row_id", types.Number), f.field("value", property.type)],
|
|
212
|
-
annos=[bt.external_annotation]
|
|
213
|
-
)
|
|
214
|
-
ctx.cdc_relations[key] = relation
|
|
215
|
-
ctx.rewrite_ctx.relations.append(relation)
|
|
216
|
-
return ctx.cdc_relations[key]
|