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,70 +0,0 @@
|
|
|
1
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
2
|
-
from relationalai.semantics.metamodel import ir, builtins as rel_builtins, factory as f, visitor
|
|
3
|
-
from relationalai.semantics.metamodel.typer import typer
|
|
4
|
-
|
|
5
|
-
from typing import List, Sequence, Tuple, Union
|
|
6
|
-
|
|
7
|
-
# Rewrite constants to vars in Updates. This results in a more normalized format where
|
|
8
|
-
# updates contain only variables. This allows for easier rewrites in later passes.
|
|
9
|
-
class ConstantsToVars(Pass):
|
|
10
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
11
|
-
r = self.ConstantToVarRewriter()
|
|
12
|
-
return r.walk(model)
|
|
13
|
-
|
|
14
|
-
# Return 1) a new list of Values with no duplicates (at the object level) and
|
|
15
|
-
# 2) equalities between any original Value and a deduplicated Value.
|
|
16
|
-
@staticmethod
|
|
17
|
-
def replace_constants_with_vars(vals: Sequence[ir.Value]) -> Tuple[List[ir.Value], List[ir.Lookup]]:
|
|
18
|
-
new_vals = []
|
|
19
|
-
eqs = []
|
|
20
|
-
|
|
21
|
-
for i, val in enumerate(vals):
|
|
22
|
-
if isinstance(val, ir.PyValue) or isinstance(val, ir.Literal):
|
|
23
|
-
# Replace constant with a new Var.
|
|
24
|
-
typ = typer.to_type(val)
|
|
25
|
-
assert isinstance(typ, ir.ScalarType), "can only replace scalar constants with vars"
|
|
26
|
-
new_var = ir.Var(typ, f"{typ.name.lower()}_{i}")
|
|
27
|
-
new_vals.append(new_var)
|
|
28
|
-
eqs.append(f.lookup(rel_builtins.eq, [new_var, val]))
|
|
29
|
-
else:
|
|
30
|
-
new_vals.append(val)
|
|
31
|
-
|
|
32
|
-
return new_vals, eqs
|
|
33
|
-
|
|
34
|
-
@staticmethod
|
|
35
|
-
def dedup_update(update: ir.Update) -> List[Union[ir.Update, ir.Lookup]]:
|
|
36
|
-
deduped_vals, req_lookups = ConstantsToVars.replace_constants_with_vars(update.args)
|
|
37
|
-
new_update = ir.Update(
|
|
38
|
-
update.engine,
|
|
39
|
-
update.relation,
|
|
40
|
-
tuple(deduped_vals),
|
|
41
|
-
update.effect,
|
|
42
|
-
update.annotations,
|
|
43
|
-
)
|
|
44
|
-
return req_lookups + [new_update]
|
|
45
|
-
|
|
46
|
-
# Does the actual work.
|
|
47
|
-
class ConstantToVarRewriter(visitor.Rewriter):
|
|
48
|
-
def __init__(self):
|
|
49
|
-
super().__init__()
|
|
50
|
-
|
|
51
|
-
# We implement handle_logical instead of handle_update because in
|
|
52
|
-
# addition to modifying said update we require new lookups (equality
|
|
53
|
-
# between original and deduplicated variables).
|
|
54
|
-
def handle_logical(self, node: ir.Logical, parent: ir.Node):
|
|
55
|
-
# In order to recurse over subtasks.
|
|
56
|
-
node = super().handle_logical(node, parent)
|
|
57
|
-
|
|
58
|
-
new_body = []
|
|
59
|
-
for subtask in node.body:
|
|
60
|
-
if isinstance(subtask, ir.Update):
|
|
61
|
-
new_body.extend(ConstantsToVars.dedup_update(subtask))
|
|
62
|
-
else:
|
|
63
|
-
new_body.append(subtask)
|
|
64
|
-
|
|
65
|
-
return ir.Logical(
|
|
66
|
-
node.engine,
|
|
67
|
-
node.hoisted,
|
|
68
|
-
tuple(new_body),
|
|
69
|
-
node.annotations
|
|
70
|
-
)
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
2
|
-
from relationalai.semantics.metamodel import ir, builtins as rel_builtins, factory as f, visitor
|
|
3
|
-
from relationalai.semantics.metamodel import helpers
|
|
4
|
-
from relationalai.semantics.metamodel.util import FrozenOrderedSet
|
|
5
|
-
|
|
6
|
-
from relationalai.semantics.lqp.utils import output_names
|
|
7
|
-
|
|
8
|
-
from typing import List, Sequence, Tuple, Union
|
|
9
|
-
|
|
10
|
-
# Deduplicate Vars in Updates and Outputs.
|
|
11
|
-
class DeduplicateVars(Pass):
|
|
12
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
13
|
-
r = self.VarDeduplicator()
|
|
14
|
-
return r.walk(model)
|
|
15
|
-
|
|
16
|
-
# Return 1) a new list of Values with no duplicates (at the object level) and
|
|
17
|
-
# 2) equalities between any original Value and a deduplicated Value.
|
|
18
|
-
@staticmethod
|
|
19
|
-
def dedup_values(vals: Sequence[ir.Value]) -> Tuple[List[ir.Value], List[ir.Lookup]]:
|
|
20
|
-
# If a var is seen more than once, it is a duplicate and we will create
|
|
21
|
-
# a new Var and equate it with the seen one.
|
|
22
|
-
seen_vars = set()
|
|
23
|
-
|
|
24
|
-
new_vals = []
|
|
25
|
-
eqs = []
|
|
26
|
-
|
|
27
|
-
for i, val in enumerate(vals):
|
|
28
|
-
# Duplicates can only occur within Vars.
|
|
29
|
-
# TODO: we don't know for sure if these are the only relevant cases.
|
|
30
|
-
if isinstance(val, ir.Default) or isinstance(val, ir.Var):
|
|
31
|
-
var = val if isinstance(val, ir.Var) else val.var
|
|
32
|
-
if var in seen_vars:
|
|
33
|
-
new_var = ir.Var(var.type, var.name + "_dup_" + str(i))
|
|
34
|
-
new_val = new_var if isinstance(val, ir.Var) else ir.Default(new_var, val.value)
|
|
35
|
-
new_vals.append(new_val)
|
|
36
|
-
eqs.append(f.lookup(rel_builtins.eq, [new_var, var]))
|
|
37
|
-
else:
|
|
38
|
-
seen_vars.add(var)
|
|
39
|
-
new_vals.append(val)
|
|
40
|
-
else:
|
|
41
|
-
# No possibility of problematic duplication.
|
|
42
|
-
new_vals.append(val)
|
|
43
|
-
|
|
44
|
-
return new_vals, eqs
|
|
45
|
-
|
|
46
|
-
# Returns a reconstructed output with no duplicate variable objects
|
|
47
|
-
# (dedup_values) and now necessary equalities between any two previously
|
|
48
|
-
# duplicate variables.
|
|
49
|
-
@staticmethod
|
|
50
|
-
def dedup_output(output: ir.Output) -> List[Union[ir.Output, ir.Lookup]]:
|
|
51
|
-
vals = helpers.output_values(output.aliases)
|
|
52
|
-
deduped_vals, req_lookups = DeduplicateVars.dedup_values(vals)
|
|
53
|
-
# Need the names so we can recombine.
|
|
54
|
-
alias_names = output_names(output.aliases)
|
|
55
|
-
new_output = ir.Output(
|
|
56
|
-
output.engine,
|
|
57
|
-
FrozenOrderedSet(list(zip(alias_names, deduped_vals))),
|
|
58
|
-
output.keys,
|
|
59
|
-
output.annotations,
|
|
60
|
-
)
|
|
61
|
-
return req_lookups + [new_output]
|
|
62
|
-
|
|
63
|
-
# Returns a replacement update with no duplicate variable objects
|
|
64
|
-
# (dedup_values) and now necessary equalities between any two previously
|
|
65
|
-
# duplicate variables.
|
|
66
|
-
@staticmethod
|
|
67
|
-
def dedup_update(update: ir.Update) -> List[Union[ir.Update, ir.Lookup]]:
|
|
68
|
-
deduped_vals, req_lookups = DeduplicateVars.dedup_values(update.args)
|
|
69
|
-
new_update = ir.Update(
|
|
70
|
-
update.engine,
|
|
71
|
-
update.relation,
|
|
72
|
-
tuple(deduped_vals),
|
|
73
|
-
update.effect,
|
|
74
|
-
update.annotations,
|
|
75
|
-
)
|
|
76
|
-
return req_lookups + [new_update]
|
|
77
|
-
|
|
78
|
-
# Does the actual work.
|
|
79
|
-
class VarDeduplicator(visitor.Rewriter):
|
|
80
|
-
def __init__(self):
|
|
81
|
-
super().__init__()
|
|
82
|
-
|
|
83
|
-
# We implement handle_logical instead of handle_update/handle_output
|
|
84
|
-
# because in addition to modifying said update/output we require new
|
|
85
|
-
# lookups (equality between original and deduplicated variables).
|
|
86
|
-
def handle_logical(self, node: ir.Logical, parent: ir.Node):
|
|
87
|
-
# In order to recurse over subtasks.
|
|
88
|
-
node = super().handle_logical(node, parent)
|
|
89
|
-
|
|
90
|
-
new_body = []
|
|
91
|
-
for subtask in node.body:
|
|
92
|
-
if isinstance(subtask, ir.Output):
|
|
93
|
-
new_body.extend(DeduplicateVars.dedup_output(subtask))
|
|
94
|
-
elif isinstance(subtask, ir.Update):
|
|
95
|
-
new_body.extend(DeduplicateVars.dedup_update(subtask))
|
|
96
|
-
else:
|
|
97
|
-
new_body.append(subtask)
|
|
98
|
-
|
|
99
|
-
return ir.Logical(
|
|
100
|
-
node.engine,
|
|
101
|
-
node.hoisted,
|
|
102
|
-
tuple(new_body),
|
|
103
|
-
node.annotations
|
|
104
|
-
)
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
2
|
-
from relationalai.semantics.metamodel import ir, builtins as rel_builtins, factory as f, visitor
|
|
3
|
-
|
|
4
|
-
from typing import cast
|
|
5
|
-
import pandas as pd
|
|
6
|
-
import hashlib
|
|
7
|
-
|
|
8
|
-
# Creates intermediary relations for all Data nodes and replaces said Data nodes
|
|
9
|
-
# with a Lookup into these created relations. Reuse duplicate created relations.
|
|
10
|
-
class EliminateData(Pass):
|
|
11
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
12
|
-
r = self.DataRewriter()
|
|
13
|
-
return r.walk(model)
|
|
14
|
-
|
|
15
|
-
# Does the actual work.
|
|
16
|
-
class DataRewriter(visitor.Rewriter):
|
|
17
|
-
new_relations: list[ir.Relation]
|
|
18
|
-
new_updates: list[ir.Logical]
|
|
19
|
-
# Counter for naming new relations.
|
|
20
|
-
# It must be that new_count == len new_updates == len new_relations.
|
|
21
|
-
new_count: int
|
|
22
|
-
# Cache for Data nodes to avoid creating duplicate intermediary relations
|
|
23
|
-
data_cache: dict[str, ir.Relation]
|
|
24
|
-
|
|
25
|
-
def __init__(self):
|
|
26
|
-
self.new_relations = []
|
|
27
|
-
self.new_updates = []
|
|
28
|
-
self.new_count = 0
|
|
29
|
-
self.data_cache = {}
|
|
30
|
-
super().__init__()
|
|
31
|
-
|
|
32
|
-
# Create a cache key for a Data node based on its structure and content
|
|
33
|
-
def _data_cache_key(self, node: ir.Data) -> str:
|
|
34
|
-
values = pd.util.hash_pandas_object(node.data).values
|
|
35
|
-
return hashlib.sha256(bytes(values)).hexdigest()
|
|
36
|
-
|
|
37
|
-
def _intermediary_relation(self, node: ir.Data) -> ir.Relation:
|
|
38
|
-
cache_key = self._data_cache_key(node)
|
|
39
|
-
if cache_key in self.data_cache:
|
|
40
|
-
return self.data_cache[cache_key]
|
|
41
|
-
self.new_count += 1
|
|
42
|
-
intermediary_name = f"formerly_Data_{self.new_count}"
|
|
43
|
-
|
|
44
|
-
intermediary_relation = f.relation(
|
|
45
|
-
intermediary_name,
|
|
46
|
-
[f.field(v.name, v.type) for v in node.vars]
|
|
47
|
-
)
|
|
48
|
-
self.new_relations.append(intermediary_relation)
|
|
49
|
-
|
|
50
|
-
intermediary_update = f.logical([
|
|
51
|
-
# For each row (union), equate values and their variable (logical).
|
|
52
|
-
f.union(
|
|
53
|
-
[
|
|
54
|
-
f.logical(
|
|
55
|
-
[
|
|
56
|
-
f.lookup(rel_builtins.eq, [f.literal(val, var.type), var])
|
|
57
|
-
for (val, var) in zip(row, node.vars)
|
|
58
|
-
],
|
|
59
|
-
)
|
|
60
|
-
for row in node
|
|
61
|
-
],
|
|
62
|
-
hoisted = node.vars,
|
|
63
|
-
),
|
|
64
|
-
# And pop it back into the relation.
|
|
65
|
-
f.update(intermediary_relation, node.vars, ir.Effect.derive),
|
|
66
|
-
])
|
|
67
|
-
self.new_updates.append(intermediary_update)
|
|
68
|
-
|
|
69
|
-
# Cache the result for reuse
|
|
70
|
-
self.data_cache[cache_key] = intermediary_relation
|
|
71
|
-
|
|
72
|
-
return intermediary_relation
|
|
73
|
-
|
|
74
|
-
# Create a new intermediary relation representing the Data (and pop it in
|
|
75
|
-
# new_updates/new_relations) and replace this Data with a Lookup of said
|
|
76
|
-
# intermediary.
|
|
77
|
-
def handle_data(self, node: ir.Data, parent: ir.Node) -> ir.Lookup:
|
|
78
|
-
intermediary_relation = self._intermediary_relation(node)
|
|
79
|
-
replacement_lookup = f.lookup(intermediary_relation, node.vars)
|
|
80
|
-
|
|
81
|
-
return replacement_lookup
|
|
82
|
-
|
|
83
|
-
# Walks the model for the handle_data work then updates the model with
|
|
84
|
-
# the new state.
|
|
85
|
-
def handle_model(self, model: ir.Model, parent: None):
|
|
86
|
-
walked_model = super().handle_model(model, parent)
|
|
87
|
-
assert len(self.new_relations) == len(self.new_updates) and self.new_count == len(self.new_relations)
|
|
88
|
-
|
|
89
|
-
# This is okay because its LQP.
|
|
90
|
-
assert isinstance(walked_model.root, ir.Logical)
|
|
91
|
-
root_logical = cast(ir.Logical, walked_model.root)
|
|
92
|
-
|
|
93
|
-
# We may need to add the new intermediaries from handle_data to the model.
|
|
94
|
-
if self.new_count == 0:
|
|
95
|
-
return model
|
|
96
|
-
else:
|
|
97
|
-
return ir.Model(
|
|
98
|
-
walked_model.engines,
|
|
99
|
-
walked_model.relations | self.new_relations,
|
|
100
|
-
walked_model.types,
|
|
101
|
-
ir.Logical(
|
|
102
|
-
root_logical.engine,
|
|
103
|
-
root_logical.hoisted,
|
|
104
|
-
root_logical.body + tuple(self.new_updates),
|
|
105
|
-
root_logical.annotations,
|
|
106
|
-
),
|
|
107
|
-
walked_model.annotations,
|
|
108
|
-
)
|
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from dataclasses import dataclass
|
|
4
|
-
from typing import Optional
|
|
5
|
-
from relationalai.semantics.metamodel import ir, factory as f, helpers, visitor
|
|
6
|
-
from relationalai.semantics.metamodel.compiler import Pass
|
|
7
|
-
from relationalai.semantics.metamodel.util import OrderedSet, ordered_set
|
|
8
|
-
from relationalai.semantics.metamodel import dependency
|
|
9
|
-
from relationalai.semantics.metamodel import builtins
|
|
10
|
-
|
|
11
|
-
from functools import reduce
|
|
12
|
-
|
|
13
|
-
class ExtractCommon(Pass):
|
|
14
|
-
"""
|
|
15
|
-
Pass to analyze Logical bodies and extract lookups in their own Logical if it makes
|
|
16
|
-
sense. The heuristic is that, if there are multiple lookups, and there are also multiple
|
|
17
|
-
sibling nested logicals that will eventually be extracted by Flatten, then it makes
|
|
18
|
-
sense to extract these logicals into their own "rule", and then make the original body
|
|
19
|
-
just lookup this common rule.
|
|
20
|
-
|
|
21
|
-
From:
|
|
22
|
-
Logical
|
|
23
|
-
Logical
|
|
24
|
-
lookup1
|
|
25
|
-
lookup2
|
|
26
|
-
Logical1 ...
|
|
27
|
-
Logical2 ...
|
|
28
|
-
To:
|
|
29
|
-
Logical
|
|
30
|
-
Logical
|
|
31
|
-
lookup1
|
|
32
|
-
lookup2
|
|
33
|
-
derive common
|
|
34
|
-
Logical
|
|
35
|
-
lookup common
|
|
36
|
-
Logical1 ...
|
|
37
|
-
Logical2 ...
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
# The extraction plan heuristic is as follows:
|
|
41
|
-
#
|
|
42
|
-
# Given a set of binder tasks B and a set of extractable tasks E, we find:
|
|
43
|
-
# - A subset of common tasks C in B, and
|
|
44
|
-
# - A subset of exposed variables V output from tasks in C
|
|
45
|
-
# where:
|
|
46
|
-
# - The intersection of common dependencies of all tasks in E are contained in C
|
|
47
|
-
# (including transitive dependencies)
|
|
48
|
-
# - The union of input variables for all tasks in E intersected with the output
|
|
49
|
-
# variables of tasks in C are contained in V
|
|
50
|
-
|
|
51
|
-
#--------------------------------------------------
|
|
52
|
-
# Public API
|
|
53
|
-
#--------------------------------------------------
|
|
54
|
-
def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
|
|
55
|
-
# create the context
|
|
56
|
-
ctx = ExtractCommon.Context(model, options)
|
|
57
|
-
|
|
58
|
-
# rewrite the root
|
|
59
|
-
replacement = self.handle(model.root, ctx)
|
|
60
|
-
|
|
61
|
-
# the new root contains the extracted top level logicals and the rewritten root
|
|
62
|
-
if ctx.rewrite_ctx.top_level:
|
|
63
|
-
new_root = ir.Logical(model.root.engine, tuple(), tuple(ctx.rewrite_ctx.top_level + [replacement]))
|
|
64
|
-
else:
|
|
65
|
-
new_root = replacement
|
|
66
|
-
|
|
67
|
-
# create the new model, updating relations and root
|
|
68
|
-
return ir.Model(
|
|
69
|
-
model.engines,
|
|
70
|
-
OrderedSet.from_iterable(model.relations).update(ctx.rewrite_ctx.relations).frozen(),
|
|
71
|
-
model.types,
|
|
72
|
-
new_root
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
#--------------------------------------------------
|
|
76
|
-
# Extra classes
|
|
77
|
-
#--------------------------------------------------
|
|
78
|
-
|
|
79
|
-
class Context():
|
|
80
|
-
def __init__(self, model: ir.Model, options: dict):
|
|
81
|
-
self.rewrite_ctx = helpers.RewriteContext()
|
|
82
|
-
self.info = dependency.analyze(model.root)
|
|
83
|
-
self.options = options
|
|
84
|
-
|
|
85
|
-
@dataclass
|
|
86
|
-
class ExtractionPlan():
|
|
87
|
-
# tasks to extract to the body of the common logical
|
|
88
|
-
common_body: OrderedSet[ir.Task]
|
|
89
|
-
# tasks to remain in the original body
|
|
90
|
-
remaining_body: OrderedSet[ir.Task]
|
|
91
|
-
# variables to be exposed by the common logical
|
|
92
|
-
exposed_vars: OrderedSet[ir.Var]
|
|
93
|
-
# map from nested composite to the tasks in the common body that still need to be
|
|
94
|
-
# included in its body, because it contains variables not exposed by the common logical
|
|
95
|
-
local_dependencies: dict[ir.Task, OrderedSet[ir.Task]]
|
|
96
|
-
# a reference to the common connection created for this plan, if any
|
|
97
|
-
common_reference: Optional[ir.Lookup] = None
|
|
98
|
-
|
|
99
|
-
#--------------------------------------------------
|
|
100
|
-
# IR handlers
|
|
101
|
-
#--------------------------------------------------
|
|
102
|
-
|
|
103
|
-
def handle(self, task: ir.Task, ctx: Context):
|
|
104
|
-
# Currently we only extract if it's a sequence of Logicals, but we could in the
|
|
105
|
-
# future support other intermediate nodes
|
|
106
|
-
if isinstance(task, ir.Logical):
|
|
107
|
-
return self.handle_logical(task, ctx)
|
|
108
|
-
else:
|
|
109
|
-
return task
|
|
110
|
-
|
|
111
|
-
def handle_logical(self, task: ir.Logical, ctx: Context):
|
|
112
|
-
# Process the original body to find candidates for extraction. Each task is in one
|
|
113
|
-
# of three categories:
|
|
114
|
-
# - Binders: tasks that bind variables. These are candidates for extracting into
|
|
115
|
-
# the common body.
|
|
116
|
-
# - Flattenables: tasks that will later be extracted by the Flatten pass
|
|
117
|
-
# - Other: tasks that are neither binders nor flattenables; these will remain
|
|
118
|
-
# in the body as-is.
|
|
119
|
-
|
|
120
|
-
binders = ordered_set()
|
|
121
|
-
flattenables = ordered_set()
|
|
122
|
-
other = ordered_set()
|
|
123
|
-
|
|
124
|
-
for child in task.body:
|
|
125
|
-
if _is_binder(child):
|
|
126
|
-
binders.add(child)
|
|
127
|
-
elif _is_flattenable(ctx, child):
|
|
128
|
-
flattenables.add(child)
|
|
129
|
-
else:
|
|
130
|
-
other.add(child)
|
|
131
|
-
|
|
132
|
-
# The new body of the rewritten task
|
|
133
|
-
body:OrderedSet[ir.Task] = ordered_set()
|
|
134
|
-
|
|
135
|
-
# Quick check to see if it's worth doing more analysis; we only want to extract
|
|
136
|
-
# common binders if there are multiple, and there are also multiple flattenables
|
|
137
|
-
# that will be extracted by the flatten pass later (so that they can share the
|
|
138
|
-
# extracted logic).
|
|
139
|
-
plan: Optional[ExtractCommon.ExtractionPlan] = None
|
|
140
|
-
if len(binders) > 1 and len(flattenables) > 1:
|
|
141
|
-
plan = _create_extraction_plan(ctx, binders, flattenables, other)
|
|
142
|
-
if plan:
|
|
143
|
-
# plan is worthwhile, extract the common body and add the connection to the body
|
|
144
|
-
exposed_vars = plan.exposed_vars.get_list()
|
|
145
|
-
plan.common_reference = f.lookup(helpers.extract(task, plan.common_body, exposed_vars, ctx.rewrite_ctx, "common"), exposed_vars)
|
|
146
|
-
|
|
147
|
-
# Add plan common reference to the body.
|
|
148
|
-
body.add(plan.common_reference)
|
|
149
|
-
|
|
150
|
-
# recursively handle children
|
|
151
|
-
for child in task.body:
|
|
152
|
-
# skip children that were extracted
|
|
153
|
-
if plan and child not in other and child not in plan.remaining_body and child not in flattenables:
|
|
154
|
-
continue
|
|
155
|
-
|
|
156
|
-
# no plan or child is not a composite, so just add the handled to the body
|
|
157
|
-
if not plan or child not in flattenables:
|
|
158
|
-
body.add(self.handle(child, ctx))
|
|
159
|
-
continue
|
|
160
|
-
|
|
161
|
-
# there is a plan and the child is in composites, so...
|
|
162
|
-
replacement = self.handle(child, ctx)
|
|
163
|
-
|
|
164
|
-
# this child needs either extra local dependencies or the common reference
|
|
165
|
-
if child in plan.local_dependencies:
|
|
166
|
-
# the new body will have maybe the common reference and the local deps
|
|
167
|
-
replacement_body = ordered_set()
|
|
168
|
-
|
|
169
|
-
hoisted = OrderedSet()
|
|
170
|
-
if isinstance(replacement, ir.Logical):
|
|
171
|
-
# if replacement is a logical, just keep the same hoisted vars
|
|
172
|
-
hoisted.update(replacement.hoisted)
|
|
173
|
-
else:
|
|
174
|
-
# otherwise, we need to hoist the vars that are output from local deps
|
|
175
|
-
# and input to the replacement task
|
|
176
|
-
dep_outputs = OrderedSet()
|
|
177
|
-
for d in plan.local_dependencies.get(child, ordered_set()):
|
|
178
|
-
dep_outputs.update(ctx.info.task_outputs(d))
|
|
179
|
-
hoisted.update(dep_outputs & ctx.info.task_inputs(replacement))
|
|
180
|
-
|
|
181
|
-
if child in plan.local_dependencies:
|
|
182
|
-
for local_dep in plan.local_dependencies[child]:
|
|
183
|
-
replacement_body.add(local_dep.clone())
|
|
184
|
-
|
|
185
|
-
if isinstance(replacement, ir.Logical):
|
|
186
|
-
# if the replacements is a logical, we can just add to the body
|
|
187
|
-
body.add(replacement.reconstruct(
|
|
188
|
-
replacement.engine,
|
|
189
|
-
tuple(hoisted.get_list()),
|
|
190
|
-
tuple(replacement_body.update(replacement.body).get_list()),
|
|
191
|
-
replacement.annotations
|
|
192
|
-
))
|
|
193
|
-
else:
|
|
194
|
-
# Otherwise, wrap the local dependencies in a Lookup where the output
|
|
195
|
-
# variables are hoisted, and keep the computed replacement.
|
|
196
|
-
body.add(f.logical(replacement_body.get_list(), hoisted.get_list(), replacement.engine))
|
|
197
|
-
body.add(replacement)
|
|
198
|
-
else:
|
|
199
|
-
# child does not need extras in the body, just add it to the main body
|
|
200
|
-
body.add(replacement)
|
|
201
|
-
|
|
202
|
-
return ir.Logical(task.engine, task.hoisted, tuple(body))
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
#--------------------------------------------------
|
|
206
|
-
# Utilities
|
|
207
|
-
#--------------------------------------------------
|
|
208
|
-
|
|
209
|
-
def _create_extraction_plan(ctx: ExtractCommon.Context, binders: OrderedSet[ir.Task], flattenables: OrderedSet[ir.Task], others: OrderedSet[ir.Task]) -> Optional[ExtractCommon.ExtractionPlan]:
|
|
210
|
-
"""
|
|
211
|
-
Compute a plan to extract tasks in this frame that are common dependencies
|
|
212
|
-
across these composite tasks.
|
|
213
|
-
"""
|
|
214
|
-
# If there are any pragma lookups, then don't extract anything. Pragma lookups are
|
|
215
|
-
# designed to control execution order, and extracting them may affect their
|
|
216
|
-
# semantics.
|
|
217
|
-
for b in binders:
|
|
218
|
-
if isinstance(b, ir.Lookup) and builtins.is_pragma(b.relation):
|
|
219
|
-
return None
|
|
220
|
-
|
|
221
|
-
# Compute intersection of task dependencies
|
|
222
|
-
all_deps = [ctx.info.task_dependencies(f) for f in flattenables]
|
|
223
|
-
deps = reduce(lambda a, b: a & b, all_deps)
|
|
224
|
-
common_body = binders & deps
|
|
225
|
-
|
|
226
|
-
# We don't need to extract anything if there's only zero or one common tasks
|
|
227
|
-
if len(common_body) < 2:
|
|
228
|
-
return None
|
|
229
|
-
|
|
230
|
-
# Keep track of remaining tasks that are not extracted in the common body
|
|
231
|
-
remaining = ordered_set()
|
|
232
|
-
|
|
233
|
-
# Compute the vars that should be output from the common body. These are the union of
|
|
234
|
-
# all input vars across all non-extracted tasks, intersected with output vars of
|
|
235
|
-
# the common body.
|
|
236
|
-
|
|
237
|
-
# First, compute the output vars of the common body
|
|
238
|
-
common_body_output_vars = OrderedSet()
|
|
239
|
-
for child in common_body:
|
|
240
|
-
common_body_output_vars.update(ctx.info.task_outputs(child))
|
|
241
|
-
|
|
242
|
-
# Next, compute the union of the input vars of all non-extracted tasks
|
|
243
|
-
non_extracted_tasks = (binders - common_body) | flattenables | others
|
|
244
|
-
all_exposed_vars: list[OrderedSet[ir.Var]] = []
|
|
245
|
-
for t in non_extracted_tasks:
|
|
246
|
-
input_vars = ctx.info.task_inputs(t)
|
|
247
|
-
all_exposed_vars.append(input_vars if input_vars else OrderedSet())
|
|
248
|
-
|
|
249
|
-
exposed_vars = reduce(lambda a, b: a | b, all_exposed_vars) & common_body_output_vars
|
|
250
|
-
|
|
251
|
-
# If there are no vars in common, then it's not worth extracting
|
|
252
|
-
if not exposed_vars:
|
|
253
|
-
return None
|
|
254
|
-
|
|
255
|
-
# Make sure that all local dependencies of the common body are included in the common
|
|
256
|
-
# body. This is important for the safety of this rewrite.
|
|
257
|
-
for task in common_body:
|
|
258
|
-
local_deps = ctx.info.local_dependencies(task)
|
|
259
|
-
if local_deps:
|
|
260
|
-
common_body.update(local_deps & binders)
|
|
261
|
-
|
|
262
|
-
# check which of the original binders remain, and make sure their dependencies also stay
|
|
263
|
-
for binder in binders:
|
|
264
|
-
if binder not in common_body:
|
|
265
|
-
remaining.add(binder)
|
|
266
|
-
deps = _compute_local_dependencies(ctx, binders, binder, exposed_vars)
|
|
267
|
-
if deps:
|
|
268
|
-
remaining.update(deps)
|
|
269
|
-
|
|
270
|
-
# for each composite, check if there are additional tasks needed, because the task
|
|
271
|
-
# depends on it but it is not exposed by the vars
|
|
272
|
-
local_dependencies: dict[ir.Task, OrderedSet[ir.Task]] = dict()
|
|
273
|
-
for flattenable in flattenables:
|
|
274
|
-
local = _compute_local_dependencies(ctx, binders, flattenable, exposed_vars)
|
|
275
|
-
if local:
|
|
276
|
-
local_dependencies[flattenable] = local
|
|
277
|
-
|
|
278
|
-
return ExtractCommon.ExtractionPlan(common_body, remaining, exposed_vars, local_dependencies)
|
|
279
|
-
|
|
280
|
-
def _compute_local_dependencies(ctx: ExtractCommon.Context, binders: OrderedSet[ir.Task], composite: ir.Task, exposed_vars: OrderedSet[ir.Var]):
|
|
281
|
-
"""
|
|
282
|
-
The tasks in common_body will be extracted into a logical that will expose the exposed_vars.
|
|
283
|
-
Compute which additional dependencies are needed specifically for this composite, because
|
|
284
|
-
it depends on some tasks that are extracted to common_body but not exposed by exposed_vars.
|
|
285
|
-
"""
|
|
286
|
-
|
|
287
|
-
# working list of vars we still need to fulfill
|
|
288
|
-
inputs = ctx.info.task_inputs(composite)
|
|
289
|
-
if not inputs:
|
|
290
|
-
return None
|
|
291
|
-
|
|
292
|
-
# vars exposed by exposed vars + tasks added to the local body
|
|
293
|
-
vars_exposed = OrderedSet.from_iterable(exposed_vars)
|
|
294
|
-
vars_needed = (inputs - vars_exposed)
|
|
295
|
-
if not vars_needed:
|
|
296
|
-
return None
|
|
297
|
-
|
|
298
|
-
# this is a greedy algorithm that uses the first task in the common body that provides
|
|
299
|
-
# a variable needed; it may result in sub-optimal extraction, but should be correct
|
|
300
|
-
local_body = ordered_set()
|
|
301
|
-
while(vars_needed):
|
|
302
|
-
v = vars_needed.pop()
|
|
303
|
-
for x in binders:
|
|
304
|
-
if x not in local_body:
|
|
305
|
-
# an x that is not yet in local_body can fulfill v
|
|
306
|
-
x_outputs = ctx.info.task_outputs(x)
|
|
307
|
-
if x_outputs and v in x_outputs:
|
|
308
|
-
# add it to local_body and add its outputs to vars exposed
|
|
309
|
-
local_body.add(x)
|
|
310
|
-
vars_exposed.add(x_outputs)
|
|
311
|
-
# but add its inputs the vars now needed
|
|
312
|
-
inputs = ctx.info.task_inputs(x)
|
|
313
|
-
if inputs:
|
|
314
|
-
vars_needed.update(inputs - vars_exposed)
|
|
315
|
-
return local_body
|
|
316
|
-
|
|
317
|
-
def _is_binder(task: ir.Task):
|
|
318
|
-
binder_types = (ir.Lookup, ir.Construct, ir.Exists, ir.Data, ir.Not)
|
|
319
|
-
|
|
320
|
-
# If the task itself is a binder
|
|
321
|
-
if isinstance(task, binder_types):
|
|
322
|
-
return True
|
|
323
|
-
|
|
324
|
-
# If the task is a Logical containing only binders
|
|
325
|
-
if isinstance(task, ir.Logical) and all(_is_binder(c) for c in task.body):
|
|
326
|
-
return True
|
|
327
|
-
|
|
328
|
-
# If the task is a Union containing only binders
|
|
329
|
-
if isinstance(task, ir.Union) and all(_is_binder(c) for c in task.tasks):
|
|
330
|
-
return True
|
|
331
|
-
|
|
332
|
-
return False
|
|
333
|
-
|
|
334
|
-
def _is_flattenable(ctx: ExtractCommon.Context, task: ir.Task):
|
|
335
|
-
# Each output will be flattened into its own top-level def
|
|
336
|
-
if isinstance(task, ir.Output):
|
|
337
|
-
return True
|
|
338
|
-
|
|
339
|
-
extractable_types = (ir.Update, ir.Aggregate, ir.Match, ir.Rank)
|
|
340
|
-
return isinstance(task, ir.Logical) and len(visitor.collect_by_type(extractable_types, task)) > 0
|