relationalai 0.12.13__py3-none-any.whl → 0.13.0.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- relationalai/__init__.py +1 -209
- relationalai/config/__init__.py +56 -0
- relationalai/config/config.py +289 -0
- relationalai/config/config_fields.py +86 -0
- relationalai/config/connections/__init__.py +46 -0
- relationalai/config/connections/base.py +23 -0
- relationalai/config/connections/duckdb.py +29 -0
- relationalai/config/connections/snowflake.py +243 -0
- relationalai/config/external/__init__.py +17 -0
- relationalai/config/external/dbt_converter.py +101 -0
- relationalai/config/external/dbt_models.py +93 -0
- relationalai/config/external/snowflake_converter.py +41 -0
- relationalai/config/external/snowflake_models.py +85 -0
- relationalai/config/external/utils.py +19 -0
- relationalai/semantics/__init__.py +146 -22
- relationalai/semantics/backends/lqp/annotations.py +11 -0
- relationalai/semantics/backends/sql/sql_compiler.py +327 -0
- relationalai/semantics/frontend/base.py +1707 -0
- relationalai/semantics/frontend/core.py +179 -0
- relationalai/semantics/frontend/front_compiler.py +1313 -0
- relationalai/semantics/frontend/pprint.py +408 -0
- relationalai/semantics/metamodel/__init__.py +6 -40
- relationalai/semantics/metamodel/builtins.py +205 -769
- relationalai/semantics/metamodel/metamodel.py +437 -0
- relationalai/semantics/metamodel/metamodel_analyzer.py +519 -0
- relationalai/semantics/metamodel/pprint.py +412 -0
- relationalai/semantics/metamodel/rewriter.py +266 -0
- relationalai/semantics/metamodel/typer.py +1378 -0
- relationalai/semantics/std/__init__.py +60 -40
- relationalai/semantics/std/aggregates.py +149 -0
- relationalai/semantics/std/common.py +44 -0
- relationalai/semantics/std/constraints.py +37 -43
- relationalai/semantics/std/datetime.py +246 -135
- relationalai/semantics/std/decimals.py +45 -52
- relationalai/semantics/std/floats.py +13 -5
- relationalai/semantics/std/integers.py +26 -11
- relationalai/semantics/std/math.py +183 -112
- relationalai/semantics/std/numbers.py +86 -0
- relationalai/semantics/std/re.py +80 -62
- relationalai/semantics/std/strings.py +117 -60
- relationalai/shims/executor.py +147 -0
- relationalai/shims/helpers.py +126 -0
- relationalai/shims/hoister.py +221 -0
- relationalai/shims/mm2v0.py +1290 -0
- relationalai/tools/cli/__init__.py +6 -0
- relationalai/tools/cli/cli.py +90 -0
- relationalai/tools/cli/components/__init__.py +5 -0
- relationalai/tools/cli/components/progress_reader.py +1524 -0
- relationalai/tools/cli/components/utils.py +58 -0
- relationalai/tools/cli/config_template.py +45 -0
- relationalai/tools/cli/dev.py +19 -0
- relationalai/tools/debugger.py +289 -183
- relationalai/tools/typer_debugger.py +93 -0
- relationalai/util/dataclasses.py +43 -0
- relationalai/util/docutils.py +40 -0
- relationalai/util/error.py +199 -0
- relationalai/util/format.py +48 -106
- relationalai/util/naming.py +145 -0
- relationalai/util/python.py +35 -0
- relationalai/util/runtime.py +156 -0
- relationalai/util/schema.py +197 -0
- relationalai/util/source.py +185 -0
- relationalai/util/structures.py +163 -0
- relationalai/util/tracing.py +261 -0
- relationalai-0.13.0.dev0.dist-info/METADATA +46 -0
- relationalai-0.13.0.dev0.dist-info/RECORD +488 -0
- relationalai-0.13.0.dev0.dist-info/WHEEL +5 -0
- relationalai-0.13.0.dev0.dist-info/entry_points.txt +3 -0
- relationalai-0.13.0.dev0.dist-info/top_level.txt +2 -0
- v0/relationalai/__init__.py +216 -0
- v0/relationalai/clients/azure.py +477 -0
- v0/relationalai/clients/client.py +912 -0
- v0/relationalai/clients/config.py +673 -0
- v0/relationalai/clients/direct_access_client.py +118 -0
- v0/relationalai/clients/hash_util.py +31 -0
- v0/relationalai/clients/local.py +571 -0
- v0/relationalai/clients/profile_polling.py +73 -0
- v0/relationalai/clients/result_helpers.py +420 -0
- v0/relationalai/clients/snowflake.py +3869 -0
- v0/relationalai/clients/types.py +113 -0
- v0/relationalai/clients/use_index_poller.py +980 -0
- v0/relationalai/clients/util.py +356 -0
- v0/relationalai/debugging.py +389 -0
- v0/relationalai/dsl.py +1749 -0
- v0/relationalai/early_access/builder/__init__.py +30 -0
- v0/relationalai/early_access/builder/builder/__init__.py +35 -0
- v0/relationalai/early_access/builder/snowflake/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/__init__.py +25 -0
- v0/relationalai/early_access/builder/std/decimals/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/integers/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/math/__init__.py +12 -0
- v0/relationalai/early_access/builder/std/strings/__init__.py +14 -0
- v0/relationalai/early_access/devtools/__init__.py +12 -0
- v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
- v0/relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
- v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
- v0/relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
- v0/relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
- v0/relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
- v0/relationalai/early_access/dsl/bindings/common.py +402 -0
- v0/relationalai/early_access/dsl/bindings/csv.py +170 -0
- v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
- v0/relationalai/early_access/dsl/bindings/snowflake.py +64 -0
- v0/relationalai/early_access/dsl/codegen/binder.py +411 -0
- v0/relationalai/early_access/dsl/codegen/common.py +79 -0
- v0/relationalai/early_access/dsl/codegen/helpers.py +23 -0
- v0/relationalai/early_access/dsl/codegen/relations.py +700 -0
- v0/relationalai/early_access/dsl/codegen/weaver.py +417 -0
- v0/relationalai/early_access/dsl/core/builders/__init__.py +47 -0
- v0/relationalai/early_access/dsl/core/builders/logic.py +19 -0
- v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
- v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
- v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
- v0/relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
- v0/relationalai/early_access/dsl/core/context.py +13 -0
- v0/relationalai/early_access/dsl/core/cset.py +132 -0
- v0/relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
- v0/relationalai/early_access/dsl/core/exprs/relational.py +18 -0
- v0/relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
- v0/relationalai/early_access/dsl/core/instances.py +44 -0
- v0/relationalai/early_access/dsl/core/logic/__init__.py +193 -0
- v0/relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
- v0/relationalai/early_access/dsl/core/logic/exists.py +223 -0
- v0/relationalai/early_access/dsl/core/logic/helper.py +163 -0
- v0/relationalai/early_access/dsl/core/namespaces.py +32 -0
- v0/relationalai/early_access/dsl/core/relations.py +276 -0
- v0/relationalai/early_access/dsl/core/rules.py +112 -0
- v0/relationalai/early_access/dsl/core/std/__init__.py +45 -0
- v0/relationalai/early_access/dsl/core/temporal/recall.py +6 -0
- v0/relationalai/early_access/dsl/core/types/__init__.py +270 -0
- v0/relationalai/early_access/dsl/core/types/concepts.py +128 -0
- v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
- v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
- v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
- v0/relationalai/early_access/dsl/core/types/standard.py +92 -0
- v0/relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
- v0/relationalai/early_access/dsl/core/types/variables.py +203 -0
- v0/relationalai/early_access/dsl/ir/compiler.py +318 -0
- v0/relationalai/early_access/dsl/ir/executor.py +260 -0
- v0/relationalai/early_access/dsl/ontologies/constraints.py +88 -0
- v0/relationalai/early_access/dsl/ontologies/export.py +30 -0
- v0/relationalai/early_access/dsl/ontologies/models.py +453 -0
- v0/relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
- v0/relationalai/early_access/dsl/ontologies/readings.py +60 -0
- v0/relationalai/early_access/dsl/ontologies/relationships.py +322 -0
- v0/relationalai/early_access/dsl/ontologies/roles.py +87 -0
- v0/relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
- v0/relationalai/early_access/dsl/orm/constraints.py +438 -0
- v0/relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
- v0/relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
- v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
- v0/relationalai/early_access/dsl/orm/measures/measures.py +299 -0
- v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
- v0/relationalai/early_access/dsl/orm/models.py +256 -0
- v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
- v0/relationalai/early_access/dsl/orm/printer.py +469 -0
- v0/relationalai/early_access/dsl/orm/reasoners.py +480 -0
- v0/relationalai/early_access/dsl/orm/relations.py +19 -0
- v0/relationalai/early_access/dsl/orm/relationships.py +251 -0
- v0/relationalai/early_access/dsl/orm/types.py +42 -0
- v0/relationalai/early_access/dsl/orm/utils.py +79 -0
- v0/relationalai/early_access/dsl/orm/verb.py +204 -0
- v0/relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
- v0/relationalai/early_access/dsl/relations.py +170 -0
- v0/relationalai/early_access/dsl/rulesets.py +69 -0
- v0/relationalai/early_access/dsl/schemas/__init__.py +450 -0
- v0/relationalai/early_access/dsl/schemas/builder.py +48 -0
- v0/relationalai/early_access/dsl/schemas/comp_names.py +51 -0
- v0/relationalai/early_access/dsl/schemas/components.py +203 -0
- v0/relationalai/early_access/dsl/schemas/contexts.py +156 -0
- v0/relationalai/early_access/dsl/schemas/exprs.py +89 -0
- v0/relationalai/early_access/dsl/schemas/fragments.py +464 -0
- v0/relationalai/early_access/dsl/serialization.py +79 -0
- v0/relationalai/early_access/dsl/serialize/exporter.py +163 -0
- v0/relationalai/early_access/dsl/snow/api.py +104 -0
- v0/relationalai/early_access/dsl/snow/common.py +76 -0
- v0/relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
- v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
- v0/relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
- v0/relationalai/early_access/dsl/types/__init__.py +40 -0
- v0/relationalai/early_access/dsl/types/concepts.py +12 -0
- v0/relationalai/early_access/dsl/types/entities.py +135 -0
- v0/relationalai/early_access/dsl/types/values.py +17 -0
- v0/relationalai/early_access/dsl/utils.py +102 -0
- v0/relationalai/early_access/graphs/__init__.py +13 -0
- v0/relationalai/early_access/lqp/__init__.py +12 -0
- v0/relationalai/early_access/lqp/compiler/__init__.py +12 -0
- v0/relationalai/early_access/lqp/constructors/__init__.py +18 -0
- v0/relationalai/early_access/lqp/executor/__init__.py +12 -0
- v0/relationalai/early_access/lqp/ir/__init__.py +12 -0
- v0/relationalai/early_access/lqp/passes/__init__.py +12 -0
- v0/relationalai/early_access/lqp/pragmas/__init__.py +12 -0
- v0/relationalai/early_access/lqp/primitives/__init__.py +12 -0
- v0/relationalai/early_access/lqp/types/__init__.py +12 -0
- v0/relationalai/early_access/lqp/utils/__init__.py +12 -0
- v0/relationalai/early_access/lqp/validators/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/__init__.py +58 -0
- v0/relationalai/early_access/metamodel/builtins/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/compiler/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/dependency/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/factory/__init__.py +17 -0
- v0/relationalai/early_access/metamodel/helpers/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/ir/__init__.py +14 -0
- v0/relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
- v0/relationalai/early_access/metamodel/typer/__init__.py +3 -0
- v0/relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
- v0/relationalai/early_access/metamodel/types/__init__.py +15 -0
- v0/relationalai/early_access/metamodel/util/__init__.py +15 -0
- v0/relationalai/early_access/metamodel/visitor/__init__.py +12 -0
- v0/relationalai/early_access/rel/__init__.py +12 -0
- v0/relationalai/early_access/rel/executor/__init__.py +12 -0
- v0/relationalai/early_access/rel/rel_utils/__init__.py +12 -0
- v0/relationalai/early_access/rel/rewrite/__init__.py +7 -0
- v0/relationalai/early_access/solvers/__init__.py +19 -0
- v0/relationalai/early_access/sql/__init__.py +11 -0
- v0/relationalai/early_access/sql/executor/__init__.py +3 -0
- v0/relationalai/early_access/sql/rewrite/__init__.py +3 -0
- v0/relationalai/early_access/tests/logging/__init__.py +12 -0
- v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
- v0/relationalai/early_access/tests/utils/__init__.py +12 -0
- v0/relationalai/environments/__init__.py +35 -0
- v0/relationalai/environments/base.py +381 -0
- v0/relationalai/environments/colab.py +14 -0
- v0/relationalai/environments/generic.py +71 -0
- v0/relationalai/environments/ipython.py +68 -0
- v0/relationalai/environments/jupyter.py +9 -0
- v0/relationalai/environments/snowbook.py +169 -0
- v0/relationalai/errors.py +2455 -0
- v0/relationalai/experimental/SF.py +38 -0
- v0/relationalai/experimental/inspect.py +47 -0
- v0/relationalai/experimental/pathfinder/__init__.py +158 -0
- v0/relationalai/experimental/pathfinder/api.py +160 -0
- v0/relationalai/experimental/pathfinder/automaton.py +584 -0
- v0/relationalai/experimental/pathfinder/bridge.py +226 -0
- v0/relationalai/experimental/pathfinder/compiler.py +416 -0
- v0/relationalai/experimental/pathfinder/datalog.py +214 -0
- v0/relationalai/experimental/pathfinder/diagnostics.py +56 -0
- v0/relationalai/experimental/pathfinder/filter.py +236 -0
- v0/relationalai/experimental/pathfinder/glushkov.py +439 -0
- v0/relationalai/experimental/pathfinder/options.py +265 -0
- v0/relationalai/experimental/pathfinder/rpq.py +344 -0
- v0/relationalai/experimental/pathfinder/transition.py +200 -0
- v0/relationalai/experimental/pathfinder/utils.py +26 -0
- v0/relationalai/experimental/paths/api.py +143 -0
- v0/relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
- v0/relationalai/experimental/paths/examples/basic_example.py +40 -0
- v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
- v0/relationalai/experimental/paths/examples/movie_example.py +77 -0
- v0/relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
- v0/relationalai/experimental/paths/examples/paths_example.py +116 -0
- v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
- v0/relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
- v0/relationalai/experimental/paths/graph.py +185 -0
- v0/relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
- v0/relationalai/experimental/paths/path_algorithms/single.py +59 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
- v0/relationalai/experimental/paths/path_algorithms/usp.py +150 -0
- v0/relationalai/experimental/paths/product_graph.py +93 -0
- v0/relationalai/experimental/paths/rpq/automaton.py +584 -0
- v0/relationalai/experimental/paths/rpq/diagnostics.py +56 -0
- v0/relationalai/experimental/paths/rpq/rpq.py +378 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
- v0/relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
- v0/relationalai/experimental/paths/tree_agg.py +168 -0
- v0/relationalai/experimental/paths/utilities/iterators.py +27 -0
- v0/relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
- v0/relationalai/experimental/solvers.py +1087 -0
- v0/relationalai/loaders/__init__.py +0 -0
- v0/relationalai/loaders/csv.py +195 -0
- v0/relationalai/loaders/loader.py +177 -0
- v0/relationalai/loaders/types.py +23 -0
- v0/relationalai/rel_emitter.py +373 -0
- v0/relationalai/rel_utils.py +185 -0
- v0/relationalai/semantics/__init__.py +29 -0
- v0/relationalai/semantics/devtools/benchmark_lqp.py +536 -0
- v0/relationalai/semantics/devtools/compilation_manager.py +294 -0
- v0/relationalai/semantics/devtools/extract_lqp.py +110 -0
- v0/relationalai/semantics/internal/internal.py +3785 -0
- v0/relationalai/semantics/internal/snowflake.py +324 -0
- v0/relationalai/semantics/lqp/builtins.py +16 -0
- v0/relationalai/semantics/lqp/compiler.py +22 -0
- v0/relationalai/semantics/lqp/constructors.py +68 -0
- v0/relationalai/semantics/lqp/executor.py +469 -0
- v0/relationalai/semantics/lqp/intrinsics.py +24 -0
- v0/relationalai/semantics/lqp/model2lqp.py +839 -0
- v0/relationalai/semantics/lqp/passes.py +680 -0
- v0/relationalai/semantics/lqp/primitives.py +252 -0
- v0/relationalai/semantics/lqp/result_helpers.py +202 -0
- v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
- v0/relationalai/semantics/lqp/rewrite/cdc.py +216 -0
- v0/relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
- v0/relationalai/semantics/lqp/rewrite/extract_keys.py +449 -0
- v0/relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
- v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
- v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
- v0/relationalai/semantics/lqp/rewrite/splinter.py +76 -0
- v0/relationalai/semantics/lqp/types.py +101 -0
- v0/relationalai/semantics/lqp/utils.py +160 -0
- v0/relationalai/semantics/lqp/validators.py +57 -0
- v0/relationalai/semantics/metamodel/__init__.py +40 -0
- v0/relationalai/semantics/metamodel/builtins.py +774 -0
- v0/relationalai/semantics/metamodel/compiler.py +133 -0
- v0/relationalai/semantics/metamodel/dependency.py +862 -0
- v0/relationalai/semantics/metamodel/executor.py +61 -0
- v0/relationalai/semantics/metamodel/factory.py +287 -0
- v0/relationalai/semantics/metamodel/helpers.py +361 -0
- v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
- v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
- v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
- v0/relationalai/semantics/metamodel/rewrite/flatten.py +549 -0
- v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
- v0/relationalai/semantics/metamodel/typer/checker.py +353 -0
- v0/relationalai/semantics/metamodel/typer/typer.py +1395 -0
- v0/relationalai/semantics/reasoners/__init__.py +10 -0
- v0/relationalai/semantics/reasoners/graph/__init__.py +37 -0
- v0/relationalai/semantics/reasoners/graph/core.py +9020 -0
- v0/relationalai/semantics/reasoners/optimization/__init__.py +68 -0
- v0/relationalai/semantics/reasoners/optimization/common.py +88 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +1163 -0
- v0/relationalai/semantics/rel/builtins.py +40 -0
- v0/relationalai/semantics/rel/compiler.py +989 -0
- v0/relationalai/semantics/rel/executor.py +359 -0
- v0/relationalai/semantics/rel/rel.py +482 -0
- v0/relationalai/semantics/rel/rel_utils.py +276 -0
- v0/relationalai/semantics/snowflake/__init__.py +3 -0
- v0/relationalai/semantics/sql/compiler.py +2503 -0
- v0/relationalai/semantics/sql/executor/duck_db.py +52 -0
- v0/relationalai/semantics/sql/executor/result_helpers.py +64 -0
- v0/relationalai/semantics/sql/executor/snowflake.py +145 -0
- v0/relationalai/semantics/sql/rewrite/denormalize.py +222 -0
- v0/relationalai/semantics/sql/rewrite/double_negation.py +49 -0
- v0/relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
- v0/relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
- v0/relationalai/semantics/sql/sql.py +504 -0
- v0/relationalai/semantics/std/__init__.py +54 -0
- v0/relationalai/semantics/std/constraints.py +43 -0
- v0/relationalai/semantics/std/datetime.py +363 -0
- v0/relationalai/semantics/std/decimals.py +62 -0
- v0/relationalai/semantics/std/floats.py +7 -0
- v0/relationalai/semantics/std/integers.py +22 -0
- v0/relationalai/semantics/std/math.py +141 -0
- v0/relationalai/semantics/std/pragmas.py +11 -0
- v0/relationalai/semantics/std/re.py +83 -0
- v0/relationalai/semantics/std/std.py +14 -0
- v0/relationalai/semantics/std/strings.py +63 -0
- v0/relationalai/semantics/tests/__init__.py +0 -0
- v0/relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
- v0/relationalai/semantics/tests/test_snapshot_base.py +9 -0
- v0/relationalai/semantics/tests/utils.py +46 -0
- v0/relationalai/std/__init__.py +70 -0
- v0/relationalai/tools/__init__.py +0 -0
- v0/relationalai/tools/cli.py +1940 -0
- v0/relationalai/tools/cli_controls.py +1826 -0
- v0/relationalai/tools/cli_helpers.py +390 -0
- v0/relationalai/tools/debugger.py +183 -0
- v0/relationalai/tools/debugger_client.py +109 -0
- v0/relationalai/tools/debugger_server.py +302 -0
- v0/relationalai/tools/dev.py +685 -0
- v0/relationalai/tools/qb_debugger.py +425 -0
- v0/relationalai/util/clean_up_databases.py +95 -0
- v0/relationalai/util/format.py +123 -0
- v0/relationalai/util/list_databases.py +9 -0
- v0/relationalai/util/otel_configuration.py +25 -0
- v0/relationalai/util/otel_handler.py +484 -0
- v0/relationalai/util/snowflake_handler.py +88 -0
- v0/relationalai/util/span_format_test.py +43 -0
- v0/relationalai/util/span_tracker.py +207 -0
- v0/relationalai/util/spans_file_handler.py +72 -0
- v0/relationalai/util/tracing_handler.py +34 -0
- frontend/debugger/dist/.gitignore +0 -2
- frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- frontend/debugger/dist/assets/index-Cssla-O7.js +0 -208
- frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -9
- frontend/debugger/dist/index.html +0 -17
- relationalai/clients/azure.py +0 -477
- relationalai/clients/client.py +0 -912
- relationalai/clients/config.py +0 -673
- relationalai/clients/direct_access_client.py +0 -118
- relationalai/clients/export_procedure.py.jinja +0 -249
- relationalai/clients/hash_util.py +0 -31
- relationalai/clients/local.py +0 -571
- relationalai/clients/profile_polling.py +0 -73
- relationalai/clients/result_helpers.py +0 -420
- relationalai/clients/snowflake.py +0 -3869
- relationalai/clients/types.py +0 -113
- relationalai/clients/use_index_poller.py +0 -980
- relationalai/clients/util.py +0 -356
- relationalai/debugging.py +0 -389
- relationalai/dsl.py +0 -1749
- relationalai/early_access/builder/__init__.py +0 -30
- relationalai/early_access/builder/builder/__init__.py +0 -35
- relationalai/early_access/builder/snowflake/__init__.py +0 -12
- relationalai/early_access/builder/std/__init__.py +0 -25
- relationalai/early_access/builder/std/decimals/__init__.py +0 -12
- relationalai/early_access/builder/std/integers/__init__.py +0 -12
- relationalai/early_access/builder/std/math/__init__.py +0 -12
- relationalai/early_access/builder/std/strings/__init__.py +0 -14
- relationalai/early_access/devtools/__init__.py +0 -12
- relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
- relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
- relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
- relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
- relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
- relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
- relationalai/early_access/dsl/bindings/common.py +0 -402
- relationalai/early_access/dsl/bindings/csv.py +0 -170
- relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
- relationalai/early_access/dsl/bindings/snowflake.py +0 -64
- relationalai/early_access/dsl/codegen/binder.py +0 -411
- relationalai/early_access/dsl/codegen/common.py +0 -79
- relationalai/early_access/dsl/codegen/helpers.py +0 -23
- relationalai/early_access/dsl/codegen/relations.py +0 -700
- relationalai/early_access/dsl/codegen/weaver.py +0 -417
- relationalai/early_access/dsl/core/builders/__init__.py +0 -47
- relationalai/early_access/dsl/core/builders/logic.py +0 -19
- relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
- relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
- relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
- relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
- relationalai/early_access/dsl/core/context.py +0 -13
- relationalai/early_access/dsl/core/cset.py +0 -132
- relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
- relationalai/early_access/dsl/core/exprs/relational.py +0 -18
- relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
- relationalai/early_access/dsl/core/instances.py +0 -44
- relationalai/early_access/dsl/core/logic/__init__.py +0 -193
- relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
- relationalai/early_access/dsl/core/logic/exists.py +0 -223
- relationalai/early_access/dsl/core/logic/helper.py +0 -163
- relationalai/early_access/dsl/core/namespaces.py +0 -32
- relationalai/early_access/dsl/core/relations.py +0 -276
- relationalai/early_access/dsl/core/rules.py +0 -112
- relationalai/early_access/dsl/core/std/__init__.py +0 -45
- relationalai/early_access/dsl/core/temporal/recall.py +0 -6
- relationalai/early_access/dsl/core/types/__init__.py +0 -270
- relationalai/early_access/dsl/core/types/concepts.py +0 -128
- relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
- relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
- relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
- relationalai/early_access/dsl/core/types/standard.py +0 -92
- relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
- relationalai/early_access/dsl/core/types/variables.py +0 -203
- relationalai/early_access/dsl/ir/compiler.py +0 -318
- relationalai/early_access/dsl/ir/executor.py +0 -260
- relationalai/early_access/dsl/ontologies/constraints.py +0 -88
- relationalai/early_access/dsl/ontologies/export.py +0 -30
- relationalai/early_access/dsl/ontologies/models.py +0 -453
- relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
- relationalai/early_access/dsl/ontologies/readings.py +0 -60
- relationalai/early_access/dsl/ontologies/relationships.py +0 -322
- relationalai/early_access/dsl/ontologies/roles.py +0 -87
- relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
- relationalai/early_access/dsl/orm/constraints.py +0 -438
- relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
- relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
- relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
- relationalai/early_access/dsl/orm/measures/measures.py +0 -299
- relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
- relationalai/early_access/dsl/orm/models.py +0 -256
- relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
- relationalai/early_access/dsl/orm/printer.py +0 -469
- relationalai/early_access/dsl/orm/reasoners.py +0 -480
- relationalai/early_access/dsl/orm/relations.py +0 -19
- relationalai/early_access/dsl/orm/relationships.py +0 -251
- relationalai/early_access/dsl/orm/types.py +0 -42
- relationalai/early_access/dsl/orm/utils.py +0 -79
- relationalai/early_access/dsl/orm/verb.py +0 -204
- relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
- relationalai/early_access/dsl/relations.py +0 -170
- relationalai/early_access/dsl/rulesets.py +0 -69
- relationalai/early_access/dsl/schemas/__init__.py +0 -450
- relationalai/early_access/dsl/schemas/builder.py +0 -48
- relationalai/early_access/dsl/schemas/comp_names.py +0 -51
- relationalai/early_access/dsl/schemas/components.py +0 -203
- relationalai/early_access/dsl/schemas/contexts.py +0 -156
- relationalai/early_access/dsl/schemas/exprs.py +0 -89
- relationalai/early_access/dsl/schemas/fragments.py +0 -464
- relationalai/early_access/dsl/serialization.py +0 -79
- relationalai/early_access/dsl/serialize/exporter.py +0 -163
- relationalai/early_access/dsl/snow/api.py +0 -104
- relationalai/early_access/dsl/snow/common.py +0 -76
- relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
- relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
- relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
- relationalai/early_access/dsl/types/__init__.py +0 -40
- relationalai/early_access/dsl/types/concepts.py +0 -12
- relationalai/early_access/dsl/types/entities.py +0 -135
- relationalai/early_access/dsl/types/values.py +0 -17
- relationalai/early_access/dsl/utils.py +0 -102
- relationalai/early_access/graphs/__init__.py +0 -13
- relationalai/early_access/lqp/__init__.py +0 -12
- relationalai/early_access/lqp/compiler/__init__.py +0 -12
- relationalai/early_access/lqp/constructors/__init__.py +0 -18
- relationalai/early_access/lqp/executor/__init__.py +0 -12
- relationalai/early_access/lqp/ir/__init__.py +0 -12
- relationalai/early_access/lqp/passes/__init__.py +0 -12
- relationalai/early_access/lqp/pragmas/__init__.py +0 -12
- relationalai/early_access/lqp/primitives/__init__.py +0 -12
- relationalai/early_access/lqp/types/__init__.py +0 -12
- relationalai/early_access/lqp/utils/__init__.py +0 -12
- relationalai/early_access/lqp/validators/__init__.py +0 -12
- relationalai/early_access/metamodel/__init__.py +0 -58
- relationalai/early_access/metamodel/builtins/__init__.py +0 -12
- relationalai/early_access/metamodel/compiler/__init__.py +0 -12
- relationalai/early_access/metamodel/dependency/__init__.py +0 -12
- relationalai/early_access/metamodel/factory/__init__.py +0 -17
- relationalai/early_access/metamodel/helpers/__init__.py +0 -12
- relationalai/early_access/metamodel/ir/__init__.py +0 -14
- relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
- relationalai/early_access/metamodel/typer/__init__.py +0 -3
- relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
- relationalai/early_access/metamodel/types/__init__.py +0 -15
- relationalai/early_access/metamodel/util/__init__.py +0 -15
- relationalai/early_access/metamodel/visitor/__init__.py +0 -12
- relationalai/early_access/rel/__init__.py +0 -12
- relationalai/early_access/rel/executor/__init__.py +0 -12
- relationalai/early_access/rel/rel_utils/__init__.py +0 -12
- relationalai/early_access/rel/rewrite/__init__.py +0 -7
- relationalai/early_access/solvers/__init__.py +0 -19
- relationalai/early_access/sql/__init__.py +0 -11
- relationalai/early_access/sql/executor/__init__.py +0 -3
- relationalai/early_access/sql/rewrite/__init__.py +0 -3
- relationalai/early_access/tests/logging/__init__.py +0 -12
- relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
- relationalai/early_access/tests/utils/__init__.py +0 -12
- relationalai/environments/__init__.py +0 -35
- relationalai/environments/base.py +0 -381
- relationalai/environments/colab.py +0 -14
- relationalai/environments/generic.py +0 -71
- relationalai/environments/ipython.py +0 -68
- relationalai/environments/jupyter.py +0 -9
- relationalai/environments/snowbook.py +0 -169
- relationalai/errors.py +0 -2455
- relationalai/experimental/SF.py +0 -38
- relationalai/experimental/inspect.py +0 -47
- relationalai/experimental/pathfinder/__init__.py +0 -158
- relationalai/experimental/pathfinder/api.py +0 -160
- relationalai/experimental/pathfinder/automaton.py +0 -584
- relationalai/experimental/pathfinder/bridge.py +0 -226
- relationalai/experimental/pathfinder/compiler.py +0 -416
- relationalai/experimental/pathfinder/datalog.py +0 -214
- relationalai/experimental/pathfinder/diagnostics.py +0 -56
- relationalai/experimental/pathfinder/filter.py +0 -236
- relationalai/experimental/pathfinder/glushkov.py +0 -439
- relationalai/experimental/pathfinder/options.py +0 -265
- relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -1951
- relationalai/experimental/pathfinder/rpq.py +0 -344
- relationalai/experimental/pathfinder/transition.py +0 -200
- relationalai/experimental/pathfinder/utils.py +0 -26
- relationalai/experimental/paths/README.md +0 -107
- relationalai/experimental/paths/api.py +0 -143
- relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
- relationalai/experimental/paths/code_organization.md +0 -2
- relationalai/experimental/paths/examples/Movies.ipynb +0 -16328
- relationalai/experimental/paths/examples/basic_example.py +0 -40
- relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
- relationalai/experimental/paths/examples/movie_example.py +0 -77
- relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -193
- relationalai/experimental/paths/examples/movies_data/directed.csv +0 -45
- relationalai/experimental/paths/examples/movies_data/follows.csv +0 -7
- relationalai/experimental/paths/examples/movies_data/movies.csv +0 -39
- relationalai/experimental/paths/examples/movies_data/person.csv +0 -134
- relationalai/experimental/paths/examples/movies_data/produced.csv +0 -16
- relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -10
- relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -11
- relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
- relationalai/experimental/paths/examples/paths_example.py +0 -116
- relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
- relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
- relationalai/experimental/paths/graph.py +0 -185
- relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
- relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
- relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
- relationalai/experimental/paths/path_algorithms/single.py +0 -59
- relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
- relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
- relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
- relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
- relationalai/experimental/paths/path_algorithms/usp.py +0 -150
- relationalai/experimental/paths/product_graph.py +0 -93
- relationalai/experimental/paths/rpq/automaton.py +0 -584
- relationalai/experimental/paths/rpq/diagnostics.py +0 -56
- relationalai/experimental/paths/rpq/rpq.py +0 -378
- relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
- relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
- relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
- relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
- relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
- relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
- relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
- relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
- relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
- relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
- relationalai/experimental/paths/tree_agg.py +0 -168
- relationalai/experimental/paths/utilities/iterators.py +0 -27
- relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
- relationalai/experimental/solvers.py +0 -1087
- relationalai/loaders/csv.py +0 -195
- relationalai/loaders/loader.py +0 -177
- relationalai/loaders/types.py +0 -23
- relationalai/rel_emitter.py +0 -373
- relationalai/rel_utils.py +0 -185
- relationalai/semantics/designs/query_builder/identify_by.md +0 -106
- relationalai/semantics/devtools/benchmark_lqp.py +0 -536
- relationalai/semantics/devtools/compilation_manager.py +0 -294
- relationalai/semantics/devtools/extract_lqp.py +0 -110
- relationalai/semantics/internal/internal.py +0 -3785
- relationalai/semantics/internal/snowflake.py +0 -324
- relationalai/semantics/lqp/README.md +0 -34
- relationalai/semantics/lqp/builtins.py +0 -16
- relationalai/semantics/lqp/compiler.py +0 -22
- relationalai/semantics/lqp/constructors.py +0 -68
- relationalai/semantics/lqp/executor.py +0 -469
- relationalai/semantics/lqp/intrinsics.py +0 -24
- relationalai/semantics/lqp/model2lqp.py +0 -839
- relationalai/semantics/lqp/passes.py +0 -680
- relationalai/semantics/lqp/primitives.py +0 -252
- relationalai/semantics/lqp/result_helpers.py +0 -202
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
- relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
- relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
- relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
- relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
- relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- relationalai/semantics/lqp/types.py +0 -101
- relationalai/semantics/lqp/utils.py +0 -160
- relationalai/semantics/lqp/validators.py +0 -57
- relationalai/semantics/metamodel/compiler.py +0 -133
- relationalai/semantics/metamodel/dependency.py +0 -862
- relationalai/semantics/metamodel/executor.py +0 -61
- relationalai/semantics/metamodel/factory.py +0 -287
- relationalai/semantics/metamodel/helpers.py +0 -361
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
- relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
- relationalai/semantics/metamodel/typer/checker.py +0 -353
- relationalai/semantics/metamodel/typer/typer.py +0 -1395
- relationalai/semantics/reasoners/__init__.py +0 -10
- relationalai/semantics/reasoners/graph/README.md +0 -620
- relationalai/semantics/reasoners/graph/__init__.py +0 -37
- relationalai/semantics/reasoners/graph/core.py +0 -9020
- relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -797
- relationalai/semantics/reasoners/graph/tests/README.md +0 -21
- relationalai/semantics/reasoners/optimization/__init__.py +0 -68
- relationalai/semantics/reasoners/optimization/common.py +0 -88
- relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
- relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
- relationalai/semantics/rel/builtins.py +0 -40
- relationalai/semantics/rel/compiler.py +0 -989
- relationalai/semantics/rel/executor.py +0 -359
- relationalai/semantics/rel/rel.py +0 -482
- relationalai/semantics/rel/rel_utils.py +0 -276
- relationalai/semantics/snowflake/__init__.py +0 -3
- relationalai/semantics/sql/compiler.py +0 -2503
- relationalai/semantics/sql/executor/duck_db.py +0 -52
- relationalai/semantics/sql/executor/result_helpers.py +0 -64
- relationalai/semantics/sql/executor/snowflake.py +0 -145
- relationalai/semantics/sql/rewrite/denormalize.py +0 -222
- relationalai/semantics/sql/rewrite/double_negation.py +0 -49
- relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
- relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
- relationalai/semantics/sql/sql.py +0 -504
- relationalai/semantics/std/pragmas.py +0 -11
- relationalai/semantics/std/std.py +0 -14
- relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
- relationalai/semantics/tests/test_snapshot_base.py +0 -9
- relationalai/semantics/tests/utils.py +0 -46
- relationalai/std/__init__.py +0 -70
- relationalai/tools/cli.py +0 -1940
- relationalai/tools/cli_controls.py +0 -1826
- relationalai/tools/cli_helpers.py +0 -390
- relationalai/tools/debugger_client.py +0 -109
- relationalai/tools/debugger_server.py +0 -302
- relationalai/tools/dev.py +0 -685
- relationalai/tools/notes +0 -7
- relationalai/tools/qb_debugger.py +0 -425
- relationalai/util/clean_up_databases.py +0 -95
- relationalai/util/list_databases.py +0 -9
- relationalai/util/otel_configuration.py +0 -25
- relationalai/util/otel_handler.py +0 -484
- relationalai/util/snowflake_handler.py +0 -88
- relationalai/util/span_format_test.py +0 -43
- relationalai/util/span_tracker.py +0 -207
- relationalai/util/spans_file_handler.py +0 -72
- relationalai/util/tracing_handler.py +0 -34
- relationalai-0.12.13.dist-info/METADATA +0 -74
- relationalai-0.12.13.dist-info/RECORD +0 -449
- relationalai-0.12.13.dist-info/WHEEL +0 -4
- relationalai-0.12.13.dist-info/entry_points.txt +0 -3
- relationalai-0.12.13.dist-info/licenses/LICENSE +0 -202
- relationalai_test_util/__init__.py +0 -4
- relationalai_test_util/fixtures.py +0 -228
- relationalai_test_util/snapshot.py +0 -252
- relationalai_test_util/traceback.py +0 -118
- /relationalai/{analysis → semantics/frontend}/__init__.py +0 -0
- /relationalai/{auth/__init__.py → semantics/metamodel/metamodel_compiler.py} +0 -0
- /relationalai/{early_access → shims}/__init__.py +0 -0
- {relationalai/early_access/dsl/adapters → v0/relationalai/analysis}/__init__.py +0 -0
- {relationalai → v0/relationalai}/analysis/mechanistic.py +0 -0
- {relationalai → v0/relationalai}/analysis/whynot.py +0 -0
- {relationalai/early_access/dsl/adapters/orm → v0/relationalai/auth}/__init__.py +0 -0
- {relationalai → v0/relationalai}/auth/jwt_generator.py +0 -0
- {relationalai → v0/relationalai}/auth/oauth_callback_server.py +0 -0
- {relationalai → v0/relationalai}/auth/token_handler.py +0 -0
- {relationalai → v0/relationalai}/auth/util.py +0 -0
- {relationalai → v0/relationalai}/clients/__init__.py +0 -0
- {relationalai → v0/relationalai}/clients/cache_store.py +0 -0
- {relationalai → v0/relationalai}/compiler.py +0 -0
- {relationalai → v0/relationalai}/dependencies.py +0 -0
- {relationalai → v0/relationalai}/docutils.py +0 -0
- {relationalai/early_access/dsl/adapters/owl → v0/relationalai/early_access}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings → v0/relationalai/early_access/dsl/adapters}/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings/legacy → v0/relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
- {relationalai/early_access/dsl/codegen → v0/relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
- {relationalai/early_access/dsl/core/temporal → v0/relationalai/early_access/dsl/bindings}/__init__.py +0 -0
- {relationalai/early_access/dsl/ir → v0/relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
- {relationalai/early_access/dsl/ontologies → v0/relationalai/early_access/dsl/codegen}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/constants.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/stack.py +0 -0
- {relationalai/early_access/dsl/orm → v0/relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/utils.py +0 -0
- {relationalai/early_access/dsl/orm/measures → v0/relationalai/early_access/dsl/ir}/__init__.py +0 -0
- {relationalai/early_access/dsl/physical_metadata → v0/relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
- {relationalai/early_access/dsl/serialize → v0/relationalai/early_access/dsl/orm}/__init__.py +0 -0
- {relationalai/early_access/dsl/snow → v0/relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
- {relationalai/loaders → v0/relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
- {relationalai/semantics/tests → v0/relationalai/early_access/dsl/serialize}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/model.py +0 -0
- {relationalai/tools → v0/relationalai/early_access/dsl/snow}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/tests/__init__.py +0 -0
- {relationalai → v0/relationalai}/environments/ci.py +0 -0
- {relationalai → v0/relationalai}/environments/hex.py +0 -0
- {relationalai → v0/relationalai}/environments/terminal.py +0 -0
- {relationalai → v0/relationalai}/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/graphs.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/filter.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/glushkov.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/transition.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/utilities.py +0 -0
- {relationalai → v0/relationalai}/metagen.py +0 -0
- {relationalai → v0/relationalai}/metamodel.py +0 -0
- {relationalai → v0/relationalai}/rel.py +0 -0
- {relationalai → v0/relationalai}/semantics/devtools/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/annotations.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/ir.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/pragmas.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/dataflow.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/ir.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/typer/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/types.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/util.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/visitor.py +0 -0
- {relationalai → v0/relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/rel/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/executor/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/tests/logging.py +0 -0
- {relationalai → v0/relationalai}/std/aggregates.py +0 -0
- {relationalai → v0/relationalai}/std/dates.py +0 -0
- {relationalai → v0/relationalai}/std/graphs.py +0 -0
- {relationalai → v0/relationalai}/std/inspect.py +0 -0
- {relationalai → v0/relationalai}/std/math.py +0 -0
- {relationalai → v0/relationalai}/std/re.py +0 -0
- {relationalai → v0/relationalai}/std/strings.py +0 -0
- {relationalai → v0/relationalai}/tools/cleanup_snapshots.py +0 -0
- {relationalai → v0/relationalai}/tools/constants.py +0 -0
- {relationalai → v0/relationalai}/tools/query_utils.py +0 -0
- {relationalai → v0/relationalai}/tools/snapshot_viewer.py +0 -0
- {relationalai → v0/relationalai}/util/__init__.py +0 -0
- {relationalai → v0/relationalai}/util/constants.py +0 -0
- {relationalai → v0/relationalai}/util/graph.py +0 -0
- {relationalai → v0/relationalai}/util/timeout.py +0 -0
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
from abc import abstractmethod, ABC
|
|
3
|
+
from collections import OrderedDict
|
|
4
|
+
from typing import Union, Callable
|
|
5
|
+
|
|
6
|
+
import v0.relationalai.semantics as qb
|
|
7
|
+
from v0.relationalai.semantics import define, where
|
|
8
|
+
from v0.relationalai.semantics.internal.internal import ConceptConstruct, Ref, RelationshipRef, ConceptFilter
|
|
9
|
+
from v0.relationalai.early_access.dsl.bindings.common import Binding, BindableAttribute, IdentifierConceptBinding, \
|
|
10
|
+
SubtypeConceptBinding, BindableTable, ReferentConceptBinding
|
|
11
|
+
from v0.relationalai.early_access.dsl.codegen.helpers import reference_entity, construct_entity
|
|
12
|
+
from v0.relationalai.early_access.dsl.orm.constraints import Unique
|
|
13
|
+
from v0.relationalai.early_access.dsl.orm.relationships import Role
|
|
14
|
+
from v0.relationalai.semantics.metamodel.util import OrderedSet
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _get_map_madlib_and_name(name_prefix: str, value_concept: qb.Concept) -> tuple[str, str]:
|
|
18
|
+
"""
|
|
19
|
+
Generates a name for the map based on the value concept.
|
|
20
|
+
"""
|
|
21
|
+
name = f'{name_prefix}_row_to_{value_concept}'
|
|
22
|
+
madlib = f'{name} {{row_id:RowId}} {{val:{value_concept}}}'
|
|
23
|
+
return madlib, name
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GeneratedRelation(qb.Relationship):
|
|
27
|
+
"""
|
|
28
|
+
A class representing a relation generated from a model.
|
|
29
|
+
"""
|
|
30
|
+
def __init__(self, madlib, model, name):
|
|
31
|
+
super().__init__(madlib, model=model.qb_model(), short_name=name)
|
|
32
|
+
|
|
33
|
+
def __repr__(self):
|
|
34
|
+
return f'GeneratedRelation({self._name})'
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class InternallyGeneratedRelation(GeneratedRelation):
|
|
38
|
+
"""
|
|
39
|
+
A class representing a relation generated by analyzing the model.
|
|
40
|
+
"""
|
|
41
|
+
def __init__(self, madlib, dsl_model, name):
|
|
42
|
+
super().__init__(madlib, dsl_model, name)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class AbstractMap(GeneratedRelation):
|
|
46
|
+
"""
|
|
47
|
+
A class representing an abstract map.
|
|
48
|
+
"""
|
|
49
|
+
def __init__(self, madlib, dsl_model, name):
|
|
50
|
+
super().__init__(madlib, dsl_model, name)
|
|
51
|
+
|
|
52
|
+
def value_player(self) -> qb.Concept:
|
|
53
|
+
"""
|
|
54
|
+
Returns the value player of the map.
|
|
55
|
+
This is the concept that the map maps to.
|
|
56
|
+
"""
|
|
57
|
+
raise NotImplementedError()
|
|
58
|
+
|
|
59
|
+
def formula(self):
|
|
60
|
+
source_ref = self.table()
|
|
61
|
+
rez_val_ref = self.value_player().ref()
|
|
62
|
+
return rez_val_ref, [self(source_ref, rez_val_ref)]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class RoleMap(AbstractMap):
|
|
66
|
+
"""
|
|
67
|
+
A class representing a base role map relation.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
def __init__(self, madlib, model, name, role):
|
|
71
|
+
super().__init__(madlib, model, name)
|
|
72
|
+
self._role = role
|
|
73
|
+
|
|
74
|
+
def role(self):
|
|
75
|
+
"""
|
|
76
|
+
Returns the role of the role map.
|
|
77
|
+
"""
|
|
78
|
+
return self._role
|
|
79
|
+
|
|
80
|
+
def value_player(self):
|
|
81
|
+
"""
|
|
82
|
+
Returns the value player of the role map.
|
|
83
|
+
"""
|
|
84
|
+
return self._role.player()
|
|
85
|
+
|
|
86
|
+
@abstractmethod
|
|
87
|
+
def column(self) -> BindableAttribute:
|
|
88
|
+
"""
|
|
89
|
+
Returns the bindable column associated with this role map.
|
|
90
|
+
"""
|
|
91
|
+
raise NotImplementedError("Subclasses must implement this method")
|
|
92
|
+
|
|
93
|
+
def table(self) -> BindableTable:
|
|
94
|
+
"""
|
|
95
|
+
Returns the table associated with the role map.
|
|
96
|
+
"""
|
|
97
|
+
return self.column().table
|
|
98
|
+
|
|
99
|
+
def __repr__(self):
|
|
100
|
+
return f'RoleMap({self._name})'
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class InlineValueMap:
|
|
104
|
+
"""
|
|
105
|
+
A non-QB relationship class that represents an inline value map.
|
|
106
|
+
"""
|
|
107
|
+
def __init__(self, model, binding: Binding, role):
|
|
108
|
+
self._binding = binding
|
|
109
|
+
self._role = role
|
|
110
|
+
self._value_player = role.player()
|
|
111
|
+
self._initialize()
|
|
112
|
+
|
|
113
|
+
def _initialize(self):
|
|
114
|
+
role = self._role
|
|
115
|
+
if not role.player()._is_primitive():
|
|
116
|
+
raise TypeError(f'Cannot construct a value map for {role}, concept is not a value type')
|
|
117
|
+
|
|
118
|
+
table_name = self._binding.column.table.physical_name()
|
|
119
|
+
concept = role.player()
|
|
120
|
+
_, self._name = _get_map_madlib_and_name(table_name, concept)
|
|
121
|
+
self._has_transforms = bool(self._binding.transform_with)
|
|
122
|
+
|
|
123
|
+
def _construct_body_atoms(self, filter_atoms):
|
|
124
|
+
result_type = self.value_player()
|
|
125
|
+
if self._has_transforms:
|
|
126
|
+
transform_result = self._generate_transform_body()
|
|
127
|
+
return result_type(transform_result), [
|
|
128
|
+
where(
|
|
129
|
+
self._binding.column, # needed when transform-to-a-literal is used to preserve row_id
|
|
130
|
+
filter_atoms
|
|
131
|
+
)]
|
|
132
|
+
else:
|
|
133
|
+
return result_type(self._binding.column), [
|
|
134
|
+
filter_atoms,
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
def _generate_transform_body(self):
|
|
138
|
+
transformations = self._binding.transform_with
|
|
139
|
+
if transformations:
|
|
140
|
+
transformations = (transformations,) if not isinstance(transformations, tuple) else transformations
|
|
141
|
+
return self._chain_transformations(self._binding.column, transformations)
|
|
142
|
+
raise ValueError("Incorrect state, cannot apply binding transformations with empty value converter(s)")
|
|
143
|
+
|
|
144
|
+
def _chain_transformations(self, col_val_ref, transformations):
|
|
145
|
+
result = col_val_ref
|
|
146
|
+
for transformer in transformations:
|
|
147
|
+
result = self._apply_transformations(result, transformer)
|
|
148
|
+
return result
|
|
149
|
+
|
|
150
|
+
@staticmethod
|
|
151
|
+
def _apply_transformations(input_var, transformer):
|
|
152
|
+
if isinstance(transformer, Callable):
|
|
153
|
+
return transformer(input_var)
|
|
154
|
+
else:
|
|
155
|
+
raise TypeError(f'Expected a Relationship or Callable, got {type(transformer)}')
|
|
156
|
+
|
|
157
|
+
def value_player(self):
|
|
158
|
+
"""
|
|
159
|
+
Returns the value player of the inline value map.
|
|
160
|
+
"""
|
|
161
|
+
return self._value_player
|
|
162
|
+
|
|
163
|
+
def column(self) -> BindableAttribute:
|
|
164
|
+
"""
|
|
165
|
+
Returns the bindable column associated with this inline value map.
|
|
166
|
+
"""
|
|
167
|
+
return self._binding.column
|
|
168
|
+
|
|
169
|
+
def table(self) -> BindableTable:
|
|
170
|
+
"""
|
|
171
|
+
Returns the table associated with the inline value map.
|
|
172
|
+
"""
|
|
173
|
+
return self.column().table
|
|
174
|
+
|
|
175
|
+
def binding(self) -> Binding:
|
|
176
|
+
"""
|
|
177
|
+
Returns the binding of the value map.
|
|
178
|
+
"""
|
|
179
|
+
return self._binding
|
|
180
|
+
|
|
181
|
+
def formula(self):
|
|
182
|
+
"""
|
|
183
|
+
Constructs the body formula for the value map.
|
|
184
|
+
This is used to generate the head and the body of the relation.
|
|
185
|
+
"""
|
|
186
|
+
filter_atoms = where(self._binding.filter_by)
|
|
187
|
+
return self._construct_body_atoms(filter_atoms)
|
|
188
|
+
|
|
189
|
+
def __repr__(self):
|
|
190
|
+
return f'@inline ValueMap({self._name})'
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
class ValueMap(RoleMap):
|
|
194
|
+
"""
|
|
195
|
+
A class representing a value map relation.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
def __init__(self, model, binding: Binding, role):
|
|
199
|
+
# =
|
|
200
|
+
# Skip QB relationship initialization if *inline* is True, as __call__ will return a QB expression
|
|
201
|
+
# =
|
|
202
|
+
madlib, name = self._handle_params(binding, role)
|
|
203
|
+
super().__init__(madlib, model, name, role)
|
|
204
|
+
self._binding = binding
|
|
205
|
+
self._inline_value_map = InlineValueMap(model, binding, role)
|
|
206
|
+
self._generate_body()
|
|
207
|
+
|
|
208
|
+
@staticmethod
|
|
209
|
+
def _handle_params(binding, role):
|
|
210
|
+
if not role.player()._is_primitive():
|
|
211
|
+
raise TypeError(f'Cannot construct a value map for {role}, concept is not a value type')
|
|
212
|
+
|
|
213
|
+
table_name = binding.column.table.physical_name()
|
|
214
|
+
concept = role.player()
|
|
215
|
+
return _get_map_madlib_and_name(table_name, concept)
|
|
216
|
+
|
|
217
|
+
def _generate_body(self):
|
|
218
|
+
source_ref = self.table()
|
|
219
|
+
val_ref, body_atoms = self._inline_value_map.formula()
|
|
220
|
+
|
|
221
|
+
define(self(source_ref, val_ref)).where(*body_atoms)
|
|
222
|
+
|
|
223
|
+
def value_player(self):
|
|
224
|
+
return self._inline_value_map.value_player()
|
|
225
|
+
|
|
226
|
+
def column(self) -> BindableAttribute:
|
|
227
|
+
return self._inline_value_map.column()
|
|
228
|
+
|
|
229
|
+
def binding(self) -> Binding:
|
|
230
|
+
return self._inline_value_map.binding()
|
|
231
|
+
|
|
232
|
+
def formula(self):
|
|
233
|
+
source_ref = self.table()
|
|
234
|
+
rez_val_ref = self.value_player().ref()
|
|
235
|
+
return rez_val_ref, [self(source_ref, rez_val_ref)]
|
|
236
|
+
|
|
237
|
+
def __repr__(self):
|
|
238
|
+
return f'ValueMap({self._name})'
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class MaterializedEntityMap(AbstractMap):
|
|
242
|
+
"""
|
|
243
|
+
A class representing a materialized entity map relation.
|
|
244
|
+
This is used to materialize an entity map from a set of role maps.
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
def __init__(self, model, inline_entity_map: 'AbstractInlineEntityMap'):
|
|
248
|
+
super().__init__(inline_entity_map.madlib(), model, inline_entity_map.short_name())
|
|
249
|
+
self._inline_entity_map = inline_entity_map
|
|
250
|
+
self._generate_body()
|
|
251
|
+
|
|
252
|
+
def _generate_body(self):
|
|
253
|
+
# materialize the population of the entity map as necessary
|
|
254
|
+
self._inline_entity_map.materialize_population()
|
|
255
|
+
|
|
256
|
+
source_ref = self.table()
|
|
257
|
+
rez_val_ref, body_formula = self._inline_entity_map.formula()
|
|
258
|
+
where(*body_formula).define(self(source_ref, rez_val_ref))
|
|
259
|
+
|
|
260
|
+
def value_player(self):
|
|
261
|
+
"""
|
|
262
|
+
Returns the result value player of the materialized entity map.
|
|
263
|
+
This is the same as the value player of the inline entity map.
|
|
264
|
+
"""
|
|
265
|
+
return self._inline_entity_map.value_player()
|
|
266
|
+
|
|
267
|
+
def column(self) -> BindableAttribute:
|
|
268
|
+
return self._inline_entity_map.column()
|
|
269
|
+
|
|
270
|
+
def table(self) -> BindableTable:
|
|
271
|
+
"""
|
|
272
|
+
Returns the table associated with the materialized entity map.
|
|
273
|
+
"""
|
|
274
|
+
return self._inline_entity_map.table()
|
|
275
|
+
|
|
276
|
+
def __repr__(self):
|
|
277
|
+
# replace @inline with @materialized
|
|
278
|
+
return self._inline_entity_map.__repr__().replace('@inline', '@materialized')
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class AbstractInlineEntityMap(ABC):
|
|
282
|
+
"""
|
|
283
|
+
A non-QB relationship class that represents an inline entity map.
|
|
284
|
+
This is used to construct entities from a set of role maps.
|
|
285
|
+
"""
|
|
286
|
+
|
|
287
|
+
def __init__(self, model, madlib, name):
|
|
288
|
+
self._model = model
|
|
289
|
+
self._madlib = madlib
|
|
290
|
+
self._name = name
|
|
291
|
+
|
|
292
|
+
def __call__(self, *args, **kwargs):
|
|
293
|
+
if bool(args):
|
|
294
|
+
raise ValueError(f'Expected no arguments to a Value Map, got {len(args)}: {args}')
|
|
295
|
+
|
|
296
|
+
return self._construct_body_formula()
|
|
297
|
+
|
|
298
|
+
def madlib(self):
|
|
299
|
+
"""
|
|
300
|
+
Returns the madlib of the inline entity map.
|
|
301
|
+
"""
|
|
302
|
+
return self._madlib
|
|
303
|
+
|
|
304
|
+
def short_name(self):
|
|
305
|
+
"""
|
|
306
|
+
Returns the name of the inline entity map.
|
|
307
|
+
"""
|
|
308
|
+
return self._name
|
|
309
|
+
|
|
310
|
+
@abstractmethod
|
|
311
|
+
def value_player(self):
|
|
312
|
+
"""
|
|
313
|
+
Returns the value player of the role map.
|
|
314
|
+
"""
|
|
315
|
+
raise NotImplementedError("Subclasses must implement this method")
|
|
316
|
+
|
|
317
|
+
@abstractmethod
|
|
318
|
+
def column(self) -> BindableAttribute:
|
|
319
|
+
"""
|
|
320
|
+
Returns the bindable column associated with this role map.
|
|
321
|
+
"""
|
|
322
|
+
raise NotImplementedError("Subclasses must implement this method")
|
|
323
|
+
|
|
324
|
+
def table(self) -> BindableTable:
|
|
325
|
+
"""
|
|
326
|
+
Returns the table associated with the role map.
|
|
327
|
+
"""
|
|
328
|
+
return self.column().table
|
|
329
|
+
|
|
330
|
+
def formula(self):
|
|
331
|
+
return self._construct_body_formula()
|
|
332
|
+
|
|
333
|
+
@abstractmethod
|
|
334
|
+
def _construct_body_formula(self) -> tuple[Union[ConceptConstruct, ConceptFilter, Ref, RelationshipRef], list[typing.Any]]:
|
|
335
|
+
"""
|
|
336
|
+
Constructs the body formula for the inline entity map.
|
|
337
|
+
This is used to generate the body of the relation.
|
|
338
|
+
"""
|
|
339
|
+
pass
|
|
340
|
+
|
|
341
|
+
def materialize(self):
|
|
342
|
+
return MaterializedEntityMap(self._model, self)
|
|
343
|
+
|
|
344
|
+
@abstractmethod
|
|
345
|
+
def materialize_population(self):
|
|
346
|
+
"""
|
|
347
|
+
Materializes the population of the entity map, using the body of the entity map.
|
|
348
|
+
This has to check the conditions and only update the population if those are met.
|
|
349
|
+
"""
|
|
350
|
+
pass
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
class SimpleConstructorEntityMap(AbstractInlineEntityMap):
|
|
354
|
+
"""
|
|
355
|
+
A class representing an entity map relation.
|
|
356
|
+
"""
|
|
357
|
+
|
|
358
|
+
def __init__(self, model, binding: Binding, role: Role, identifier_to_role_map: OrderedDict[Unique, 'RoleMap']):
|
|
359
|
+
madlib, name = self._handle_params(binding, role)
|
|
360
|
+
super().__init__(model, madlib, name)
|
|
361
|
+
self._binding = binding
|
|
362
|
+
self._role = role
|
|
363
|
+
self._identifier_to_role_map = identifier_to_role_map
|
|
364
|
+
self._reference_role_map = list(identifier_to_role_map.items())[-1][1] # last role map is the reference one
|
|
365
|
+
|
|
366
|
+
@staticmethod
|
|
367
|
+
def _handle_params(binding, role):
|
|
368
|
+
if role.player()._is_primitive():
|
|
369
|
+
raise TypeError(f'Cannot construct an entity map for {role}, concept is not an entity type')
|
|
370
|
+
|
|
371
|
+
table_name = binding.column.table.physical_name()
|
|
372
|
+
concept = role.player()
|
|
373
|
+
return _get_map_madlib_and_name(table_name, concept)
|
|
374
|
+
|
|
375
|
+
def _construct_body_formula(self):
|
|
376
|
+
concept = self._role.player()
|
|
377
|
+
value_ref, ref_body_atoms = self._reference_role_map.formula()
|
|
378
|
+
entity_ref = reference_entity(concept, value_ref, check_population=False)
|
|
379
|
+
body_atoms = [
|
|
380
|
+
*ref_body_atoms
|
|
381
|
+
]
|
|
382
|
+
return entity_ref, body_atoms
|
|
383
|
+
|
|
384
|
+
def _concept_population_atom(self, entity):
|
|
385
|
+
"""
|
|
386
|
+
Generates the *optional* population atom for the entity map.
|
|
387
|
+
Only used for bindings that have a FK.
|
|
388
|
+
"""
|
|
389
|
+
if self._should_reference():
|
|
390
|
+
return where(
|
|
391
|
+
self._role.player()(entity)
|
|
392
|
+
)
|
|
393
|
+
else:
|
|
394
|
+
return where()
|
|
395
|
+
|
|
396
|
+
def _should_reference(self) -> bool:
|
|
397
|
+
return self._reference_role_map.column().references_column is not None
|
|
398
|
+
|
|
399
|
+
def value_player(self):
|
|
400
|
+
"""
|
|
401
|
+
Returns the value player of the entity map.
|
|
402
|
+
"""
|
|
403
|
+
return self._role.player()
|
|
404
|
+
|
|
405
|
+
def column(self) -> BindableAttribute:
|
|
406
|
+
"""
|
|
407
|
+
Returns the bindable column associated with this entity map.
|
|
408
|
+
"""
|
|
409
|
+
return self._binding.column
|
|
410
|
+
|
|
411
|
+
def materialize_population(self):
|
|
412
|
+
concept = self._role.player()
|
|
413
|
+
if not self._should_reference():
|
|
414
|
+
# then create entities
|
|
415
|
+
role_maps = self._identifier_to_role_map.values()
|
|
416
|
+
map_value_refs, subformulas = [], []
|
|
417
|
+
for role_map in role_maps:
|
|
418
|
+
rez_val, subformula = role_map.formula()
|
|
419
|
+
map_value_refs.append(rez_val)
|
|
420
|
+
subformulas.extend(subformula)
|
|
421
|
+
where(
|
|
422
|
+
*subformulas
|
|
423
|
+
).define(construct_entity(concept, *map_value_refs))
|
|
424
|
+
|
|
425
|
+
def __repr__(self):
|
|
426
|
+
return f'@inline CtorEntityMap({self._name})'
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
class ReferentEntityMap(AbstractInlineEntityMap):
|
|
430
|
+
"""
|
|
431
|
+
A class representing a referent entity map relation.
|
|
432
|
+
"""
|
|
433
|
+
|
|
434
|
+
def __init__(self, model, binding: Binding, role: Role, constructing_role_map: 'Map'):
|
|
435
|
+
madlib, name = self._handle_params(binding, role)
|
|
436
|
+
super().__init__(model, madlib, name)
|
|
437
|
+
self._binding = binding
|
|
438
|
+
self._role = role
|
|
439
|
+
self._constructing_role_map = constructing_role_map
|
|
440
|
+
|
|
441
|
+
@staticmethod
|
|
442
|
+
def _handle_params(binding, role):
|
|
443
|
+
if role.player()._is_primitive():
|
|
444
|
+
raise TypeError(f'Cannot construct an entity map for {role}, concept is not an entity type')
|
|
445
|
+
|
|
446
|
+
table_name = binding.column.table.physical_name()
|
|
447
|
+
concept = role.player()
|
|
448
|
+
return _get_map_madlib_and_name(f'{table_name}_ref', concept)
|
|
449
|
+
|
|
450
|
+
def _construct_body_formula(self):
|
|
451
|
+
concept = self._role.player()
|
|
452
|
+
orig_entity_ref, subformula_atoms = self._constructing_role_map.formula()
|
|
453
|
+
|
|
454
|
+
entity_ref = reference_entity(concept, orig_entity_ref)
|
|
455
|
+
return entity_ref, [
|
|
456
|
+
*subformula_atoms,
|
|
457
|
+
]
|
|
458
|
+
|
|
459
|
+
def value_player(self):
|
|
460
|
+
return self._role.player()
|
|
461
|
+
|
|
462
|
+
def binding(self) -> Binding:
|
|
463
|
+
"""
|
|
464
|
+
Returns the binding of the entity map.
|
|
465
|
+
"""
|
|
466
|
+
return self._binding
|
|
467
|
+
|
|
468
|
+
def column(self) -> BindableAttribute:
|
|
469
|
+
"""
|
|
470
|
+
Returns the bindable column associated with this entity map.
|
|
471
|
+
"""
|
|
472
|
+
return self._binding.column
|
|
473
|
+
|
|
474
|
+
def materialize_population(self):
|
|
475
|
+
"""
|
|
476
|
+
Referent entity maps do not need to materialize population, as they always reference existing entities.
|
|
477
|
+
"""
|
|
478
|
+
pass
|
|
479
|
+
|
|
480
|
+
def __repr__(self):
|
|
481
|
+
return f'@inline ReferentEntityMap({self._name})'
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
class CompositeEntityMap(AbstractInlineEntityMap):
|
|
485
|
+
"""
|
|
486
|
+
A class representing a composite entity map relation.
|
|
487
|
+
|
|
488
|
+
Takes a sequence of EntityMaps and constructs a composite entity type.
|
|
489
|
+
"""
|
|
490
|
+
|
|
491
|
+
def __init__(self, model, entity_concept: qb.Concept, *role_maps: 'Map'):
|
|
492
|
+
madlib, name = self._handle_params(entity_concept, *role_maps)
|
|
493
|
+
super().__init__(model, madlib, name)
|
|
494
|
+
self._entity_concept = entity_concept
|
|
495
|
+
self._role_maps = list(role_maps)
|
|
496
|
+
|
|
497
|
+
def _handle_params(self, entity_concept: qb.Concept, *role_maps: 'Map'):
|
|
498
|
+
if entity_concept._is_primitive():
|
|
499
|
+
raise TypeError(f'Cannot construct a composite entity map for {entity_concept},'
|
|
500
|
+
f' concept is not an entity type')
|
|
501
|
+
if len(role_maps) < 2:
|
|
502
|
+
raise ValueError('CompositeEntityMap requires at least two EntityMaps')
|
|
503
|
+
|
|
504
|
+
role_map = role_maps[0]
|
|
505
|
+
table = role_map.table()
|
|
506
|
+
self._table = table
|
|
507
|
+
return _get_map_madlib_and_name(table.physical_name(), entity_concept)
|
|
508
|
+
|
|
509
|
+
def _construct_body_formula(self):
|
|
510
|
+
var_refs, body_atoms = self._body_formula()
|
|
511
|
+
|
|
512
|
+
# the rule to populate the entity map
|
|
513
|
+
entity_ref = reference_entity(self._entity_concept, *var_refs, check_population=False)
|
|
514
|
+
return entity_ref, body_atoms
|
|
515
|
+
|
|
516
|
+
@staticmethod
|
|
517
|
+
def _should_reference() -> bool:
|
|
518
|
+
"""
|
|
519
|
+
Determines if the composite entity map should reference a column.
|
|
520
|
+
Currently not supported fully.
|
|
521
|
+
"""
|
|
522
|
+
return False
|
|
523
|
+
|
|
524
|
+
def _body_formula(self):
|
|
525
|
+
var_refs, subformulas = zip(*(role_map.formula() for role_map in self._role_maps))
|
|
526
|
+
return var_refs, [
|
|
527
|
+
*(atom for subformula in subformulas for atom in subformula)
|
|
528
|
+
]
|
|
529
|
+
|
|
530
|
+
def value_player(self):
|
|
531
|
+
"""
|
|
532
|
+
Returns the value player of the composite entity map.
|
|
533
|
+
"""
|
|
534
|
+
return self._entity_concept
|
|
535
|
+
|
|
536
|
+
def table(self) -> BindableTable:
|
|
537
|
+
"""
|
|
538
|
+
Returns the table associated with the composite entity map.
|
|
539
|
+
"""
|
|
540
|
+
return self._table
|
|
541
|
+
|
|
542
|
+
def column(self) -> BindableAttribute:
|
|
543
|
+
raise ValueError('CompositeEntityMap does not index a single column')
|
|
544
|
+
|
|
545
|
+
def materialize_population(self):
|
|
546
|
+
var_refs, body_atoms = self._body_formula()
|
|
547
|
+
if not self._should_reference():
|
|
548
|
+
# construct entities
|
|
549
|
+
entity_ref = construct_entity(self._entity_concept, *var_refs)
|
|
550
|
+
where(
|
|
551
|
+
*body_atoms,
|
|
552
|
+
).define(entity_ref)
|
|
553
|
+
|
|
554
|
+
def __repr__(self):
|
|
555
|
+
return f'@inline CompositeEntityMap({self._name})'
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
AbstractEntityMap = Union['SimpleConstructorEntityMap', 'ReferentEntityMap', 'CompositeEntityMap', 'UnionEntityMap']
|
|
559
|
+
Map = Union['ValueMap', 'InlineValueMap', 'UnionEntityMap', 'AbstractInlineEntityMap', 'MaterializedEntityMap']
|
|
560
|
+
|
|
561
|
+
class EntitySubtypeMap(AbstractInlineEntityMap):
|
|
562
|
+
"""
|
|
563
|
+
A class representing an entity subtype map relation.
|
|
564
|
+
"""
|
|
565
|
+
|
|
566
|
+
def __init__(self, model, binding: Union[IdentifierConceptBinding, SubtypeConceptBinding, ReferentConceptBinding],
|
|
567
|
+
ctor_entity_map: Union[AbstractInlineEntityMap, MaterializedEntityMap]):
|
|
568
|
+
# type of the entity subtype map is the parent type coming from the ctor_entity_map
|
|
569
|
+
madlib, name = self._handle_params(binding, ctor_entity_map.value_player())
|
|
570
|
+
super().__init__(model, madlib, name)
|
|
571
|
+
self._binding = binding
|
|
572
|
+
self._ctor_entity_map = ctor_entity_map
|
|
573
|
+
|
|
574
|
+
@staticmethod
|
|
575
|
+
def _handle_params(binding: Union[IdentifierConceptBinding, SubtypeConceptBinding, ReferentConceptBinding],
|
|
576
|
+
result_concept: qb.Concept):
|
|
577
|
+
table = binding.column.table
|
|
578
|
+
entity_concept = binding.entity_type
|
|
579
|
+
# check that the entity concept is a subtype of the result concept
|
|
580
|
+
assert entity_concept._isa(result_concept), f"Entity concept {entity_concept} must be a subtype of result concept {result_concept}"
|
|
581
|
+
name = f'{table.physical_name()}_row_to_{entity_concept}'
|
|
582
|
+
madlib = f'{name} {{row_id:RowId}} {{val:{result_concept}}}'
|
|
583
|
+
return madlib, name
|
|
584
|
+
|
|
585
|
+
def _construct_body_formula(self):
|
|
586
|
+
parent_type_ref, body_atoms = self._generate_body_atoms()
|
|
587
|
+
|
|
588
|
+
# note: have to return the parent type here, as otherwise it gets a join on the subtype population
|
|
589
|
+
# but doesn't cast to the type of the subtype...
|
|
590
|
+
return parent_type_ref, body_atoms
|
|
591
|
+
|
|
592
|
+
def _generate_body_atoms(self):
|
|
593
|
+
filtering_atom = where(self._binding.filter_by)
|
|
594
|
+
parent_type_ref, subformula_atoms = self._ctor_entity_map.formula()
|
|
595
|
+
return parent_type_ref, [
|
|
596
|
+
*subformula_atoms,
|
|
597
|
+
filtering_atom
|
|
598
|
+
]
|
|
599
|
+
|
|
600
|
+
def binding(self):
|
|
601
|
+
"""
|
|
602
|
+
Returns the binding of the entity subtype map.
|
|
603
|
+
"""
|
|
604
|
+
return self._binding
|
|
605
|
+
|
|
606
|
+
def value_player(self):
|
|
607
|
+
"""
|
|
608
|
+
Returns the subtype of the entity subtype map.
|
|
609
|
+
"""
|
|
610
|
+
return self._binding.entity_type
|
|
611
|
+
|
|
612
|
+
def column(self) -> BindableAttribute:
|
|
613
|
+
"""
|
|
614
|
+
Returns the bindable column associated with this entity subtype map.
|
|
615
|
+
"""
|
|
616
|
+
return self._binding.column
|
|
617
|
+
|
|
618
|
+
def table(self) -> BindableTable:
|
|
619
|
+
"""
|
|
620
|
+
Returns the table associated with the entity subtype map.
|
|
621
|
+
"""
|
|
622
|
+
return self._binding.column.table
|
|
623
|
+
|
|
624
|
+
def materialize_population(self):
|
|
625
|
+
subtype = self._binding.entity_type
|
|
626
|
+
parent_type_ref, body_atoms = self._generate_body_atoms()
|
|
627
|
+
# TODO instead of Person.new maybe try Employee.new to construct these?
|
|
628
|
+
# derive subtype population
|
|
629
|
+
where(*body_atoms).define(subtype(parent_type_ref))
|
|
630
|
+
|
|
631
|
+
def __repr__(self):
|
|
632
|
+
return f'@inline EntitySubtypeMap({self._name})'
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
class UnionEntityMap(AbstractMap):
|
|
636
|
+
"""
|
|
637
|
+
A class representing a union entity map relation.
|
|
638
|
+
"""
|
|
639
|
+
|
|
640
|
+
def __init__(self, model, entity_concept: qb.Concept, *entity_maps: AbstractEntityMap, generate_population: bool=False):
|
|
641
|
+
madlib, name = self._handle_params(entity_concept, *entity_maps)
|
|
642
|
+
super().__init__(madlib, model, name)
|
|
643
|
+
self._entity_type = entity_concept
|
|
644
|
+
self._entity_maps = OrderedSet().update(entity_maps)
|
|
645
|
+
self._generate_population = generate_population
|
|
646
|
+
self._generate_body()
|
|
647
|
+
|
|
648
|
+
def _handle_params(self, entity_concept: qb.Concept, *entity_maps: AbstractEntityMap):
|
|
649
|
+
if len(entity_maps) == 0:
|
|
650
|
+
raise ValueError('UnionEntityMap requires at least one EntityMap')
|
|
651
|
+
# pick an arbitrary entity map to get the table, as they must all have the same
|
|
652
|
+
table = entity_maps[0].table()
|
|
653
|
+
self._table = table
|
|
654
|
+
return _get_map_madlib_and_name(table.physical_name(), entity_concept)
|
|
655
|
+
|
|
656
|
+
def _generate_body(self):
|
|
657
|
+
for entity_map in self._entity_maps:
|
|
658
|
+
self._generate_body_rule(entity_map)
|
|
659
|
+
|
|
660
|
+
def _generate_body_rule(self, entity_map: AbstractEntityMap):
|
|
661
|
+
source_ref = self.table()
|
|
662
|
+
rez_val_ref, subformula_atoms = entity_map.formula()
|
|
663
|
+
|
|
664
|
+
# derive union entity map
|
|
665
|
+
where(
|
|
666
|
+
*subformula_atoms
|
|
667
|
+
).define(self(source_ref, rez_val_ref))
|
|
668
|
+
|
|
669
|
+
def value_player(self):
|
|
670
|
+
"""
|
|
671
|
+
Returns the type of the entity map.
|
|
672
|
+
"""
|
|
673
|
+
return self._entity_type
|
|
674
|
+
|
|
675
|
+
def table(self):
|
|
676
|
+
"""
|
|
677
|
+
Returns the table associated with the entity map.
|
|
678
|
+
"""
|
|
679
|
+
return self._table
|
|
680
|
+
|
|
681
|
+
def update(self, entity_map: AbstractEntityMap):
|
|
682
|
+
"""
|
|
683
|
+
Updates the union entity map with a new entity map.
|
|
684
|
+
"""
|
|
685
|
+
if entity_map in self._entity_maps:
|
|
686
|
+
return
|
|
687
|
+
self._entity_maps.add(entity_map)
|
|
688
|
+
self._generate_body_rule(entity_map)
|
|
689
|
+
|
|
690
|
+
def materialize_population(self):
|
|
691
|
+
if self._generate_population:
|
|
692
|
+
# derive type population
|
|
693
|
+
for entity_map in self._entity_maps:
|
|
694
|
+
rez_val_ref, subformula_atoms = entity_map.formula()
|
|
695
|
+
where(
|
|
696
|
+
*subformula_atoms
|
|
697
|
+
).define(self._entity_type(rez_val_ref))
|
|
698
|
+
|
|
699
|
+
def __repr__(self):
|
|
700
|
+
return f'UnionEntityMap({self._name})'
|