relationalai 0.13.5__py3-none-any.whl → 1.0.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (856) hide show
  1. relationalai/__init__.py +1 -256
  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/config/shims.py +1 -0
  16. relationalai/semantics/__init__.py +146 -22
  17. relationalai/semantics/backends/lqp/annotations.py +11 -0
  18. relationalai/semantics/backends/sql/sql_compiler.py +327 -0
  19. relationalai/semantics/frontend/base.py +1716 -0
  20. relationalai/semantics/frontend/core.py +179 -0
  21. relationalai/semantics/frontend/front_compiler.py +1313 -0
  22. relationalai/semantics/frontend/pprint.py +408 -0
  23. relationalai/semantics/metamodel/__init__.py +6 -40
  24. relationalai/semantics/metamodel/builtins.py +205 -772
  25. relationalai/semantics/metamodel/metamodel.py +437 -0
  26. relationalai/semantics/metamodel/metamodel_analyzer.py +519 -0
  27. relationalai/semantics/metamodel/pprint.py +412 -0
  28. relationalai/semantics/metamodel/rewriter.py +266 -0
  29. relationalai/semantics/metamodel/typer.py +1186 -0
  30. relationalai/semantics/std/__init__.py +60 -40
  31. relationalai/semantics/std/aggregates.py +149 -0
  32. relationalai/semantics/std/common.py +44 -0
  33. relationalai/semantics/std/constraints.py +37 -43
  34. relationalai/semantics/std/datetime.py +246 -135
  35. relationalai/semantics/std/decimals.py +45 -52
  36. relationalai/semantics/std/floats.py +13 -5
  37. relationalai/semantics/std/integers.py +26 -11
  38. relationalai/semantics/std/math.py +183 -112
  39. relationalai/semantics/std/numbers.py +86 -0
  40. relationalai/semantics/std/re.py +80 -62
  41. relationalai/semantics/std/strings.py +101 -46
  42. relationalai/shims/executor.py +161 -0
  43. relationalai/shims/helpers.py +126 -0
  44. relationalai/shims/hoister.py +221 -0
  45. relationalai/shims/mm2v0.py +1324 -0
  46. relationalai/tools/cli/__init__.py +6 -0
  47. relationalai/tools/cli/cli.py +90 -0
  48. relationalai/tools/cli/components/__init__.py +5 -0
  49. relationalai/tools/cli/components/progress_reader.py +1524 -0
  50. relationalai/tools/cli/components/utils.py +58 -0
  51. relationalai/tools/cli/config_template.py +45 -0
  52. relationalai/tools/cli/dev.py +19 -0
  53. relationalai/tools/debugger.py +289 -183
  54. relationalai/tools/typer_debugger.py +93 -0
  55. relationalai/util/dataclasses.py +43 -0
  56. relationalai/util/docutils.py +40 -0
  57. relationalai/util/error.py +199 -0
  58. relationalai/util/format.py +48 -109
  59. relationalai/util/naming.py +145 -0
  60. relationalai/util/python.py +35 -0
  61. relationalai/util/runtime.py +156 -0
  62. relationalai/util/schema.py +197 -0
  63. relationalai/util/source.py +185 -0
  64. relationalai/util/structures.py +163 -0
  65. relationalai/util/tracing.py +261 -0
  66. relationalai-1.0.0a1.dist-info/METADATA +44 -0
  67. relationalai-1.0.0a1.dist-info/RECORD +489 -0
  68. relationalai-1.0.0a1.dist-info/WHEEL +5 -0
  69. relationalai-1.0.0a1.dist-info/entry_points.txt +3 -0
  70. relationalai-1.0.0a1.dist-info/top_level.txt +2 -0
  71. v0/relationalai/__init__.py +216 -0
  72. v0/relationalai/clients/__init__.py +5 -0
  73. v0/relationalai/clients/azure.py +477 -0
  74. v0/relationalai/clients/client.py +912 -0
  75. v0/relationalai/clients/config.py +673 -0
  76. v0/relationalai/clients/direct_access_client.py +118 -0
  77. v0/relationalai/clients/hash_util.py +31 -0
  78. v0/relationalai/clients/local.py +571 -0
  79. v0/relationalai/clients/profile_polling.py +73 -0
  80. v0/relationalai/clients/result_helpers.py +420 -0
  81. v0/relationalai/clients/snowflake.py +3869 -0
  82. v0/relationalai/clients/types.py +113 -0
  83. v0/relationalai/clients/use_index_poller.py +980 -0
  84. v0/relationalai/clients/util.py +356 -0
  85. v0/relationalai/debugging.py +389 -0
  86. v0/relationalai/dsl.py +1749 -0
  87. v0/relationalai/early_access/builder/__init__.py +30 -0
  88. v0/relationalai/early_access/builder/builder/__init__.py +35 -0
  89. v0/relationalai/early_access/builder/snowflake/__init__.py +12 -0
  90. v0/relationalai/early_access/builder/std/__init__.py +25 -0
  91. v0/relationalai/early_access/builder/std/decimals/__init__.py +12 -0
  92. v0/relationalai/early_access/builder/std/integers/__init__.py +12 -0
  93. v0/relationalai/early_access/builder/std/math/__init__.py +12 -0
  94. v0/relationalai/early_access/builder/std/strings/__init__.py +14 -0
  95. v0/relationalai/early_access/devtools/__init__.py +12 -0
  96. v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
  97. v0/relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
  98. v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
  99. v0/relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
  100. v0/relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
  101. v0/relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
  102. v0/relationalai/early_access/dsl/bindings/common.py +402 -0
  103. v0/relationalai/early_access/dsl/bindings/csv.py +170 -0
  104. v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
  105. v0/relationalai/early_access/dsl/bindings/snowflake.py +64 -0
  106. v0/relationalai/early_access/dsl/codegen/binder.py +411 -0
  107. v0/relationalai/early_access/dsl/codegen/common.py +79 -0
  108. v0/relationalai/early_access/dsl/codegen/helpers.py +23 -0
  109. v0/relationalai/early_access/dsl/codegen/relations.py +700 -0
  110. v0/relationalai/early_access/dsl/codegen/weaver.py +417 -0
  111. v0/relationalai/early_access/dsl/core/builders/__init__.py +47 -0
  112. v0/relationalai/early_access/dsl/core/builders/logic.py +19 -0
  113. v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
  114. v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
  115. v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
  116. v0/relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
  117. v0/relationalai/early_access/dsl/core/context.py +13 -0
  118. v0/relationalai/early_access/dsl/core/cset.py +132 -0
  119. v0/relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
  120. v0/relationalai/early_access/dsl/core/exprs/relational.py +18 -0
  121. v0/relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
  122. v0/relationalai/early_access/dsl/core/instances.py +44 -0
  123. v0/relationalai/early_access/dsl/core/logic/__init__.py +193 -0
  124. v0/relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
  125. v0/relationalai/early_access/dsl/core/logic/exists.py +223 -0
  126. v0/relationalai/early_access/dsl/core/logic/helper.py +163 -0
  127. v0/relationalai/early_access/dsl/core/namespaces.py +32 -0
  128. v0/relationalai/early_access/dsl/core/relations.py +276 -0
  129. v0/relationalai/early_access/dsl/core/rules.py +112 -0
  130. v0/relationalai/early_access/dsl/core/std/__init__.py +45 -0
  131. v0/relationalai/early_access/dsl/core/temporal/recall.py +6 -0
  132. v0/relationalai/early_access/dsl/core/types/__init__.py +270 -0
  133. v0/relationalai/early_access/dsl/core/types/concepts.py +128 -0
  134. v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
  135. v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
  136. v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
  137. v0/relationalai/early_access/dsl/core/types/standard.py +92 -0
  138. v0/relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
  139. v0/relationalai/early_access/dsl/core/types/variables.py +203 -0
  140. v0/relationalai/early_access/dsl/ir/compiler.py +318 -0
  141. v0/relationalai/early_access/dsl/ir/executor.py +260 -0
  142. v0/relationalai/early_access/dsl/ontologies/constraints.py +88 -0
  143. v0/relationalai/early_access/dsl/ontologies/export.py +30 -0
  144. v0/relationalai/early_access/dsl/ontologies/models.py +453 -0
  145. v0/relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
  146. v0/relationalai/early_access/dsl/ontologies/readings.py +60 -0
  147. v0/relationalai/early_access/dsl/ontologies/relationships.py +322 -0
  148. v0/relationalai/early_access/dsl/ontologies/roles.py +87 -0
  149. v0/relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
  150. v0/relationalai/early_access/dsl/orm/constraints.py +438 -0
  151. v0/relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
  152. v0/relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
  153. v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
  154. v0/relationalai/early_access/dsl/orm/measures/measures.py +299 -0
  155. v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
  156. v0/relationalai/early_access/dsl/orm/models.py +256 -0
  157. v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
  158. v0/relationalai/early_access/dsl/orm/printer.py +469 -0
  159. v0/relationalai/early_access/dsl/orm/reasoners.py +480 -0
  160. v0/relationalai/early_access/dsl/orm/relations.py +19 -0
  161. v0/relationalai/early_access/dsl/orm/relationships.py +251 -0
  162. v0/relationalai/early_access/dsl/orm/types.py +42 -0
  163. v0/relationalai/early_access/dsl/orm/utils.py +79 -0
  164. v0/relationalai/early_access/dsl/orm/verb.py +204 -0
  165. v0/relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
  166. v0/relationalai/early_access/dsl/relations.py +170 -0
  167. v0/relationalai/early_access/dsl/rulesets.py +69 -0
  168. v0/relationalai/early_access/dsl/schemas/__init__.py +450 -0
  169. v0/relationalai/early_access/dsl/schemas/builder.py +48 -0
  170. v0/relationalai/early_access/dsl/schemas/comp_names.py +51 -0
  171. v0/relationalai/early_access/dsl/schemas/components.py +203 -0
  172. v0/relationalai/early_access/dsl/schemas/contexts.py +156 -0
  173. v0/relationalai/early_access/dsl/schemas/exprs.py +89 -0
  174. v0/relationalai/early_access/dsl/schemas/fragments.py +464 -0
  175. v0/relationalai/early_access/dsl/serialization.py +79 -0
  176. v0/relationalai/early_access/dsl/serialize/exporter.py +163 -0
  177. v0/relationalai/early_access/dsl/snow/api.py +104 -0
  178. v0/relationalai/early_access/dsl/snow/common.py +76 -0
  179. v0/relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
  180. v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
  181. v0/relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
  182. v0/relationalai/early_access/dsl/types/__init__.py +40 -0
  183. v0/relationalai/early_access/dsl/types/concepts.py +12 -0
  184. v0/relationalai/early_access/dsl/types/entities.py +135 -0
  185. v0/relationalai/early_access/dsl/types/values.py +17 -0
  186. v0/relationalai/early_access/dsl/utils.py +102 -0
  187. v0/relationalai/early_access/graphs/__init__.py +13 -0
  188. v0/relationalai/early_access/lqp/__init__.py +12 -0
  189. v0/relationalai/early_access/lqp/compiler/__init__.py +12 -0
  190. v0/relationalai/early_access/lqp/constructors/__init__.py +18 -0
  191. v0/relationalai/early_access/lqp/executor/__init__.py +12 -0
  192. v0/relationalai/early_access/lqp/ir/__init__.py +12 -0
  193. v0/relationalai/early_access/lqp/passes/__init__.py +12 -0
  194. v0/relationalai/early_access/lqp/pragmas/__init__.py +12 -0
  195. v0/relationalai/early_access/lqp/primitives/__init__.py +12 -0
  196. v0/relationalai/early_access/lqp/types/__init__.py +12 -0
  197. v0/relationalai/early_access/lqp/utils/__init__.py +12 -0
  198. v0/relationalai/early_access/lqp/validators/__init__.py +12 -0
  199. v0/relationalai/early_access/metamodel/__init__.py +58 -0
  200. v0/relationalai/early_access/metamodel/builtins/__init__.py +12 -0
  201. v0/relationalai/early_access/metamodel/compiler/__init__.py +12 -0
  202. v0/relationalai/early_access/metamodel/dependency/__init__.py +12 -0
  203. v0/relationalai/early_access/metamodel/factory/__init__.py +17 -0
  204. v0/relationalai/early_access/metamodel/helpers/__init__.py +12 -0
  205. v0/relationalai/early_access/metamodel/ir/__init__.py +14 -0
  206. v0/relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
  207. v0/relationalai/early_access/metamodel/typer/__init__.py +3 -0
  208. v0/relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
  209. v0/relationalai/early_access/metamodel/types/__init__.py +15 -0
  210. v0/relationalai/early_access/metamodel/util/__init__.py +15 -0
  211. v0/relationalai/early_access/metamodel/visitor/__init__.py +12 -0
  212. v0/relationalai/early_access/rel/__init__.py +12 -0
  213. v0/relationalai/early_access/rel/executor/__init__.py +12 -0
  214. v0/relationalai/early_access/rel/rel_utils/__init__.py +12 -0
  215. v0/relationalai/early_access/rel/rewrite/__init__.py +7 -0
  216. v0/relationalai/early_access/solvers/__init__.py +19 -0
  217. v0/relationalai/early_access/sql/__init__.py +11 -0
  218. v0/relationalai/early_access/sql/executor/__init__.py +3 -0
  219. v0/relationalai/early_access/sql/rewrite/__init__.py +3 -0
  220. v0/relationalai/early_access/tests/logging/__init__.py +12 -0
  221. v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
  222. v0/relationalai/early_access/tests/utils/__init__.py +12 -0
  223. v0/relationalai/environments/__init__.py +35 -0
  224. v0/relationalai/environments/base.py +381 -0
  225. v0/relationalai/environments/colab.py +14 -0
  226. v0/relationalai/environments/generic.py +71 -0
  227. v0/relationalai/environments/ipython.py +68 -0
  228. v0/relationalai/environments/jupyter.py +9 -0
  229. v0/relationalai/environments/snowbook.py +169 -0
  230. v0/relationalai/errors.py +2455 -0
  231. v0/relationalai/experimental/SF.py +38 -0
  232. v0/relationalai/experimental/inspect.py +47 -0
  233. v0/relationalai/experimental/pathfinder/__init__.py +158 -0
  234. v0/relationalai/experimental/pathfinder/api.py +160 -0
  235. v0/relationalai/experimental/pathfinder/automaton.py +584 -0
  236. v0/relationalai/experimental/pathfinder/bridge.py +226 -0
  237. v0/relationalai/experimental/pathfinder/compiler.py +416 -0
  238. v0/relationalai/experimental/pathfinder/datalog.py +214 -0
  239. v0/relationalai/experimental/pathfinder/diagnostics.py +56 -0
  240. v0/relationalai/experimental/pathfinder/filter.py +236 -0
  241. v0/relationalai/experimental/pathfinder/glushkov.py +439 -0
  242. v0/relationalai/experimental/pathfinder/options.py +265 -0
  243. v0/relationalai/experimental/pathfinder/rpq.py +344 -0
  244. v0/relationalai/experimental/pathfinder/transition.py +200 -0
  245. v0/relationalai/experimental/pathfinder/utils.py +26 -0
  246. v0/relationalai/experimental/paths/api.py +143 -0
  247. v0/relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
  248. v0/relationalai/experimental/paths/examples/basic_example.py +40 -0
  249. v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
  250. v0/relationalai/experimental/paths/examples/movie_example.py +77 -0
  251. v0/relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
  252. v0/relationalai/experimental/paths/examples/paths_example.py +116 -0
  253. v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
  254. v0/relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
  255. v0/relationalai/experimental/paths/graph.py +185 -0
  256. v0/relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
  257. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
  258. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
  259. v0/relationalai/experimental/paths/path_algorithms/single.py +59 -0
  260. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
  261. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
  262. v0/relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
  263. v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
  264. v0/relationalai/experimental/paths/path_algorithms/usp.py +150 -0
  265. v0/relationalai/experimental/paths/product_graph.py +93 -0
  266. v0/relationalai/experimental/paths/rpq/automaton.py +584 -0
  267. v0/relationalai/experimental/paths/rpq/diagnostics.py +56 -0
  268. v0/relationalai/experimental/paths/rpq/rpq.py +378 -0
  269. v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
  270. v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
  271. v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
  272. v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
  273. v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
  274. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
  275. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
  276. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
  277. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
  278. v0/relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
  279. v0/relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
  280. v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
  281. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
  282. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
  283. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
  284. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
  285. v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
  286. v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
  287. v0/relationalai/experimental/paths/tree_agg.py +168 -0
  288. v0/relationalai/experimental/paths/utilities/iterators.py +27 -0
  289. v0/relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
  290. v0/relationalai/experimental/solvers.py +1087 -0
  291. v0/relationalai/loaders/csv.py +195 -0
  292. v0/relationalai/loaders/loader.py +177 -0
  293. v0/relationalai/loaders/types.py +23 -0
  294. v0/relationalai/rel_emitter.py +373 -0
  295. v0/relationalai/rel_utils.py +185 -0
  296. v0/relationalai/semantics/__init__.py +29 -0
  297. v0/relationalai/semantics/devtools/benchmark_lqp.py +536 -0
  298. v0/relationalai/semantics/devtools/compilation_manager.py +294 -0
  299. v0/relationalai/semantics/devtools/extract_lqp.py +110 -0
  300. v0/relationalai/semantics/internal/internal.py +3785 -0
  301. v0/relationalai/semantics/internal/snowflake.py +324 -0
  302. v0/relationalai/semantics/lqp/builtins.py +16 -0
  303. v0/relationalai/semantics/lqp/compiler.py +22 -0
  304. v0/relationalai/semantics/lqp/constructors.py +68 -0
  305. v0/relationalai/semantics/lqp/executor.py +469 -0
  306. v0/relationalai/semantics/lqp/intrinsics.py +24 -0
  307. v0/relationalai/semantics/lqp/ir.py +124 -0
  308. v0/relationalai/semantics/lqp/model2lqp.py +839 -0
  309. v0/relationalai/semantics/lqp/passes.py +680 -0
  310. v0/relationalai/semantics/lqp/primitives.py +252 -0
  311. v0/relationalai/semantics/lqp/result_helpers.py +202 -0
  312. v0/relationalai/semantics/lqp/rewrite/__init__.py +18 -0
  313. v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
  314. v0/relationalai/semantics/lqp/rewrite/cdc.py +216 -0
  315. v0/relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
  316. v0/relationalai/semantics/lqp/rewrite/extract_keys.py +449 -0
  317. v0/relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
  318. v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
  319. v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
  320. v0/relationalai/semantics/lqp/rewrite/splinter.py +76 -0
  321. v0/relationalai/semantics/lqp/types.py +101 -0
  322. v0/relationalai/semantics/lqp/utils.py +160 -0
  323. v0/relationalai/semantics/lqp/validators.py +57 -0
  324. v0/relationalai/semantics/metamodel/__init__.py +40 -0
  325. v0/relationalai/semantics/metamodel/builtins.py +774 -0
  326. v0/relationalai/semantics/metamodel/compiler.py +133 -0
  327. v0/relationalai/semantics/metamodel/dependency.py +862 -0
  328. v0/relationalai/semantics/metamodel/executor.py +61 -0
  329. v0/relationalai/semantics/metamodel/factory.py +287 -0
  330. v0/relationalai/semantics/metamodel/helpers.py +361 -0
  331. v0/relationalai/semantics/metamodel/ir.py +923 -0
  332. v0/relationalai/semantics/metamodel/rewrite/__init__.py +7 -0
  333. v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
  334. v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
  335. v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
  336. v0/relationalai/semantics/metamodel/rewrite/flatten.py +549 -0
  337. v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
  338. v0/relationalai/semantics/metamodel/typer/checker.py +353 -0
  339. v0/relationalai/semantics/metamodel/typer/typer.py +1395 -0
  340. v0/relationalai/semantics/metamodel/util.py +505 -0
  341. v0/relationalai/semantics/metamodel/visitor.py +944 -0
  342. v0/relationalai/semantics/reasoners/__init__.py +10 -0
  343. v0/relationalai/semantics/reasoners/graph/__init__.py +37 -0
  344. v0/relationalai/semantics/reasoners/graph/core.py +9020 -0
  345. v0/relationalai/semantics/reasoners/optimization/__init__.py +68 -0
  346. v0/relationalai/semantics/reasoners/optimization/common.py +88 -0
  347. v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
  348. v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +1163 -0
  349. v0/relationalai/semantics/rel/builtins.py +40 -0
  350. v0/relationalai/semantics/rel/compiler.py +989 -0
  351. v0/relationalai/semantics/rel/executor.py +359 -0
  352. v0/relationalai/semantics/rel/rel.py +482 -0
  353. v0/relationalai/semantics/rel/rel_utils.py +276 -0
  354. v0/relationalai/semantics/snowflake/__init__.py +3 -0
  355. v0/relationalai/semantics/sql/compiler.py +2503 -0
  356. v0/relationalai/semantics/sql/executor/duck_db.py +52 -0
  357. v0/relationalai/semantics/sql/executor/result_helpers.py +64 -0
  358. v0/relationalai/semantics/sql/executor/snowflake.py +145 -0
  359. v0/relationalai/semantics/sql/rewrite/denormalize.py +222 -0
  360. v0/relationalai/semantics/sql/rewrite/double_negation.py +49 -0
  361. v0/relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
  362. v0/relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
  363. v0/relationalai/semantics/sql/sql.py +504 -0
  364. v0/relationalai/semantics/std/__init__.py +54 -0
  365. v0/relationalai/semantics/std/constraints.py +43 -0
  366. v0/relationalai/semantics/std/datetime.py +363 -0
  367. v0/relationalai/semantics/std/decimals.py +62 -0
  368. v0/relationalai/semantics/std/floats.py +7 -0
  369. v0/relationalai/semantics/std/integers.py +22 -0
  370. v0/relationalai/semantics/std/math.py +141 -0
  371. v0/relationalai/semantics/std/pragmas.py +11 -0
  372. v0/relationalai/semantics/std/re.py +83 -0
  373. v0/relationalai/semantics/std/std.py +14 -0
  374. v0/relationalai/semantics/std/strings.py +63 -0
  375. v0/relationalai/semantics/tests/__init__.py +0 -0
  376. v0/relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
  377. v0/relationalai/semantics/tests/test_snapshot_base.py +9 -0
  378. v0/relationalai/semantics/tests/utils.py +46 -0
  379. v0/relationalai/std/__init__.py +70 -0
  380. v0/relationalai/tools/__init__.py +0 -0
  381. v0/relationalai/tools/cli.py +1940 -0
  382. v0/relationalai/tools/cli_controls.py +1826 -0
  383. v0/relationalai/tools/cli_helpers.py +390 -0
  384. v0/relationalai/tools/debugger.py +183 -0
  385. v0/relationalai/tools/debugger_client.py +109 -0
  386. v0/relationalai/tools/debugger_server.py +302 -0
  387. v0/relationalai/tools/dev.py +685 -0
  388. v0/relationalai/tools/qb_debugger.py +425 -0
  389. v0/relationalai/util/clean_up_databases.py +95 -0
  390. v0/relationalai/util/format.py +123 -0
  391. v0/relationalai/util/list_databases.py +9 -0
  392. v0/relationalai/util/otel_configuration.py +25 -0
  393. v0/relationalai/util/otel_handler.py +484 -0
  394. v0/relationalai/util/snowflake_handler.py +88 -0
  395. v0/relationalai/util/span_format_test.py +43 -0
  396. v0/relationalai/util/span_tracker.py +207 -0
  397. v0/relationalai/util/spans_file_handler.py +72 -0
  398. v0/relationalai/util/tracing_handler.py +34 -0
  399. frontend/debugger/dist/.gitignore +0 -2
  400. frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  401. frontend/debugger/dist/assets/index-Cssla-O7.js +0 -208
  402. frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -9
  403. frontend/debugger/dist/index.html +0 -17
  404. relationalai/clients/__init__.py +0 -18
  405. relationalai/clients/client.py +0 -946
  406. relationalai/clients/config.py +0 -673
  407. relationalai/clients/direct_access_client.py +0 -118
  408. relationalai/clients/exec_txn_poller.py +0 -153
  409. relationalai/clients/hash_util.py +0 -31
  410. relationalai/clients/local.py +0 -594
  411. relationalai/clients/profile_polling.py +0 -73
  412. relationalai/clients/resources/__init__.py +0 -8
  413. relationalai/clients/resources/azure/azure.py +0 -502
  414. relationalai/clients/resources/snowflake/__init__.py +0 -20
  415. relationalai/clients/resources/snowflake/cli_resources.py +0 -98
  416. relationalai/clients/resources/snowflake/direct_access_resources.py +0 -739
  417. relationalai/clients/resources/snowflake/engine_service.py +0 -381
  418. relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -315
  419. relationalai/clients/resources/snowflake/error_handlers.py +0 -240
  420. relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -249
  421. relationalai/clients/resources/snowflake/resources_factory.py +0 -99
  422. relationalai/clients/resources/snowflake/snowflake.py +0 -3193
  423. relationalai/clients/resources/snowflake/use_index_poller.py +0 -1019
  424. relationalai/clients/resources/snowflake/use_index_resources.py +0 -188
  425. relationalai/clients/resources/snowflake/util.py +0 -387
  426. relationalai/clients/result_helpers.py +0 -420
  427. relationalai/clients/types.py +0 -118
  428. relationalai/clients/util.py +0 -356
  429. relationalai/debugging.py +0 -389
  430. relationalai/dsl.py +0 -1749
  431. relationalai/early_access/builder/__init__.py +0 -30
  432. relationalai/early_access/builder/builder/__init__.py +0 -35
  433. relationalai/early_access/builder/snowflake/__init__.py +0 -12
  434. relationalai/early_access/builder/std/__init__.py +0 -25
  435. relationalai/early_access/builder/std/decimals/__init__.py +0 -12
  436. relationalai/early_access/builder/std/integers/__init__.py +0 -12
  437. relationalai/early_access/builder/std/math/__init__.py +0 -12
  438. relationalai/early_access/builder/std/strings/__init__.py +0 -14
  439. relationalai/early_access/devtools/__init__.py +0 -12
  440. relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
  441. relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
  442. relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
  443. relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
  444. relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
  445. relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
  446. relationalai/early_access/dsl/bindings/common.py +0 -402
  447. relationalai/early_access/dsl/bindings/csv.py +0 -170
  448. relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
  449. relationalai/early_access/dsl/bindings/snowflake.py +0 -64
  450. relationalai/early_access/dsl/codegen/binder.py +0 -411
  451. relationalai/early_access/dsl/codegen/common.py +0 -79
  452. relationalai/early_access/dsl/codegen/helpers.py +0 -23
  453. relationalai/early_access/dsl/codegen/relations.py +0 -700
  454. relationalai/early_access/dsl/codegen/weaver.py +0 -417
  455. relationalai/early_access/dsl/core/builders/__init__.py +0 -47
  456. relationalai/early_access/dsl/core/builders/logic.py +0 -19
  457. relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
  458. relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
  459. relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
  460. relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
  461. relationalai/early_access/dsl/core/context.py +0 -13
  462. relationalai/early_access/dsl/core/cset.py +0 -132
  463. relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
  464. relationalai/early_access/dsl/core/exprs/relational.py +0 -18
  465. relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
  466. relationalai/early_access/dsl/core/instances.py +0 -44
  467. relationalai/early_access/dsl/core/logic/__init__.py +0 -193
  468. relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
  469. relationalai/early_access/dsl/core/logic/exists.py +0 -223
  470. relationalai/early_access/dsl/core/logic/helper.py +0 -163
  471. relationalai/early_access/dsl/core/namespaces.py +0 -32
  472. relationalai/early_access/dsl/core/relations.py +0 -276
  473. relationalai/early_access/dsl/core/rules.py +0 -112
  474. relationalai/early_access/dsl/core/std/__init__.py +0 -45
  475. relationalai/early_access/dsl/core/temporal/recall.py +0 -6
  476. relationalai/early_access/dsl/core/types/__init__.py +0 -270
  477. relationalai/early_access/dsl/core/types/concepts.py +0 -128
  478. relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
  479. relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
  480. relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
  481. relationalai/early_access/dsl/core/types/standard.py +0 -92
  482. relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
  483. relationalai/early_access/dsl/core/types/variables.py +0 -203
  484. relationalai/early_access/dsl/ir/compiler.py +0 -318
  485. relationalai/early_access/dsl/ir/executor.py +0 -260
  486. relationalai/early_access/dsl/ontologies/constraints.py +0 -88
  487. relationalai/early_access/dsl/ontologies/export.py +0 -30
  488. relationalai/early_access/dsl/ontologies/models.py +0 -453
  489. relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
  490. relationalai/early_access/dsl/ontologies/readings.py +0 -60
  491. relationalai/early_access/dsl/ontologies/relationships.py +0 -322
  492. relationalai/early_access/dsl/ontologies/roles.py +0 -87
  493. relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
  494. relationalai/early_access/dsl/orm/constraints.py +0 -438
  495. relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
  496. relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
  497. relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
  498. relationalai/early_access/dsl/orm/measures/measures.py +0 -299
  499. relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
  500. relationalai/early_access/dsl/orm/models.py +0 -256
  501. relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
  502. relationalai/early_access/dsl/orm/printer.py +0 -469
  503. relationalai/early_access/dsl/orm/reasoners.py +0 -480
  504. relationalai/early_access/dsl/orm/relations.py +0 -19
  505. relationalai/early_access/dsl/orm/relationships.py +0 -251
  506. relationalai/early_access/dsl/orm/types.py +0 -42
  507. relationalai/early_access/dsl/orm/utils.py +0 -79
  508. relationalai/early_access/dsl/orm/verb.py +0 -204
  509. relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
  510. relationalai/early_access/dsl/relations.py +0 -170
  511. relationalai/early_access/dsl/rulesets.py +0 -69
  512. relationalai/early_access/dsl/schemas/__init__.py +0 -450
  513. relationalai/early_access/dsl/schemas/builder.py +0 -48
  514. relationalai/early_access/dsl/schemas/comp_names.py +0 -51
  515. relationalai/early_access/dsl/schemas/components.py +0 -203
  516. relationalai/early_access/dsl/schemas/contexts.py +0 -156
  517. relationalai/early_access/dsl/schemas/exprs.py +0 -89
  518. relationalai/early_access/dsl/schemas/fragments.py +0 -464
  519. relationalai/early_access/dsl/serialization.py +0 -79
  520. relationalai/early_access/dsl/serialize/exporter.py +0 -163
  521. relationalai/early_access/dsl/snow/api.py +0 -105
  522. relationalai/early_access/dsl/snow/common.py +0 -76
  523. relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
  524. relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
  525. relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
  526. relationalai/early_access/dsl/types/__init__.py +0 -40
  527. relationalai/early_access/dsl/types/concepts.py +0 -12
  528. relationalai/early_access/dsl/types/entities.py +0 -135
  529. relationalai/early_access/dsl/types/values.py +0 -17
  530. relationalai/early_access/dsl/utils.py +0 -102
  531. relationalai/early_access/graphs/__init__.py +0 -13
  532. relationalai/early_access/lqp/__init__.py +0 -12
  533. relationalai/early_access/lqp/compiler/__init__.py +0 -12
  534. relationalai/early_access/lqp/constructors/__init__.py +0 -18
  535. relationalai/early_access/lqp/executor/__init__.py +0 -12
  536. relationalai/early_access/lqp/ir/__init__.py +0 -12
  537. relationalai/early_access/lqp/passes/__init__.py +0 -12
  538. relationalai/early_access/lqp/pragmas/__init__.py +0 -12
  539. relationalai/early_access/lqp/primitives/__init__.py +0 -12
  540. relationalai/early_access/lqp/types/__init__.py +0 -12
  541. relationalai/early_access/lqp/utils/__init__.py +0 -12
  542. relationalai/early_access/lqp/validators/__init__.py +0 -12
  543. relationalai/early_access/metamodel/__init__.py +0 -58
  544. relationalai/early_access/metamodel/builtins/__init__.py +0 -12
  545. relationalai/early_access/metamodel/compiler/__init__.py +0 -12
  546. relationalai/early_access/metamodel/dependency/__init__.py +0 -12
  547. relationalai/early_access/metamodel/factory/__init__.py +0 -17
  548. relationalai/early_access/metamodel/helpers/__init__.py +0 -12
  549. relationalai/early_access/metamodel/ir/__init__.py +0 -14
  550. relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
  551. relationalai/early_access/metamodel/typer/__init__.py +0 -3
  552. relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
  553. relationalai/early_access/metamodel/types/__init__.py +0 -15
  554. relationalai/early_access/metamodel/util/__init__.py +0 -15
  555. relationalai/early_access/metamodel/visitor/__init__.py +0 -12
  556. relationalai/early_access/rel/__init__.py +0 -12
  557. relationalai/early_access/rel/executor/__init__.py +0 -12
  558. relationalai/early_access/rel/rel_utils/__init__.py +0 -12
  559. relationalai/early_access/rel/rewrite/__init__.py +0 -7
  560. relationalai/early_access/solvers/__init__.py +0 -19
  561. relationalai/early_access/sql/__init__.py +0 -11
  562. relationalai/early_access/sql/executor/__init__.py +0 -3
  563. relationalai/early_access/sql/rewrite/__init__.py +0 -3
  564. relationalai/early_access/tests/logging/__init__.py +0 -12
  565. relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
  566. relationalai/early_access/tests/utils/__init__.py +0 -12
  567. relationalai/environments/__init__.py +0 -35
  568. relationalai/environments/base.py +0 -381
  569. relationalai/environments/colab.py +0 -14
  570. relationalai/environments/generic.py +0 -71
  571. relationalai/environments/ipython.py +0 -68
  572. relationalai/environments/jupyter.py +0 -9
  573. relationalai/environments/snowbook.py +0 -169
  574. relationalai/errors.py +0 -2496
  575. relationalai/experimental/SF.py +0 -38
  576. relationalai/experimental/inspect.py +0 -47
  577. relationalai/experimental/pathfinder/__init__.py +0 -158
  578. relationalai/experimental/pathfinder/api.py +0 -160
  579. relationalai/experimental/pathfinder/automaton.py +0 -584
  580. relationalai/experimental/pathfinder/bridge.py +0 -226
  581. relationalai/experimental/pathfinder/compiler.py +0 -416
  582. relationalai/experimental/pathfinder/datalog.py +0 -214
  583. relationalai/experimental/pathfinder/diagnostics.py +0 -56
  584. relationalai/experimental/pathfinder/filter.py +0 -236
  585. relationalai/experimental/pathfinder/glushkov.py +0 -439
  586. relationalai/experimental/pathfinder/options.py +0 -265
  587. relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -1951
  588. relationalai/experimental/pathfinder/rpq.py +0 -344
  589. relationalai/experimental/pathfinder/transition.py +0 -200
  590. relationalai/experimental/pathfinder/utils.py +0 -26
  591. relationalai/experimental/paths/README.md +0 -107
  592. relationalai/experimental/paths/api.py +0 -143
  593. relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
  594. relationalai/experimental/paths/code_organization.md +0 -2
  595. relationalai/experimental/paths/examples/Movies.ipynb +0 -16328
  596. relationalai/experimental/paths/examples/basic_example.py +0 -40
  597. relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
  598. relationalai/experimental/paths/examples/movie_example.py +0 -77
  599. relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -193
  600. relationalai/experimental/paths/examples/movies_data/directed.csv +0 -45
  601. relationalai/experimental/paths/examples/movies_data/follows.csv +0 -7
  602. relationalai/experimental/paths/examples/movies_data/movies.csv +0 -39
  603. relationalai/experimental/paths/examples/movies_data/person.csv +0 -134
  604. relationalai/experimental/paths/examples/movies_data/produced.csv +0 -16
  605. relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -10
  606. relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -11
  607. relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
  608. relationalai/experimental/paths/examples/paths_example.py +0 -116
  609. relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
  610. relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
  611. relationalai/experimental/paths/graph.py +0 -185
  612. relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
  613. relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
  614. relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
  615. relationalai/experimental/paths/path_algorithms/single.py +0 -59
  616. relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
  617. relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
  618. relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
  619. relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
  620. relationalai/experimental/paths/path_algorithms/usp.py +0 -150
  621. relationalai/experimental/paths/product_graph.py +0 -93
  622. relationalai/experimental/paths/rpq/automaton.py +0 -584
  623. relationalai/experimental/paths/rpq/diagnostics.py +0 -56
  624. relationalai/experimental/paths/rpq/rpq.py +0 -378
  625. relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
  626. relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
  627. relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
  628. relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
  629. relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
  630. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
  631. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
  632. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
  633. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
  634. relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
  635. relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
  636. relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
  637. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
  638. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
  639. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
  640. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
  641. relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
  642. relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
  643. relationalai/experimental/paths/tree_agg.py +0 -168
  644. relationalai/experimental/paths/utilities/iterators.py +0 -27
  645. relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
  646. relationalai/experimental/solvers.py +0 -1095
  647. relationalai/loaders/csv.py +0 -195
  648. relationalai/loaders/loader.py +0 -177
  649. relationalai/loaders/types.py +0 -23
  650. relationalai/rel_emitter.py +0 -373
  651. relationalai/rel_utils.py +0 -185
  652. relationalai/semantics/designs/query_builder/identify_by.md +0 -106
  653. relationalai/semantics/devtools/benchmark_lqp.py +0 -535
  654. relationalai/semantics/devtools/compilation_manager.py +0 -294
  655. relationalai/semantics/devtools/extract_lqp.py +0 -110
  656. relationalai/semantics/internal/internal.py +0 -3785
  657. relationalai/semantics/internal/snowflake.py +0 -329
  658. relationalai/semantics/lqp/README.md +0 -34
  659. relationalai/semantics/lqp/algorithms.py +0 -173
  660. relationalai/semantics/lqp/builtins.py +0 -213
  661. relationalai/semantics/lqp/compiler.py +0 -22
  662. relationalai/semantics/lqp/constructors.py +0 -68
  663. relationalai/semantics/lqp/executor.py +0 -518
  664. relationalai/semantics/lqp/export_rewriter.py +0 -40
  665. relationalai/semantics/lqp/intrinsics.py +0 -24
  666. relationalai/semantics/lqp/ir.py +0 -150
  667. relationalai/semantics/lqp/model2lqp.py +0 -1056
  668. relationalai/semantics/lqp/passes.py +0 -38
  669. relationalai/semantics/lqp/primitives.py +0 -252
  670. relationalai/semantics/lqp/result_helpers.py +0 -266
  671. relationalai/semantics/lqp/rewrite/__init__.py +0 -32
  672. relationalai/semantics/lqp/rewrite/algorithm.py +0 -385
  673. relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -69
  674. relationalai/semantics/lqp/rewrite/cdc.py +0 -216
  675. relationalai/semantics/lqp/rewrite/constants_to_vars.py +0 -70
  676. relationalai/semantics/lqp/rewrite/deduplicate_vars.py +0 -104
  677. relationalai/semantics/lqp/rewrite/eliminate_data.py +0 -108
  678. relationalai/semantics/lqp/rewrite/extract_common.py +0 -340
  679. relationalai/semantics/lqp/rewrite/extract_keys.py +0 -577
  680. relationalai/semantics/lqp/rewrite/flatten_script.py +0 -301
  681. relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
  682. relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -348
  683. relationalai/semantics/lqp/rewrite/period_math.py +0 -77
  684. relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -339
  685. relationalai/semantics/lqp/rewrite/splinter.py +0 -76
  686. relationalai/semantics/lqp/rewrite/unify_definitions.py +0 -323
  687. relationalai/semantics/lqp/types.py +0 -101
  688. relationalai/semantics/lqp/utils.py +0 -170
  689. relationalai/semantics/lqp/validators.py +0 -70
  690. relationalai/semantics/metamodel/compiler.py +0 -134
  691. relationalai/semantics/metamodel/dependency.py +0 -880
  692. relationalai/semantics/metamodel/executor.py +0 -78
  693. relationalai/semantics/metamodel/factory.py +0 -287
  694. relationalai/semantics/metamodel/helpers.py +0 -368
  695. relationalai/semantics/metamodel/ir.py +0 -924
  696. relationalai/semantics/metamodel/rewrite/__init__.py +0 -8
  697. relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
  698. relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -220
  699. relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
  700. relationalai/semantics/metamodel/rewrite/flatten.py +0 -590
  701. relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -256
  702. relationalai/semantics/metamodel/rewrite/handle_aggregations_and_ranks.py +0 -237
  703. relationalai/semantics/metamodel/typer/checker.py +0 -355
  704. relationalai/semantics/metamodel/typer/typer.py +0 -1396
  705. relationalai/semantics/metamodel/util.py +0 -506
  706. relationalai/semantics/metamodel/visitor.py +0 -945
  707. relationalai/semantics/reasoners/__init__.py +0 -10
  708. relationalai/semantics/reasoners/graph/README.md +0 -620
  709. relationalai/semantics/reasoners/graph/__init__.py +0 -37
  710. relationalai/semantics/reasoners/graph/core.py +0 -9019
  711. relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -797
  712. relationalai/semantics/reasoners/graph/tests/README.md +0 -21
  713. relationalai/semantics/reasoners/optimization/__init__.py +0 -68
  714. relationalai/semantics/reasoners/optimization/common.py +0 -88
  715. relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
  716. relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1407
  717. relationalai/semantics/rel/builtins.py +0 -40
  718. relationalai/semantics/rel/compiler.py +0 -994
  719. relationalai/semantics/rel/executor.py +0 -363
  720. relationalai/semantics/rel/rel.py +0 -482
  721. relationalai/semantics/rel/rel_utils.py +0 -276
  722. relationalai/semantics/snowflake/__init__.py +0 -3
  723. relationalai/semantics/sql/compiler.py +0 -2503
  724. relationalai/semantics/sql/executor/duck_db.py +0 -52
  725. relationalai/semantics/sql/executor/result_helpers.py +0 -64
  726. relationalai/semantics/sql/executor/snowflake.py +0 -149
  727. relationalai/semantics/sql/rewrite/denormalize.py +0 -222
  728. relationalai/semantics/sql/rewrite/double_negation.py +0 -49
  729. relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
  730. relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
  731. relationalai/semantics/sql/sql.py +0 -504
  732. relationalai/semantics/std/pragmas.py +0 -11
  733. relationalai/semantics/std/std.py +0 -14
  734. relationalai/semantics/tests/lqp/algorithms.py +0 -345
  735. relationalai/semantics/tests/test_snapshot_abstract.py +0 -144
  736. relationalai/semantics/tests/test_snapshot_base.py +0 -9
  737. relationalai/semantics/tests/utils.py +0 -46
  738. relationalai/std/__init__.py +0 -70
  739. relationalai/tools/cli.py +0 -2089
  740. relationalai/tools/cli_controls.py +0 -1975
  741. relationalai/tools/cli_helpers.py +0 -802
  742. relationalai/tools/debugger_client.py +0 -109
  743. relationalai/tools/debugger_server.py +0 -302
  744. relationalai/tools/dev.py +0 -685
  745. relationalai/tools/notes +0 -7
  746. relationalai/tools/qb_debugger.py +0 -425
  747. relationalai/tools/txn_progress.py +0 -188
  748. relationalai/util/clean_up_databases.py +0 -95
  749. relationalai/util/list_databases.py +0 -9
  750. relationalai/util/otel_configuration.py +0 -26
  751. relationalai/util/otel_handler.py +0 -484
  752. relationalai/util/snowflake_handler.py +0 -88
  753. relationalai/util/span_format_test.py +0 -43
  754. relationalai/util/span_tracker.py +0 -207
  755. relationalai/util/spans_file_handler.py +0 -72
  756. relationalai/util/tracing_handler.py +0 -34
  757. relationalai-0.13.5.dist-info/METADATA +0 -74
  758. relationalai-0.13.5.dist-info/RECORD +0 -473
  759. relationalai-0.13.5.dist-info/WHEEL +0 -4
  760. relationalai-0.13.5.dist-info/entry_points.txt +0 -3
  761. relationalai-0.13.5.dist-info/licenses/LICENSE +0 -202
  762. relationalai_test_util/__init__.py +0 -4
  763. relationalai_test_util/fixtures.py +0 -233
  764. relationalai_test_util/snapshot.py +0 -252
  765. relationalai_test_util/traceback.py +0 -118
  766. /relationalai/{analysis → semantics/frontend}/__init__.py +0 -0
  767. /relationalai/{auth/__init__.py → semantics/metamodel/metamodel_compiler.py} +0 -0
  768. /relationalai/{early_access → shims}/__init__.py +0 -0
  769. {relationalai/early_access/dsl/adapters → v0/relationalai/analysis}/__init__.py +0 -0
  770. {relationalai → v0/relationalai}/analysis/mechanistic.py +0 -0
  771. {relationalai → v0/relationalai}/analysis/whynot.py +0 -0
  772. {relationalai/early_access/dsl/adapters/orm → v0/relationalai/auth}/__init__.py +0 -0
  773. {relationalai → v0/relationalai}/auth/jwt_generator.py +0 -0
  774. {relationalai → v0/relationalai}/auth/oauth_callback_server.py +0 -0
  775. {relationalai → v0/relationalai}/auth/token_handler.py +0 -0
  776. {relationalai → v0/relationalai}/auth/util.py +0 -0
  777. {relationalai/clients/resources/snowflake → v0/relationalai/clients}/cache_store.py +0 -0
  778. {relationalai → v0/relationalai}/compiler.py +0 -0
  779. {relationalai → v0/relationalai}/dependencies.py +0 -0
  780. {relationalai → v0/relationalai}/docutils.py +0 -0
  781. {relationalai/early_access/dsl/adapters/owl → v0/relationalai/early_access}/__init__.py +0 -0
  782. {relationalai → v0/relationalai}/early_access/dsl/__init__.py +0 -0
  783. {relationalai/early_access/dsl/bindings → v0/relationalai/early_access/dsl/adapters}/__init__.py +0 -0
  784. {relationalai/early_access/dsl/bindings/legacy → v0/relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
  785. {relationalai → v0/relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
  786. {relationalai/early_access/dsl/codegen → v0/relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
  787. {relationalai → v0/relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
  788. {relationalai/early_access/dsl/core/temporal → v0/relationalai/early_access/dsl/bindings}/__init__.py +0 -0
  789. {relationalai/early_access/dsl/ir → v0/relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
  790. {relationalai/early_access/dsl/ontologies → v0/relationalai/early_access/dsl/codegen}/__init__.py +0 -0
  791. {relationalai → v0/relationalai}/early_access/dsl/constants.py +0 -0
  792. {relationalai → v0/relationalai}/early_access/dsl/core/__init__.py +0 -0
  793. {relationalai → v0/relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
  794. {relationalai → v0/relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  795. {relationalai → v0/relationalai}/early_access/dsl/core/stack.py +0 -0
  796. {relationalai/early_access/dsl/orm → v0/relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
  797. {relationalai → v0/relationalai}/early_access/dsl/core/utils.py +0 -0
  798. {relationalai/early_access/dsl/orm/measures → v0/relationalai/early_access/dsl/ir}/__init__.py +0 -0
  799. {relationalai/early_access/dsl/physical_metadata → v0/relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
  800. {relationalai → v0/relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
  801. {relationalai/early_access/dsl/serialize → v0/relationalai/early_access/dsl/orm}/__init__.py +0 -0
  802. {relationalai/early_access/dsl/snow → v0/relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
  803. {relationalai → v0/relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
  804. {relationalai/loaders → v0/relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
  805. {relationalai/semantics/tests → v0/relationalai/early_access/dsl/serialize}/__init__.py +0 -0
  806. {relationalai → v0/relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
  807. {relationalai → v0/relationalai}/early_access/dsl/serialize/model.py +0 -0
  808. {relationalai/semantics/tests/lqp → v0/relationalai/early_access/dsl/snow}/__init__.py +0 -0
  809. {relationalai → v0/relationalai}/early_access/tests/__init__.py +0 -0
  810. {relationalai → v0/relationalai}/environments/ci.py +0 -0
  811. {relationalai → v0/relationalai}/environments/hex.py +0 -0
  812. {relationalai → v0/relationalai}/environments/terminal.py +0 -0
  813. {relationalai → v0/relationalai}/experimental/__init__.py +0 -0
  814. {relationalai → v0/relationalai}/experimental/graphs.py +0 -0
  815. {relationalai → v0/relationalai}/experimental/paths/__init__.py +0 -0
  816. {relationalai → v0/relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
  817. {relationalai → v0/relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
  818. {relationalai → v0/relationalai}/experimental/paths/rpq/__init__.py +0 -0
  819. {relationalai → v0/relationalai}/experimental/paths/rpq/filter.py +0 -0
  820. {relationalai → v0/relationalai}/experimental/paths/rpq/glushkov.py +0 -0
  821. {relationalai → v0/relationalai}/experimental/paths/rpq/transition.py +0 -0
  822. {relationalai → v0/relationalai}/experimental/paths/utilities/__init__.py +0 -0
  823. {relationalai → v0/relationalai}/experimental/paths/utilities/utilities.py +0 -0
  824. {relationalai/tools → v0/relationalai/loaders}/__init__.py +0 -0
  825. {relationalai → v0/relationalai}/metagen.py +0 -0
  826. {relationalai → v0/relationalai}/metamodel.py +0 -0
  827. {relationalai → v0/relationalai}/rel.py +0 -0
  828. {relationalai → v0/relationalai}/semantics/devtools/__init__.py +0 -0
  829. {relationalai → v0/relationalai}/semantics/internal/__init__.py +0 -0
  830. {relationalai → v0/relationalai}/semantics/internal/annotations.py +0 -0
  831. {relationalai → v0/relationalai}/semantics/lqp/__init__.py +0 -0
  832. {relationalai → v0/relationalai}/semantics/lqp/pragmas.py +0 -0
  833. {relationalai → v0/relationalai}/semantics/metamodel/dataflow.py +0 -0
  834. {relationalai → v0/relationalai}/semantics/metamodel/typer/__init__.py +0 -0
  835. {relationalai → v0/relationalai}/semantics/metamodel/types.py +0 -0
  836. {relationalai → v0/relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
  837. {relationalai → v0/relationalai}/semantics/rel/__init__.py +0 -0
  838. {relationalai → v0/relationalai}/semantics/sql/__init__.py +0 -0
  839. {relationalai → v0/relationalai}/semantics/sql/executor/__init__.py +0 -0
  840. {relationalai → v0/relationalai}/semantics/sql/rewrite/__init__.py +0 -0
  841. {relationalai → v0/relationalai}/semantics/tests/logging.py +0 -0
  842. {relationalai → v0/relationalai}/std/aggregates.py +0 -0
  843. {relationalai → v0/relationalai}/std/dates.py +0 -0
  844. {relationalai → v0/relationalai}/std/graphs.py +0 -0
  845. {relationalai → v0/relationalai}/std/inspect.py +0 -0
  846. {relationalai → v0/relationalai}/std/math.py +0 -0
  847. {relationalai → v0/relationalai}/std/re.py +0 -0
  848. {relationalai → v0/relationalai}/std/strings.py +0 -0
  849. {relationalai → v0/relationalai}/tools/cleanup_snapshots.py +0 -0
  850. {relationalai → v0/relationalai}/tools/constants.py +0 -0
  851. {relationalai → v0/relationalai}/tools/query_utils.py +0 -0
  852. {relationalai → v0/relationalai}/tools/snapshot_viewer.py +0 -0
  853. {relationalai → v0/relationalai}/util/__init__.py +0 -0
  854. {relationalai → v0/relationalai}/util/constants.py +0 -0
  855. {relationalai → v0/relationalai}/util/graph.py +0 -0
  856. {relationalai → v0/relationalai}/util/timeout.py +0 -0
@@ -1,994 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Any, Iterable, Sequence as PySequence, cast, Tuple, Union
4
- from dataclasses import dataclass, field
5
- from decimal import Decimal as PyDecimal
6
-
7
- from relationalai.semantics.metamodel import ir, compiler as c, builtins as bt, types, visitor, helpers, factory as f
8
- from relationalai.semantics.metamodel.typer import Checker, InferTypes
9
- from relationalai.semantics.metamodel.typer.typer import to_base_primitive, to_type, _NON_PARAMETRIC_PRIMITIVES
10
- from relationalai.semantics.metamodel.visitor import ReadWriteVisitor
11
- from relationalai.semantics.metamodel.util import OrderedSet, group_by, NameCache, ordered_set
12
-
13
- from relationalai.semantics.rel import rel, rel_utils as u, builtins as rel_bt
14
-
15
- from ..metamodel.rewrite import (
16
- Flatten, DNFUnionSplitter, DischargeConstraints, FormatOutputs, ExtractNestedLogicals,
17
- # HandleAggregationsAndRanks
18
- )
19
- from ..lqp.rewrite import CDC, ExtractCommon, ExtractKeys, FunctionAnnotations, QuantifyVars, Splinter, SplitMultiCheckRequires
20
-
21
- import math
22
-
23
-
24
- #--------------------------------------------------
25
- # Compiler
26
- #--------------------------------------------------
27
-
28
- class Compiler(c.Compiler):
29
- def __init__(self):
30
- super().__init__([
31
- SplitMultiCheckRequires(),
32
- FunctionAnnotations(),
33
- DischargeConstraints(),
34
- Checker(),
35
- CDC(), # specialize to physical relations before extracting nested and typing
36
- ExtractNestedLogicals(),
37
- InferTypes(),
38
- DNFUnionSplitter(),
39
- ExtractKeys(),
40
- FormatOutputs(use_rel=True),
41
- ExtractCommon(),
42
- Flatten(),
43
- # HandleAggregationsAndRanks(),
44
- Splinter(),
45
- QuantifyVars(),
46
- ])
47
- self.model_to_rel = ModelToRel()
48
-
49
- def do_compile(self, model: ir.Model, options:dict={}) -> str:
50
- return str(self.model_to_rel.to_rel(model, options=options))
51
-
52
- COMPILER_OPTIONS = [
53
- # do not generated declarations for relations read by the model but not written to
54
- "no_declares",
55
- # do not GNF the output relation, keeping it wide
56
- "wide_outputs"
57
- ]
58
-
59
- @dataclass
60
- class ModelToRel:
61
- """ Generates Rel from an IR Model, assuming the compiler rewrites were done. """
62
-
63
- relation_name_cache: NameCache = field(default_factory=NameCache)
64
- rule_name_cache: NameCache = field(default_factory=NameCache)
65
-
66
- # Map a rel variable to one with a different name
67
- var_map: dict[rel.Var, rel.Var] = field(default_factory=dict)
68
-
69
- #--------------------------------------------------
70
- # Public API
71
- #--------------------------------------------------
72
-
73
- def to_rel(self, model: ir.Model, options:dict = {}) -> rel.Program:
74
- self._register_external_relations(model)
75
-
76
- rules = self._generate_rules(model)
77
- reads = self._rel_reads(rules)
78
- declares = [] if options.get("no_declares") else self._generate_declares(model)
79
- self._rel_reads(declares, reads)
80
- return rel.Program(tuple([
81
- *self._generate_builtin_defs(model, reads),
82
- *declares,
83
- *rules,
84
- ]))
85
-
86
- #--------------------------------------------------
87
- # Top level handlers
88
- #--------------------------------------------------
89
-
90
- def _generate_builtin_defs(self, model: ir.Model, reads:OrderedSet[str]) -> list[rel.Def]:
91
- defs = []
92
-
93
- for t in model.types:
94
- # TODO - some of these types are never used, we should not generate them, but we
95
- # need to replace the rel_reads function with something that collects those types
96
- # during generation
97
- if isinstance(t, ir.DecimalType):
98
- defs.append(
99
- rel.Def(u.rel_typename(t),
100
- tuple([rel.Var("x")]),
101
- rel.atom("::std::common::FixedDecimal",
102
- tuple([rel.MetaValue(types.digits_to_bits(t.precision)), rel.MetaValue(t.scale), rel.Var("x")])),
103
- tuple([rel.Annotation("inline", ())]),
104
- ),
105
- )
106
-
107
- if "pyrel_inf" in reads:
108
- defs.append(
109
- rel.Def("pyrel_inf",
110
- tuple([rel.Var("x")]),
111
- rel.atom("::std::common::infinity", tuple([rel.MetaValue(64), rel.Var("x")])),
112
- tuple([rel.Annotation("inline", ())]),
113
- ),
114
- )
115
-
116
- if "pyrel_NaN" in reads:
117
- defs.append(
118
- rel.Def("pyrel_NaN",
119
- tuple([rel.Var("x")]),
120
- rel.atom("::std::common::nan", tuple([rel.MetaValue(64), rel.Var("x")])),
121
- tuple([rel.Annotation("inline", ())]),
122
- ),
123
- )
124
-
125
- if "pyrel_ID" in reads:
126
- defs.append(rel.Def("pyrel_ID",
127
- tuple([rel.Var("x")]),
128
- rel.Or(OrderedSet[rel.Expr].from_iterable([
129
- rel.atom("::std::common::UInt128", tuple([rel.Var("x")])),
130
- rel.atom("::std::common::Missing", tuple([rel.Var("x")])),
131
- ])),
132
- tuple([rel.Annotation("inline", ())]),
133
- ))
134
-
135
- if "pyrel_count" in reads:
136
- defs.append(
137
- rel.Def("pyrel_count",
138
- tuple([rel.Var("{R}"), rel.Var("y")]),
139
- rel.Exists(
140
- tuple([rel.Var("z")]),
141
- rel.And(ordered_set(
142
- rel.atom("::std::common::count", tuple([rel.Var("R"), rel.Var("z")])),
143
- rel.Atom(self._convert_abs(types.Int64, types.Int128), tuple([rel.Var("z"), rel.Var("y")])),
144
- )),
145
- ),
146
- tuple([rel.Annotation("inline", ())]),
147
- ),
148
- )
149
-
150
- if "pyrel_sort" in reads:
151
- defs.append(
152
- rel.Def("pyrel_sort",
153
- tuple([rel.Var("{R}"), rel.Var("n"), rel.Var("r", varargs=True)]),
154
- rel.Exists(
155
- tuple([rel.Var("z")]),
156
- rel.And(ordered_set(
157
- rel.atom("::std::common::sort", tuple([rel.Var("R"), rel.Var("z"), rel.Var("r", varargs=True)])),
158
- rel.Atom(self._convert_abs(types.Int64, types.Int128), tuple([rel.Var("z"), rel.Var("n")])),
159
- )),
160
- ),
161
- tuple([rel.Annotation("inline", ())]),
162
- ),
163
- )
164
-
165
- if "pyrel_reverse_sort" in reads:
166
- defs.append(
167
- rel.Def("pyrel_reverse_sort",
168
- tuple([rel.Var("{R}"), rel.Var("n"), rel.Var("r", varargs=True)]),
169
- rel.Exists(
170
- tuple([rel.Var("z")]),
171
- rel.And(ordered_set(
172
- rel.atom("::std::common::reverse_sort", tuple([rel.Var("R"), rel.Var("z"), rel.Var("r", varargs=True)])),
173
- rel.Atom(self._convert_abs(types.Int64, types.Int128), tuple([rel.Var("z"), rel.Var("n")])),
174
- )),
175
- ),
176
- tuple([rel.Annotation("inline", ())]),
177
- ),
178
- )
179
-
180
- if "pyrel_top" in reads:
181
- defs.append(
182
- rel.Def("pyrel_top",
183
- tuple([rel.Var("k"), rel.Var("{R}"), rel.Var("n"), rel.Var("r", varargs=True)]),
184
- rel.Exists(
185
- tuple([rel.Var("z")]),
186
- rel.And(ordered_set(
187
- rel.atom("::std::common::top", tuple([rel.Var("k"), rel.Var("R"), rel.Var("z"), rel.Var("r", varargs=True)])),
188
- rel.Atom(self._convert_abs(types.Int64, types.Int128), tuple([rel.Var("z"), rel.Var("n")])),
189
- )),
190
- ),
191
- tuple([rel.Annotation("inline", ())]),
192
- ),
193
- )
194
-
195
- if "pyrel_bottom" in reads:
196
- defs.append(
197
- rel.Def("pyrel_bottom",
198
- tuple([rel.Var("k"), rel.Var("{R}"), rel.Var("n"), rel.Var("r", varargs=True)]),
199
- rel.Exists(
200
- tuple([rel.Var("z")]),
201
- rel.And(ordered_set(
202
- rel.atom("::std::common::bottom", tuple([rel.Var("k"),rel.Var("R"), rel.Var("z"), rel.Var("r", varargs=True)])),
203
- rel.Atom(self._convert_abs(types.Int64, types.Int128), tuple([rel.Var("z"), rel.Var("n")])),
204
- )),
205
- ),
206
- tuple([rel.Annotation("inline", ())]),
207
- ),
208
- )
209
-
210
- if "pyrel_dates_period_days" in reads:
211
- defs.append(
212
- rel.Def("pyrel_dates_period_days",
213
- tuple([rel.Var("a"), rel.Var("b"), rel.Var("c")]),
214
- rel.Exists(
215
- tuple([rel.Var("d")]),
216
- rel.And(ordered_set(
217
- rel.atom("::std::common::dates_period_days",
218
- tuple([rel.Var("a"), rel.Var("b"), rel.Var("d")])),
219
- rel.atom("::std::common::^Day",
220
- tuple([rel.Var("c"), rel.Var("d")]))
221
- )),
222
- ),
223
- tuple([rel.Annotation("inline", ())]),
224
- ),
225
- )
226
-
227
- if "pyrel_datetimes_period_milliseconds" in reads:
228
- defs.append(
229
- rel.Def("pyrel_datetimes_period_milliseconds",
230
- tuple([rel.Var("a"), rel.Var("b"), rel.Var("c")]),
231
- rel.Exists(
232
- tuple([rel.Var("m")]),
233
- rel.And(ordered_set(
234
- rel.atom("::std::common::datetimes_period_milliseconds",
235
- tuple([rel.Var("a"), rel.Var("b"), rel.Var("m")])),
236
- rel.atom("::std::common::^Millisecond",
237
- tuple([rel.Var("c"), rel.Var("m")]))
238
- )),
239
- ),
240
- tuple([rel.Annotation("inline", ())]),
241
- ),
242
- )
243
-
244
- if "pyrel_regex_search" in reads:
245
- raise NotImplementedError("pyrel_regex_search is not implemented")
246
-
247
- return defs
248
-
249
- @staticmethod
250
- def _convert_abs(from_type: ir.Type, to_type: ir.Type):
251
- if from_type == types.Int64 and to_type == types.Float:
252
- return rel.Identifier("::std::common::int_float_convert")
253
- elif from_type == types.Float and to_type == types.Int64:
254
- return rel.Identifier("::std::common::float_int_convert")
255
- else:
256
- input_type = u.rel_typename(from_type)
257
- output_type = u.rel_typename(to_type)
258
- return rel.RelationalAbstraction(
259
- tuple([rel.Var("val_x", type=input_type), rel.Var("val_y", type=output_type)]),
260
- rel.Exists(
261
- tuple([rel.Var("type_x"), rel.Var("type_y")]),
262
- rel.And(ordered_set(
263
- # Since we declared them to be the types we're converting from and to, we can just use the types of x and y here.
264
- # The Rel compiler will use the static type of the variable to compute the Type values.
265
- rel.atom("rel_primitive_typeof", tuple([rel.Var("val_x"), rel.Var("type_x")])),
266
- rel.atom("rel_primitive_typeof", tuple([rel.Var("val_y"), rel.Var("type_y")])),
267
- rel.atom("rel_primitive_convert", tuple([rel.Var("type_x"), rel.Var("type_y"), rel.Var("val_x"), rel.Var("val_y")])),
268
- )),
269
- )
270
- )
271
-
272
- def _generate_declares(self, m: ir.Model) -> list[rel.Declare]:
273
- """
274
- Generate declare statements for relations declared by the model and:
275
- - not built-ins
276
- - not used as an annotation
277
- - not annotated as external
278
- - do not start with ^ (for hardcoded Rel constructors)
279
- - and are never the target of an update
280
- """
281
- rw = ReadWriteVisitor()
282
- m.accept(rw)
283
-
284
- root = cast(ir.Logical, m.root)
285
-
286
- annotations = [anno.relation for anno in visitor.collect_by_type(ir.Annotation, m.root)]
287
- reads = m.relations - rw.writes(root) - bt.builtin_relations - bt.builtin_overloads - bt.builtin_annotations - annotations
288
- reads = list(filter(lambda r: not r.name.startswith('^') and not helpers.is_external(r), reads))
289
-
290
- primitive_type_names = OrderedSet.from_iterable([t.name for t in _NON_PARAMETRIC_PRIMITIVES])
291
- declares: list[rel.Declare] = []
292
- for r in reads:
293
- if r.name in rel.infix or r.name in u.OPERATORS:
294
- continue
295
-
296
- if helpers.is_from_cast(r):
297
- continue
298
-
299
- # TODO: should address the root of the issue
300
- # In some cases we might end up with explicit Concepts for primitives in the model
301
- if r.name in primitive_type_names or r.name.startswith("Decimal("):
302
- continue
303
-
304
- # In case parameter name starts with ':' use its name instead of type name
305
- def requires_name(fld: ir.Field):
306
- if isinstance(fld.type, ir.ScalarType):
307
- t = fld.type
308
- if t == types.Symbol:
309
- return rel.MetaValue(fld.name[1:])
310
- else:
311
- return rel.Var(name=u.sanitize(fld.name.lower()), type=u.rel_typename(t))
312
- else:
313
- return rel.Var(u.sanitize(fld.name.lower()))
314
- head = tuple([requires_name(f) for f in r.fields])
315
-
316
- # Example: declare test(:a, _x0 in Int, _x1 in String) requires true
317
- declares.append(rel.Declare(
318
- rel.atom(self._relation_name(r), head),
319
- rel.true # `requires true` does not generate any constraints, that affects performance on the RAI side
320
- ))
321
- return declares
322
-
323
- def _generate_rules(self, m: ir.Model) -> list[Union[rel.Def, rel.RawSource]]:
324
- """ Generate rules for the root of this model.
325
-
326
- Assumes the model already was processed such that it contains a root Logical with
327
- children that are also Logical tasks representing the rules to generate.
328
- """
329
- rules: list[Union[rel.Def, rel.RawSource]] = []
330
- root = cast(ir.Logical, m.root)
331
- for child in root.body:
332
- rules.extend(self._generate_rule(cast(ir.Logical, child)))
333
- return rules
334
-
335
- def _generate_rule(self, rule: ir.Logical) -> list[Union[rel.Def, rel.RawSource]]:
336
- """ Generate rules for a nested Logical in a model.
337
-
338
- This is for a top-level Logical, under the root Logical.
339
- """
340
- # reset the name cache for each rule
341
- self.rule_name_cache = NameCache()
342
- effects, other, aggregates, ranks = self._split_tasks(rule.body)
343
- if not effects or (aggregates and ranks):
344
- # nothing to generate for this Logical
345
- return []
346
-
347
- elif len(effects) == 1:
348
- # a single effect with a body becomes a single rule
349
- effect = effects[0]
350
-
351
- # deal with raw sources
352
- if isinstance(effect, ir.Update) and effect.relation == bt.raw_source:
353
- # TODO: remove this once the type checker checks this.
354
- assert(len(effect.args) == 2 and isinstance(effect.args[0], ir.Literal) and isinstance(effect.args[1], ir.Literal))
355
- if effect.args[0].value != "rel":
356
- return []
357
- return [rel.RawSource(cast(str, effect.args[1].value))]
358
- else:
359
- args, lookups, rel_equiv = self._effect_args(effect)
360
- if lookups:
361
- other.extend(lookups)
362
- return [rel.Def(
363
- self._effect_name(effect),
364
- args,
365
- rel.create_and([
366
- self.generate_logical_body(other, aggregates, ranks),
367
- *rel_equiv
368
- ]),
369
- self.generate_annotations(effect.annotations)
370
- )]
371
- else:
372
- # currently we can only deal with multiple effects if they are all updates with
373
- # no body, which is the pattern for inserting hardcoded data.
374
- if other or aggregates:
375
- raise NotImplementedError("Body in logical task with multiple effects.")
376
- if any(isinstance(effect, ir.Output) for effect in effects):
377
- raise NotImplementedError("Output in logical task with multiple effects.")
378
- sample = cast(ir.Update, effects[0]).effect
379
- if any(cast(ir.Update, effect).effect != sample for effect in effects):
380
- raise NotImplementedError("Different types of effects in logical task.")
381
-
382
- # Group updates by relation name
383
- relation_groups = group_by(cast(list[ir.Update], effects), lambda e: self._relation_name(e.relation))
384
-
385
- # Process each relation group
386
- defs = []
387
- for name, updates in relation_groups.items():
388
- effects_to_union = []
389
- for update in updates:
390
- update_args, lookups, rel_equiv = self._effect_args(update)
391
- if update_args:
392
- defs.append(
393
- rel.Def(
394
- name,
395
- update_args,
396
- rel.create_and([
397
- self.generate_body_expr(lookups),
398
- *rel_equiv
399
- ]),
400
- self.generate_annotations(update.annotations)
401
- )
402
- )
403
- else:
404
- effects_to_union.append(update)
405
-
406
- if effects_to_union:
407
- update = updates.some()
408
- args, lookups, rel_equiv = self._effect_args(update)
409
- bodies = []
410
- for update in effects_to_union:
411
- bodies.append(self.handle(update))
412
- for lookup in lookups:
413
- bodies.append(self.handle(lookup))
414
-
415
- defs.append(
416
- rel.Def(
417
- name,
418
- args,
419
- rel.create_and([
420
- rel.Union(tuple(bodies)),
421
- *rel_equiv
422
- ]),
423
- self.generate_annotations(update.annotations)
424
- )
425
- )
426
- return defs
427
-
428
- def generate_logical_body(self, other, aggregates, ranks):
429
- """ Generate the body of a rule for a Logical that contains these aggregates/ranks
430
- and other tasks (i.e., no effects)."""
431
-
432
- if aggregates:
433
- # push the body into the aggregates; this assumes a rewrite pass already
434
- # prepared the body to contain only what's needed by the aggregates
435
- exprs = []
436
- for agg in aggregates:
437
- # The variables declared in the relational abstraction are the agg's "projection" + "over"
438
- abs_vars = OrderedSet.from_iterable(agg.projection)
439
- result = []
440
- for arg in agg.args:
441
- if helpers.is_aggregate_input(arg, agg):
442
- new_arg = arg if isinstance(arg, ir.Var) else self.handle(arg)
443
- abs_vars.add(new_arg)
444
- else:
445
- result.append(self.handle(arg))
446
-
447
- old_var_map = self.var_map
448
- self.var_map = {}
449
-
450
- common_vars = OrderedSet.from_iterable(agg.projection) & agg.group
451
- abs_body_exprs = []
452
- for v in common_vars:
453
- orig_rel_v = self.handle_var(v)
454
- inner_rel_v = rel.Var("_t" + orig_rel_v.name)
455
- self.var_map[orig_rel_v] = inner_rel_v
456
- eq_expr = rel.BinaryExpr(orig_rel_v, "=", inner_rel_v)
457
- abs_body_exprs.append(eq_expr)
458
-
459
- abs_head = self.handle_list(tuple(abs_vars))
460
- abs_body = self.generate_body_expr(other)
461
- if abs_body_exprs:
462
- abs_body = rel.create_and([abs_body, *abs_body_exprs])
463
- rel_abstraction = rel.RelationalAbstraction(abs_head, abs_body)
464
-
465
- self.var_map = old_var_map
466
-
467
- exprs.append(rel.atom(
468
- u.rel_operator(agg.aggregation.name),
469
- tuple([ rel_abstraction, *result ])
470
- ))
471
- return exprs[0] if len(exprs) == 1 else rel.create_and(exprs)
472
- elif ranks:
473
- # push the body into the aggregates; this assumes a rewrite pass already
474
- # prepared the body to contain only what's needed by the aggregates
475
- exprs = []
476
- for rank in ranks:
477
- rel_name, has_limit = self.compute_rank_limit_info(rank)
478
- old_var_map = self.var_map
479
- self.var_map = {}
480
-
481
- abs_vars = ordered_set()
482
- abs_body_exprs = []
483
- # Rename the sorted vars to avoid conflicts with the result vars.
484
- # We sort the requested args, augmented with the keys (projection).
485
- # The keys have to be present to preserve bag semantics, but should
486
- # not affect the ranking. Thus they have to go at the end of the list.
487
- # Create a set to deduplicate vars appearing in both.
488
- raw_args = OrderedSet.from_iterable(rank.args + rank.projection)
489
- for ir_v in raw_args:
490
- orig_rel_v = self.handle_var(ir_v)
491
- if ir_v in rank.projection and ir_v not in rank.group:
492
- inner_rel_v = rel.Var("_t" + orig_rel_v.name)
493
- self.var_map[orig_rel_v] = inner_rel_v
494
- else:
495
- inner_rel_v = rel.Var("_t" + orig_rel_v.name)
496
- self.var_map[orig_rel_v] = inner_rel_v
497
- # inner_rel_v = rel.Var(orig_rel_v.name)
498
- if ir_v in rank.group:
499
- eq_expr = rel.BinaryExpr(orig_rel_v, "=", inner_rel_v)
500
- abs_body_exprs.append(eq_expr)
501
- abs_vars.add(inner_rel_v)
502
-
503
- abs_body = self.generate_body_expr(other)
504
- if abs_body_exprs:
505
- abs_body = rel.create_and([abs_body, *abs_body_exprs])
506
- rel_abstraction = rel.RelationalAbstraction(tuple(abs_vars), abs_body)
507
-
508
- self.var_map = old_var_map
509
-
510
- out_vars = [self.handle_var(v) for v in raw_args]
511
- params = [rel_abstraction, self.handle_var(rank.result), *out_vars]
512
- if has_limit:
513
- params.insert(0, rank.limit)
514
- exprs.append(rel.atom(rel_name, tuple(params)))
515
-
516
- return exprs[0] if len(exprs) == 1 else rel.create_and(exprs)
517
- else:
518
- # no aggregates or ranks, just return an expression for the body
519
- return self.generate_body_expr(other)
520
-
521
- def compute_rank_limit_info(self, rank: ir.Rank):
522
- if all(o for o in rank.arg_is_ascending):
523
- ascending = True
524
- elif all(not o for o in rank.arg_is_ascending):
525
- ascending = False
526
- else:
527
- raise Exception("Mixed orderings in rank are not supported yet.")
528
- has_limit = rank.limit != 0
529
-
530
- if ascending:
531
- rel_name = "pyrel_top" if has_limit else "pyrel_sort"
532
- else:
533
- rel_name = "pyrel_bottom" if has_limit else "pyrel_reverse_sort"
534
- return rel_name, has_limit
535
-
536
- def generate_body_expr(self, tasks: list[ir.Task]):
537
- """ Helper to generate the an expression from the tasks, wrapping in Ands if necessary. """
538
- if not tasks:
539
- return rel.true
540
- elif len(tasks) == 1:
541
- return self.handle(tasks[0])
542
- else:
543
- return rel.create_and([self.handle(b) for b in tasks])
544
-
545
- #--------------------------------------------------
546
- # IR handlers
547
- #--------------------------------------------------
548
-
549
- def handle(self, n: ir.Node):
550
- """ Dispatch to the appropriate ir.Node handler. """
551
- handler = getattr(self, f"handle_{n.kind}", None)
552
- if handler:
553
- return handler(n)
554
- else:
555
- raise Exception(f"Rel Compiler handler for '{n.kind}' node not implemented.")
556
-
557
- def handle_list(self, n: Iterable[ir.Node]):
558
- """ Dispatch each node to the appropriate ir.Node handler. """
559
- return tuple([self.handle(x) for x in n])
560
-
561
- def handle_value(self, type: ir.Type|None, value: Any) -> Union[rel.Primitive, rel.RelationalAbstraction, rel.MetaValue, rel.Var]:
562
- """ Handle the value (Node or Value) and wrap in a Metavalue if the type is Symbol. """
563
- # only handle if it is a Node (e.g. ir.Var or ir.Literal)
564
- v = self.handle(value) if isinstance(value, ir.Node) else value
565
-
566
- # type might be None for these so we have to handle them before the check below.
567
- if isinstance(v, float) and (math.isinf(v) or math.isnan(v)):
568
- x = rel.Var("_float")
569
- rel_name = "::std::common::infinity" if math.isinf(v) else "::std::common::nan"
570
- return rel.RelationalAbstraction(
571
- tuple([x]),
572
- rel.atom(rel_name, tuple([rel.MetaValue(64), x])),
573
- )
574
-
575
- if type is None:
576
- return cast(Union[rel.Primitive, rel.RelationalAbstraction, rel.MetaValue, rel.Var], v)
577
-
578
- # only wrap if v is a primitive (i.e. not a metavalue or a var, for example).
579
- base = to_base_primitive(type) or type
580
- if type == types.Symbol and isinstance(v, (str, int, float, bool)):
581
- return rel.MetaValue(v)
582
- elif isinstance(v, PyDecimal):
583
- if base == types.GenericDecimal:
584
- # generic decimals arrive here if that's the type of the field in the relation;
585
- # in that case, the typer made sure that the value is a Literal and the type in
586
- # the literal is the exact decimal we need. We can clean this up once we remove
587
- # support for native literals here, since it's not supported in the IR anymore.
588
- assert isinstance(value, ir.Literal)
589
- type = value.type
590
- assert isinstance(type, ir.DecimalType)
591
- precision = types.digits_to_bits(type.precision)
592
- else:
593
- # if it's not an GenericDecimal, it is a specific decimal and we just use it.
594
- assert isinstance(type, ir.DecimalType)
595
- precision = types.digits_to_bits(type.precision)
596
- x = rel.Var("_dec")
597
- return rel.RelationalAbstraction(
598
- tuple([x]),
599
- rel.atom("::std::common::decimal", tuple([rel.MetaValue(precision), rel.MetaValue(type.scale), v, x]))
600
- )
601
-
602
- elif base == types.Int128 and isinstance(v, int):
603
- x = rel.Var("_int")
604
- return rel.RelationalAbstraction(
605
- tuple([x]),
606
- rel.atom("::std::common::int", tuple([128, v, x]))
607
- )
608
- elif (base == types.UInt128 or base == types.RowId) and isinstance(v, int):
609
- x = rel.Var("_uint")
610
- return rel.RelationalAbstraction(
611
- tuple([x]),
612
- rel.atom("::std::common::uint", tuple([128, v, x]))
613
- )
614
- else:
615
- return cast(Union[rel.Primitive, rel.RelationalAbstraction, rel.MetaValue, rel.Var], v)
616
-
617
- def handle_value_list(self, types, values) -> list[Union[rel.Primitive, rel.MetaValue, rel.RelationalAbstraction, rel.Var]]:
618
- result = []
619
- for t, v in zip(types, values):
620
- # splat values that are "varargs"
621
- if isinstance(v, tuple) and isinstance(t, ir.ListType):
622
- for item in v:
623
- result.append(self.handle_value(t, item))
624
- else:
625
- result.append(self.handle_value(t, v))
626
- return result
627
-
628
- #
629
- # DATA MODEL
630
- #
631
- def handle_scalartype(self, n: ir.ScalarType):
632
- return n.name
633
- # TODO - what to generate for other kinds of types?
634
-
635
-
636
-
637
-
638
- #
639
- # TASKS
640
- #
641
- def handle_logical(self, n: ir.Logical) -> rel.Expr:
642
- # Generate nested expressions for a nested logical
643
- effects, other, aggregates, ranks = self._split_tasks(n.body)
644
- if effects:
645
- raise Exception("Cannot process nested logical with effects.")
646
- elif aggregates and ranks:
647
- raise Exception("Cannot process nested logical with both aggregates and ranks.")
648
- return self.generate_logical_body(other, aggregates, ranks)
649
-
650
- def handle_union(self, n: ir.Union) -> rel.Expr:
651
- # Generate nested expressions for a nested logical
652
- body:list[rel.Expr] = []
653
- for t in n.tasks:
654
- body.append(self.handle(t))
655
- return rel.Or(OrderedSet.from_iterable(body))
656
-
657
- def handle_rank(self, n: ir.Rank) -> rel.Expr:
658
- return rel.atom("rank", tuple([self.handle_var(n.result)]))
659
-
660
- #
661
- # LOGICAL QUANTIFIERS
662
- #
663
- def handle_not(self, n: ir.Not):
664
- return rel.Not(self.handle(n.task))
665
-
666
- def handle_exists(self, n: ir.Exists):
667
- vars = self._remove_wildcards(n.vars)
668
- if vars:
669
- return rel.Exists(
670
- self.handle_vars(vars),
671
- self.handle(n.task)
672
- )
673
- else:
674
- # all vars are wildcards, no need for exists
675
- return self.handle(n.task)
676
-
677
- #
678
- # ITERATION
679
- #
680
-
681
- #
682
- # RELATIONAL OPERATIONS
683
- #
684
-
685
- def handle_vars(self, vars: Tuple[ir.Var, ...]):
686
- return tuple([self.handle_var(v) for v in vars])
687
-
688
- def handle_var(self, n: ir.Var):
689
- name = n.name if (n.name == "_" or n.name.startswith(':')) else f"_{self._var_name(n)}"
690
- v = rel.Var(name)
691
- return self.var_map.get(v, v)
692
-
693
- def handle_literal(self, n: ir.Literal):
694
- return self.handle_value(n.type, n.value)
695
-
696
- def handle_data(self, n: ir.Data):
697
- return rel.Atom(rel.Union(tuple([self.handle_value(None, d) for d in n])), tuple([self.handle(d) for d in n.vars]))
698
-
699
- def generate_annotations(self, annos: Iterable[ir.Annotation]):
700
- """ Helper to cast the handling of ir.Annotations into a tuple of rel.Annotations. """
701
- filtered_annos = list(filter(lambda anno: anno.relation.name in rel_bt.builtin_annotation_names, annos))
702
- rel_annos = cast(Tuple[rel.Annotation, ...], self.handle_list(filtered_annos))
703
- return rel_annos
704
-
705
- # standard handling mistreats the integer arg of ranked `@function(:checked, k)`
706
- def handle_ranked_function_annotation(self, n: ir.Annotation):
707
- assert n.relation == bt.function_ranked and len(n.args) == 2
708
- checked_lit = n.args[0]
709
- rank_lit = n.args[1]
710
- assert isinstance(checked_lit, ir.Literal) and isinstance(rank_lit, ir.Literal)
711
- checked = rel.MetaValue(checked_lit.value)
712
- rank = rank_lit.value
713
- return rel.Annotation(
714
- n.relation.name,
715
- (checked, rank)
716
- )
717
-
718
- def handle_annotation(self, n: ir.Annotation):
719
- # special treatment for (ranked) @function(:checked, k)
720
- if n.relation == bt.function_ranked:
721
- return self.handle_ranked_function_annotation(n)
722
-
723
- # we know that annotations won't have vars, so we can ignore that type warning
724
- return rel.Annotation(
725
- n.relation.name,
726
- tuple(self.handle_value_list(self._relation_types(n.relation), n.args)) # type:ignore
727
- )
728
-
729
- def handle_update(self, n: ir.Update):
730
- return rel.atom(
731
- self._relation_name(n.relation),
732
- tuple(self.handle_value_list(self._relation_types(n.relation), n.args))
733
- )
734
-
735
-
736
- def handle_lookup(self, n: ir.Lookup):
737
- # special cases
738
- if n.relation == bt.cast:
739
- return self.handle_cast(n)
740
- if n.relation == bt.parse_decimal:
741
- return self.handle_parse_decimal(n)
742
- if n.relation == bt.join:
743
- return self.handle_join(n)
744
- # only translate names to Rel operators if the relation is a built-in
745
- name = self._relation_name(n.relation)
746
- if bt.is_builtin(n.relation):
747
- name = u.rel_operator(name)
748
- types = self._relation_types(n.relation)
749
- return rel.atom(name, tuple(self.handle_value_list(types, n.args)))
750
-
751
- def handle_construct(self, n: ir.Construct):
752
- args = self.handle_value_list([None] * len(n.values), n.values) + [self.handle(n.id_var)]
753
- return rel.atom("rel_primitive_hash_tuple_uint128", tuple(args))
754
-
755
-
756
- #--------------------------------------------------
757
- # Built-in special cases
758
- #--------------------------------------------------
759
- def handle_cast(self, n: ir.Lookup):
760
- assert len(n.args) == 3
761
- (target_type, source, target) = n.args
762
- assert isinstance(target_type, ir.Type), f"Expected Type, got {type(target_type)}"
763
- from_type = to_type(source)
764
- rel_abstraction = self._convert_abs(from_type, target_type)
765
- types = (from_type, target_type)
766
- return rel.Atom(rel_abstraction, tuple(self.handle_value_list(types, (source, target))))
767
-
768
- def handle_parse_decimal(self, n: ir.Lookup):
769
- # parse_decimal in the metamodel is a binary relation, (value:String, var:DecimalType)
770
- # but we need to expand the lookup to (bits(var.precision), var.scale, value, var),
771
- # so we special case it here
772
- assert len(n.args) == 2
773
- value, var = n.args
774
- assert isinstance(value, ir.Node)
775
- assert isinstance(var, ir.Var)
776
- typ = var.type
777
- assert isinstance(typ, ir.DecimalType)
778
- args = [
779
- rel.MetaValue(types.digits_to_bits(typ.precision)),
780
- rel.MetaValue(typ.scale),
781
- self.handle(value),
782
- self.handle(var)
783
- ]
784
- return rel.Atom(rel.Identifier("rel_primitive_parse_decimal"), tuple(args))
785
-
786
- def handle_join(self, n: ir.Lookup):
787
- assert len(n.args) == 3
788
- (strs, separator, target) = n.args
789
- # prepare binary relation for string_join.
790
- # string_join example: string_join[", ", {(1, "a"); (2, "b"); (3, "c")}]
791
- assert isinstance(separator, ir.Node)
792
- assert isinstance(target, ir.Var)
793
- assert isinstance(strs, tuple)
794
- str_args = []
795
- for i, s in enumerate(strs):
796
- assert isinstance(s, ir.Node)
797
- str_args.append(rel.Product((i, self.handle(s))))
798
- args = [
799
- self.handle(separator),
800
- rel.Union(tuple(str_args)),
801
- self.handle(target)
802
- ]
803
- return rel.Atom(rel.Identifier("::std::common::string_join"), tuple(args))
804
-
805
- #--------------------------------------------------
806
- # Helpers
807
- #--------------------------------------------------
808
-
809
- def _relation_types(self, relation: ir.Relation):
810
- return [f.type for f in relation.fields]
811
-
812
- def _relation_name(self, relation: ir.Relation):
813
- if helpers.is_external(relation) or helpers.builtins.is_builtin(relation):
814
- return relation.name
815
- return self.relation_name_cache.get_name(relation.id, relation.name, helpers.relation_name_prefix(relation))
816
-
817
- def _var_name(self, var: ir.Var):
818
- if var.name == "_":
819
- return "_"
820
- return self.rule_name_cache.get_name(var.id, u.sanitize(var.name.lower()))
821
-
822
- def _remove_wildcards(self, vars: tuple[ir.Var, ...]):
823
- return tuple(filter(lambda v: v.name != "_", vars))
824
-
825
- def _register_external_relations(self, model: ir.Model):
826
- # force all external relations to get a name in the cache, so that internal relations
827
- # cannot use those names in _relation_name
828
- for r in model.relations:
829
- if helpers.is_external(r):
830
- self.relation_name_cache.get_name(r.id, r.name)
831
-
832
- def _split_tasks(self, tasks: PySequence[ir.Task]) -> tuple[list[Union[ir.Update, ir.Output]], list[ir.Task], list[ir.Aggregate], list[ir.Rank]]:
833
- effects = []
834
- aggregates = []
835
- other_body = []
836
- ranks = []
837
- for task in tasks:
838
- if isinstance(task, (ir.Update, ir.Output)):
839
- effects.append(task)
840
- elif isinstance(task, ir.Aggregate):
841
- aggregates.append(task)
842
- elif isinstance(task, ir.Rank):
843
- ranks.append(task)
844
- else:
845
- other_body.append(task)
846
- return effects, other_body, aggregates, ranks
847
-
848
-
849
- def _effect_name(self, n: ir.Task):
850
- """ Return the name to be used for the effect (e.g. the relation name, output, etc). """
851
- if helpers.is_export(n):
852
- return "Export_Relation"
853
- elif isinstance(n, ir.Output):
854
- return "output"
855
- elif isinstance(n, ir.Update):
856
- return self._relation_name(n.relation)
857
- else:
858
- raise Exception(f"Cannot retrieve effect name from node {type(n)}")
859
-
860
- def _effect_args(self, n: ir.Task) -> Tuple[Tuple[Any], list[ir.Task], list[rel.Expr]]:
861
- """
862
- Return the arguments for the head of an effect rule and a list of lookups to add
863
- to the body of the rule.
864
-
865
- The lookups may be necessary because Rel does not allow "missing" in the head,
866
- so we create a new variable, set the variable to missing in the body (the
867
- lookup) and use the variable in the head.
868
-
869
- E.g. output(None) becomes output(x): { x = missing }
870
- """
871
- orig_args = []
872
- handled_args = []
873
- if isinstance(n, ir.Output):
874
- args = helpers.output_values(n.aliases)
875
- orig_args.extend(args)
876
- handled_args.extend(self.handle_value_list([None] * len(args), args))
877
- elif isinstance(n, ir.Update):
878
- orig_args.extend(n.args)
879
- handled_args.extend(self.handle_value_list(self._relation_types(n.relation), n.args))
880
- else:
881
- raise Exception(f"Cannot retrieve effect params from node {type(n)}")
882
-
883
- assert len(orig_args) == len(handled_args)
884
- args, lookups, rel_equiv = [], [], []
885
- for idx, handled in enumerate(handled_args):
886
- if handled is None:
887
- var = ir.Var(types.Any, "head")
888
- args.append(self.handle(var))
889
- lookups.append(f.lookup(bt.eq, [var, orig_args[idx]]))
890
- elif isinstance(handled, rel.RelationalAbstraction):
891
- var = ir.Var(types.Any, "head")
892
- rel_var = self.handle(var)
893
- args.append(rel_var)
894
- rel_equiv.append(rel.create_eq(rel_var, handled))
895
- elif isinstance(handled, bool):
896
- # boolean constants need to be bound to a var in the body which is used in the head
897
- var = ir.Var(types.Any, "head")
898
- args.append(self.handle(var))
899
- lookups.append(f.lookup(bt.eq, [var, ir.Literal(types.Bool, handled)]))
900
- elif not isinstance(handled, rel.Var):
901
- # other constants
902
- args.append(handled)
903
- else:
904
- orig = orig_args[idx]
905
- assert isinstance(orig, ir.Var)
906
-
907
- # Count how many times this argument has been seen before
908
- cnt = handled_args[:idx].count(handled)
909
- if cnt == 0:
910
- arg_type = self._ir_var_to_rel_type(orig)
911
- args.append(rel.Var(handled.name, False, arg_type) if arg_type else handled)
912
- continue
913
-
914
- # Deduplicate variable
915
- new_var = ir.Var(orig.type, handled.name + "_dup" + str(cnt))
916
- rel_var = self.handle_var(new_var)
917
- arg_type = self._ir_var_to_rel_type(orig)
918
- args.append(rel.Var(rel_var.name, False, arg_type) if arg_type else rel_var)
919
- rel_equiv.append(rel.create_eq(rel_var, handled))
920
- return tuple(args), lookups, rel_equiv
921
-
922
- def _ir_var_to_rel_type(self, v: ir.Var) -> str:
923
- if isinstance(v.type, ir.DecimalType):
924
- return u.rel_typename(v.type)
925
- primitive_type = to_base_primitive(v.type)
926
- if primitive_type:
927
- return u.rel_typename(primitive_type)
928
- elif v.type != types.Any and v.type != types.Enum:
929
- return "pyrel_ID"
930
- return ""
931
-
932
- def _rel_reads(self, root, reads:OrderedSet[str]|None = None) -> OrderedSet[str]:
933
- if reads is None:
934
- reads = OrderedSet()
935
-
936
- if isinstance(root, (tuple, list)):
937
- for r in root:
938
- self._rel_reads(r, reads)
939
-
940
- if isinstance(root, rel.Var):
941
- if root.type is not None and not root.type.startswith("::std::common::"):
942
- reads.add(root.type)
943
-
944
- elif isinstance(root, rel.Declare):
945
- assert isinstance(root.premise, rel.Atom)
946
- self._rel_reads(root.premise.args, reads)
947
- self._rel_reads(root.requires, reads)
948
-
949
- elif isinstance(root, rel.Def):
950
- self._rel_reads(root.params, reads)
951
- self._rel_reads(root.body, reads)
952
-
953
- elif isinstance(root, rel.Atom):
954
- if isinstance(root.expr, rel.Identifier):
955
- reads.add(root.expr.name)
956
- else:
957
- self._rel_reads(root.expr, reads)
958
- self._rel_reads(root.args, reads)
959
-
960
- elif isinstance(root, rel.RelationalAbstraction):
961
- self._rel_reads(root.head, reads)
962
- self._rel_reads(root.body, reads)
963
-
964
- elif isinstance(root, rel.And):
965
- for arg in root.body:
966
- self._rel_reads(arg, reads)
967
-
968
- elif isinstance(root, rel.Or):
969
- for arg in root.body:
970
- self._rel_reads(arg, reads)
971
-
972
- elif isinstance(root, rel.Exists):
973
- self._rel_reads(root.body, reads)
974
-
975
- elif isinstance(root, rel.ForAll):
976
- self._rel_reads(root.body, reads)
977
-
978
- elif isinstance(root, rel.Not):
979
- self._rel_reads(root.body, reads)
980
-
981
- elif isinstance(root, rel.BinaryExpr):
982
- self._rel_reads(root.lhs, reads)
983
- self._rel_reads(root.rhs, reads)
984
- reads.add(root.op)
985
-
986
- elif isinstance(root, rel.Product):
987
- for arg in root.body:
988
- self._rel_reads(arg, reads)
989
-
990
- elif isinstance(root, rel.Union):
991
- for arg in root.body:
992
- self._rel_reads(arg, reads)
993
-
994
- return reads