relationalai 0.13.0__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 -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/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 -771
- 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/__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/__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/metamodel/util.py +505 -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 -912
- relationalai/clients/config.py +0 -673
- relationalai/clients/direct_access_client.py +0 -118
- relationalai/clients/hash_util.py +0 -31
- relationalai/clients/local.py +0 -571
- relationalai/clients/profile_polling.py +0 -73
- relationalai/clients/resources/__init__.py +0 -8
- relationalai/clients/resources/azure/azure.py +0 -477
- relationalai/clients/resources/snowflake/__init__.py +0 -20
- relationalai/clients/resources/snowflake/cli_resources.py +0 -87
- relationalai/clients/resources/snowflake/direct_access_resources.py +0 -711
- relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -309
- relationalai/clients/resources/snowflake/error_handlers.py +0 -199
- 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 -3083
- relationalai/clients/resources/snowflake/use_index_poller.py +0 -1011
- 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 -113
- 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 -2478
- 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 -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 -325
- 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 -877
- 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 -506
- 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 -554
- 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/metamodel/util.py +0 -506
- 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 -1163
- relationalai/semantics/rel/builtins.py +0 -40
- relationalai/semantics/rel/compiler.py +0 -989
- relationalai/semantics/rel/executor.py +0 -362
- 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/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 -1936
- relationalai/tools/cli_controls.py +0 -1826
- relationalai/tools/cli_helpers.py +0 -398
- 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 -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.0.dist-info/METADATA +0 -74
- relationalai-0.13.0.dist-info/RECORD +0 -458
- relationalai-0.13.0.dist-info/WHEEL +0 -4
- relationalai-0.13.0.dist-info/entry_points.txt +0 -3
- relationalai-0.13.0.dist-info/licenses/LICENSE +0 -202
- relationalai_test_util/__init__.py +0 -4
- relationalai_test_util/fixtures.py +0 -229
- 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/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/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,402 @@
|
|
|
1
|
+
import dataclasses
|
|
2
|
+
import datetime
|
|
3
|
+
from abc import abstractmethod, ABC
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Optional, TypeVar, Generic, Tuple, Callable, Sequence
|
|
6
|
+
from typing import Union
|
|
7
|
+
|
|
8
|
+
import v0.relationalai.semantics as qb
|
|
9
|
+
from v0.relationalai.semantics import std
|
|
10
|
+
from v0.relationalai.semantics.internal import internal as b
|
|
11
|
+
from v0.relationalai.semantics.internal.internal import Not
|
|
12
|
+
from v0.relationalai.early_access.dsl.orm.relationships import Relationship, Role
|
|
13
|
+
from v0.relationalai.early_access.dsl.orm.types import Concept
|
|
14
|
+
from v0.relationalai.early_access.dsl.snow.common import ColumnRef, ForeignKey
|
|
15
|
+
|
|
16
|
+
_PrimitiveType = Union[int, float, str, bool, datetime.date, datetime.datetime, Enum]
|
|
17
|
+
_CompositeFilterBy = Union[Not, qb.Expression, qb.Fragment, b.Producer]
|
|
18
|
+
FilterBy = Union[_PrimitiveType, _CompositeFilterBy, tuple[_CompositeFilterBy, ...]]
|
|
19
|
+
|
|
20
|
+
_BuiltInQbTransformer = Callable # A callable that is a built-in QB transformer, such as string_trim, lowercase, etc.
|
|
21
|
+
_Transformer = Union[_BuiltInQbTransformer, qb.Relationship]
|
|
22
|
+
TransformWith = Union[_Transformer, Sequence[_Transformer]]
|
|
23
|
+
|
|
24
|
+
_supported_builtins_to_types = {
|
|
25
|
+
std.strings.lower: (qb.String, qb.String),
|
|
26
|
+
std.strings.upper: (qb.String, qb.String),
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def _get_transform_types(obj: _Transformer):
|
|
30
|
+
"""Utility: return (input_type, output_type) of a transformer/relationship."""
|
|
31
|
+
if isinstance(obj, qb.Relationship) and obj._arity() == 2:
|
|
32
|
+
fields = getattr(obj, "_field_refs", None)
|
|
33
|
+
if fields:
|
|
34
|
+
return fields[0]._thing, fields[-1]._thing
|
|
35
|
+
elif isinstance(obj, Callable) and obj in _supported_builtins_to_types:
|
|
36
|
+
input_type, output_type = _supported_builtins_to_types[obj]
|
|
37
|
+
return input_type, output_type
|
|
38
|
+
raise ValueError(f"Cannot infer input/output types from {obj}. Make sure to use a valid built-in transformer or"
|
|
39
|
+
f" a binary relationship")
|
|
40
|
+
|
|
41
|
+
# defining symbol in codegen to not expose this to the user
|
|
42
|
+
Symbol = Concept.builtins["Symbol"]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class BindableTable(ABC):
|
|
46
|
+
"""
|
|
47
|
+
A class representing a bindable table.
|
|
48
|
+
"""
|
|
49
|
+
_ref: b.Ref
|
|
50
|
+
_row_field: b.Field
|
|
51
|
+
|
|
52
|
+
def _to_keys(self) -> list[b.Ref]:
|
|
53
|
+
return [self._ref]
|
|
54
|
+
|
|
55
|
+
@abstractmethod
|
|
56
|
+
def key_type(self) -> qb.Concept:
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def physical_name(self) -> str:
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class BindableAttribute(ABC):
|
|
65
|
+
|
|
66
|
+
def _to_keys(self) -> list[b.Ref]:
|
|
67
|
+
return self.table._to_keys()
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
@abstractmethod
|
|
71
|
+
def table(self) -> BindableTable:
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
@abstractmethod
|
|
75
|
+
def physical_name(self) -> str:
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
@abstractmethod
|
|
79
|
+
def type(self) -> qb.Concept:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
@abstractmethod
|
|
84
|
+
def references_column(self) -> Optional[ColumnRef]:
|
|
85
|
+
pass
|
|
86
|
+
|
|
87
|
+
@abstractmethod
|
|
88
|
+
def column_ref(self) -> ColumnRef:
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@dataclasses.dataclass(frozen=True)
|
|
93
|
+
class Binding:
|
|
94
|
+
"""
|
|
95
|
+
Base class for all bindings in the model. It captures the column and the optional filter that should be applied
|
|
96
|
+
to the binding.
|
|
97
|
+
|
|
98
|
+
Examples of filters:
|
|
99
|
+
- `FilterBy` can be a primitive value, such as an integer or a string, which will be used to filter the
|
|
100
|
+
values in the column.
|
|
101
|
+
- An expression can be used to filter the values in the column based on a more complex condition.
|
|
102
|
+
- A tuple of expressions can be used to filter the values in the column based on multiple expressions, joined
|
|
103
|
+
together.
|
|
104
|
+
|
|
105
|
+
Note: all the expressions must be atomic, i.e., they cannot contain arbitrarily nested formulas.
|
|
106
|
+
|
|
107
|
+
# binds the column to the role in the relationship, filtering out any rows that don't match the specified value
|
|
108
|
+
{source}.COLUMN.binds(MyRelationship, filter_by="some_value")
|
|
109
|
+
|
|
110
|
+
# binds the column to the role in the relationship, filtering out any rows that don't match the specified
|
|
111
|
+
# expression
|
|
112
|
+
{source}.COLUMN.binds(MyRelationship, filter_by=(
|
|
113
|
+
{source}.ANOTHER_COLUMN >= 18
|
|
114
|
+
))
|
|
115
|
+
|
|
116
|
+
# multiple atoms can be used too, resulting in a conjunction
|
|
117
|
+
{source}.COLUMN.binds(MyRelationship[MyRole], filter_by=(
|
|
118
|
+
{source}.ANOTHER_COLUMN >= 18,
|
|
119
|
+
{source}.YET_ANOTHER_COLUMN == "some_value"
|
|
120
|
+
))
|
|
121
|
+
|
|
122
|
+
Examples of transformations:
|
|
123
|
+
- `TransformWith` can be a QB built-in like `strip` or `lower`.
|
|
124
|
+
- A single *binary* relationship can be used to transform the values in the column, where the type of the value
|
|
125
|
+
must follow the data type defined in the model for the role.
|
|
126
|
+
- A tuple of relationships can be used to transform the values in the column, chaining the transformations.
|
|
127
|
+
The types should chain and match, with the last one being the data type defined in the model for the role.
|
|
128
|
+
|
|
129
|
+
# single string lowercase transformation
|
|
130
|
+
{source}.COLUMN.binds(MyRelationship, transform_with=std.strings.lower)
|
|
131
|
+
|
|
132
|
+
# chain of transformations with a strip followed by an uppercase
|
|
133
|
+
{source}.COLUMN.binds(MyRelationship, transform_with=(
|
|
134
|
+
std.strings.strip, std.strings.upper
|
|
135
|
+
))
|
|
136
|
+
|
|
137
|
+
# manually defined transformation relationship
|
|
138
|
+
my_transformer = Relationship("MyTransformer {String} {String}")
|
|
139
|
+
s1, s2 = String.ref(), String.ref()
|
|
140
|
+
define(my_transformer(s1, s2)).where(
|
|
141
|
+
# ... implement the logic ...
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
{source}.COLUMN.binds(MyRelationship, transform_with=my_transformer)
|
|
145
|
+
"""
|
|
146
|
+
column: 'BindableColumn'
|
|
147
|
+
filter_by: Optional[FilterBy]
|
|
148
|
+
transform_with: Optional[TransformWith]
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@dataclasses.dataclass(frozen=True)
|
|
152
|
+
class RoleBinding(Binding):
|
|
153
|
+
"""
|
|
154
|
+
RoleBinding represents a binding between a column and a role in a relationship.
|
|
155
|
+
|
|
156
|
+
See `BindableColumn.binds` for more details on how to use this binding.
|
|
157
|
+
"""
|
|
158
|
+
role: Role
|
|
159
|
+
|
|
160
|
+
def __str__(self):
|
|
161
|
+
return f'RoleBinding[{self.column.table.physical_name()}:{self.column.physical_name()} -> {self.role.player().name()}]'
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@dataclasses.dataclass(frozen=True)
|
|
165
|
+
class AbstractConceptBinding(Binding):
|
|
166
|
+
"""
|
|
167
|
+
Represents a parent class for all concept bindings. Doesn't have any specific semantics but serves as a base
|
|
168
|
+
class for this class hierarchy.
|
|
169
|
+
"""
|
|
170
|
+
entity_type: qb.Concept
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@dataclasses.dataclass(frozen=True)
|
|
174
|
+
class IdentifierConceptBinding(AbstractConceptBinding):
|
|
175
|
+
"""
|
|
176
|
+
Represents a binding between an identifier column and a specific entity type.
|
|
177
|
+
|
|
178
|
+
This binding could either represent a constructor binding (instances of the entity type are constructed from the
|
|
179
|
+
values), referent binding (instances of the entity type are being looked up by the values), or a subtype binding
|
|
180
|
+
(instances are being looked up using the parent type's ref scheme, or it acts as a constructor for the subtype).
|
|
181
|
+
|
|
182
|
+
See `BindableColumn.identifies` and `BindableColumn.references` for more details on how to use this binding.
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
def __str__(self):
|
|
186
|
+
return f'IdentifierConceptBinding[{self.column.table.physical_name()}:{self.column.physical_name()} -> {self.entity_type.name()}]'
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@dataclasses.dataclass(frozen=True)
|
|
190
|
+
class ReferentConceptBinding(AbstractConceptBinding):
|
|
191
|
+
"""
|
|
192
|
+
Represents a binding between an identifier column and a specific entity type, where the values in the column
|
|
193
|
+
are used to look up existing instances of the entity type.
|
|
194
|
+
|
|
195
|
+
See `BindableColumn.identifies` and `BindableColumn.references` for more details on how to use this binding.
|
|
196
|
+
"""
|
|
197
|
+
|
|
198
|
+
def __str__(self):
|
|
199
|
+
return f'ReferentConceptBinding[{self.column.table.physical_name()}:{self.column.physical_name()} -> {self.entity_type.name()}]'
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@dataclasses.dataclass(frozen=True)
|
|
203
|
+
class SubtypeConceptBinding(AbstractConceptBinding):
|
|
204
|
+
"""
|
|
205
|
+
Represents a binding between an identifier column and a subtype of an entity type, where the values in the column
|
|
206
|
+
are used to filter existing instances of the parent entity type. That could be done either directly (any value from
|
|
207
|
+
that column is a subtype) or with the extra filter passed in `filter_by`, by filtering out the rows that do not
|
|
208
|
+
match the specified value.
|
|
209
|
+
|
|
210
|
+
See `BindableColumn.binds_subtype` for more details on how to use this binding.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
def __str__(self):
|
|
214
|
+
return f'SubtypeConceptBinding[{self.column.table.physical_name()}:{self.column.physical_name()} -> {self.entity_type.name()}]'
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
class BindableColumn(BindableAttribute, ABC):
|
|
218
|
+
_source: BindableTable
|
|
219
|
+
_references_column: Optional[ColumnRef]
|
|
220
|
+
|
|
221
|
+
def __init__(self, col_name: str, col_type: qb.Concept, source: BindableTable, model):
|
|
222
|
+
self._col_name = col_name
|
|
223
|
+
self._type = col_type
|
|
224
|
+
self._source = source
|
|
225
|
+
self._orm_model = model
|
|
226
|
+
self._references_column = None
|
|
227
|
+
|
|
228
|
+
def identifies(self, entity_type: Concept, filter_by: Optional[FilterBy] = None,
|
|
229
|
+
transform_with: Optional[TransformWith] = None):
|
|
230
|
+
"""
|
|
231
|
+
Binds a column that identifies an entity type. With that, the values in the column are used to construct
|
|
232
|
+
instances of the entity type.
|
|
233
|
+
|
|
234
|
+
Examples:
|
|
235
|
+
{source}.ID.identifies(Person) # binds the column values to the Person entity type, constructing instances
|
|
236
|
+
"""
|
|
237
|
+
if isinstance(entity_type, Enum):
|
|
238
|
+
raise ValueError(f'Cannot bind to Enum {entity_type}, use `references` instead')
|
|
239
|
+
filter_by = self._handle_primitive_filter(filter_by)
|
|
240
|
+
binding = IdentifierConceptBinding(column=self, entity_type=entity_type, filter_by=filter_by,
|
|
241
|
+
transform_with=transform_with)
|
|
242
|
+
self._orm_model.binding(binding)
|
|
243
|
+
|
|
244
|
+
def references(self, entity_type: Concept, filter_by: Optional[FilterBy] = None,
|
|
245
|
+
transform_with: Optional[TransformWith] = None):
|
|
246
|
+
"""
|
|
247
|
+
Binds a column that references an identifier of an entity type. With that, the values in the column are
|
|
248
|
+
used to look up existing instances of the entity type.
|
|
249
|
+
|
|
250
|
+
Examples:
|
|
251
|
+
{source}.ID.identifies(Person) # binds the column values to the Person entity type, constructing instances
|
|
252
|
+
{another_source}.PERSON_ID.references(Person) # binds the column values to the Person entity type,
|
|
253
|
+
# looking up existing instances
|
|
254
|
+
|
|
255
|
+
{source}.TRACKING_NUMER.identifies(TrackingNumber) # constructs instances of the TrackingNumber entity type
|
|
256
|
+
{source}.RETURN_TRACKING_NUMBER.references(TrackingNumber) # looks up existing instances of the TrackingNumber entity type
|
|
257
|
+
"""
|
|
258
|
+
filter_by = self._handle_primitive_filter(filter_by)
|
|
259
|
+
binding = ReferentConceptBinding(column=self, entity_type=entity_type, filter_by=filter_by,
|
|
260
|
+
transform_with=transform_with)
|
|
261
|
+
self._orm_model.binding(binding)
|
|
262
|
+
|
|
263
|
+
def binds_subtype(self, sub_type: Concept, filter_by: Optional[FilterBy] = None,
|
|
264
|
+
transform_with: Optional[TransformWith] = None):
|
|
265
|
+
"""
|
|
266
|
+
Binds a column that contains identifier of the subtype. The values in the column are used to filter
|
|
267
|
+
existing instances of the parent entity type by filtering out the rows that do not match the
|
|
268
|
+
specified value.
|
|
269
|
+
|
|
270
|
+
Note: the subtype must inherit the reference scheme of the parent entity type and not define its own. Otherwise,
|
|
271
|
+
use `identifies` or `references` to bind to the subtype.
|
|
272
|
+
|
|
273
|
+
Examples:
|
|
274
|
+
# constructs instances of the CorporateAction entity type
|
|
275
|
+
{source}.CORPORATE_ACTION_ID.identifies(CorporateAction)
|
|
276
|
+
|
|
277
|
+
# partitions CorporateAction into Split subtype
|
|
278
|
+
{source}.CORPORATE_ACTION_ID.binds_subtype(Split, filter_by=(
|
|
279
|
+
{source}.CORPORATE_ACTION_TYPE == "SPLIT"
|
|
280
|
+
))
|
|
281
|
+
|
|
282
|
+
# partitions CorporateAction into Merger subtype
|
|
283
|
+
{source}.CORPORATE_ACTION_ID.binds_subtype(Merger, filter_by=(
|
|
284
|
+
{source}.CORPORATE_ACTION_TYPE == "MERGER"
|
|
285
|
+
))
|
|
286
|
+
"""
|
|
287
|
+
filter_by = self._handle_primitive_filter(filter_by)
|
|
288
|
+
binding = SubtypeConceptBinding(column=self, entity_type=sub_type, filter_by=filter_by,
|
|
289
|
+
transform_with=transform_with)
|
|
290
|
+
self._orm_model.binding(binding)
|
|
291
|
+
|
|
292
|
+
def binds(self, elm, filter_by: Optional[FilterBy] = None, transform_with: Optional[TransformWith] = None):
|
|
293
|
+
"""
|
|
294
|
+
Binds the column to a role in a relationship or a role itself. It's possible to bind a column to a binary
|
|
295
|
+
relationship, which will bind to the last role in the relationship.
|
|
296
|
+
|
|
297
|
+
Examples:
|
|
298
|
+
{source}.{column}.binds(MyRelationship) # binds the last role in MyRelationship
|
|
299
|
+
|
|
300
|
+
{source}.{column}.binds(MyRelationship[MyConcept]) # binds the role played by MyConcept (if unique)
|
|
301
|
+
|
|
302
|
+
# binding by index (may be useful for relationships with multiple roles played by the same concept)
|
|
303
|
+
# BecameFriendsAt = Relationship("{Person} at {DateTime} befriended {Person}")
|
|
304
|
+
friends_source.PERSON_ID.binds(BecameFriendsAt[0]) # binds the first Person role
|
|
305
|
+
friends_source.BEFRIENDED_AT.binds(BecameFriendsAt[DateTime]) # binds the DateTime role
|
|
306
|
+
friends_source.FRIEND_ID.binds(BecameFriendsAt[2]) # binds the second Person role (third in the relationship)
|
|
307
|
+
"""
|
|
308
|
+
if isinstance(elm, Relationship):
|
|
309
|
+
# this binds to the last role in binary relations
|
|
310
|
+
if elm._arity() > 2:
|
|
311
|
+
raise ValueError(f'Expected binary or unary relationship, got arity {elm._arity()}')
|
|
312
|
+
roles = elm._roles()
|
|
313
|
+
role = roles[-1]
|
|
314
|
+
elif isinstance(elm, Role):
|
|
315
|
+
role = elm
|
|
316
|
+
else:
|
|
317
|
+
raise Exception(
|
|
318
|
+
f'Expected ORM Relationship or Role, got {type(elm)} - QB Relationships cannot be used in bindings')
|
|
319
|
+
filter_by = self._handle_primitive_filter(filter_by)
|
|
320
|
+
binding = RoleBinding(role=role, column=self, filter_by=filter_by, transform_with=transform_with)
|
|
321
|
+
self._orm_model.binding(binding)
|
|
322
|
+
|
|
323
|
+
def _handle_primitive_filter(self, filter_by: Optional[FilterBy]) -> Optional[FilterBy]:
|
|
324
|
+
if isinstance(filter_by, _PrimitiveType):
|
|
325
|
+
eq = b.Relationship.builtins["="]
|
|
326
|
+
return b.Expression(eq, self, filter_by)
|
|
327
|
+
elif isinstance(filter_by, Tuple):
|
|
328
|
+
return b.where(*filter_by)
|
|
329
|
+
else:
|
|
330
|
+
return filter_by
|
|
331
|
+
|
|
332
|
+
@property
|
|
333
|
+
def table(self):
|
|
334
|
+
return self._source
|
|
335
|
+
|
|
336
|
+
@property
|
|
337
|
+
def references_column(self) -> Optional[ColumnRef]:
|
|
338
|
+
return self._references_column
|
|
339
|
+
|
|
340
|
+
@references_column.setter
|
|
341
|
+
def references_column(self, ref: ColumnRef):
|
|
342
|
+
self._references_column = ref
|
|
343
|
+
|
|
344
|
+
def physical_name(self) -> str:
|
|
345
|
+
return self._col_name
|
|
346
|
+
|
|
347
|
+
def type(self) -> qb.Concept:
|
|
348
|
+
return self._type
|
|
349
|
+
|
|
350
|
+
def column_ref(self) -> ColumnRef:
|
|
351
|
+
return ColumnRef(self._source.physical_name(), self.physical_name())
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
T = TypeVar("T", bound=BindableColumn)
|
|
355
|
+
class AbstractBindableTable(BindableTable, Generic[T], ABC):
|
|
356
|
+
_foreign_keys: set[ForeignKey]
|
|
357
|
+
|
|
358
|
+
def __init__(self, fqn: str, model, foreign_keys: set[ForeignKey]):
|
|
359
|
+
self._fqn = fqn
|
|
360
|
+
self._model = model
|
|
361
|
+
self._cols: dict[str, T] = dict()
|
|
362
|
+
self._foreign_keys = foreign_keys
|
|
363
|
+
|
|
364
|
+
def __getattr__(self, key):
|
|
365
|
+
if key in self.__dict__:
|
|
366
|
+
return self.__dict__[key]
|
|
367
|
+
if key in self._cols:
|
|
368
|
+
return self._cols[key]
|
|
369
|
+
raise AttributeError(f'Table "{self.physical_name()}" has no column named "{key}"')
|
|
370
|
+
|
|
371
|
+
def foreign_key(self, *refs: Tuple[BindableColumn, BindableColumn]):
|
|
372
|
+
source_columns = []
|
|
373
|
+
target_columns = []
|
|
374
|
+
|
|
375
|
+
for source, target in refs:
|
|
376
|
+
source_columns.append(ColumnRef(source.table.physical_name(), source.physical_name()))
|
|
377
|
+
target_columns.append(ColumnRef(target.table.physical_name(), target.physical_name()))
|
|
378
|
+
|
|
379
|
+
source_col_names = "_".join(col.column for col in source_columns)
|
|
380
|
+
target_col_names = "_".join(col.column for col in target_columns)
|
|
381
|
+
|
|
382
|
+
fk_name = f"fk_{source_col_names}__to__{target_col_names}"
|
|
383
|
+
|
|
384
|
+
fk = ForeignKey(fk_name, source_columns, target_columns)
|
|
385
|
+
self._foreign_keys.add(fk)
|
|
386
|
+
self._process_foreign_key(fk)
|
|
387
|
+
|
|
388
|
+
def key_type(self) -> qb.Concept:
|
|
389
|
+
return qb.Integer
|
|
390
|
+
|
|
391
|
+
def columns(self):
|
|
392
|
+
return self._cols
|
|
393
|
+
|
|
394
|
+
def _process_foreign_keys(self):
|
|
395
|
+
for fk in self._foreign_keys:
|
|
396
|
+
self._process_foreign_key(fk)
|
|
397
|
+
|
|
398
|
+
def _process_foreign_key(self, fk):
|
|
399
|
+
# TODO : this doesn't work for composite FKs
|
|
400
|
+
for col in fk.source_columns:
|
|
401
|
+
target_col = fk.target_columns[0]
|
|
402
|
+
self._cols[col.column].references_column = target_col
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
from io import StringIO
|
|
2
|
+
from typing import Optional, Hashable
|
|
3
|
+
|
|
4
|
+
import numpy as np
|
|
5
|
+
import pandas as pd
|
|
6
|
+
|
|
7
|
+
from v0.relationalai.semantics import define, where
|
|
8
|
+
from v0.relationalai.semantics.std import decimals
|
|
9
|
+
from v0.relationalai.semantics.internal import internal as b
|
|
10
|
+
from v0.relationalai.early_access.dsl.bindings.common import BindableColumn, AbstractBindableTable
|
|
11
|
+
from v0.relationalai.early_access.dsl.snow.common import CsvColumnMetadata
|
|
12
|
+
from v0.relationalai.early_access.dsl.utils import normalize
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class BindableCsvColumn(BindableColumn, b.Relationship):
|
|
16
|
+
_metadata: CsvColumnMetadata
|
|
17
|
+
_column_basic_type: str
|
|
18
|
+
|
|
19
|
+
def __init__(self, metadata: CsvColumnMetadata, source: 'CsvTable', model):
|
|
20
|
+
BindableColumn.__init__(self, metadata.name, metadata.datatype, source, model)
|
|
21
|
+
fqn, fields, field_refs = self._relationship_ctor_inputs(metadata, source)
|
|
22
|
+
b.Relationship.__init__(self, fqn, model=model.qb_model(), fields=fields, field_refs=field_refs)
|
|
23
|
+
self._metadata = metadata
|
|
24
|
+
self._column_basic_type = "Int64" if metadata.datatype._name == b.Integer._name else "string"
|
|
25
|
+
|
|
26
|
+
@staticmethod
|
|
27
|
+
def _relationship_ctor_inputs(metadata: CsvColumnMetadata, source: 'CsvTable'):
|
|
28
|
+
"""
|
|
29
|
+
Handles the construction of the Relationship name components.
|
|
30
|
+
|
|
31
|
+
We use a separate QB relationship per source column, as this allows proper typing.
|
|
32
|
+
"""
|
|
33
|
+
col_name = metadata.name
|
|
34
|
+
col_type = metadata.datatype
|
|
35
|
+
source_name = source.physical_name()
|
|
36
|
+
fqn = f"{source_name}_{col_name}"
|
|
37
|
+
fields = [source._row_field, b.Field(name=col_name, type_str=str(col_type), type=col_type)]
|
|
38
|
+
field_refs = [source._ref, col_type.ref()]
|
|
39
|
+
return fqn, fields, field_refs
|
|
40
|
+
|
|
41
|
+
def __call__(self, *args):
|
|
42
|
+
"""
|
|
43
|
+
Allows the column to be called as a function, which is handy for manual data weaving.
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
row = Integer.ref()
|
|
47
|
+
where(
|
|
48
|
+
{source}.ID(row, id),
|
|
49
|
+
{source}.NAME(row, name),
|
|
50
|
+
person := Person.new(id=id)
|
|
51
|
+
).define(
|
|
52
|
+
person,
|
|
53
|
+
Person.name(person, name)
|
|
54
|
+
)
|
|
55
|
+
"""
|
|
56
|
+
if len(args) != 2:
|
|
57
|
+
raise ValueError(f'Expected 2 arguments passed to a call to BindableColumn, got {len(args)}')
|
|
58
|
+
return b.Relationship.__call__(self, *args)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def metadata(self):
|
|
62
|
+
return self._metadata
|
|
63
|
+
|
|
64
|
+
def basic_type(self):
|
|
65
|
+
return self._column_basic_type
|
|
66
|
+
|
|
67
|
+
def decimal_scale(self) -> Optional[int]:
|
|
68
|
+
typ = self.type()
|
|
69
|
+
if decimals.is_decimal(typ):
|
|
70
|
+
return decimals.scale(typ)
|
|
71
|
+
else:
|
|
72
|
+
return None
|
|
73
|
+
|
|
74
|
+
def __repr__(self):
|
|
75
|
+
return f"CSV:{self._source.physical_name()}.{self.physical_name()}"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class CsvTable(AbstractBindableTable[BindableCsvColumn]):
|
|
79
|
+
_basic_type_schema: dict[Hashable, str]
|
|
80
|
+
_csv_data: list[pd.DataFrame]
|
|
81
|
+
_num_rows: int
|
|
82
|
+
|
|
83
|
+
def __init__(self, fqn: str, schema: dict[str, b.Concept], model):
|
|
84
|
+
AbstractBindableTable.__init__(self, fqn, model, set())
|
|
85
|
+
self._initialize(schema, model)
|
|
86
|
+
|
|
87
|
+
def _initialize(self, schema: dict[str, b.Concept], model):
|
|
88
|
+
self._concept = b.Concept(self._fqn, extends=[b.Concept.builtins["RowId"]])
|
|
89
|
+
b.Concept.globals[self._fqn.lower()] = self._concept
|
|
90
|
+
ref = self._concept.ref("row_id")
|
|
91
|
+
assert isinstance(ref, b.Ref)
|
|
92
|
+
self._ref = ref
|
|
93
|
+
self._row_field = b.Field(name="row_id", type_str=self._fqn, type=self._concept)
|
|
94
|
+
self._csv_data = list()
|
|
95
|
+
self._num_rows = 0
|
|
96
|
+
self._cols = {column_name: BindableCsvColumn(CsvColumnMetadata(column_name, column_type), self, model)
|
|
97
|
+
for column_name, column_type in schema.items()}
|
|
98
|
+
self._basic_type_schema = {col.metadata.name: col.basic_type() for col in self._cols.values()}
|
|
99
|
+
|
|
100
|
+
def _compile_lookup(self, compiler:b.Compiler, ctx:b.CompilerContext):
|
|
101
|
+
return compiler.lookup(self._ref, ctx)
|
|
102
|
+
|
|
103
|
+
def _to_keys(self) -> list[b.Ref]:
|
|
104
|
+
assert isinstance( self._ref, b.Ref)
|
|
105
|
+
return [self._ref]
|
|
106
|
+
|
|
107
|
+
def __str__(self):
|
|
108
|
+
# returns the name of the table, as well as the columns and their types
|
|
109
|
+
return self.physical_name() + ':\n' + '\n'.join(
|
|
110
|
+
[f' {col.metadata.name} {col.metadata.datatype}' for _, col in self._cols.items()]
|
|
111
|
+
) + '\n' + '\n'.join(
|
|
112
|
+
[f' {fk.source_columns} -> {fk.target_columns}' for fk in self._foreign_keys]
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def csv_data(self) -> list[pd.DataFrame]:
|
|
117
|
+
return self._csv_data
|
|
118
|
+
|
|
119
|
+
def physical_name(self) -> str:
|
|
120
|
+
return self._fqn.lower()
|
|
121
|
+
|
|
122
|
+
def data(self, csv_data: str):
|
|
123
|
+
csv_df = pd.read_csv(StringIO(normalize(csv_data)), dtype=self._basic_type_schema)
|
|
124
|
+
self._csv_data.append(csv_df)
|
|
125
|
+
CsvSourceModule.generate(self, csv_df, row_offset=self._num_rows)
|
|
126
|
+
# update offset now that we generated the rules
|
|
127
|
+
self._num_rows += len(csv_df)
|
|
128
|
+
|
|
129
|
+
class CsvSourceModule:
|
|
130
|
+
|
|
131
|
+
@staticmethod
|
|
132
|
+
def generate(table: CsvTable, data: pd.DataFrame, row_offset: int = 0):
|
|
133
|
+
for local_index, row in enumerate(data.itertuples(index=False)):
|
|
134
|
+
row_index = row_offset + local_index
|
|
135
|
+
for column_name in data.columns:
|
|
136
|
+
value = getattr(row, column_name)
|
|
137
|
+
if pd.notna(value):
|
|
138
|
+
column = table.__getattr__(column_name)
|
|
139
|
+
column_type = column.type()
|
|
140
|
+
if column_type._name == b.Date._name:
|
|
141
|
+
CsvSourceModule._row_to_date_value_rule(column, row_index, value)
|
|
142
|
+
elif column_type._name == b.DateTime._name:
|
|
143
|
+
CsvSourceModule._row_to_date_time_value_rule(column, row_index, value)
|
|
144
|
+
elif b.is_decimal(column_type):
|
|
145
|
+
CsvSourceModule._row_to_decimal_value_rule(column, row_index, value)
|
|
146
|
+
else:
|
|
147
|
+
CsvSourceModule._row_to_value_rule(column, row_index, value)
|
|
148
|
+
|
|
149
|
+
@staticmethod
|
|
150
|
+
def _row_to_value_rule(column, row, value):
|
|
151
|
+
# if numpy scalar, convert to a native Python type
|
|
152
|
+
if isinstance(value, np.generic):
|
|
153
|
+
value = value.item()
|
|
154
|
+
define(column(row, value))
|
|
155
|
+
|
|
156
|
+
@staticmethod
|
|
157
|
+
def _row_to_date_value_rule(column, row, value):
|
|
158
|
+
parse_date = b.Relationship.builtins['parse_date']
|
|
159
|
+
rez = b.Date.ref()
|
|
160
|
+
where(parse_date(value, 'yyyy-mm-dd', rez)).define(column(row, rez))
|
|
161
|
+
|
|
162
|
+
@staticmethod
|
|
163
|
+
def _row_to_date_time_value_rule(column, row, value):
|
|
164
|
+
parse_datetime = b.Relationship.builtins['parse_datetime']
|
|
165
|
+
rez = b.DateTime.ref()
|
|
166
|
+
where(parse_datetime(value, 'yyy-mm-dd HH:MM:SS z', rez)).define(column(row, rez))
|
|
167
|
+
|
|
168
|
+
@staticmethod
|
|
169
|
+
def _row_to_decimal_value_rule(column, row, value):
|
|
170
|
+
define(column(row, decimals.parse(value, column.type())))
|