relationalai 0.13.5__py3-none-any.whl → 1.0.0a2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- relationalai/__init__.py +1 -256
- relationalai/config/__init__.py +56 -0
- relationalai/config/config.py +289 -0
- relationalai/config/config_fields.py +86 -0
- relationalai/config/connections/__init__.py +46 -0
- relationalai/config/connections/base.py +23 -0
- relationalai/config/connections/duckdb.py +29 -0
- relationalai/config/connections/snowflake.py +243 -0
- relationalai/config/external/__init__.py +17 -0
- relationalai/config/external/dbt_converter.py +101 -0
- relationalai/config/external/dbt_models.py +93 -0
- relationalai/config/external/snowflake_converter.py +41 -0
- relationalai/config/external/snowflake_models.py +85 -0
- relationalai/config/external/utils.py +19 -0
- relationalai/config/shims.py +1 -0
- relationalai/semantics/__init__.py +146 -22
- relationalai/semantics/backends/lqp/annotations.py +11 -0
- relationalai/semantics/backends/sql/sql_compiler.py +327 -0
- relationalai/semantics/frontend/base.py +1719 -0
- relationalai/semantics/frontend/core.py +179 -0
- relationalai/semantics/frontend/front_compiler.py +1316 -0
- relationalai/semantics/frontend/pprint.py +408 -0
- relationalai/semantics/metamodel/__init__.py +6 -40
- relationalai/semantics/metamodel/builtins.py +206 -772
- relationalai/semantics/metamodel/metamodel.py +465 -0
- relationalai/semantics/metamodel/metamodel_analyzer.py +519 -0
- relationalai/semantics/metamodel/pprint.py +414 -0
- relationalai/semantics/metamodel/rewriter.py +266 -0
- relationalai/semantics/metamodel/typer.py +1213 -0
- relationalai/semantics/std/__init__.py +60 -40
- relationalai/semantics/std/aggregates.py +148 -0
- relationalai/semantics/std/common.py +44 -0
- relationalai/semantics/std/constraints.py +37 -43
- relationalai/semantics/std/datetime.py +249 -135
- relationalai/semantics/std/decimals.py +45 -52
- relationalai/semantics/std/floats.py +13 -5
- relationalai/semantics/std/integers.py +26 -11
- relationalai/semantics/std/math.py +183 -112
- relationalai/semantics/std/numbers.py +86 -0
- relationalai/semantics/std/re.py +80 -62
- relationalai/semantics/std/strings.py +101 -46
- relationalai/shims/executor.py +179 -0
- relationalai/shims/helpers.py +126 -0
- relationalai/shims/hoister.py +221 -0
- relationalai/shims/mm2v0.py +1394 -0
- relationalai/tools/cli/__init__.py +6 -0
- relationalai/tools/cli/cli.py +90 -0
- relationalai/tools/cli/components/__init__.py +5 -0
- relationalai/tools/cli/components/progress_reader.py +1524 -0
- relationalai/tools/cli/components/utils.py +58 -0
- relationalai/tools/cli/config_template.py +45 -0
- relationalai/tools/cli/dev.py +19 -0
- relationalai/tools/debugger.py +289 -183
- relationalai/tools/typer_debugger.py +93 -0
- relationalai/util/dataclasses.py +43 -0
- relationalai/util/docutils.py +40 -0
- relationalai/util/error.py +199 -0
- relationalai/util/format.py +48 -109
- relationalai/util/naming.py +145 -0
- relationalai/util/python.py +35 -0
- relationalai/util/runtime.py +156 -0
- relationalai/util/schema.py +197 -0
- relationalai/util/source.py +185 -0
- relationalai/util/structures.py +163 -0
- relationalai/util/tracing.py +261 -0
- relationalai-1.0.0a2.dist-info/METADATA +44 -0
- relationalai-1.0.0a2.dist-info/RECORD +489 -0
- relationalai-1.0.0a2.dist-info/WHEEL +5 -0
- relationalai-1.0.0a2.dist-info/entry_points.txt +3 -0
- relationalai-1.0.0a2.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 +2478 -0
- v0/relationalai/experimental/SF.py +38 -0
- v0/relationalai/experimental/inspect.py +47 -0
- v0/relationalai/experimental/pathfinder/__init__.py +158 -0
- v0/relationalai/experimental/pathfinder/api.py +160 -0
- v0/relationalai/experimental/pathfinder/automaton.py +584 -0
- v0/relationalai/experimental/pathfinder/bridge.py +226 -0
- v0/relationalai/experimental/pathfinder/compiler.py +416 -0
- v0/relationalai/experimental/pathfinder/datalog.py +214 -0
- v0/relationalai/experimental/pathfinder/diagnostics.py +56 -0
- v0/relationalai/experimental/pathfinder/filter.py +236 -0
- v0/relationalai/experimental/pathfinder/glushkov.py +439 -0
- v0/relationalai/experimental/pathfinder/options.py +265 -0
- v0/relationalai/experimental/pathfinder/rpq.py +344 -0
- v0/relationalai/experimental/pathfinder/transition.py +200 -0
- v0/relationalai/experimental/pathfinder/utils.py +26 -0
- v0/relationalai/experimental/paths/api.py +143 -0
- v0/relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
- v0/relationalai/experimental/paths/examples/basic_example.py +40 -0
- v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
- v0/relationalai/experimental/paths/examples/movie_example.py +77 -0
- v0/relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
- v0/relationalai/experimental/paths/examples/paths_example.py +116 -0
- v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
- v0/relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
- v0/relationalai/experimental/paths/graph.py +185 -0
- v0/relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
- v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
- v0/relationalai/experimental/paths/path_algorithms/single.py +59 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
- v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
- v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
- v0/relationalai/experimental/paths/path_algorithms/usp.py +150 -0
- v0/relationalai/experimental/paths/product_graph.py +93 -0
- v0/relationalai/experimental/paths/rpq/automaton.py +584 -0
- v0/relationalai/experimental/paths/rpq/diagnostics.py +56 -0
- v0/relationalai/experimental/paths/rpq/rpq.py +378 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
- v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
- v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
- v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
- v0/relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
- v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
- v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
- v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
- v0/relationalai/experimental/paths/tree_agg.py +168 -0
- v0/relationalai/experimental/paths/utilities/iterators.py +27 -0
- v0/relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
- v0/relationalai/experimental/solvers.py +1087 -0
- v0/relationalai/loaders/csv.py +195 -0
- v0/relationalai/loaders/loader.py +177 -0
- v0/relationalai/loaders/types.py +23 -0
- v0/relationalai/rel_emitter.py +373 -0
- v0/relationalai/rel_utils.py +185 -0
- v0/relationalai/semantics/__init__.py +29 -0
- v0/relationalai/semantics/devtools/benchmark_lqp.py +536 -0
- v0/relationalai/semantics/devtools/compilation_manager.py +294 -0
- v0/relationalai/semantics/devtools/extract_lqp.py +110 -0
- v0/relationalai/semantics/internal/internal.py +3785 -0
- v0/relationalai/semantics/internal/snowflake.py +325 -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 +474 -0
- v0/relationalai/semantics/lqp/intrinsics.py +24 -0
- v0/relationalai/semantics/lqp/ir.py +124 -0
- v0/relationalai/semantics/lqp/model2lqp.py +877 -0
- v0/relationalai/semantics/lqp/passes.py +680 -0
- v0/relationalai/semantics/lqp/primitives.py +252 -0
- v0/relationalai/semantics/lqp/result_helpers.py +202 -0
- v0/relationalai/semantics/lqp/rewrite/__init__.py +18 -0
- v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
- v0/relationalai/semantics/lqp/rewrite/cdc.py +216 -0
- v0/relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
- v0/relationalai/semantics/lqp/rewrite/extract_keys.py +490 -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 +776 -0
- v0/relationalai/semantics/metamodel/compiler.py +133 -0
- v0/relationalai/semantics/metamodel/dependency.py +862 -0
- v0/relationalai/semantics/metamodel/executor.py +61 -0
- v0/relationalai/semantics/metamodel/factory.py +287 -0
- v0/relationalai/semantics/metamodel/helpers.py +361 -0
- v0/relationalai/semantics/metamodel/ir.py +923 -0
- v0/relationalai/semantics/metamodel/rewrite/__init__.py +7 -0
- v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
- v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
- v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
- v0/relationalai/semantics/metamodel/rewrite/flatten.py +554 -0
- v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
- v0/relationalai/semantics/metamodel/typer/checker.py +353 -0
- v0/relationalai/semantics/metamodel/typer/typer.py +1395 -0
- v0/relationalai/semantics/metamodel/util.py +505 -0
- v0/relationalai/semantics/metamodel/visitor.py +944 -0
- v0/relationalai/semantics/reasoners/__init__.py +10 -0
- v0/relationalai/semantics/reasoners/graph/__init__.py +37 -0
- v0/relationalai/semantics/reasoners/graph/core.py +9019 -0
- v0/relationalai/semantics/reasoners/optimization/__init__.py +68 -0
- v0/relationalai/semantics/reasoners/optimization/common.py +88 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
- v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +1163 -0
- v0/relationalai/semantics/rel/builtins.py +40 -0
- v0/relationalai/semantics/rel/compiler.py +989 -0
- v0/relationalai/semantics/rel/executor.py +359 -0
- v0/relationalai/semantics/rel/rel.py +482 -0
- v0/relationalai/semantics/rel/rel_utils.py +276 -0
- v0/relationalai/semantics/snowflake/__init__.py +3 -0
- v0/relationalai/semantics/sql/compiler.py +2503 -0
- v0/relationalai/semantics/sql/executor/duck_db.py +52 -0
- v0/relationalai/semantics/sql/executor/result_helpers.py +64 -0
- v0/relationalai/semantics/sql/executor/snowflake.py +145 -0
- v0/relationalai/semantics/sql/rewrite/denormalize.py +222 -0
- v0/relationalai/semantics/sql/rewrite/double_negation.py +49 -0
- v0/relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
- v0/relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
- v0/relationalai/semantics/sql/sql.py +504 -0
- v0/relationalai/semantics/std/__init__.py +54 -0
- v0/relationalai/semantics/std/constraints.py +43 -0
- v0/relationalai/semantics/std/datetime.py +363 -0
- v0/relationalai/semantics/std/decimals.py +62 -0
- v0/relationalai/semantics/std/floats.py +7 -0
- v0/relationalai/semantics/std/integers.py +22 -0
- v0/relationalai/semantics/std/math.py +141 -0
- v0/relationalai/semantics/std/pragmas.py +11 -0
- v0/relationalai/semantics/std/re.py +83 -0
- v0/relationalai/semantics/std/std.py +14 -0
- v0/relationalai/semantics/std/strings.py +63 -0
- v0/relationalai/semantics/tests/__init__.py +0 -0
- v0/relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
- v0/relationalai/semantics/tests/test_snapshot_base.py +9 -0
- v0/relationalai/semantics/tests/utils.py +46 -0
- v0/relationalai/std/__init__.py +70 -0
- v0/relationalai/tools/__init__.py +0 -0
- v0/relationalai/tools/cli.py +1940 -0
- v0/relationalai/tools/cli_controls.py +1826 -0
- v0/relationalai/tools/cli_helpers.py +390 -0
- v0/relationalai/tools/debugger.py +183 -0
- v0/relationalai/tools/debugger_client.py +109 -0
- v0/relationalai/tools/debugger_server.py +302 -0
- v0/relationalai/tools/dev.py +685 -0
- v0/relationalai/tools/qb_debugger.py +425 -0
- v0/relationalai/util/clean_up_databases.py +95 -0
- v0/relationalai/util/format.py +123 -0
- v0/relationalai/util/list_databases.py +9 -0
- v0/relationalai/util/otel_configuration.py +25 -0
- v0/relationalai/util/otel_handler.py +484 -0
- v0/relationalai/util/snowflake_handler.py +88 -0
- v0/relationalai/util/span_format_test.py +43 -0
- v0/relationalai/util/span_tracker.py +207 -0
- v0/relationalai/util/spans_file_handler.py +72 -0
- v0/relationalai/util/tracing_handler.py +34 -0
- frontend/debugger/dist/.gitignore +0 -2
- frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
- frontend/debugger/dist/assets/index-Cssla-O7.js +0 -208
- frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -9
- frontend/debugger/dist/index.html +0 -17
- relationalai/clients/__init__.py +0 -18
- relationalai/clients/client.py +0 -946
- relationalai/clients/config.py +0 -673
- relationalai/clients/direct_access_client.py +0 -118
- relationalai/clients/exec_txn_poller.py +0 -153
- relationalai/clients/hash_util.py +0 -31
- relationalai/clients/local.py +0 -594
- relationalai/clients/profile_polling.py +0 -73
- relationalai/clients/resources/__init__.py +0 -8
- relationalai/clients/resources/azure/azure.py +0 -502
- relationalai/clients/resources/snowflake/__init__.py +0 -20
- relationalai/clients/resources/snowflake/cli_resources.py +0 -98
- relationalai/clients/resources/snowflake/direct_access_resources.py +0 -739
- relationalai/clients/resources/snowflake/engine_service.py +0 -381
- relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -315
- relationalai/clients/resources/snowflake/error_handlers.py +0 -240
- relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -249
- relationalai/clients/resources/snowflake/resources_factory.py +0 -99
- relationalai/clients/resources/snowflake/snowflake.py +0 -3193
- relationalai/clients/resources/snowflake/use_index_poller.py +0 -1019
- relationalai/clients/resources/snowflake/use_index_resources.py +0 -188
- relationalai/clients/resources/snowflake/util.py +0 -387
- relationalai/clients/result_helpers.py +0 -420
- relationalai/clients/types.py +0 -118
- relationalai/clients/util.py +0 -356
- relationalai/debugging.py +0 -389
- relationalai/dsl.py +0 -1749
- relationalai/early_access/builder/__init__.py +0 -30
- relationalai/early_access/builder/builder/__init__.py +0 -35
- relationalai/early_access/builder/snowflake/__init__.py +0 -12
- relationalai/early_access/builder/std/__init__.py +0 -25
- relationalai/early_access/builder/std/decimals/__init__.py +0 -12
- relationalai/early_access/builder/std/integers/__init__.py +0 -12
- relationalai/early_access/builder/std/math/__init__.py +0 -12
- relationalai/early_access/builder/std/strings/__init__.py +0 -14
- relationalai/early_access/devtools/__init__.py +0 -12
- relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
- relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
- relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
- relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
- relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
- relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
- relationalai/early_access/dsl/bindings/common.py +0 -402
- relationalai/early_access/dsl/bindings/csv.py +0 -170
- relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
- relationalai/early_access/dsl/bindings/snowflake.py +0 -64
- relationalai/early_access/dsl/codegen/binder.py +0 -411
- relationalai/early_access/dsl/codegen/common.py +0 -79
- relationalai/early_access/dsl/codegen/helpers.py +0 -23
- relationalai/early_access/dsl/codegen/relations.py +0 -700
- relationalai/early_access/dsl/codegen/weaver.py +0 -417
- relationalai/early_access/dsl/core/builders/__init__.py +0 -47
- relationalai/early_access/dsl/core/builders/logic.py +0 -19
- relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
- relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
- relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
- relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
- relationalai/early_access/dsl/core/context.py +0 -13
- relationalai/early_access/dsl/core/cset.py +0 -132
- relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
- relationalai/early_access/dsl/core/exprs/relational.py +0 -18
- relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
- relationalai/early_access/dsl/core/instances.py +0 -44
- relationalai/early_access/dsl/core/logic/__init__.py +0 -193
- relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
- relationalai/early_access/dsl/core/logic/exists.py +0 -223
- relationalai/early_access/dsl/core/logic/helper.py +0 -163
- relationalai/early_access/dsl/core/namespaces.py +0 -32
- relationalai/early_access/dsl/core/relations.py +0 -276
- relationalai/early_access/dsl/core/rules.py +0 -112
- relationalai/early_access/dsl/core/std/__init__.py +0 -45
- relationalai/early_access/dsl/core/temporal/recall.py +0 -6
- relationalai/early_access/dsl/core/types/__init__.py +0 -270
- relationalai/early_access/dsl/core/types/concepts.py +0 -128
- relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
- relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
- relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
- relationalai/early_access/dsl/core/types/standard.py +0 -92
- relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
- relationalai/early_access/dsl/core/types/variables.py +0 -203
- relationalai/early_access/dsl/ir/compiler.py +0 -318
- relationalai/early_access/dsl/ir/executor.py +0 -260
- relationalai/early_access/dsl/ontologies/constraints.py +0 -88
- relationalai/early_access/dsl/ontologies/export.py +0 -30
- relationalai/early_access/dsl/ontologies/models.py +0 -453
- relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
- relationalai/early_access/dsl/ontologies/readings.py +0 -60
- relationalai/early_access/dsl/ontologies/relationships.py +0 -322
- relationalai/early_access/dsl/ontologies/roles.py +0 -87
- relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
- relationalai/early_access/dsl/orm/constraints.py +0 -438
- relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
- relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
- relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
- relationalai/early_access/dsl/orm/measures/measures.py +0 -299
- relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
- relationalai/early_access/dsl/orm/models.py +0 -256
- relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
- relationalai/early_access/dsl/orm/printer.py +0 -469
- relationalai/early_access/dsl/orm/reasoners.py +0 -480
- relationalai/early_access/dsl/orm/relations.py +0 -19
- relationalai/early_access/dsl/orm/relationships.py +0 -251
- relationalai/early_access/dsl/orm/types.py +0 -42
- relationalai/early_access/dsl/orm/utils.py +0 -79
- relationalai/early_access/dsl/orm/verb.py +0 -204
- relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
- relationalai/early_access/dsl/relations.py +0 -170
- relationalai/early_access/dsl/rulesets.py +0 -69
- relationalai/early_access/dsl/schemas/__init__.py +0 -450
- relationalai/early_access/dsl/schemas/builder.py +0 -48
- relationalai/early_access/dsl/schemas/comp_names.py +0 -51
- relationalai/early_access/dsl/schemas/components.py +0 -203
- relationalai/early_access/dsl/schemas/contexts.py +0 -156
- relationalai/early_access/dsl/schemas/exprs.py +0 -89
- relationalai/early_access/dsl/schemas/fragments.py +0 -464
- relationalai/early_access/dsl/serialization.py +0 -79
- relationalai/early_access/dsl/serialize/exporter.py +0 -163
- relationalai/early_access/dsl/snow/api.py +0 -105
- relationalai/early_access/dsl/snow/common.py +0 -76
- relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
- relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
- relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
- relationalai/early_access/dsl/types/__init__.py +0 -40
- relationalai/early_access/dsl/types/concepts.py +0 -12
- relationalai/early_access/dsl/types/entities.py +0 -135
- relationalai/early_access/dsl/types/values.py +0 -17
- relationalai/early_access/dsl/utils.py +0 -102
- relationalai/early_access/graphs/__init__.py +0 -13
- relationalai/early_access/lqp/__init__.py +0 -12
- relationalai/early_access/lqp/compiler/__init__.py +0 -12
- relationalai/early_access/lqp/constructors/__init__.py +0 -18
- relationalai/early_access/lqp/executor/__init__.py +0 -12
- relationalai/early_access/lqp/ir/__init__.py +0 -12
- relationalai/early_access/lqp/passes/__init__.py +0 -12
- relationalai/early_access/lqp/pragmas/__init__.py +0 -12
- relationalai/early_access/lqp/primitives/__init__.py +0 -12
- relationalai/early_access/lqp/types/__init__.py +0 -12
- relationalai/early_access/lqp/utils/__init__.py +0 -12
- relationalai/early_access/lqp/validators/__init__.py +0 -12
- relationalai/early_access/metamodel/__init__.py +0 -58
- relationalai/early_access/metamodel/builtins/__init__.py +0 -12
- relationalai/early_access/metamodel/compiler/__init__.py +0 -12
- relationalai/early_access/metamodel/dependency/__init__.py +0 -12
- relationalai/early_access/metamodel/factory/__init__.py +0 -17
- relationalai/early_access/metamodel/helpers/__init__.py +0 -12
- relationalai/early_access/metamodel/ir/__init__.py +0 -14
- relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
- relationalai/early_access/metamodel/typer/__init__.py +0 -3
- relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
- relationalai/early_access/metamodel/types/__init__.py +0 -15
- relationalai/early_access/metamodel/util/__init__.py +0 -15
- relationalai/early_access/metamodel/visitor/__init__.py +0 -12
- relationalai/early_access/rel/__init__.py +0 -12
- relationalai/early_access/rel/executor/__init__.py +0 -12
- relationalai/early_access/rel/rel_utils/__init__.py +0 -12
- relationalai/early_access/rel/rewrite/__init__.py +0 -7
- relationalai/early_access/solvers/__init__.py +0 -19
- relationalai/early_access/sql/__init__.py +0 -11
- relationalai/early_access/sql/executor/__init__.py +0 -3
- relationalai/early_access/sql/rewrite/__init__.py +0 -3
- relationalai/early_access/tests/logging/__init__.py +0 -12
- relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
- relationalai/early_access/tests/utils/__init__.py +0 -12
- relationalai/environments/__init__.py +0 -35
- relationalai/environments/base.py +0 -381
- relationalai/environments/colab.py +0 -14
- relationalai/environments/generic.py +0 -71
- relationalai/environments/ipython.py +0 -68
- relationalai/environments/jupyter.py +0 -9
- relationalai/environments/snowbook.py +0 -169
- relationalai/errors.py +0 -2496
- relationalai/experimental/SF.py +0 -38
- relationalai/experimental/inspect.py +0 -47
- relationalai/experimental/pathfinder/__init__.py +0 -158
- relationalai/experimental/pathfinder/api.py +0 -160
- relationalai/experimental/pathfinder/automaton.py +0 -584
- relationalai/experimental/pathfinder/bridge.py +0 -226
- relationalai/experimental/pathfinder/compiler.py +0 -416
- relationalai/experimental/pathfinder/datalog.py +0 -214
- relationalai/experimental/pathfinder/diagnostics.py +0 -56
- relationalai/experimental/pathfinder/filter.py +0 -236
- relationalai/experimental/pathfinder/glushkov.py +0 -439
- relationalai/experimental/pathfinder/options.py +0 -265
- relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -1951
- relationalai/experimental/pathfinder/rpq.py +0 -344
- relationalai/experimental/pathfinder/transition.py +0 -200
- relationalai/experimental/pathfinder/utils.py +0 -26
- relationalai/experimental/paths/README.md +0 -107
- relationalai/experimental/paths/api.py +0 -143
- relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
- relationalai/experimental/paths/code_organization.md +0 -2
- relationalai/experimental/paths/examples/Movies.ipynb +0 -16328
- relationalai/experimental/paths/examples/basic_example.py +0 -40
- relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
- relationalai/experimental/paths/examples/movie_example.py +0 -77
- relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -193
- relationalai/experimental/paths/examples/movies_data/directed.csv +0 -45
- relationalai/experimental/paths/examples/movies_data/follows.csv +0 -7
- relationalai/experimental/paths/examples/movies_data/movies.csv +0 -39
- relationalai/experimental/paths/examples/movies_data/person.csv +0 -134
- relationalai/experimental/paths/examples/movies_data/produced.csv +0 -16
- relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -10
- relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -11
- relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
- relationalai/experimental/paths/examples/paths_example.py +0 -116
- relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
- relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
- relationalai/experimental/paths/graph.py +0 -185
- relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
- relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
- relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
- relationalai/experimental/paths/path_algorithms/single.py +0 -59
- relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
- relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
- relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
- relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
- relationalai/experimental/paths/path_algorithms/usp.py +0 -150
- relationalai/experimental/paths/product_graph.py +0 -93
- relationalai/experimental/paths/rpq/automaton.py +0 -584
- relationalai/experimental/paths/rpq/diagnostics.py +0 -56
- relationalai/experimental/paths/rpq/rpq.py +0 -378
- relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
- relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
- relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
- relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
- relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
- relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
- relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
- relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
- relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
- relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
- relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
- relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
- relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
- relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
- relationalai/experimental/paths/tree_agg.py +0 -168
- relationalai/experimental/paths/utilities/iterators.py +0 -27
- relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
- relationalai/experimental/solvers.py +0 -1095
- relationalai/loaders/csv.py +0 -195
- relationalai/loaders/loader.py +0 -177
- relationalai/loaders/types.py +0 -23
- relationalai/rel_emitter.py +0 -373
- relationalai/rel_utils.py +0 -185
- relationalai/semantics/designs/query_builder/identify_by.md +0 -106
- relationalai/semantics/devtools/benchmark_lqp.py +0 -535
- relationalai/semantics/devtools/compilation_manager.py +0 -294
- relationalai/semantics/devtools/extract_lqp.py +0 -110
- relationalai/semantics/internal/internal.py +0 -3785
- relationalai/semantics/internal/snowflake.py +0 -329
- relationalai/semantics/lqp/README.md +0 -34
- relationalai/semantics/lqp/algorithms.py +0 -173
- relationalai/semantics/lqp/builtins.py +0 -213
- relationalai/semantics/lqp/compiler.py +0 -22
- relationalai/semantics/lqp/constructors.py +0 -68
- relationalai/semantics/lqp/executor.py +0 -518
- relationalai/semantics/lqp/export_rewriter.py +0 -40
- relationalai/semantics/lqp/intrinsics.py +0 -24
- relationalai/semantics/lqp/ir.py +0 -150
- relationalai/semantics/lqp/model2lqp.py +0 -1056
- relationalai/semantics/lqp/passes.py +0 -38
- relationalai/semantics/lqp/primitives.py +0 -252
- relationalai/semantics/lqp/result_helpers.py +0 -266
- relationalai/semantics/lqp/rewrite/__init__.py +0 -32
- relationalai/semantics/lqp/rewrite/algorithm.py +0 -385
- relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -69
- relationalai/semantics/lqp/rewrite/cdc.py +0 -216
- relationalai/semantics/lqp/rewrite/constants_to_vars.py +0 -70
- relationalai/semantics/lqp/rewrite/deduplicate_vars.py +0 -104
- relationalai/semantics/lqp/rewrite/eliminate_data.py +0 -108
- relationalai/semantics/lqp/rewrite/extract_common.py +0 -340
- relationalai/semantics/lqp/rewrite/extract_keys.py +0 -577
- relationalai/semantics/lqp/rewrite/flatten_script.py +0 -301
- relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
- relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -348
- relationalai/semantics/lqp/rewrite/period_math.py +0 -77
- relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -339
- relationalai/semantics/lqp/rewrite/splinter.py +0 -76
- relationalai/semantics/lqp/rewrite/unify_definitions.py +0 -323
- relationalai/semantics/lqp/types.py +0 -101
- relationalai/semantics/lqp/utils.py +0 -170
- relationalai/semantics/lqp/validators.py +0 -70
- relationalai/semantics/metamodel/compiler.py +0 -134
- relationalai/semantics/metamodel/dependency.py +0 -880
- relationalai/semantics/metamodel/executor.py +0 -78
- relationalai/semantics/metamodel/factory.py +0 -287
- relationalai/semantics/metamodel/helpers.py +0 -368
- relationalai/semantics/metamodel/ir.py +0 -924
- relationalai/semantics/metamodel/rewrite/__init__.py +0 -8
- relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
- relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -220
- relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
- relationalai/semantics/metamodel/rewrite/flatten.py +0 -590
- relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -256
- relationalai/semantics/metamodel/rewrite/handle_aggregations_and_ranks.py +0 -237
- relationalai/semantics/metamodel/typer/checker.py +0 -355
- relationalai/semantics/metamodel/typer/typer.py +0 -1396
- relationalai/semantics/metamodel/util.py +0 -506
- relationalai/semantics/metamodel/visitor.py +0 -945
- relationalai/semantics/reasoners/__init__.py +0 -10
- relationalai/semantics/reasoners/graph/README.md +0 -620
- relationalai/semantics/reasoners/graph/__init__.py +0 -37
- relationalai/semantics/reasoners/graph/core.py +0 -9019
- relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -797
- relationalai/semantics/reasoners/graph/tests/README.md +0 -21
- relationalai/semantics/reasoners/optimization/__init__.py +0 -68
- relationalai/semantics/reasoners/optimization/common.py +0 -88
- relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
- relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1407
- relationalai/semantics/rel/builtins.py +0 -40
- relationalai/semantics/rel/compiler.py +0 -994
- relationalai/semantics/rel/executor.py +0 -363
- relationalai/semantics/rel/rel.py +0 -482
- relationalai/semantics/rel/rel_utils.py +0 -276
- relationalai/semantics/snowflake/__init__.py +0 -3
- relationalai/semantics/sql/compiler.py +0 -2503
- relationalai/semantics/sql/executor/duck_db.py +0 -52
- relationalai/semantics/sql/executor/result_helpers.py +0 -64
- relationalai/semantics/sql/executor/snowflake.py +0 -149
- relationalai/semantics/sql/rewrite/denormalize.py +0 -222
- relationalai/semantics/sql/rewrite/double_negation.py +0 -49
- relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
- relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
- relationalai/semantics/sql/sql.py +0 -504
- relationalai/semantics/std/pragmas.py +0 -11
- relationalai/semantics/std/std.py +0 -14
- relationalai/semantics/tests/lqp/algorithms.py +0 -345
- relationalai/semantics/tests/test_snapshot_abstract.py +0 -144
- relationalai/semantics/tests/test_snapshot_base.py +0 -9
- relationalai/semantics/tests/utils.py +0 -46
- relationalai/std/__init__.py +0 -70
- relationalai/tools/cli.py +0 -2089
- relationalai/tools/cli_controls.py +0 -1975
- relationalai/tools/cli_helpers.py +0 -802
- relationalai/tools/debugger_client.py +0 -109
- relationalai/tools/debugger_server.py +0 -302
- relationalai/tools/dev.py +0 -685
- relationalai/tools/notes +0 -7
- relationalai/tools/qb_debugger.py +0 -425
- relationalai/tools/txn_progress.py +0 -188
- relationalai/util/clean_up_databases.py +0 -95
- relationalai/util/list_databases.py +0 -9
- relationalai/util/otel_configuration.py +0 -26
- relationalai/util/otel_handler.py +0 -484
- relationalai/util/snowflake_handler.py +0 -88
- relationalai/util/span_format_test.py +0 -43
- relationalai/util/span_tracker.py +0 -207
- relationalai/util/spans_file_handler.py +0 -72
- relationalai/util/tracing_handler.py +0 -34
- relationalai-0.13.5.dist-info/METADATA +0 -74
- relationalai-0.13.5.dist-info/RECORD +0 -473
- relationalai-0.13.5.dist-info/WHEEL +0 -4
- relationalai-0.13.5.dist-info/entry_points.txt +0 -3
- relationalai-0.13.5.dist-info/licenses/LICENSE +0 -202
- relationalai_test_util/__init__.py +0 -4
- relationalai_test_util/fixtures.py +0 -233
- relationalai_test_util/snapshot.py +0 -252
- relationalai_test_util/traceback.py +0 -118
- /relationalai/{analysis → semantics/frontend}/__init__.py +0 -0
- /relationalai/{auth/__init__.py → semantics/metamodel/metamodel_compiler.py} +0 -0
- /relationalai/{early_access → shims}/__init__.py +0 -0
- {relationalai/early_access/dsl/adapters → v0/relationalai/analysis}/__init__.py +0 -0
- {relationalai → v0/relationalai}/analysis/mechanistic.py +0 -0
- {relationalai → v0/relationalai}/analysis/whynot.py +0 -0
- {relationalai/early_access/dsl/adapters/orm → v0/relationalai/auth}/__init__.py +0 -0
- {relationalai → v0/relationalai}/auth/jwt_generator.py +0 -0
- {relationalai → v0/relationalai}/auth/oauth_callback_server.py +0 -0
- {relationalai → v0/relationalai}/auth/token_handler.py +0 -0
- {relationalai → v0/relationalai}/auth/util.py +0 -0
- {relationalai/clients/resources/snowflake → v0/relationalai/clients}/cache_store.py +0 -0
- {relationalai → v0/relationalai}/compiler.py +0 -0
- {relationalai → v0/relationalai}/dependencies.py +0 -0
- {relationalai → v0/relationalai}/docutils.py +0 -0
- {relationalai/early_access/dsl/adapters/owl → v0/relationalai/early_access}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings → v0/relationalai/early_access/dsl/adapters}/__init__.py +0 -0
- {relationalai/early_access/dsl/bindings/legacy → v0/relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
- {relationalai/early_access/dsl/codegen → v0/relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
- {relationalai/early_access/dsl/core/temporal → v0/relationalai/early_access/dsl/bindings}/__init__.py +0 -0
- {relationalai/early_access/dsl/ir → v0/relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
- {relationalai/early_access/dsl/ontologies → v0/relationalai/early_access/dsl/codegen}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/constants.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/stack.py +0 -0
- {relationalai/early_access/dsl/orm → v0/relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/core/utils.py +0 -0
- {relationalai/early_access/dsl/orm/measures → v0/relationalai/early_access/dsl/ir}/__init__.py +0 -0
- {relationalai/early_access/dsl/physical_metadata → v0/relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
- {relationalai/early_access/dsl/serialize → v0/relationalai/early_access/dsl/orm}/__init__.py +0 -0
- {relationalai/early_access/dsl/snow → v0/relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
- {relationalai/loaders → v0/relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
- {relationalai/semantics/tests → v0/relationalai/early_access/dsl/serialize}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
- {relationalai → v0/relationalai}/early_access/dsl/serialize/model.py +0 -0
- {relationalai/semantics/tests/lqp → v0/relationalai/early_access/dsl/snow}/__init__.py +0 -0
- {relationalai → v0/relationalai}/early_access/tests/__init__.py +0 -0
- {relationalai → v0/relationalai}/environments/ci.py +0 -0
- {relationalai → v0/relationalai}/environments/hex.py +0 -0
- {relationalai → v0/relationalai}/environments/terminal.py +0 -0
- {relationalai → v0/relationalai}/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/graphs.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/filter.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/glushkov.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/rpq/transition.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/__init__.py +0 -0
- {relationalai → v0/relationalai}/experimental/paths/utilities/utilities.py +0 -0
- {relationalai/tools → v0/relationalai/loaders}/__init__.py +0 -0
- {relationalai → v0/relationalai}/metagen.py +0 -0
- {relationalai → v0/relationalai}/metamodel.py +0 -0
- {relationalai → v0/relationalai}/rel.py +0 -0
- {relationalai → v0/relationalai}/semantics/devtools/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/internal/annotations.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/lqp/pragmas.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/dataflow.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/typer/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/metamodel/types.py +0 -0
- {relationalai → v0/relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/rel/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/executor/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/sql/rewrite/__init__.py +0 -0
- {relationalai → v0/relationalai}/semantics/tests/logging.py +0 -0
- {relationalai → v0/relationalai}/std/aggregates.py +0 -0
- {relationalai → v0/relationalai}/std/dates.py +0 -0
- {relationalai → v0/relationalai}/std/graphs.py +0 -0
- {relationalai → v0/relationalai}/std/inspect.py +0 -0
- {relationalai → v0/relationalai}/std/math.py +0 -0
- {relationalai → v0/relationalai}/std/re.py +0 -0
- {relationalai → v0/relationalai}/std/strings.py +0 -0
- {relationalai → v0/relationalai}/tools/cleanup_snapshots.py +0 -0
- {relationalai → v0/relationalai}/tools/constants.py +0 -0
- {relationalai → v0/relationalai}/tools/query_utils.py +0 -0
- {relationalai → v0/relationalai}/tools/snapshot_viewer.py +0 -0
- {relationalai → v0/relationalai}/util/__init__.py +0 -0
- {relationalai → v0/relationalai}/util/constants.py +0 -0
- {relationalai → v0/relationalai}/util/graph.py +0 -0
- {relationalai → v0/relationalai}/util/timeout.py +0 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Optional, Any, Union
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
import v0.relationalai.semantics as qb
|
|
6
|
+
from v0.relationalai.semantics.internal.internal import RelationshipFieldRef, Field
|
|
7
|
+
from v0.relationalai.early_access.dsl.core.utils import generate_stable_uuid
|
|
8
|
+
from v0.relationalai.early_access.dsl.orm.utils import generate_rai_way_name
|
|
9
|
+
|
|
10
|
+
##########
|
|
11
|
+
# Utility functions for parsing RelationshipReading patterns
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
def leading_text_of(reading: RelationshipReading):
|
|
15
|
+
pattern = r"^([^{]*).*$"
|
|
16
|
+
return re.findall(pattern, reading._madlib)[0].strip()
|
|
17
|
+
|
|
18
|
+
# Returns the dictionary of texts following a role (empty string if not present)
|
|
19
|
+
# indexed by the role position
|
|
20
|
+
#
|
|
21
|
+
def roles_data_from(reading: RelationshipReading):
|
|
22
|
+
# This pattern capture the player name (with optional role name) and the following text for each
|
|
23
|
+
# role in the madlib string
|
|
24
|
+
# \{([^{}]*)\} Player or role_name:Player
|
|
25
|
+
# ([^{]*) Following text
|
|
26
|
+
pattern = r"\{([^{}]*)\}([^{]*)"
|
|
27
|
+
|
|
28
|
+
matches = re.findall(pattern, reading._madlib)
|
|
29
|
+
following_texts = dict()
|
|
30
|
+
|
|
31
|
+
for i, (_, follows) in enumerate(matches):
|
|
32
|
+
following_texts[i] = follows.strip()
|
|
33
|
+
return following_texts
|
|
34
|
+
|
|
35
|
+
# Analyzes a substring of relationship-reading pattern text that contains
|
|
36
|
+
# no role occurrences and refines it into a triple of 3 optional strings:
|
|
37
|
+
#
|
|
38
|
+
# - post: is a substring of text that post-binds to the role occurrence
|
|
39
|
+
# that this text follows
|
|
40
|
+
# - inter: is a substring that is not part of any post or pre bound text
|
|
41
|
+
# - pre: is a substring that pre-binds the role occurrence that follows
|
|
42
|
+
# this text sequence in the original reading pattern.
|
|
43
|
+
#
|
|
44
|
+
# Any of these sequences could be empty on return.
|
|
45
|
+
#
|
|
46
|
+
def refine_reading_text(text):
|
|
47
|
+
found_prefix = False
|
|
48
|
+
post = None
|
|
49
|
+
inter = None
|
|
50
|
+
pre = None
|
|
51
|
+
|
|
52
|
+
inter_seq = []
|
|
53
|
+
pre_seq = []
|
|
54
|
+
|
|
55
|
+
tokens = text.split()
|
|
56
|
+
for v in tokens:
|
|
57
|
+
if v.startswith('-'):
|
|
58
|
+
if found_prefix:
|
|
59
|
+
raise Exception(f"Malformed reading text {text} has prefix text preceding postfix text")
|
|
60
|
+
inter_seq.append(v[1:])
|
|
61
|
+
post = " ".join(inter_seq)
|
|
62
|
+
inter_seq = []
|
|
63
|
+
elif v.endswith('-'):
|
|
64
|
+
if found_prefix:
|
|
65
|
+
raise Exception(f"Malformed reading text {text} has multple postfix text delimeters")
|
|
66
|
+
found_prefix = True
|
|
67
|
+
pre_seq = [ v[0:len(v)-1] ]
|
|
68
|
+
else:
|
|
69
|
+
if found_prefix:
|
|
70
|
+
pre_seq.append(v)
|
|
71
|
+
else:
|
|
72
|
+
inter_seq.append(v)
|
|
73
|
+
|
|
74
|
+
if len(pre_seq) > 0:
|
|
75
|
+
pre = " ".join(pre_seq)
|
|
76
|
+
if len(inter_seq) > 0:
|
|
77
|
+
inter = " ".join(inter_seq)
|
|
78
|
+
|
|
79
|
+
return (post, inter, pre)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class Relationship(qb.Relationship):
|
|
83
|
+
|
|
84
|
+
def __init__(self, model, madlib:Any, short_name:str="", fields:Optional[list[Field]]=None):
|
|
85
|
+
super().__init__(madlib, short_name=short_name, model=model.qb_model(), fields=fields)
|
|
86
|
+
self._dsl_model = model
|
|
87
|
+
self._rel_roles = {field.name: self.__getitem__(field.name) for field in self._fields}
|
|
88
|
+
self._readings[0] = RelationshipReading(self._dsl_model, madlib, self, short_name)
|
|
89
|
+
|
|
90
|
+
def __getitem__(self, arg:Union[str, int, qb.Concept]) -> Any:
|
|
91
|
+
rel_field_ref = super().__getitem__(arg)
|
|
92
|
+
field_name = rel_field_ref._field_ref._name
|
|
93
|
+
if hasattr(self, "_rel_roles"):
|
|
94
|
+
if field_name in self._rel_roles:
|
|
95
|
+
return self._rel_roles[field_name]
|
|
96
|
+
else:
|
|
97
|
+
raise ValueError(f"{arg} is undefined for {self._name}")
|
|
98
|
+
return Role._from_field(rel_field_ref)
|
|
99
|
+
|
|
100
|
+
def _guid(self):
|
|
101
|
+
return generate_stable_uuid(str(self._id))
|
|
102
|
+
|
|
103
|
+
def alt(self, madlib:Any, short_name:str = "", reading:qb.RelationshipReading|None = None) -> qb.RelationshipReading:
|
|
104
|
+
return super().alt(madlib, short_name=short_name,
|
|
105
|
+
reading=RelationshipReading(self._dsl_model, madlib, self, short_name))
|
|
106
|
+
|
|
107
|
+
def _unary(self):
|
|
108
|
+
return self._arity() == 1
|
|
109
|
+
|
|
110
|
+
def _binary(self):
|
|
111
|
+
return self._arity() == 2
|
|
112
|
+
|
|
113
|
+
def _first(self):
|
|
114
|
+
return self.__getitem__(0)
|
|
115
|
+
|
|
116
|
+
def _roles(self):
|
|
117
|
+
return [self._rel_roles[field.name] for field in self._fields]
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class RelationshipReading(qb.RelationshipReading):
|
|
121
|
+
|
|
122
|
+
def __init__(self, model, madlib:Any, alt_of:Relationship, short_name:str):
|
|
123
|
+
super().__init__(madlib, alt_of, short_name, model=model.qb_model())
|
|
124
|
+
self._dsl_model = model
|
|
125
|
+
self._prepare()
|
|
126
|
+
|
|
127
|
+
def __getitem__(self, arg:Union[str, int, qb.Concept]) -> Any:
|
|
128
|
+
return Role._from_field(super().__getitem__(arg))
|
|
129
|
+
|
|
130
|
+
def _guid(self):
|
|
131
|
+
return generate_stable_uuid(str(self._id))
|
|
132
|
+
|
|
133
|
+
def _unary(self):
|
|
134
|
+
return self._arity() == 1
|
|
135
|
+
|
|
136
|
+
def _binary(self):
|
|
137
|
+
return self._arity() == 2
|
|
138
|
+
|
|
139
|
+
def _first(self):
|
|
140
|
+
return self.__getitem__(0)
|
|
141
|
+
|
|
142
|
+
def _last(self):
|
|
143
|
+
roles = self._roles()
|
|
144
|
+
return roles[len(roles) - 1]
|
|
145
|
+
|
|
146
|
+
def _roles(self):
|
|
147
|
+
return [self._alt_of._rel_roles[field.name] for field in self._fields]
|
|
148
|
+
|
|
149
|
+
def rai_way_name(self):
|
|
150
|
+
return generate_rai_way_name(self)
|
|
151
|
+
|
|
152
|
+
def _sample_fact(self) -> str:
|
|
153
|
+
verb = []
|
|
154
|
+
for idx in range(len(self._role_in_reading)):
|
|
155
|
+
verb.append(str(self._role_in_reading[idx]))
|
|
156
|
+
follows = self._follows[idx]
|
|
157
|
+
if follows is not None:
|
|
158
|
+
verb.append(follows)
|
|
159
|
+
return ' '.join(verb)
|
|
160
|
+
|
|
161
|
+
# Analyzes the reading pattern supplied with this reading to compute:
|
|
162
|
+
# - the leading text (or None)
|
|
163
|
+
# - the sequence of role occurrences in this reading order, and
|
|
164
|
+
# - the sequence of text fragments that follow each role occurrence
|
|
165
|
+
# in this reading order
|
|
166
|
+
#
|
|
167
|
+
def _prepare(self):
|
|
168
|
+
|
|
169
|
+
self._follows: list[Optional[str]] = []
|
|
170
|
+
self._role_in_reading: list[RoleOccurrence] = []
|
|
171
|
+
|
|
172
|
+
(post, self._leading_text, pre) = refine_reading_text(leading_text_of(self))
|
|
173
|
+
pre_seq = {0: pre}
|
|
174
|
+
role_seq = self._roles()
|
|
175
|
+
|
|
176
|
+
idx = 0
|
|
177
|
+
dict = roles_data_from(self)
|
|
178
|
+
for v in dict.values():
|
|
179
|
+
(post, inter, pre) = refine_reading_text(v)
|
|
180
|
+
self._role_in_reading.append(RoleOccurrence(role_seq[idx], pre_seq[idx], post))
|
|
181
|
+
self._follows.append(inter)
|
|
182
|
+
pre_seq[idx + 1] = pre
|
|
183
|
+
idx += 1
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class Role(RelationshipFieldRef):
|
|
187
|
+
_sibling: Optional[Role] = None
|
|
188
|
+
|
|
189
|
+
def __init__(self, parent:Any, part_of, pos):
|
|
190
|
+
super().__init__(parent, part_of, pos)
|
|
191
|
+
|
|
192
|
+
def _guid(self):
|
|
193
|
+
return generate_stable_uuid(f"{self._field_ix}_{self._part_of()._guid()}")
|
|
194
|
+
|
|
195
|
+
def player(self) -> qb.Concept:
|
|
196
|
+
return self._concept
|
|
197
|
+
|
|
198
|
+
def sibling(self):
|
|
199
|
+
if self._relationship._arity() == 2 and not self._sibling:
|
|
200
|
+
first_role = self._relationship[0]
|
|
201
|
+
sibling = self._relationship[1] if self._id == first_role._id else first_role
|
|
202
|
+
self._sibling = sibling
|
|
203
|
+
return self._sibling
|
|
204
|
+
|
|
205
|
+
def siblings(self):
|
|
206
|
+
return [self._relationship[i] for i in range(self._relationship._arity()) if i != self._field_ix]
|
|
207
|
+
|
|
208
|
+
def _part_of(self):
|
|
209
|
+
return self._relationship
|
|
210
|
+
|
|
211
|
+
@staticmethod
|
|
212
|
+
def _from_field(field:RelationshipFieldRef):
|
|
213
|
+
return Role(field._parent, field._relationship, field._field_ix)
|
|
214
|
+
|
|
215
|
+
def __hash__(self):
|
|
216
|
+
return hash(f"Role({self._guid()})")
|
|
217
|
+
|
|
218
|
+
def __eq__(self, other):
|
|
219
|
+
if not isinstance(other, Role):
|
|
220
|
+
return False
|
|
221
|
+
return self._guid() == other._guid() and self._part_of() == other._part_of()
|
|
222
|
+
|
|
223
|
+
# A RoleOccurrence objectifies the occurrence of a Role in some RelationshipReading
|
|
224
|
+
# to account for any pre- and/or post-bound text around the Role occurrence in
|
|
225
|
+
# that reading. For instance, in the RelationshipReading with this reading pattern:
|
|
226
|
+
#
|
|
227
|
+
# "{Person} has personal- {Vehicle}"
|
|
228
|
+
#
|
|
229
|
+
# the RoleOccurrences for the roles verbalize as
|
|
230
|
+
#
|
|
231
|
+
# "Person" and
|
|
232
|
+
# "personal Vehicle"
|
|
233
|
+
#
|
|
234
|
+
class RoleOccurrence:
|
|
235
|
+
|
|
236
|
+
def __init__(self, role: Role, pre: Optional[str], post: Optional[str]):
|
|
237
|
+
self._prefix: Optional[str] = pre
|
|
238
|
+
self._postfix: Optional[str] = post
|
|
239
|
+
self._role: Role = role
|
|
240
|
+
self._verbalizes_as: Optional[str] = None
|
|
241
|
+
|
|
242
|
+
def __str__(self):
|
|
243
|
+
if self._verbalizes_as is None:
|
|
244
|
+
verb_seq = []
|
|
245
|
+
if self._prefix is not None:
|
|
246
|
+
verb_seq.append(self._prefix)
|
|
247
|
+
verb_seq.append(str(self._role.player()))
|
|
248
|
+
if self._postfix is not None:
|
|
249
|
+
verb_seq.append(self._postfix)
|
|
250
|
+
self._verbalizes_as = " ".join(verb_seq)
|
|
251
|
+
return self._verbalizes_as
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from typing import Any, Union
|
|
2
|
+
|
|
3
|
+
import v0.relationalai.semantics as qb
|
|
4
|
+
from v0.relationalai.semantics.internal.internal import python_types_to_concepts
|
|
5
|
+
from v0.relationalai.early_access.dsl.core.utils import generate_stable_uuid
|
|
6
|
+
from v0.relationalai.early_access.dsl.orm.relationships import Relationship
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Concept(qb.Concept):
|
|
10
|
+
|
|
11
|
+
def __init__(self, model, name: str, extends: list[Any] = [], identify_by:dict[str, Any]={}):
|
|
12
|
+
self._dsl_model = model
|
|
13
|
+
# create an orm Relationship for each Concept to be able to refer to them in DSL model
|
|
14
|
+
identify_args = {}
|
|
15
|
+
if identify_by:
|
|
16
|
+
for k, v in identify_by.items():
|
|
17
|
+
if python_types_to_concepts.get(v):
|
|
18
|
+
v = python_types_to_concepts[v]
|
|
19
|
+
if isinstance(v, qb.Concept):
|
|
20
|
+
identify_args[k] = Relationship(self._dsl_model, f"{{{name}}} has {{{k}:{v._name}}}", short_name=k)
|
|
21
|
+
elif isinstance(v, type) and issubclass(v, self._dsl_model.Enum): #type: ignore
|
|
22
|
+
identify_args[k] = Relationship(self._dsl_model, f"{{{name}}} has {{{k}:{v._concept._name}}}", short_name=k)
|
|
23
|
+
elif isinstance(v, qb.Relationship):
|
|
24
|
+
identify_args[k] = v
|
|
25
|
+
else:
|
|
26
|
+
raise ValueError(f"identify_by must be either a Concept or Relationship: {k}={v}")
|
|
27
|
+
super().__init__(name, extends, model.qb_model(), identify_args)
|
|
28
|
+
self._dsl_model._add_concept(self)
|
|
29
|
+
self._dsl_model.reasoner().new_concept(self)
|
|
30
|
+
if identify_by:
|
|
31
|
+
# once concept is added, add constraints required for reference schema
|
|
32
|
+
self._dsl_model._ref_scheme_constraints(*identify_args.values())
|
|
33
|
+
|
|
34
|
+
def identify_by(self, *relations:Union[qb.Relationship, qb.RelationshipReading]):
|
|
35
|
+
super().identify_by(*relations)
|
|
36
|
+
self._dsl_model._ref_scheme_constraints(*relations)
|
|
37
|
+
|
|
38
|
+
def __repr__(self):
|
|
39
|
+
return f"Concept({self._name})"
|
|
40
|
+
|
|
41
|
+
def _guid(self):
|
|
42
|
+
return generate_stable_uuid(f"{self._id}")
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import keyword
|
|
4
|
+
from v0.relationalai.early_access.dsl.core.utils import camel_to_snake, to_rai_way_string
|
|
5
|
+
import v0.relationalai.early_access.dsl.orm.relationships as orm_qb
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# This method generates a string containing a standard abbreviated name for the given reading, generated according
|
|
9
|
+
# to the rai way conventions.
|
|
10
|
+
def generate_rai_way_name(reading: orm_qb.RelationshipReading):
|
|
11
|
+
# These two dict and the roles array are indexed in same way, using the role position in the madlib
|
|
12
|
+
roles = reading._roles()
|
|
13
|
+
|
|
14
|
+
# A role name must be different from player and player_i (used for multiple occurrences of the same player)
|
|
15
|
+
def get_role_name(idx: int):
|
|
16
|
+
player = roles[idx].player()._name.lower()
|
|
17
|
+
role_name = reading._fields[idx].name
|
|
18
|
+
if role_name != player and ("_" not in role_name or not role_name.split("_")[1].isdigit()):
|
|
19
|
+
return role_name
|
|
20
|
+
return ""
|
|
21
|
+
|
|
22
|
+
# We invoke this method with an index to compose together the textual parts of a single role (prefix, role/player
|
|
23
|
+
# name, postfix and following text.
|
|
24
|
+
def compose_role_textual_parts(idx: int, drop_is_has=True, drop_role_name=False):
|
|
25
|
+
textual_parts = []
|
|
26
|
+
role = roles[idx]
|
|
27
|
+
role_occurrence = reading._role_in_reading[idx]
|
|
28
|
+
role_name = get_role_name(idx)
|
|
29
|
+
if role_occurrence._prefix and (not role_name or drop_role_name):
|
|
30
|
+
textual_parts.append(camel_to_snake(role_occurrence._prefix))
|
|
31
|
+
if idx > 0:
|
|
32
|
+
textual_parts.append(camel_to_snake(role_name) if role_name and not drop_role_name
|
|
33
|
+
else camel_to_snake(role.player()._name))
|
|
34
|
+
if role_occurrence._postfix and (not role_name or drop_role_name):
|
|
35
|
+
textual_parts.append(camel_to_snake(role_occurrence._postfix))
|
|
36
|
+
follows = reading._follows[idx]
|
|
37
|
+
if follows:
|
|
38
|
+
rai_way_string = to_rai_way_string(follows, drop_is_has)
|
|
39
|
+
if rai_way_string:
|
|
40
|
+
textual_parts.append(rai_way_string)
|
|
41
|
+
return '_'.join(textual_parts).replace(" ", "_")
|
|
42
|
+
|
|
43
|
+
# Generate the rai way name for the binary case, when most of the role data in not present.
|
|
44
|
+
def generate_simple_binary_name():
|
|
45
|
+
follows = reading._follows[0]
|
|
46
|
+
if follows:
|
|
47
|
+
simple_name = to_rai_way_string(follows)
|
|
48
|
+
if (simple_name and not reading._follows[1] and not keyword.iskeyword(simple_name) and
|
|
49
|
+
not reading._role_in_reading[0]._prefix and not reading._role_in_reading[0]._postfix and
|
|
50
|
+
not reading._role_in_reading[1]._prefix and not reading._role_in_reading[1]._postfix):
|
|
51
|
+
return simple_name
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
# Unary case
|
|
55
|
+
if len(roles) == 1:
|
|
56
|
+
return compose_role_textual_parts(0)
|
|
57
|
+
# Binary case
|
|
58
|
+
elif len(roles) == 2:
|
|
59
|
+
# If there exists a role name for the second player, use it as rai way name
|
|
60
|
+
if get_role_name(1):
|
|
61
|
+
return camel_to_snake(get_role_name(1))
|
|
62
|
+
else:
|
|
63
|
+
simple_binary_name = generate_simple_binary_name()
|
|
64
|
+
if simple_binary_name:
|
|
65
|
+
return simple_binary_name
|
|
66
|
+
# General case: process all the components of both roles
|
|
67
|
+
else:
|
|
68
|
+
first_role_component = compose_role_textual_parts(0)
|
|
69
|
+
second_role_component = compose_role_textual_parts(1, False)
|
|
70
|
+
rel_name = f"{first_role_component}_{second_role_component}" if first_role_component != "" else second_role_component
|
|
71
|
+
return rel_name
|
|
72
|
+
# Ternary case and beyond
|
|
73
|
+
else:
|
|
74
|
+
all_roles_components = []
|
|
75
|
+
for i, role in enumerate(roles):
|
|
76
|
+
role_component = compose_role_textual_parts(i,False, True)
|
|
77
|
+
all_roles_components.append(role_component)
|
|
78
|
+
rel_name = "_".join(all_roles_components)
|
|
79
|
+
return rel_name
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
from v0.relationalai.early_access.dsl.orm.models import Model, Relationship, Role
|
|
3
|
+
from v0.relationalai.early_access.dsl.orm.reasoners import Multiplicity
|
|
4
|
+
|
|
5
|
+
# Decapitalizes (lowers first character of) a string
|
|
6
|
+
def decapitalize(text: str) -> str: return text[:1].lower() + text[1:]
|
|
7
|
+
|
|
8
|
+
class Verbalizer:
|
|
9
|
+
def __init__(self, model: Model):
|
|
10
|
+
self._model = model
|
|
11
|
+
|
|
12
|
+
# We cache incrementally maintainable RelationshipVerbaliers to prevent
|
|
13
|
+
# unnecessary recalculation while users are actively editing a model.
|
|
14
|
+
self._rel_verbs = {}
|
|
15
|
+
|
|
16
|
+
def verbalize(self, rel: Relationship) -> str:
|
|
17
|
+
if rel._id not in self._rel_verbs:
|
|
18
|
+
self._rel_verbs[rel._id] = RelationshipVerbalizer(rel, self._model)
|
|
19
|
+
return str(self._rel_verbs[rel._id])
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# PointMultiplicityVerbalizers are used to verbalize constraints on the
|
|
23
|
+
# Roles of some Relationship using some specific RelationshipReading of
|
|
24
|
+
# that Relationship. We verbalize these constraints in the language of
|
|
25
|
+
# point multiplicities of a given Role
|
|
26
|
+
#
|
|
27
|
+
class PointMultiplicityVerbalizer:
|
|
28
|
+
|
|
29
|
+
def __init__(self, reading, model: Model):
|
|
30
|
+
self._model = model
|
|
31
|
+
self._reading = reading
|
|
32
|
+
|
|
33
|
+
# Use this reading to verbalize the multiplicity of *role* in a context
|
|
34
|
+
# in which players for all of the other roles have been fixed.
|
|
35
|
+
#
|
|
36
|
+
def multiplicity_of(self, role: Role) -> str:
|
|
37
|
+
arity = role._part_of()._arity()
|
|
38
|
+
if arity == 1:
|
|
39
|
+
return self._multiplicity_of_unary(role)
|
|
40
|
+
if arity == 2:
|
|
41
|
+
return self._multiplicity_of_binary(role)
|
|
42
|
+
else:
|
|
43
|
+
return self._multiplicity_of_nary(role)
|
|
44
|
+
|
|
45
|
+
def sample_fact(self): return self._reading._sample_fact()
|
|
46
|
+
|
|
47
|
+
# Binary relationships admit much more readable multiplicity verbalizations
|
|
48
|
+
# than the more general n-ary relationships; so we handle them separately.
|
|
49
|
+
#
|
|
50
|
+
def _multiplicity_of_binary(self, role: Role):
|
|
51
|
+
reading = self._reading
|
|
52
|
+
|
|
53
|
+
role1_text = str(reading._role_in_reading[0])
|
|
54
|
+
pos1_text = str(role1_text) if reading._follows[0] is None else str(role1_text) + " " + reading._follows[0]
|
|
55
|
+
role2_text = str(reading._role_in_reading[1])
|
|
56
|
+
pos2_text = role2_text if reading._follows[1] is None else str(role2_text) + " " + reading._follows[1]
|
|
57
|
+
|
|
58
|
+
reasoner = self._model.reasoner()
|
|
59
|
+
mult = reasoner.point_multiplicity(role)
|
|
60
|
+
mult_verb = mult.qualifier()
|
|
61
|
+
leads = reading._leading_text
|
|
62
|
+
|
|
63
|
+
if role._id == reading._last()._id:
|
|
64
|
+
# When the role with multiplicity is the second in this reading,
|
|
65
|
+
# the reading is natural
|
|
66
|
+
if mult.many():
|
|
67
|
+
if leads is None:
|
|
68
|
+
return f"It is possible that some {pos1_text} {mult_verb} {pos2_text}"
|
|
69
|
+
else:
|
|
70
|
+
return f"It is possible that {decapitalize(leads)} some {pos1_text} {mult_verb} {pos2_text}"
|
|
71
|
+
else:
|
|
72
|
+
if leads is None:
|
|
73
|
+
return f"Each {pos1_text} {mult_verb} {pos2_text}"
|
|
74
|
+
else:
|
|
75
|
+
return f"{leads.capitalize()} each {pos1_text} {mult_verb} {pos2_text}"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
else:
|
|
79
|
+
# The role with multiplicity is the first in this reading
|
|
80
|
+
if mult.many():
|
|
81
|
+
if leads is None:
|
|
82
|
+
return f"It is possible that for some {role2_text}, {mult_verb} {pos1_text} that {pos2_text}"
|
|
83
|
+
else:
|
|
84
|
+
return f"It is possible that for some {role2_text}, {decapitalize(leads)} {mult_verb} {pos1_text} that {pos2_text}"
|
|
85
|
+
else:
|
|
86
|
+
if leads is None:
|
|
87
|
+
return f"For each {role2_text}, {mult_verb} {pos1_text} that {pos2_text}"
|
|
88
|
+
else:
|
|
89
|
+
return f"For each {role2_text}, {decapitalize(leads)} {mult_verb} {pos1_text} that {pos2_text}"
|
|
90
|
+
|
|
91
|
+
def _multiplicity_of_unary(self, role: Role) -> str:
|
|
92
|
+
reading = self._reading
|
|
93
|
+
point_variable = str(role.player())
|
|
94
|
+
mult_verb = []
|
|
95
|
+
if reading._leading_text is not None:
|
|
96
|
+
mult_verb.append(decapitalize(reading._leading_text))
|
|
97
|
+
mult_verb.append("that " + str(reading._role_in_reading[0]))
|
|
98
|
+
follows = reading._follows[0]
|
|
99
|
+
if follows is not None:
|
|
100
|
+
mult_verb.append(reading._follows[0])
|
|
101
|
+
|
|
102
|
+
return f"It is possible that for some {point_variable}, " + " ".join(mult_verb)
|
|
103
|
+
|
|
104
|
+
def _multiplicity_of_nary(self, role: Role) -> str:
|
|
105
|
+
|
|
106
|
+
def point_var_seq(pvars: List[str]) -> str:
|
|
107
|
+
if len(pvars) == 1:
|
|
108
|
+
return pvars[0]
|
|
109
|
+
else:
|
|
110
|
+
length = len(pvars) - 1
|
|
111
|
+
return ", ".join(pvars[0:length]) + " and " + pvars[length]
|
|
112
|
+
|
|
113
|
+
reading = self._reading
|
|
114
|
+
|
|
115
|
+
point_variables = []
|
|
116
|
+
mult_verb = []
|
|
117
|
+
if reading._leading_text is not None:
|
|
118
|
+
mult_verb.append(decapitalize(reading._leading_text))
|
|
119
|
+
idx = 0
|
|
120
|
+
role_verb = None
|
|
121
|
+
for r in reading._roles():
|
|
122
|
+
if role._id == r._id:
|
|
123
|
+
qualifier = Multiplicity.qualifier(self._model.reasoner().point_multiplicity(role))
|
|
124
|
+
role_verb = qualifier + " " + str(reading._role_in_reading[idx])
|
|
125
|
+
else:
|
|
126
|
+
role_verb = "that " + str(reading._role_in_reading[idx])
|
|
127
|
+
point_variables.append(str(r.player()))
|
|
128
|
+
follows = reading._follows[idx]
|
|
129
|
+
if follows is None:
|
|
130
|
+
mult_verb.append(role_verb)
|
|
131
|
+
else:
|
|
132
|
+
mult_verb.append(role_verb + " " + follows)
|
|
133
|
+
idx += 1
|
|
134
|
+
|
|
135
|
+
return "It is possible that for some " + point_var_seq(point_variables) + ", " + " ".join(mult_verb)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# RelationshipVerbalizers verbalize information about a Relationship in
|
|
139
|
+
# natural language, including a sample fact and a verbalization of its
|
|
140
|
+
# constraints in the form of a point multiplicity verbalization of each
|
|
141
|
+
# of its roles.
|
|
142
|
+
#
|
|
143
|
+
# Generating good point multiplicity verbalizations is tricky because:
|
|
144
|
+
# - the most natural way for a human to understand a point multiplicity
|
|
145
|
+
# is when it is verbalized on the last role of some RelationshipReading,
|
|
146
|
+
# but the model may not contain a reading in which a given role appears
|
|
147
|
+
# last.
|
|
148
|
+
# - mandatory and uniqueness constraints on the all of the Roles of the
|
|
149
|
+
# Relationship can influence the point multiplicity of any given Role.
|
|
150
|
+
#
|
|
151
|
+
class RelationshipVerbalizer:
|
|
152
|
+
|
|
153
|
+
def __init__(self, relationship: Relationship, model: Model):
|
|
154
|
+
self._relationship = relationship
|
|
155
|
+
self._model = model
|
|
156
|
+
|
|
157
|
+
# Number of readings of this relationship
|
|
158
|
+
self._number_of_readings = 0 # Forces a sync with the model on first use
|
|
159
|
+
|
|
160
|
+
# Maps the last role of a RelationshipReading to the PointMultiplicityVerbalizer
|
|
161
|
+
# for that reading. Used to simplify the choice of readings to use when
|
|
162
|
+
# verbalizing the point multiplicity of a Role, as the best ones are when
|
|
163
|
+
# the role appears last.
|
|
164
|
+
self._role_to_verb = {}
|
|
165
|
+
|
|
166
|
+
# Default verbalizer to use when verbalizing a point multiplicity of this
|
|
167
|
+
# Relationship when there is no better choice. Also used to verbalize
|
|
168
|
+
# sample facts of this Relationship because it is specific to a Reading.
|
|
169
|
+
self._default_verb = None
|
|
170
|
+
|
|
171
|
+
def __str__(self):
|
|
172
|
+
default_reading = self.verbalizer_for()
|
|
173
|
+
verb = [default_reading.sample_fact()]
|
|
174
|
+
for role in self._relationship._rel_roles.values():
|
|
175
|
+
reading_verb = self.verbalizer_for(role)
|
|
176
|
+
verb.append(reading_verb.multiplicity_of(role))
|
|
177
|
+
return "\n".join(verb)
|
|
178
|
+
|
|
179
|
+
# Returns a verbalizer that is good for verbalizing the point multiplicity
|
|
180
|
+
# of a given role of this Relationship. If no role is provided, returns
|
|
181
|
+
# a default verbalizer.
|
|
182
|
+
def verbalizer_for(self, role=None) -> PointMultiplicityVerbalizer:
|
|
183
|
+
num_readings = len(self._relationship._readings)
|
|
184
|
+
if self._number_of_readings < num_readings:
|
|
185
|
+
# Then update the reading verbalizations to include those of any
|
|
186
|
+
# newly added RelationshipReadings.
|
|
187
|
+
#
|
|
188
|
+
self._number_of_readings = num_readings
|
|
189
|
+
self._role_to_verb = {}
|
|
190
|
+
|
|
191
|
+
for reading in self._relationship._readings:
|
|
192
|
+
reading_verb = PointMultiplicityVerbalizer(reading, self._model)
|
|
193
|
+
self._role_to_verb[reading._last()._id] = reading_verb
|
|
194
|
+
if self._default_verb is None:
|
|
195
|
+
self._default_verb = reading_verb
|
|
196
|
+
|
|
197
|
+
if self._default_verb is None:
|
|
198
|
+
raise Exception(f"Could not find a default reading for Relationship {self._relationship}")
|
|
199
|
+
|
|
200
|
+
if role is not None and role._id in self._role_to_verb:
|
|
201
|
+
return self._role_to_verb[role._id]
|
|
202
|
+
|
|
203
|
+
# Otherwise choose an arbitary reading verbalization
|
|
204
|
+
return self._default_verb
|