relationalai 0.12.13__py3-none-any.whl → 0.13.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (825) hide show
  1. relationalai/__init__.py +1 -209
  2. relationalai/config/__init__.py +56 -0
  3. relationalai/config/config.py +289 -0
  4. relationalai/config/config_fields.py +86 -0
  5. relationalai/config/connections/__init__.py +46 -0
  6. relationalai/config/connections/base.py +23 -0
  7. relationalai/config/connections/duckdb.py +29 -0
  8. relationalai/config/connections/snowflake.py +243 -0
  9. relationalai/config/external/__init__.py +17 -0
  10. relationalai/config/external/dbt_converter.py +101 -0
  11. relationalai/config/external/dbt_models.py +93 -0
  12. relationalai/config/external/snowflake_converter.py +41 -0
  13. relationalai/config/external/snowflake_models.py +85 -0
  14. relationalai/config/external/utils.py +19 -0
  15. relationalai/semantics/__init__.py +146 -22
  16. relationalai/semantics/backends/lqp/annotations.py +11 -0
  17. relationalai/semantics/backends/sql/sql_compiler.py +327 -0
  18. relationalai/semantics/frontend/base.py +1707 -0
  19. relationalai/semantics/frontend/core.py +179 -0
  20. relationalai/semantics/frontend/front_compiler.py +1313 -0
  21. relationalai/semantics/frontend/pprint.py +408 -0
  22. relationalai/semantics/metamodel/__init__.py +6 -40
  23. relationalai/semantics/metamodel/builtins.py +205 -769
  24. relationalai/semantics/metamodel/metamodel.py +437 -0
  25. relationalai/semantics/metamodel/metamodel_analyzer.py +519 -0
  26. relationalai/semantics/metamodel/pprint.py +412 -0
  27. relationalai/semantics/metamodel/rewriter.py +266 -0
  28. relationalai/semantics/metamodel/typer.py +1378 -0
  29. relationalai/semantics/std/__init__.py +60 -40
  30. relationalai/semantics/std/aggregates.py +149 -0
  31. relationalai/semantics/std/common.py +44 -0
  32. relationalai/semantics/std/constraints.py +37 -43
  33. relationalai/semantics/std/datetime.py +246 -135
  34. relationalai/semantics/std/decimals.py +45 -52
  35. relationalai/semantics/std/floats.py +13 -5
  36. relationalai/semantics/std/integers.py +26 -11
  37. relationalai/semantics/std/math.py +183 -112
  38. relationalai/semantics/std/numbers.py +86 -0
  39. relationalai/semantics/std/re.py +80 -62
  40. relationalai/semantics/std/strings.py +117 -60
  41. relationalai/shims/executor.py +147 -0
  42. relationalai/shims/helpers.py +126 -0
  43. relationalai/shims/hoister.py +221 -0
  44. relationalai/shims/mm2v0.py +1290 -0
  45. relationalai/tools/cli/__init__.py +6 -0
  46. relationalai/tools/cli/cli.py +90 -0
  47. relationalai/tools/cli/components/__init__.py +5 -0
  48. relationalai/tools/cli/components/progress_reader.py +1524 -0
  49. relationalai/tools/cli/components/utils.py +58 -0
  50. relationalai/tools/cli/config_template.py +45 -0
  51. relationalai/tools/cli/dev.py +19 -0
  52. relationalai/tools/debugger.py +289 -183
  53. relationalai/tools/typer_debugger.py +93 -0
  54. relationalai/util/dataclasses.py +43 -0
  55. relationalai/util/docutils.py +40 -0
  56. relationalai/util/error.py +199 -0
  57. relationalai/util/format.py +48 -106
  58. relationalai/util/naming.py +145 -0
  59. relationalai/util/python.py +35 -0
  60. relationalai/util/runtime.py +156 -0
  61. relationalai/util/schema.py +197 -0
  62. relationalai/util/source.py +185 -0
  63. relationalai/util/structures.py +163 -0
  64. relationalai/util/tracing.py +261 -0
  65. relationalai-0.13.0.dev0.dist-info/METADATA +46 -0
  66. relationalai-0.13.0.dev0.dist-info/RECORD +488 -0
  67. relationalai-0.13.0.dev0.dist-info/WHEEL +5 -0
  68. relationalai-0.13.0.dev0.dist-info/entry_points.txt +3 -0
  69. relationalai-0.13.0.dev0.dist-info/top_level.txt +2 -0
  70. v0/relationalai/__init__.py +216 -0
  71. v0/relationalai/clients/azure.py +477 -0
  72. v0/relationalai/clients/client.py +912 -0
  73. v0/relationalai/clients/config.py +673 -0
  74. v0/relationalai/clients/direct_access_client.py +118 -0
  75. v0/relationalai/clients/hash_util.py +31 -0
  76. v0/relationalai/clients/local.py +571 -0
  77. v0/relationalai/clients/profile_polling.py +73 -0
  78. v0/relationalai/clients/result_helpers.py +420 -0
  79. v0/relationalai/clients/snowflake.py +3869 -0
  80. v0/relationalai/clients/types.py +113 -0
  81. v0/relationalai/clients/use_index_poller.py +980 -0
  82. v0/relationalai/clients/util.py +356 -0
  83. v0/relationalai/debugging.py +389 -0
  84. v0/relationalai/dsl.py +1749 -0
  85. v0/relationalai/early_access/builder/__init__.py +30 -0
  86. v0/relationalai/early_access/builder/builder/__init__.py +35 -0
  87. v0/relationalai/early_access/builder/snowflake/__init__.py +12 -0
  88. v0/relationalai/early_access/builder/std/__init__.py +25 -0
  89. v0/relationalai/early_access/builder/std/decimals/__init__.py +12 -0
  90. v0/relationalai/early_access/builder/std/integers/__init__.py +12 -0
  91. v0/relationalai/early_access/builder/std/math/__init__.py +12 -0
  92. v0/relationalai/early_access/builder/std/strings/__init__.py +14 -0
  93. v0/relationalai/early_access/devtools/__init__.py +12 -0
  94. v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
  95. v0/relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
  96. v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
  97. v0/relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
  98. v0/relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
  99. v0/relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
  100. v0/relationalai/early_access/dsl/bindings/common.py +402 -0
  101. v0/relationalai/early_access/dsl/bindings/csv.py +170 -0
  102. v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
  103. v0/relationalai/early_access/dsl/bindings/snowflake.py +64 -0
  104. v0/relationalai/early_access/dsl/codegen/binder.py +411 -0
  105. v0/relationalai/early_access/dsl/codegen/common.py +79 -0
  106. v0/relationalai/early_access/dsl/codegen/helpers.py +23 -0
  107. v0/relationalai/early_access/dsl/codegen/relations.py +700 -0
  108. v0/relationalai/early_access/dsl/codegen/weaver.py +417 -0
  109. v0/relationalai/early_access/dsl/core/builders/__init__.py +47 -0
  110. v0/relationalai/early_access/dsl/core/builders/logic.py +19 -0
  111. v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
  112. v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
  113. v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
  114. v0/relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
  115. v0/relationalai/early_access/dsl/core/context.py +13 -0
  116. v0/relationalai/early_access/dsl/core/cset.py +132 -0
  117. v0/relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
  118. v0/relationalai/early_access/dsl/core/exprs/relational.py +18 -0
  119. v0/relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
  120. v0/relationalai/early_access/dsl/core/instances.py +44 -0
  121. v0/relationalai/early_access/dsl/core/logic/__init__.py +193 -0
  122. v0/relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
  123. v0/relationalai/early_access/dsl/core/logic/exists.py +223 -0
  124. v0/relationalai/early_access/dsl/core/logic/helper.py +163 -0
  125. v0/relationalai/early_access/dsl/core/namespaces.py +32 -0
  126. v0/relationalai/early_access/dsl/core/relations.py +276 -0
  127. v0/relationalai/early_access/dsl/core/rules.py +112 -0
  128. v0/relationalai/early_access/dsl/core/std/__init__.py +45 -0
  129. v0/relationalai/early_access/dsl/core/temporal/recall.py +6 -0
  130. v0/relationalai/early_access/dsl/core/types/__init__.py +270 -0
  131. v0/relationalai/early_access/dsl/core/types/concepts.py +128 -0
  132. v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
  133. v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
  134. v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
  135. v0/relationalai/early_access/dsl/core/types/standard.py +92 -0
  136. v0/relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
  137. v0/relationalai/early_access/dsl/core/types/variables.py +203 -0
  138. v0/relationalai/early_access/dsl/ir/compiler.py +318 -0
  139. v0/relationalai/early_access/dsl/ir/executor.py +260 -0
  140. v0/relationalai/early_access/dsl/ontologies/constraints.py +88 -0
  141. v0/relationalai/early_access/dsl/ontologies/export.py +30 -0
  142. v0/relationalai/early_access/dsl/ontologies/models.py +453 -0
  143. v0/relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
  144. v0/relationalai/early_access/dsl/ontologies/readings.py +60 -0
  145. v0/relationalai/early_access/dsl/ontologies/relationships.py +322 -0
  146. v0/relationalai/early_access/dsl/ontologies/roles.py +87 -0
  147. v0/relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
  148. v0/relationalai/early_access/dsl/orm/constraints.py +438 -0
  149. v0/relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
  150. v0/relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
  151. v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
  152. v0/relationalai/early_access/dsl/orm/measures/measures.py +299 -0
  153. v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
  154. v0/relationalai/early_access/dsl/orm/models.py +256 -0
  155. v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
  156. v0/relationalai/early_access/dsl/orm/printer.py +469 -0
  157. v0/relationalai/early_access/dsl/orm/reasoners.py +480 -0
  158. v0/relationalai/early_access/dsl/orm/relations.py +19 -0
  159. v0/relationalai/early_access/dsl/orm/relationships.py +251 -0
  160. v0/relationalai/early_access/dsl/orm/types.py +42 -0
  161. v0/relationalai/early_access/dsl/orm/utils.py +79 -0
  162. v0/relationalai/early_access/dsl/orm/verb.py +204 -0
  163. v0/relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
  164. v0/relationalai/early_access/dsl/relations.py +170 -0
  165. v0/relationalai/early_access/dsl/rulesets.py +69 -0
  166. v0/relationalai/early_access/dsl/schemas/__init__.py +450 -0
  167. v0/relationalai/early_access/dsl/schemas/builder.py +48 -0
  168. v0/relationalai/early_access/dsl/schemas/comp_names.py +51 -0
  169. v0/relationalai/early_access/dsl/schemas/components.py +203 -0
  170. v0/relationalai/early_access/dsl/schemas/contexts.py +156 -0
  171. v0/relationalai/early_access/dsl/schemas/exprs.py +89 -0
  172. v0/relationalai/early_access/dsl/schemas/fragments.py +464 -0
  173. v0/relationalai/early_access/dsl/serialization.py +79 -0
  174. v0/relationalai/early_access/dsl/serialize/exporter.py +163 -0
  175. v0/relationalai/early_access/dsl/snow/api.py +104 -0
  176. v0/relationalai/early_access/dsl/snow/common.py +76 -0
  177. v0/relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
  178. v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
  179. v0/relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
  180. v0/relationalai/early_access/dsl/types/__init__.py +40 -0
  181. v0/relationalai/early_access/dsl/types/concepts.py +12 -0
  182. v0/relationalai/early_access/dsl/types/entities.py +135 -0
  183. v0/relationalai/early_access/dsl/types/values.py +17 -0
  184. v0/relationalai/early_access/dsl/utils.py +102 -0
  185. v0/relationalai/early_access/graphs/__init__.py +13 -0
  186. v0/relationalai/early_access/lqp/__init__.py +12 -0
  187. v0/relationalai/early_access/lqp/compiler/__init__.py +12 -0
  188. v0/relationalai/early_access/lqp/constructors/__init__.py +18 -0
  189. v0/relationalai/early_access/lqp/executor/__init__.py +12 -0
  190. v0/relationalai/early_access/lqp/ir/__init__.py +12 -0
  191. v0/relationalai/early_access/lqp/passes/__init__.py +12 -0
  192. v0/relationalai/early_access/lqp/pragmas/__init__.py +12 -0
  193. v0/relationalai/early_access/lqp/primitives/__init__.py +12 -0
  194. v0/relationalai/early_access/lqp/types/__init__.py +12 -0
  195. v0/relationalai/early_access/lqp/utils/__init__.py +12 -0
  196. v0/relationalai/early_access/lqp/validators/__init__.py +12 -0
  197. v0/relationalai/early_access/metamodel/__init__.py +58 -0
  198. v0/relationalai/early_access/metamodel/builtins/__init__.py +12 -0
  199. v0/relationalai/early_access/metamodel/compiler/__init__.py +12 -0
  200. v0/relationalai/early_access/metamodel/dependency/__init__.py +12 -0
  201. v0/relationalai/early_access/metamodel/factory/__init__.py +17 -0
  202. v0/relationalai/early_access/metamodel/helpers/__init__.py +12 -0
  203. v0/relationalai/early_access/metamodel/ir/__init__.py +14 -0
  204. v0/relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
  205. v0/relationalai/early_access/metamodel/typer/__init__.py +3 -0
  206. v0/relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
  207. v0/relationalai/early_access/metamodel/types/__init__.py +15 -0
  208. v0/relationalai/early_access/metamodel/util/__init__.py +15 -0
  209. v0/relationalai/early_access/metamodel/visitor/__init__.py +12 -0
  210. v0/relationalai/early_access/rel/__init__.py +12 -0
  211. v0/relationalai/early_access/rel/executor/__init__.py +12 -0
  212. v0/relationalai/early_access/rel/rel_utils/__init__.py +12 -0
  213. v0/relationalai/early_access/rel/rewrite/__init__.py +7 -0
  214. v0/relationalai/early_access/solvers/__init__.py +19 -0
  215. v0/relationalai/early_access/sql/__init__.py +11 -0
  216. v0/relationalai/early_access/sql/executor/__init__.py +3 -0
  217. v0/relationalai/early_access/sql/rewrite/__init__.py +3 -0
  218. v0/relationalai/early_access/tests/logging/__init__.py +12 -0
  219. v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
  220. v0/relationalai/early_access/tests/utils/__init__.py +12 -0
  221. v0/relationalai/environments/__init__.py +35 -0
  222. v0/relationalai/environments/base.py +381 -0
  223. v0/relationalai/environments/colab.py +14 -0
  224. v0/relationalai/environments/generic.py +71 -0
  225. v0/relationalai/environments/ipython.py +68 -0
  226. v0/relationalai/environments/jupyter.py +9 -0
  227. v0/relationalai/environments/snowbook.py +169 -0
  228. v0/relationalai/errors.py +2455 -0
  229. v0/relationalai/experimental/SF.py +38 -0
  230. v0/relationalai/experimental/inspect.py +47 -0
  231. v0/relationalai/experimental/pathfinder/__init__.py +158 -0
  232. v0/relationalai/experimental/pathfinder/api.py +160 -0
  233. v0/relationalai/experimental/pathfinder/automaton.py +584 -0
  234. v0/relationalai/experimental/pathfinder/bridge.py +226 -0
  235. v0/relationalai/experimental/pathfinder/compiler.py +416 -0
  236. v0/relationalai/experimental/pathfinder/datalog.py +214 -0
  237. v0/relationalai/experimental/pathfinder/diagnostics.py +56 -0
  238. v0/relationalai/experimental/pathfinder/filter.py +236 -0
  239. v0/relationalai/experimental/pathfinder/glushkov.py +439 -0
  240. v0/relationalai/experimental/pathfinder/options.py +265 -0
  241. v0/relationalai/experimental/pathfinder/rpq.py +344 -0
  242. v0/relationalai/experimental/pathfinder/transition.py +200 -0
  243. v0/relationalai/experimental/pathfinder/utils.py +26 -0
  244. v0/relationalai/experimental/paths/api.py +143 -0
  245. v0/relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
  246. v0/relationalai/experimental/paths/examples/basic_example.py +40 -0
  247. v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
  248. v0/relationalai/experimental/paths/examples/movie_example.py +77 -0
  249. v0/relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
  250. v0/relationalai/experimental/paths/examples/paths_example.py +116 -0
  251. v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
  252. v0/relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
  253. v0/relationalai/experimental/paths/graph.py +185 -0
  254. v0/relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
  255. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
  256. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
  257. v0/relationalai/experimental/paths/path_algorithms/single.py +59 -0
  258. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
  259. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
  260. v0/relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
  261. v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
  262. v0/relationalai/experimental/paths/path_algorithms/usp.py +150 -0
  263. v0/relationalai/experimental/paths/product_graph.py +93 -0
  264. v0/relationalai/experimental/paths/rpq/automaton.py +584 -0
  265. v0/relationalai/experimental/paths/rpq/diagnostics.py +56 -0
  266. v0/relationalai/experimental/paths/rpq/rpq.py +378 -0
  267. v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
  268. v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
  269. v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
  270. v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
  271. v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
  272. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
  273. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
  274. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
  275. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
  276. v0/relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
  277. v0/relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
  278. v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
  279. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
  280. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
  281. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
  282. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
  283. v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
  284. v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
  285. v0/relationalai/experimental/paths/tree_agg.py +168 -0
  286. v0/relationalai/experimental/paths/utilities/iterators.py +27 -0
  287. v0/relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
  288. v0/relationalai/experimental/solvers.py +1087 -0
  289. v0/relationalai/loaders/__init__.py +0 -0
  290. v0/relationalai/loaders/csv.py +195 -0
  291. v0/relationalai/loaders/loader.py +177 -0
  292. v0/relationalai/loaders/types.py +23 -0
  293. v0/relationalai/rel_emitter.py +373 -0
  294. v0/relationalai/rel_utils.py +185 -0
  295. v0/relationalai/semantics/__init__.py +29 -0
  296. v0/relationalai/semantics/devtools/benchmark_lqp.py +536 -0
  297. v0/relationalai/semantics/devtools/compilation_manager.py +294 -0
  298. v0/relationalai/semantics/devtools/extract_lqp.py +110 -0
  299. v0/relationalai/semantics/internal/internal.py +3785 -0
  300. v0/relationalai/semantics/internal/snowflake.py +324 -0
  301. v0/relationalai/semantics/lqp/builtins.py +16 -0
  302. v0/relationalai/semantics/lqp/compiler.py +22 -0
  303. v0/relationalai/semantics/lqp/constructors.py +68 -0
  304. v0/relationalai/semantics/lqp/executor.py +469 -0
  305. v0/relationalai/semantics/lqp/intrinsics.py +24 -0
  306. v0/relationalai/semantics/lqp/model2lqp.py +839 -0
  307. v0/relationalai/semantics/lqp/passes.py +680 -0
  308. v0/relationalai/semantics/lqp/primitives.py +252 -0
  309. v0/relationalai/semantics/lqp/result_helpers.py +202 -0
  310. v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
  311. v0/relationalai/semantics/lqp/rewrite/cdc.py +216 -0
  312. v0/relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
  313. v0/relationalai/semantics/lqp/rewrite/extract_keys.py +449 -0
  314. v0/relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
  315. v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
  316. v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
  317. v0/relationalai/semantics/lqp/rewrite/splinter.py +76 -0
  318. v0/relationalai/semantics/lqp/types.py +101 -0
  319. v0/relationalai/semantics/lqp/utils.py +160 -0
  320. v0/relationalai/semantics/lqp/validators.py +57 -0
  321. v0/relationalai/semantics/metamodel/__init__.py +40 -0
  322. v0/relationalai/semantics/metamodel/builtins.py +774 -0
  323. v0/relationalai/semantics/metamodel/compiler.py +133 -0
  324. v0/relationalai/semantics/metamodel/dependency.py +862 -0
  325. v0/relationalai/semantics/metamodel/executor.py +61 -0
  326. v0/relationalai/semantics/metamodel/factory.py +287 -0
  327. v0/relationalai/semantics/metamodel/helpers.py +361 -0
  328. v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
  329. v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
  330. v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
  331. v0/relationalai/semantics/metamodel/rewrite/flatten.py +549 -0
  332. v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
  333. v0/relationalai/semantics/metamodel/typer/checker.py +353 -0
  334. v0/relationalai/semantics/metamodel/typer/typer.py +1395 -0
  335. v0/relationalai/semantics/reasoners/__init__.py +10 -0
  336. v0/relationalai/semantics/reasoners/graph/__init__.py +37 -0
  337. v0/relationalai/semantics/reasoners/graph/core.py +9020 -0
  338. v0/relationalai/semantics/reasoners/optimization/__init__.py +68 -0
  339. v0/relationalai/semantics/reasoners/optimization/common.py +88 -0
  340. v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
  341. v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +1163 -0
  342. v0/relationalai/semantics/rel/builtins.py +40 -0
  343. v0/relationalai/semantics/rel/compiler.py +989 -0
  344. v0/relationalai/semantics/rel/executor.py +359 -0
  345. v0/relationalai/semantics/rel/rel.py +482 -0
  346. v0/relationalai/semantics/rel/rel_utils.py +276 -0
  347. v0/relationalai/semantics/snowflake/__init__.py +3 -0
  348. v0/relationalai/semantics/sql/compiler.py +2503 -0
  349. v0/relationalai/semantics/sql/executor/duck_db.py +52 -0
  350. v0/relationalai/semantics/sql/executor/result_helpers.py +64 -0
  351. v0/relationalai/semantics/sql/executor/snowflake.py +145 -0
  352. v0/relationalai/semantics/sql/rewrite/denormalize.py +222 -0
  353. v0/relationalai/semantics/sql/rewrite/double_negation.py +49 -0
  354. v0/relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
  355. v0/relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
  356. v0/relationalai/semantics/sql/sql.py +504 -0
  357. v0/relationalai/semantics/std/__init__.py +54 -0
  358. v0/relationalai/semantics/std/constraints.py +43 -0
  359. v0/relationalai/semantics/std/datetime.py +363 -0
  360. v0/relationalai/semantics/std/decimals.py +62 -0
  361. v0/relationalai/semantics/std/floats.py +7 -0
  362. v0/relationalai/semantics/std/integers.py +22 -0
  363. v0/relationalai/semantics/std/math.py +141 -0
  364. v0/relationalai/semantics/std/pragmas.py +11 -0
  365. v0/relationalai/semantics/std/re.py +83 -0
  366. v0/relationalai/semantics/std/std.py +14 -0
  367. v0/relationalai/semantics/std/strings.py +63 -0
  368. v0/relationalai/semantics/tests/__init__.py +0 -0
  369. v0/relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
  370. v0/relationalai/semantics/tests/test_snapshot_base.py +9 -0
  371. v0/relationalai/semantics/tests/utils.py +46 -0
  372. v0/relationalai/std/__init__.py +70 -0
  373. v0/relationalai/tools/__init__.py +0 -0
  374. v0/relationalai/tools/cli.py +1940 -0
  375. v0/relationalai/tools/cli_controls.py +1826 -0
  376. v0/relationalai/tools/cli_helpers.py +390 -0
  377. v0/relationalai/tools/debugger.py +183 -0
  378. v0/relationalai/tools/debugger_client.py +109 -0
  379. v0/relationalai/tools/debugger_server.py +302 -0
  380. v0/relationalai/tools/dev.py +685 -0
  381. v0/relationalai/tools/qb_debugger.py +425 -0
  382. v0/relationalai/util/clean_up_databases.py +95 -0
  383. v0/relationalai/util/format.py +123 -0
  384. v0/relationalai/util/list_databases.py +9 -0
  385. v0/relationalai/util/otel_configuration.py +25 -0
  386. v0/relationalai/util/otel_handler.py +484 -0
  387. v0/relationalai/util/snowflake_handler.py +88 -0
  388. v0/relationalai/util/span_format_test.py +43 -0
  389. v0/relationalai/util/span_tracker.py +207 -0
  390. v0/relationalai/util/spans_file_handler.py +72 -0
  391. v0/relationalai/util/tracing_handler.py +34 -0
  392. frontend/debugger/dist/.gitignore +0 -2
  393. frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  394. frontend/debugger/dist/assets/index-Cssla-O7.js +0 -208
  395. frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -9
  396. frontend/debugger/dist/index.html +0 -17
  397. relationalai/clients/azure.py +0 -477
  398. relationalai/clients/client.py +0 -912
  399. relationalai/clients/config.py +0 -673
  400. relationalai/clients/direct_access_client.py +0 -118
  401. relationalai/clients/export_procedure.py.jinja +0 -249
  402. relationalai/clients/hash_util.py +0 -31
  403. relationalai/clients/local.py +0 -571
  404. relationalai/clients/profile_polling.py +0 -73
  405. relationalai/clients/result_helpers.py +0 -420
  406. relationalai/clients/snowflake.py +0 -3869
  407. relationalai/clients/types.py +0 -113
  408. relationalai/clients/use_index_poller.py +0 -980
  409. relationalai/clients/util.py +0 -356
  410. relationalai/debugging.py +0 -389
  411. relationalai/dsl.py +0 -1749
  412. relationalai/early_access/builder/__init__.py +0 -30
  413. relationalai/early_access/builder/builder/__init__.py +0 -35
  414. relationalai/early_access/builder/snowflake/__init__.py +0 -12
  415. relationalai/early_access/builder/std/__init__.py +0 -25
  416. relationalai/early_access/builder/std/decimals/__init__.py +0 -12
  417. relationalai/early_access/builder/std/integers/__init__.py +0 -12
  418. relationalai/early_access/builder/std/math/__init__.py +0 -12
  419. relationalai/early_access/builder/std/strings/__init__.py +0 -14
  420. relationalai/early_access/devtools/__init__.py +0 -12
  421. relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
  422. relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
  423. relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
  424. relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
  425. relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
  426. relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
  427. relationalai/early_access/dsl/bindings/common.py +0 -402
  428. relationalai/early_access/dsl/bindings/csv.py +0 -170
  429. relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
  430. relationalai/early_access/dsl/bindings/snowflake.py +0 -64
  431. relationalai/early_access/dsl/codegen/binder.py +0 -411
  432. relationalai/early_access/dsl/codegen/common.py +0 -79
  433. relationalai/early_access/dsl/codegen/helpers.py +0 -23
  434. relationalai/early_access/dsl/codegen/relations.py +0 -700
  435. relationalai/early_access/dsl/codegen/weaver.py +0 -417
  436. relationalai/early_access/dsl/core/builders/__init__.py +0 -47
  437. relationalai/early_access/dsl/core/builders/logic.py +0 -19
  438. relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
  439. relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
  440. relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
  441. relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
  442. relationalai/early_access/dsl/core/context.py +0 -13
  443. relationalai/early_access/dsl/core/cset.py +0 -132
  444. relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
  445. relationalai/early_access/dsl/core/exprs/relational.py +0 -18
  446. relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
  447. relationalai/early_access/dsl/core/instances.py +0 -44
  448. relationalai/early_access/dsl/core/logic/__init__.py +0 -193
  449. relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
  450. relationalai/early_access/dsl/core/logic/exists.py +0 -223
  451. relationalai/early_access/dsl/core/logic/helper.py +0 -163
  452. relationalai/early_access/dsl/core/namespaces.py +0 -32
  453. relationalai/early_access/dsl/core/relations.py +0 -276
  454. relationalai/early_access/dsl/core/rules.py +0 -112
  455. relationalai/early_access/dsl/core/std/__init__.py +0 -45
  456. relationalai/early_access/dsl/core/temporal/recall.py +0 -6
  457. relationalai/early_access/dsl/core/types/__init__.py +0 -270
  458. relationalai/early_access/dsl/core/types/concepts.py +0 -128
  459. relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
  460. relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
  461. relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
  462. relationalai/early_access/dsl/core/types/standard.py +0 -92
  463. relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
  464. relationalai/early_access/dsl/core/types/variables.py +0 -203
  465. relationalai/early_access/dsl/ir/compiler.py +0 -318
  466. relationalai/early_access/dsl/ir/executor.py +0 -260
  467. relationalai/early_access/dsl/ontologies/constraints.py +0 -88
  468. relationalai/early_access/dsl/ontologies/export.py +0 -30
  469. relationalai/early_access/dsl/ontologies/models.py +0 -453
  470. relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
  471. relationalai/early_access/dsl/ontologies/readings.py +0 -60
  472. relationalai/early_access/dsl/ontologies/relationships.py +0 -322
  473. relationalai/early_access/dsl/ontologies/roles.py +0 -87
  474. relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
  475. relationalai/early_access/dsl/orm/constraints.py +0 -438
  476. relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
  477. relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
  478. relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
  479. relationalai/early_access/dsl/orm/measures/measures.py +0 -299
  480. relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
  481. relationalai/early_access/dsl/orm/models.py +0 -256
  482. relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
  483. relationalai/early_access/dsl/orm/printer.py +0 -469
  484. relationalai/early_access/dsl/orm/reasoners.py +0 -480
  485. relationalai/early_access/dsl/orm/relations.py +0 -19
  486. relationalai/early_access/dsl/orm/relationships.py +0 -251
  487. relationalai/early_access/dsl/orm/types.py +0 -42
  488. relationalai/early_access/dsl/orm/utils.py +0 -79
  489. relationalai/early_access/dsl/orm/verb.py +0 -204
  490. relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
  491. relationalai/early_access/dsl/relations.py +0 -170
  492. relationalai/early_access/dsl/rulesets.py +0 -69
  493. relationalai/early_access/dsl/schemas/__init__.py +0 -450
  494. relationalai/early_access/dsl/schemas/builder.py +0 -48
  495. relationalai/early_access/dsl/schemas/comp_names.py +0 -51
  496. relationalai/early_access/dsl/schemas/components.py +0 -203
  497. relationalai/early_access/dsl/schemas/contexts.py +0 -156
  498. relationalai/early_access/dsl/schemas/exprs.py +0 -89
  499. relationalai/early_access/dsl/schemas/fragments.py +0 -464
  500. relationalai/early_access/dsl/serialization.py +0 -79
  501. relationalai/early_access/dsl/serialize/exporter.py +0 -163
  502. relationalai/early_access/dsl/snow/api.py +0 -104
  503. relationalai/early_access/dsl/snow/common.py +0 -76
  504. relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
  505. relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
  506. relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
  507. relationalai/early_access/dsl/types/__init__.py +0 -40
  508. relationalai/early_access/dsl/types/concepts.py +0 -12
  509. relationalai/early_access/dsl/types/entities.py +0 -135
  510. relationalai/early_access/dsl/types/values.py +0 -17
  511. relationalai/early_access/dsl/utils.py +0 -102
  512. relationalai/early_access/graphs/__init__.py +0 -13
  513. relationalai/early_access/lqp/__init__.py +0 -12
  514. relationalai/early_access/lqp/compiler/__init__.py +0 -12
  515. relationalai/early_access/lqp/constructors/__init__.py +0 -18
  516. relationalai/early_access/lqp/executor/__init__.py +0 -12
  517. relationalai/early_access/lqp/ir/__init__.py +0 -12
  518. relationalai/early_access/lqp/passes/__init__.py +0 -12
  519. relationalai/early_access/lqp/pragmas/__init__.py +0 -12
  520. relationalai/early_access/lqp/primitives/__init__.py +0 -12
  521. relationalai/early_access/lqp/types/__init__.py +0 -12
  522. relationalai/early_access/lqp/utils/__init__.py +0 -12
  523. relationalai/early_access/lqp/validators/__init__.py +0 -12
  524. relationalai/early_access/metamodel/__init__.py +0 -58
  525. relationalai/early_access/metamodel/builtins/__init__.py +0 -12
  526. relationalai/early_access/metamodel/compiler/__init__.py +0 -12
  527. relationalai/early_access/metamodel/dependency/__init__.py +0 -12
  528. relationalai/early_access/metamodel/factory/__init__.py +0 -17
  529. relationalai/early_access/metamodel/helpers/__init__.py +0 -12
  530. relationalai/early_access/metamodel/ir/__init__.py +0 -14
  531. relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
  532. relationalai/early_access/metamodel/typer/__init__.py +0 -3
  533. relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
  534. relationalai/early_access/metamodel/types/__init__.py +0 -15
  535. relationalai/early_access/metamodel/util/__init__.py +0 -15
  536. relationalai/early_access/metamodel/visitor/__init__.py +0 -12
  537. relationalai/early_access/rel/__init__.py +0 -12
  538. relationalai/early_access/rel/executor/__init__.py +0 -12
  539. relationalai/early_access/rel/rel_utils/__init__.py +0 -12
  540. relationalai/early_access/rel/rewrite/__init__.py +0 -7
  541. relationalai/early_access/solvers/__init__.py +0 -19
  542. relationalai/early_access/sql/__init__.py +0 -11
  543. relationalai/early_access/sql/executor/__init__.py +0 -3
  544. relationalai/early_access/sql/rewrite/__init__.py +0 -3
  545. relationalai/early_access/tests/logging/__init__.py +0 -12
  546. relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
  547. relationalai/early_access/tests/utils/__init__.py +0 -12
  548. relationalai/environments/__init__.py +0 -35
  549. relationalai/environments/base.py +0 -381
  550. relationalai/environments/colab.py +0 -14
  551. relationalai/environments/generic.py +0 -71
  552. relationalai/environments/ipython.py +0 -68
  553. relationalai/environments/jupyter.py +0 -9
  554. relationalai/environments/snowbook.py +0 -169
  555. relationalai/errors.py +0 -2455
  556. relationalai/experimental/SF.py +0 -38
  557. relationalai/experimental/inspect.py +0 -47
  558. relationalai/experimental/pathfinder/__init__.py +0 -158
  559. relationalai/experimental/pathfinder/api.py +0 -160
  560. relationalai/experimental/pathfinder/automaton.py +0 -584
  561. relationalai/experimental/pathfinder/bridge.py +0 -226
  562. relationalai/experimental/pathfinder/compiler.py +0 -416
  563. relationalai/experimental/pathfinder/datalog.py +0 -214
  564. relationalai/experimental/pathfinder/diagnostics.py +0 -56
  565. relationalai/experimental/pathfinder/filter.py +0 -236
  566. relationalai/experimental/pathfinder/glushkov.py +0 -439
  567. relationalai/experimental/pathfinder/options.py +0 -265
  568. relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -1951
  569. relationalai/experimental/pathfinder/rpq.py +0 -344
  570. relationalai/experimental/pathfinder/transition.py +0 -200
  571. relationalai/experimental/pathfinder/utils.py +0 -26
  572. relationalai/experimental/paths/README.md +0 -107
  573. relationalai/experimental/paths/api.py +0 -143
  574. relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
  575. relationalai/experimental/paths/code_organization.md +0 -2
  576. relationalai/experimental/paths/examples/Movies.ipynb +0 -16328
  577. relationalai/experimental/paths/examples/basic_example.py +0 -40
  578. relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
  579. relationalai/experimental/paths/examples/movie_example.py +0 -77
  580. relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -193
  581. relationalai/experimental/paths/examples/movies_data/directed.csv +0 -45
  582. relationalai/experimental/paths/examples/movies_data/follows.csv +0 -7
  583. relationalai/experimental/paths/examples/movies_data/movies.csv +0 -39
  584. relationalai/experimental/paths/examples/movies_data/person.csv +0 -134
  585. relationalai/experimental/paths/examples/movies_data/produced.csv +0 -16
  586. relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -10
  587. relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -11
  588. relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
  589. relationalai/experimental/paths/examples/paths_example.py +0 -116
  590. relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
  591. relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
  592. relationalai/experimental/paths/graph.py +0 -185
  593. relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
  594. relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
  595. relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
  596. relationalai/experimental/paths/path_algorithms/single.py +0 -59
  597. relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
  598. relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
  599. relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
  600. relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
  601. relationalai/experimental/paths/path_algorithms/usp.py +0 -150
  602. relationalai/experimental/paths/product_graph.py +0 -93
  603. relationalai/experimental/paths/rpq/automaton.py +0 -584
  604. relationalai/experimental/paths/rpq/diagnostics.py +0 -56
  605. relationalai/experimental/paths/rpq/rpq.py +0 -378
  606. relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
  607. relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
  608. relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
  609. relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
  610. relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
  611. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
  612. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
  613. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
  614. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
  615. relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
  616. relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
  617. relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
  618. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
  619. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
  620. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
  621. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
  622. relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
  623. relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
  624. relationalai/experimental/paths/tree_agg.py +0 -168
  625. relationalai/experimental/paths/utilities/iterators.py +0 -27
  626. relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
  627. relationalai/experimental/solvers.py +0 -1087
  628. relationalai/loaders/csv.py +0 -195
  629. relationalai/loaders/loader.py +0 -177
  630. relationalai/loaders/types.py +0 -23
  631. relationalai/rel_emitter.py +0 -373
  632. relationalai/rel_utils.py +0 -185
  633. relationalai/semantics/designs/query_builder/identify_by.md +0 -106
  634. relationalai/semantics/devtools/benchmark_lqp.py +0 -536
  635. relationalai/semantics/devtools/compilation_manager.py +0 -294
  636. relationalai/semantics/devtools/extract_lqp.py +0 -110
  637. relationalai/semantics/internal/internal.py +0 -3785
  638. relationalai/semantics/internal/snowflake.py +0 -324
  639. relationalai/semantics/lqp/README.md +0 -34
  640. relationalai/semantics/lqp/builtins.py +0 -16
  641. relationalai/semantics/lqp/compiler.py +0 -22
  642. relationalai/semantics/lqp/constructors.py +0 -68
  643. relationalai/semantics/lqp/executor.py +0 -469
  644. relationalai/semantics/lqp/intrinsics.py +0 -24
  645. relationalai/semantics/lqp/model2lqp.py +0 -839
  646. relationalai/semantics/lqp/passes.py +0 -680
  647. relationalai/semantics/lqp/primitives.py +0 -252
  648. relationalai/semantics/lqp/result_helpers.py +0 -202
  649. relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
  650. relationalai/semantics/lqp/rewrite/cdc.py +0 -216
  651. relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
  652. relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
  653. relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
  654. relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
  655. relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
  656. relationalai/semantics/lqp/rewrite/splinter.py +0 -76
  657. relationalai/semantics/lqp/types.py +0 -101
  658. relationalai/semantics/lqp/utils.py +0 -160
  659. relationalai/semantics/lqp/validators.py +0 -57
  660. relationalai/semantics/metamodel/compiler.py +0 -133
  661. relationalai/semantics/metamodel/dependency.py +0 -862
  662. relationalai/semantics/metamodel/executor.py +0 -61
  663. relationalai/semantics/metamodel/factory.py +0 -287
  664. relationalai/semantics/metamodel/helpers.py +0 -361
  665. relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
  666. relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
  667. relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
  668. relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
  669. relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
  670. relationalai/semantics/metamodel/typer/checker.py +0 -353
  671. relationalai/semantics/metamodel/typer/typer.py +0 -1395
  672. relationalai/semantics/reasoners/__init__.py +0 -10
  673. relationalai/semantics/reasoners/graph/README.md +0 -620
  674. relationalai/semantics/reasoners/graph/__init__.py +0 -37
  675. relationalai/semantics/reasoners/graph/core.py +0 -9020
  676. relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -797
  677. relationalai/semantics/reasoners/graph/tests/README.md +0 -21
  678. relationalai/semantics/reasoners/optimization/__init__.py +0 -68
  679. relationalai/semantics/reasoners/optimization/common.py +0 -88
  680. relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
  681. relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
  682. relationalai/semantics/rel/builtins.py +0 -40
  683. relationalai/semantics/rel/compiler.py +0 -989
  684. relationalai/semantics/rel/executor.py +0 -359
  685. relationalai/semantics/rel/rel.py +0 -482
  686. relationalai/semantics/rel/rel_utils.py +0 -276
  687. relationalai/semantics/snowflake/__init__.py +0 -3
  688. relationalai/semantics/sql/compiler.py +0 -2503
  689. relationalai/semantics/sql/executor/duck_db.py +0 -52
  690. relationalai/semantics/sql/executor/result_helpers.py +0 -64
  691. relationalai/semantics/sql/executor/snowflake.py +0 -145
  692. relationalai/semantics/sql/rewrite/denormalize.py +0 -222
  693. relationalai/semantics/sql/rewrite/double_negation.py +0 -49
  694. relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
  695. relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
  696. relationalai/semantics/sql/sql.py +0 -504
  697. relationalai/semantics/std/pragmas.py +0 -11
  698. relationalai/semantics/std/std.py +0 -14
  699. relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
  700. relationalai/semantics/tests/test_snapshot_base.py +0 -9
  701. relationalai/semantics/tests/utils.py +0 -46
  702. relationalai/std/__init__.py +0 -70
  703. relationalai/tools/cli.py +0 -1940
  704. relationalai/tools/cli_controls.py +0 -1826
  705. relationalai/tools/cli_helpers.py +0 -390
  706. relationalai/tools/debugger_client.py +0 -109
  707. relationalai/tools/debugger_server.py +0 -302
  708. relationalai/tools/dev.py +0 -685
  709. relationalai/tools/notes +0 -7
  710. relationalai/tools/qb_debugger.py +0 -425
  711. relationalai/util/clean_up_databases.py +0 -95
  712. relationalai/util/list_databases.py +0 -9
  713. relationalai/util/otel_configuration.py +0 -25
  714. relationalai/util/otel_handler.py +0 -484
  715. relationalai/util/snowflake_handler.py +0 -88
  716. relationalai/util/span_format_test.py +0 -43
  717. relationalai/util/span_tracker.py +0 -207
  718. relationalai/util/spans_file_handler.py +0 -72
  719. relationalai/util/tracing_handler.py +0 -34
  720. relationalai-0.12.13.dist-info/METADATA +0 -74
  721. relationalai-0.12.13.dist-info/RECORD +0 -449
  722. relationalai-0.12.13.dist-info/WHEEL +0 -4
  723. relationalai-0.12.13.dist-info/entry_points.txt +0 -3
  724. relationalai-0.12.13.dist-info/licenses/LICENSE +0 -202
  725. relationalai_test_util/__init__.py +0 -4
  726. relationalai_test_util/fixtures.py +0 -228
  727. relationalai_test_util/snapshot.py +0 -252
  728. relationalai_test_util/traceback.py +0 -118
  729. /relationalai/{analysis → semantics/frontend}/__init__.py +0 -0
  730. /relationalai/{auth/__init__.py → semantics/metamodel/metamodel_compiler.py} +0 -0
  731. /relationalai/{early_access → shims}/__init__.py +0 -0
  732. {relationalai/early_access/dsl/adapters → v0/relationalai/analysis}/__init__.py +0 -0
  733. {relationalai → v0/relationalai}/analysis/mechanistic.py +0 -0
  734. {relationalai → v0/relationalai}/analysis/whynot.py +0 -0
  735. {relationalai/early_access/dsl/adapters/orm → v0/relationalai/auth}/__init__.py +0 -0
  736. {relationalai → v0/relationalai}/auth/jwt_generator.py +0 -0
  737. {relationalai → v0/relationalai}/auth/oauth_callback_server.py +0 -0
  738. {relationalai → v0/relationalai}/auth/token_handler.py +0 -0
  739. {relationalai → v0/relationalai}/auth/util.py +0 -0
  740. {relationalai → v0/relationalai}/clients/__init__.py +0 -0
  741. {relationalai → v0/relationalai}/clients/cache_store.py +0 -0
  742. {relationalai → v0/relationalai}/compiler.py +0 -0
  743. {relationalai → v0/relationalai}/dependencies.py +0 -0
  744. {relationalai → v0/relationalai}/docutils.py +0 -0
  745. {relationalai/early_access/dsl/adapters/owl → v0/relationalai/early_access}/__init__.py +0 -0
  746. {relationalai → v0/relationalai}/early_access/dsl/__init__.py +0 -0
  747. {relationalai/early_access/dsl/bindings → v0/relationalai/early_access/dsl/adapters}/__init__.py +0 -0
  748. {relationalai/early_access/dsl/bindings/legacy → v0/relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
  749. {relationalai → v0/relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
  750. {relationalai/early_access/dsl/codegen → v0/relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
  751. {relationalai → v0/relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
  752. {relationalai/early_access/dsl/core/temporal → v0/relationalai/early_access/dsl/bindings}/__init__.py +0 -0
  753. {relationalai/early_access/dsl/ir → v0/relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
  754. {relationalai/early_access/dsl/ontologies → v0/relationalai/early_access/dsl/codegen}/__init__.py +0 -0
  755. {relationalai → v0/relationalai}/early_access/dsl/constants.py +0 -0
  756. {relationalai → v0/relationalai}/early_access/dsl/core/__init__.py +0 -0
  757. {relationalai → v0/relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
  758. {relationalai → v0/relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  759. {relationalai → v0/relationalai}/early_access/dsl/core/stack.py +0 -0
  760. {relationalai/early_access/dsl/orm → v0/relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
  761. {relationalai → v0/relationalai}/early_access/dsl/core/utils.py +0 -0
  762. {relationalai/early_access/dsl/orm/measures → v0/relationalai/early_access/dsl/ir}/__init__.py +0 -0
  763. {relationalai/early_access/dsl/physical_metadata → v0/relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
  764. {relationalai → v0/relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
  765. {relationalai/early_access/dsl/serialize → v0/relationalai/early_access/dsl/orm}/__init__.py +0 -0
  766. {relationalai/early_access/dsl/snow → v0/relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
  767. {relationalai → v0/relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
  768. {relationalai/loaders → v0/relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
  769. {relationalai/semantics/tests → v0/relationalai/early_access/dsl/serialize}/__init__.py +0 -0
  770. {relationalai → v0/relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
  771. {relationalai → v0/relationalai}/early_access/dsl/serialize/model.py +0 -0
  772. {relationalai/tools → v0/relationalai/early_access/dsl/snow}/__init__.py +0 -0
  773. {relationalai → v0/relationalai}/early_access/tests/__init__.py +0 -0
  774. {relationalai → v0/relationalai}/environments/ci.py +0 -0
  775. {relationalai → v0/relationalai}/environments/hex.py +0 -0
  776. {relationalai → v0/relationalai}/environments/terminal.py +0 -0
  777. {relationalai → v0/relationalai}/experimental/__init__.py +0 -0
  778. {relationalai → v0/relationalai}/experimental/graphs.py +0 -0
  779. {relationalai → v0/relationalai}/experimental/paths/__init__.py +0 -0
  780. {relationalai → v0/relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
  781. {relationalai → v0/relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
  782. {relationalai → v0/relationalai}/experimental/paths/rpq/__init__.py +0 -0
  783. {relationalai → v0/relationalai}/experimental/paths/rpq/filter.py +0 -0
  784. {relationalai → v0/relationalai}/experimental/paths/rpq/glushkov.py +0 -0
  785. {relationalai → v0/relationalai}/experimental/paths/rpq/transition.py +0 -0
  786. {relationalai → v0/relationalai}/experimental/paths/utilities/__init__.py +0 -0
  787. {relationalai → v0/relationalai}/experimental/paths/utilities/utilities.py +0 -0
  788. {relationalai → v0/relationalai}/metagen.py +0 -0
  789. {relationalai → v0/relationalai}/metamodel.py +0 -0
  790. {relationalai → v0/relationalai}/rel.py +0 -0
  791. {relationalai → v0/relationalai}/semantics/devtools/__init__.py +0 -0
  792. {relationalai → v0/relationalai}/semantics/internal/__init__.py +0 -0
  793. {relationalai → v0/relationalai}/semantics/internal/annotations.py +0 -0
  794. {relationalai → v0/relationalai}/semantics/lqp/__init__.py +0 -0
  795. {relationalai → v0/relationalai}/semantics/lqp/ir.py +0 -0
  796. {relationalai → v0/relationalai}/semantics/lqp/pragmas.py +0 -0
  797. {relationalai → v0/relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
  798. {relationalai → v0/relationalai}/semantics/metamodel/dataflow.py +0 -0
  799. {relationalai → v0/relationalai}/semantics/metamodel/ir.py +0 -0
  800. {relationalai → v0/relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
  801. {relationalai → v0/relationalai}/semantics/metamodel/typer/__init__.py +0 -0
  802. {relationalai → v0/relationalai}/semantics/metamodel/types.py +0 -0
  803. {relationalai → v0/relationalai}/semantics/metamodel/util.py +0 -0
  804. {relationalai → v0/relationalai}/semantics/metamodel/visitor.py +0 -0
  805. {relationalai → v0/relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
  806. {relationalai → v0/relationalai}/semantics/rel/__init__.py +0 -0
  807. {relationalai → v0/relationalai}/semantics/sql/__init__.py +0 -0
  808. {relationalai → v0/relationalai}/semantics/sql/executor/__init__.py +0 -0
  809. {relationalai → v0/relationalai}/semantics/sql/rewrite/__init__.py +0 -0
  810. {relationalai → v0/relationalai}/semantics/tests/logging.py +0 -0
  811. {relationalai → v0/relationalai}/std/aggregates.py +0 -0
  812. {relationalai → v0/relationalai}/std/dates.py +0 -0
  813. {relationalai → v0/relationalai}/std/graphs.py +0 -0
  814. {relationalai → v0/relationalai}/std/inspect.py +0 -0
  815. {relationalai → v0/relationalai}/std/math.py +0 -0
  816. {relationalai → v0/relationalai}/std/re.py +0 -0
  817. {relationalai → v0/relationalai}/std/strings.py +0 -0
  818. {relationalai → v0/relationalai}/tools/cleanup_snapshots.py +0 -0
  819. {relationalai → v0/relationalai}/tools/constants.py +0 -0
  820. {relationalai → v0/relationalai}/tools/query_utils.py +0 -0
  821. {relationalai → v0/relationalai}/tools/snapshot_viewer.py +0 -0
  822. {relationalai → v0/relationalai}/util/__init__.py +0 -0
  823. {relationalai → v0/relationalai}/util/constants.py +0 -0
  824. {relationalai → v0/relationalai}/util/graph.py +0 -0
  825. {relationalai → v0/relationalai}/util/timeout.py +0 -0
@@ -0,0 +1,256 @@
1
+ from __future__ import annotations
2
+
3
+ from collections import OrderedDict
4
+ from typing import Optional, Any, Sequence, Union, TypeVar
5
+
6
+ import v0.relationalai.semantics as qb
7
+ from v0.relationalai.semantics.std import constraints as c
8
+ from v0.relationalai import Config
9
+ from v0.relationalai.early_access.dsl.bindings.common import Binding
10
+ from v0.relationalai.early_access.dsl.bindings.csv import CsvTable
11
+ from v0.relationalai.early_access.dsl.bindings.snowflake import SnowflakeTable
12
+ from v0.relationalai.early_access.dsl.codegen.weaver import Weaver
13
+ from v0.relationalai.early_access.dsl.core.utils import generate_stable_uuid, to_pascal_case
14
+ from v0.relationalai.early_access.dsl.orm.constraints import Unique, Mandatory, RoleValueConstraint, Range, \
15
+ ExclusiveSubtypeConstraint, InclusiveSubtypeConstraint, InclusiveRoleConstraint, ExclusiveRoleConstraint, \
16
+ RingConstraint, ValueComparisonConstraint, RoleSubsetConstraint, EqualityConstraint, FrequencyConstraint, \
17
+ CardinalityConstraint, RoleCardinalityConstraint, ValueConstraint
18
+ from v0.relationalai.early_access.dsl.orm.reasoners import OntologyReasoner
19
+ from v0.relationalai.early_access.dsl.orm.relationships import Relationship, Role, RelationshipReading
20
+ from v0.relationalai.early_access.dsl.orm.types import Concept
21
+ from v0.relationalai.early_access.dsl.snow.api import Executor
22
+ from v0.relationalai.semantics.metamodel.util import OrderedSet
23
+
24
+ T = TypeVar('T', int, float, str)
25
+
26
+ class Model:
27
+ def __init__(
28
+ self,
29
+ name: str,
30
+ is_primary: bool = True,
31
+ dry_run: bool = False,
32
+ use_lqp: bool | None = None,
33
+ use_sql: bool = False,
34
+ wide_outputs: bool = False,
35
+ config: Optional[Config] = None
36
+ ):
37
+ self.name = name
38
+ self._qb_model = qb.Model(name, dry_run=dry_run, strict=True, config=config, use_lqp=use_lqp, use_sql=use_sql, wide_outputs=wide_outputs)
39
+ self.is_primary = is_primary
40
+ self._constraints = OrderedSet()
41
+ self._entity_to_id_relationship = OrderedDict()
42
+ self._bindable_tables = OrderedDict()
43
+ self._relationship_iuc: dict[qb.Relationship, list[Unique]] = {}
44
+ self._bindings = []
45
+ self._executor = None
46
+ self._reasoner = OntologyReasoner()
47
+ self._weaver = None
48
+ self._queries = OrderedSet()
49
+ self.Enum = self._qb_model.Enum
50
+
51
+ def guid(self):
52
+ return generate_stable_uuid(self.name)
53
+
54
+ def Concept(self, name: str, extends: list[Any] = [], identify_by:dict[str, Any]={}) -> Concept:
55
+ name = to_pascal_case(name)
56
+ return Concept(self, name, extends, identify_by)
57
+
58
+ def qb_model(self):
59
+ return self._qb_model
60
+
61
+ def reasoner(self):
62
+ return self._reasoner
63
+
64
+ def Relationship(self, reading: Any, short_name:str="") -> qb.Relationship:
65
+ """
66
+ Create a new relationship with the given reading.
67
+ """
68
+ return Relationship(self, reading, short_name=short_name)
69
+
70
+ def constraint(self, constraint):
71
+ # Generic constraint addition with validation
72
+ self._constraints.add(constraint)
73
+ self._reasoner.new_constraint(constraint)
74
+ constraint._desugar()
75
+
76
+ def unique(self, *roles):
77
+ uc = Unique(*roles)
78
+ self.constraint(uc)
79
+ c.unique(*roles)
80
+ first_part_of = roles[0]._part_of()
81
+ if isinstance(first_part_of, RelationshipReading):
82
+ relationship = first_part_of._alt_of
83
+ else:
84
+ relationship = first_part_of
85
+ # check if UC is internal
86
+ if all(role._part_of()._id == first_part_of._id for role in roles):
87
+ internal_ucs = self._relationship_iuc.get(relationship, [])
88
+ internal_ucs.append(uc)
89
+ self._relationship_iuc[relationship] = internal_ucs # todo: this logic should be part of reactive reasoner
90
+
91
+ def mandatory(self, role):
92
+ self.constraint(Mandatory(role))
93
+
94
+ def inclusive_roles(self, *roles):
95
+ self.constraint(InclusiveRoleConstraint(*roles))
96
+
97
+ def exclusive_roles(self, *role_sequences):
98
+ self.constraint(ExclusiveRoleConstraint(*role_sequences))
99
+
100
+ def ring(self, constraint_types, *roles):
101
+ self.constraint(RingConstraint(constraint_types, *roles))
102
+
103
+ def value_comparison(self, constraint_type, *roles):
104
+ self.constraint(ValueComparisonConstraint(constraint_type, *roles))
105
+
106
+ def role_subset(self, *role_sequences):
107
+ self.constraint(RoleSubsetConstraint(*role_sequences))
108
+
109
+ def equality(self, *role_sequences):
110
+ self.constraint(EqualityConstraint(*role_sequences))
111
+
112
+ def frequency(self, frequency, *role_sequences):
113
+ self.constraint(FrequencyConstraint(frequency, *role_sequences))
114
+
115
+ def cardinality(self, concept: Concept, values: Sequence[Union[int, Range[int]]]):
116
+ self.constraint(CardinalityConstraint(concept, values))
117
+
118
+ def role_cardinality(self, role: Role, values: Sequence[Union[int, Range[int]]]):
119
+ self.constraint(RoleCardinalityConstraint(role, values))
120
+
121
+ def value_constraint(self, concept: Concept, values: Sequence[Union[T, Range[T]]]):
122
+ self.constraint(ValueConstraint(concept, values))
123
+
124
+ def role_value_constraint(self, role: Role, values: Sequence[Union[T, Range[T]]]):
125
+ # TODO: check if a role value constraint is incompatible with an existing value constraint
126
+ first_type = values[0]._type() if isinstance(values[0], Range) else type(values[0])
127
+ for v in values[1:]:
128
+ t = v._type() if isinstance(v, Range) else type(v)
129
+ if t != first_type:
130
+ raise Exception("Values for role value constraint must have the same type.")
131
+ if role.player()._is_primitive() or role.player()._is_value_type():
132
+ self.constraint(RoleValueConstraint(role, values))
133
+ else:
134
+ raise Exception("A role value constraint can only be applied to roles played by value types")
135
+
136
+ def exclusive_subtype_constraint(self, *concepts:Concept):
137
+ self.constraint(ExclusiveSubtypeConstraint(*concepts))
138
+
139
+ def inclusive_subtype_constraint(self, *concepts:Concept):
140
+ self.constraint(InclusiveSubtypeConstraint(*concepts))
141
+
142
+ def _add_concept(self, concept: Concept) -> Concept:
143
+ self._validate_type_name(concept._name)
144
+ if concept._name not in self.qb_model().concepts:
145
+ self.qb_model().concepts[concept._name] = [concept]
146
+ return concept
147
+
148
+ def _ref_scheme_constraints(self, *relations:Relationship):
149
+ if len(relations) == 1:
150
+ # binary case, internal UC
151
+ role = relations[0][1]
152
+ self._internal_preferred_uc(role)
153
+ else:
154
+ roles = [rel[1] for rel in relations]
155
+ self._composite_preferred_uc(*roles)
156
+
157
+ def _internal_preferred_uc(self, role):
158
+ rel = role._part_of()
159
+ if rel._arity() != 2:
160
+ raise Exception("The relationship should be binary to apply preferred identifier constraint")
161
+ # mark the role as preferred identifier
162
+ self.constraint(Unique(role, is_preferred_identifier=True))
163
+ # mark the sibling role as mandatory and unique
164
+ sibling = role.sibling()
165
+ self.mandatory(sibling)
166
+ self.unique(sibling)
167
+
168
+ def _composite_preferred_uc(self, *roles):
169
+ for role in roles:
170
+ sibling = role.sibling()
171
+ if not sibling:
172
+ raise Exception("Composite preferred identifier constraint should be applied on binary relationships")
173
+ self.mandatory(sibling)
174
+ self.unique(sibling)
175
+ self.constraint(Unique(*roles, is_preferred_identifier=True))
176
+
177
+ def lookup_concept(self, name) -> Optional[qb.Concept]:
178
+ name = to_pascal_case(name)
179
+ if name in self._qb_model.concepts:
180
+ return self._qb_model.concepts[name][0]
181
+ return None
182
+
183
+ def constraints(self):
184
+ """Getter for the _constraints property"""
185
+ return self._constraints
186
+
187
+ def queries(self):
188
+ return self._queries
189
+
190
+ def concepts(self):
191
+ c = list()
192
+ for concepts in self._qb_model.concepts.values():
193
+ c.append(concepts[0])
194
+ return c
195
+
196
+ def concepts_map(self):
197
+ d = dict()
198
+ for k, v in self._qb_model.concepts.items():
199
+ d[k] = v[0]
200
+ return d
201
+
202
+ def enums(self):
203
+ return list(self._qb_model.enums.values())
204
+
205
+ def enums_map(self):
206
+ return self._qb_model.enums
207
+
208
+ def value_types(self):
209
+ return list(filter(lambda c: c._is_primitive(), self.concepts()))
210
+
211
+ def value_types_map(self):
212
+ return dict(filter(lambda item: item[1]._is_primitive(), self.concepts_map().items()))
213
+
214
+ def entity_types(self):
215
+ return list(filter(lambda c: not c._is_primitive(), self.concepts()))
216
+
217
+ def entity_types_map(self):
218
+ return dict(filter(lambda item: not item[1]._is_primitive(), self.concepts_map().items()))
219
+
220
+ def relationships(self):
221
+ return self._qb_model.relationships
222
+
223
+ def bindable_tables(self):
224
+ return self._bindable_tables
225
+
226
+ def api(self):
227
+ self._executor = self._executor or Executor(self._qb_model._config)
228
+ return self._executor
229
+
230
+ def table(self, name: str, schema:dict[str, str|qb.Concept]|None=None) -> SnowflakeTable:
231
+ table = SnowflakeTable(name, self, schema=schema)
232
+ self._bindable_tables[name] = table
233
+ return table
234
+
235
+ def csv_table(self, name: str, schema: dict[str, qb.Concept]) -> CsvTable:
236
+ table = CsvTable(name, schema, self)
237
+ self._bindable_tables[name] = table
238
+ return table
239
+
240
+ def binding(self, binding: Binding):
241
+ self._bindings.append(binding)
242
+
243
+ def generate_model_rules(self, config: Optional[dict]=None):
244
+ if self._weaver is None:
245
+ self._weaver = Weaver(self, config)
246
+ else:
247
+ raise Exception("Model rules have already been generated.")
248
+ self._weaver.generate()
249
+
250
+ def delete(self):
251
+ self.api().provider().delete_model(self.name)
252
+
253
+ def _validate_type_name(self, name):
254
+ if name in self._qb_model.concepts:
255
+ raise Exception(
256
+ f"The name '{name}' is used to declare a Concept.")
@@ -0,0 +1,344 @@
1
+ import typing
2
+
3
+ from v0.relationalai.early_access.dsl.orm.printer import Printer, _sort_dependency_graph, InterfacePrinter
4
+ from v0.relationalai.early_access.dsl.orm.models import Model
5
+ from v0.relationalai.early_access.dsl.orm.types import Concept
6
+
7
+ SPACE_INDENT = " "
8
+ TAB_INDENT = "\t"
9
+
10
+ class ObjectOrientedPrinter(Printer):
11
+ _indent: str
12
+
13
+ def __init__(self, io: typing.Optional[typing.IO[str]] = None, space_indent: bool= False):
14
+ super().__init__(io)
15
+ object.__setattr__(self, '_indent', SPACE_INDENT if space_indent else TAB_INDENT)
16
+
17
+ def to_string(self, model: Model, enums_enabled: bool = False, pyi_enabled: bool = False) -> None:
18
+ self._process_constraints(model)
19
+
20
+ self._print_nl("from typing import Any, Sequence, Union, TypeVar")
21
+ self._print_nl("import relationalai.semantics.internal as qb")
22
+ self._print_nl("import relationalai.semantics.internal.internal as builder")
23
+ self._print_nl("from relationalai.early_access.dsl.orm.models import Model")
24
+ if pyi_enabled:
25
+ self._print_nl("from relationalai.early_access.dsl.orm.models import Concept")
26
+ self._print_nl("from relationalai.early_access.dsl.orm.relationships import Role")
27
+ self._print_nl("from relationalai.early_access.dsl.orm.constraints import Range")
28
+ self._print_nl("from relationalai.early_access.dsl.orm.constraints import RingType")
29
+ self._print_nl("from relationalai.early_access.dsl.orm.constraints import ValueComparisonType")
30
+ self._nl()
31
+
32
+ self._handle_concepts_declaration(model, enums_enabled, pyi_enabled)
33
+ self._nl()
34
+ self._print_nl("class OntologyBase:\n"
35
+ f'{self._indent}"""Represents an Ontology."""')
36
+ self._nl()
37
+ self._print_nl(f"{self._indent}def __init__(self, model: Model):\n"
38
+ f"{self._indent}{self._indent}self.model = model")
39
+ self._nl()
40
+ self._print_nl(f"{self._indent}def generate_model_rules(self):\n"
41
+ f"{self._indent}{self._indent}self.model.generate_model_rules()")
42
+ self._nl()
43
+ if not pyi_enabled:
44
+ self._print_nl(f"{self._indent}def Concept(self, name: str, extends: list[Any] = [], identify_by:dict[str, Any]={{}}):\n"
45
+ f"{self._indent}{self._indent}return self.model.Concept(name, extends, identify_by)")
46
+ if enums_enabled:
47
+ self._print_nl(f"{self._indent}def Enum(self):\n"
48
+ f"{self._indent}{self._indent}return self.model.Enum()")
49
+ self._print_nl(f"{self._indent}def Relationship(self, reading: Any, short_name:str=\"\") -> qb.Relationship:\n"
50
+ f"{self._indent}{self._indent}return self.model.Relationship(reading, short_name)")
51
+ self._print_nl(f"{self._indent}def Unique(self, *roles):\n"
52
+ f"{self._indent}{self._indent}self.model.unique(*roles)")
53
+ self._print_nl(f"{self._indent}def Mandatory(self, role):\n"
54
+ f"{self._indent}{self._indent}self.model.mandatory(role)")
55
+ self._print_nl(f"{self._indent}T = TypeVar('T', int, float, str)")
56
+ self._print_nl(f"{self._indent}def RoleValueConstraint(self, role: Role, values: Sequence[Union[T, Range[T]]]):\n"
57
+ f"{self._indent}{self._indent}self.model.role_value_constraint(role, values)")
58
+ self._print_nl(f"{self._indent}def InclusiveSubtypeConstraint(self, *concepts: Concept):\n"
59
+ f"{self._indent}{self._indent}self.model.inclusive_subtype_constraint(*concepts)")
60
+ self._print_nl(f"{self._indent}def ExclusiveSubtypeConstraint(self, *concepts: Concept):\n"
61
+ f"{self._indent}{self._indent}self.model.exclusive_subtype_constraint(*concepts)")
62
+ self._print_nl(f"{self._indent}def InclusiveRoleConstraint(self, *roles):\n"
63
+ f"{self._indent}{self._indent}self.model.inclusive_roles(*roles)")
64
+ self._print_nl(f"{self._indent}def ExclusiveRoleConstraint(self, *role_sequences):\n"
65
+ f"{self._indent}{self._indent}self.model.exclusive_roles(*role_sequences)")
66
+ self._print_nl(f"{self._indent}def RingConstraint(self, *roles):\n"
67
+ f"{self._indent}{self._indent}self.model.ring(*roles)")
68
+ self._print_nl(f"{self._indent}def ValueComparisonConstraint(self, constraint_type, *roles):\n"
69
+ f"{self._indent}{self._indent}self.model.value_comparison(constraint_type, *roles)")
70
+ self._print_nl(f"{self._indent}def RoleSubsetConstraint(self, *role_sequences):\n"
71
+ f"{self._indent}{self._indent}self.model.role_subset(*role_sequences)")
72
+ self._print_nl(f"{self._indent}def EqualityConstraint(self, *role_sequences):\n"
73
+ f"{self._indent}{self._indent}self.model.equality(*role_sequences)")
74
+ self._print_nl(f"{self._indent}def FrequencyConstraint(self, frequency, *role_sequences):\n"
75
+ f"{self._indent}{self._indent}self.model.frequency(frequency, *role_sequences)")
76
+ self._print_nl(
77
+ f"{self._indent}def CardinalityConstraint(self, concept: Concept, values: Sequence[Union[int, Range[int]]]):\n"
78
+ f"{self._indent}{self._indent}self.model.cardinality(concept, values)")
79
+ self._print_nl(f"{self._indent}def RoleCardinalityConstraint(self, role: Role, values: Sequence[Union[int, Range[int]]]):\n"
80
+ f"{self._indent}{self._indent}self.model.role_cardinality(role, values)")
81
+ self._print_nl(f"{self._indent}def ValueConstraint(self, concept: Concept, values: Sequence[Union[T, Range[T]]]):\n"
82
+ f"{self._indent}{self._indent}self.model.value_constraint(concept, values)")
83
+
84
+ self._nl()
85
+ self._print_nl("class ORMOntology(OntologyBase):")
86
+ self._print_nl(f'{self._indent}"""Represents an Ontology generated from an ORM file."""')
87
+ self._nl()
88
+ self._print_nl(f"{self._indent}def __init__(self, model: Model):")
89
+ self._print_nl(f"{self._indent}{self._indent}super().__init__(model)")
90
+ self._nl()
91
+ self._handle_concepts(model, enums_enabled, pyi_enabled)
92
+ self._nl()
93
+ self._handle_relationships(model)
94
+
95
+ self._nl()
96
+ self._handle_ref_schemes(model)
97
+
98
+ if self._unique_constraints:
99
+ self._nl()
100
+ self._handle_uniqueness_constraints()
101
+
102
+ if self._mandatory_constraints:
103
+ self._nl()
104
+ self._handle_mandatory_constraints()
105
+
106
+ if self._role_value_constraints:
107
+ self._nl()
108
+ self._handle_role_value_constraints()
109
+
110
+ if self._inclusive_subtype_constraints or self._exclusive_subtype_constraints:
111
+ self._nl()
112
+ self._handle_subtype_constraints()
113
+
114
+ if self._inclusive_role_constraints:
115
+ self._nl()
116
+ self._handle_inclusive_role_constraints()
117
+
118
+ if self._exclusive_role_constraints:
119
+ self._nl()
120
+ self._handle_exclusive_role_constraints()
121
+
122
+ if self._ring_constraints:
123
+ self._nl()
124
+ self._handle_ring_constraints()
125
+
126
+ if self._value_comparison_constraints:
127
+ self._nl()
128
+ self._handle_value_comparison_constraints()
129
+
130
+ if self._role_subset_constraints:
131
+ self._nl()
132
+ self._handle_role_subset_constraints()
133
+
134
+ if self._equality_constraints:
135
+ self._nl()
136
+ self._handle_equality_constraints()
137
+
138
+ if self._frequency_constraints:
139
+ self._nl()
140
+ self._handle_frequency_constraints()
141
+
142
+ if self._cardinality_constraints:
143
+ self._nl()
144
+ self._handle_cardinality_constraints()
145
+
146
+ if self._role_cardinality_constraints:
147
+ self._nl()
148
+ self._handle_role_cardinality_constraints()
149
+
150
+ if self._value_constraints:
151
+ self._nl()
152
+ self._handle_value_constraints()
153
+
154
+ def _handle_concepts_declaration(self, model: Model, enums_enabled: bool, pyi_enabled: bool) -> None:
155
+ concepts_map = model.concepts_map()
156
+ sorted_concepts = _sort_dependency_graph(model.concepts())
157
+ # print Concept classes
158
+ if pyi_enabled:
159
+ for name in sorted_concepts:
160
+ c = concepts_map.get(name)
161
+ if c is None:
162
+ raise ValueError(f"The concept '{name}' was not declared but used as concept domain.")
163
+ # skip enums when they are enabled for printer
164
+ if c._is_enum() and enums_enabled:
165
+ continue
166
+ extends = [f"{e._name}Concept" for e in c._extends if not e._is_primitive()]
167
+ self._print_nl(f"class {name}Concept({', '.join(extends) if extends else 'Concept'}):")
168
+ self._print_nl(f'{self._indent}"""Represents {name} concept."""')
169
+ self._nl()
170
+
171
+ def _handle_concepts(self, model: Model, enums_enabled: bool, pyi_enabled: bool) -> None:
172
+ concepts_map = model.concepts_map()
173
+ enums_map = model.enums_map()
174
+ sorted_concepts = _sort_dependency_graph(model.concepts())
175
+ for name in sorted_concepts:
176
+ c = concepts_map.get(name)
177
+ if c is None:
178
+ raise ValueError(f"The concept '{name}' was not declared but used as concept domain.")
179
+ if enums_enabled and c._is_enum():
180
+ self._print_nl(f"{self._indent}{self._indent}self.{name} = model.Enum('{name}', {[e.name for e in enums_map[name]]})")
181
+ else:
182
+ extends = c._extends
183
+ if not enums_enabled and c._is_enum():
184
+ # todo: derive enum type
185
+ # ORM adapter produces only string enums
186
+ extends_elements = ["qb.String"]
187
+ else:
188
+ extends_elements = [f"self.{self._get_type(ext)}" if not self._get_type(ext).startswith(
189
+ "qb.") and not self._get_type(ext).startswith("builder.") else self._get_type(ext) for ext in
190
+ extends]
191
+ extends_str = f", extends=[{', '.join(extends_elements)}]" if extends else ""
192
+ concept_class = name + 'Concept' if pyi_enabled else 'model.Concept'
193
+ params = f"({'model, ' if pyi_enabled else ''}'{name}'{extends_str})"
194
+ self._print_nl(f"{self._indent}{self._indent}self.{name} = {concept_class}{params}")
195
+
196
+ def _handle_relationships(self, model: Model) -> None:
197
+ for rel in model.relationships():
198
+ # skip autogenerated 'name' Relationship for Enums
199
+ if rel._name == 'name' and rel._parent is not None and rel._parent._is_enum():
200
+ continue
201
+ # print a root Relationship
202
+ self._print_nl(f"{self._indent}{self._indent}self.{self._get_relationship_name(rel)} = "
203
+ f"model.Relationship('{rel._madlib}'{self._print_if_not_empty_and_not_equal('short_name', rel._passed_short_name, rel._name)})")
204
+
205
+ # print remaining RelationshipReadings if any
206
+ for r in rel._readings[1:]:
207
+ self._print_nl(f"{self._indent}{self._indent}self.{self._get_relationship_name(r)} = "
208
+ f"self.{self._get_relationship_name(rel)}.alt('{r._madlib}'{self._print_if_not_empty_and_not_equal('short_name', r._passed_short_name, r._name)})")
209
+
210
+ def _handle_ref_schemes(self, model: Model) -> None:
211
+ for concept_name, concept in model.entity_types_map().items():
212
+ if not isinstance(concept, Concept) or not concept._reference_schemes:
213
+ continue
214
+
215
+ for ref_scheme in concept._reference_schemes:
216
+ rel_names = [f"self.{self._get_relationship_name(rel)}" for rel in ref_scheme]
217
+ self._print_nl(f"{self._indent}{self._indent}self.{concept_name}.identify_by({', '.join(rel_names)})")
218
+
219
+ def _handle_uniqueness_constraints(self) -> None:
220
+ for constraint in self._unique_constraints:
221
+ if not constraint.is_preferred_identifier:
222
+ elements = [f"self.{self._get_role_name(role)}" for role in constraint.roles()]
223
+ self._print_nl(f"{self._indent}{self._indent}self.Unique({', '.join(elements)})")
224
+
225
+ def _handle_mandatory_constraints(self):
226
+ for constraint in self._mandatory_constraints:
227
+ role = constraint.roles()[0]
228
+ role_name = self._get_role_name(role)
229
+ self._print_nl(f"{self._indent}{self._indent}self.Mandatory(self.{role_name})")
230
+
231
+ def _handle_role_value_constraints(self) -> None:
232
+ for constraint in self._role_value_constraints:
233
+ role = constraint.roles()[0]
234
+ elements = self._get_constraint_values(constraint)
235
+ role_name = f"self.{self._get_role_name(role)}"
236
+ self._print_nl(f"{self._indent}{self._indent}self.RoleValueConstraint({role_name}, [{', '.join(elements)}])")
237
+
238
+ def _handle_inclusive_role_constraints(self):
239
+ for constraint in self._inclusive_role_constraints:
240
+ roles = [f"self.{self._get_role_name(r)}" for r in constraint.roles()]
241
+ self._print_nl(f"{self._indent}{self._indent}self.InclusiveRoleConstraint({', '.join(roles)})")
242
+
243
+ def _handle_exclusive_role_constraints(self):
244
+ self._emit_role_sequence_constraints(self._exclusive_role_constraints, "ExclusiveRoleConstraint")
245
+
246
+ def _handle_ring_constraints(self):
247
+ for constraint in self._ring_constraints:
248
+ elements = [f"self.{self._get_role_name(role)}" for role in constraint.roles()]
249
+ cst_types = [f"{tp}" for tp in constraint.types]
250
+ self._print_nl(f"{self._indent}{self._indent}self.RingConstraint([{', '.join(cst_types)}], {', '.join(elements)})")
251
+
252
+ def _handle_value_comparison_constraints(self):
253
+ for constraint in self._value_comparison_constraints:
254
+ elements = [f"self.{self._get_role_name(role)}" for role in constraint.roles()]
255
+ self._print_nl(f"{self._indent}{self._indent}self.ValueComparisonConstraint({constraint.type}, {', '.join(elements)})")
256
+
257
+ def _handle_frequency_constraints(self):
258
+ for constraint in self._frequency_constraints:
259
+ elements = [f"self.{self._get_role_name(role)}" for role in constraint.roles()]
260
+ self._print_nl(f"{self._indent}{self._indent}self.FrequencyConstraint(({', '.join(constraint.frequency)}), {', '.join(elements)})")
261
+
262
+ def _handle_cardinality_constraints(self):
263
+ for constraint in self._cardinality_constraints:
264
+ elements = self._get_constraint_values(constraint)
265
+ self._print_nl(
266
+ f"{self._indent}{self._indent}self.CardinalityConstraint(self.{constraint.concept()._name}, [{', '.join(elements)}])")
267
+
268
+ def _handle_role_cardinality_constraints(self):
269
+ for constraint in self._role_cardinality_constraints:
270
+ elements = self._get_constraint_values(constraint)
271
+ self._print_nl(
272
+ f"{self._indent}{self._indent}self.RoleCardinalityConstraint(self.{self._get_role_name(constraint.roles()[0])}, [{', '.join(elements)}])")
273
+
274
+ def _handle_value_constraints(self):
275
+ for constraint in self._value_constraints:
276
+ elements = self._get_constraint_values(constraint)
277
+ self._print_nl(f"{self._indent}{self._indent}self.ValueConstraint(self.{constraint.concept()._name}, [{', '.join(elements)}])")
278
+
279
+ def _emit_role_sequence_constraints(self, constraints, constraint_type: str):
280
+ for constraint in constraints:
281
+ role_sequences = [[f"self.{self._get_role_name(r)}" for r in ro_list] for ro_list in
282
+ constraint.role_sequences()]
283
+ if self._is_complex_role_sequence(role_sequences):
284
+ self._print_nl(
285
+ f"{self._indent}{self._indent}self.{constraint_type}([{'], ['.join(', '.join(ro_list) for ro_list in role_sequences)}])")
286
+ else:
287
+ self._print_nl(
288
+ f"{self._indent}{self._indent}self.{constraint_type}({', '.join(', '.join(ro_list) for ro_list in role_sequences)})")
289
+
290
+ def _emit_subtype_constraints(self, constraints, constraint_type: str):
291
+ for constraint in constraints:
292
+ concepts = [f"self.{self._get_type(c)}" for c in constraint.concepts().values()]
293
+ self._print_nl(f"{self._indent}{self._indent}self.{constraint_type}({', '.join(concepts)})")
294
+
295
+
296
+ EXCLUDED_RELATIONSHIPS = ["shape"]
297
+
298
+
299
+ class ObjectOrientedInterfacePrinter(InterfacePrinter):
300
+ _indent: str
301
+
302
+ def __init__(self, io: typing.Optional[typing.IO[str]] = None, space_indent: bool=False):
303
+ # Set the base class field (frozen)
304
+ super().__init__(io)
305
+ object.__setattr__(self, '_indent', SPACE_INDENT if space_indent else TAB_INDENT)
306
+
307
+ def to_string(self, model: Model, enums_enabled: bool = False) -> None:
308
+ if enums_enabled:
309
+ self._print_nl("from enum import Enum")
310
+ self._print_nl("from typing import Union")
311
+ self._print_nl("import relationalai.semantics.internal as qb")
312
+ self._print_nl("import relationalai.semantics.internal.internal as builder")
313
+ self._print_nl("from relationalai.early_access.dsl.orm.models import Concept")
314
+ self._nl()
315
+ if enums_enabled:
316
+ self._handle_enums(model)
317
+ self._handle_concepts(model, enums_enabled)
318
+
319
+ def _handle_concepts(self, model: Model, enums_enabled) -> None:
320
+ concepts_map = model.concepts_map()
321
+ sorted_concepts = _sort_dependency_graph(model.concepts())
322
+ for name in sorted_concepts:
323
+ c = concepts_map.get(name)
324
+ if c is None:
325
+ raise ValueError(f"The concept '{name}' was not declared but used as concept domain.")
326
+ if enums_enabled and c._is_enum():
327
+ continue
328
+ exclude_list = list(EXCLUDED_RELATIONSHIPS)
329
+ # when enum is declared but enums are disabled print it as a Concept without "name" Relationship
330
+ if c._is_enum():
331
+ exclude_list.append("name")
332
+ extends = [f"{e._name}Concept" for e in c._extends if not e._is_primitive()]
333
+ self._print_nl(f"class {name}Concept({', '.join(extends) if extends else 'Concept'}):")
334
+ rel_strs = self._get_declared_relationships(c, exclude_list)
335
+ self._print_nl(f"{self._indent}pass" if len(rel_strs) == 0 else "\n".join(rel_strs))
336
+ self._nl()
337
+ self._print_nl("class ORMOntology:")
338
+ for name in sorted_concepts:
339
+ c = concepts_map.get(name)
340
+ if c:
341
+ if c._is_enum() and enums_enabled:
342
+ self._print_nl(f"{self._indent}{c._name}: {c._name}")
343
+ else:
344
+ self._print_nl(f"{self._indent}{c._name}: {c._name}Concept")