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
@@ -0,0 +1,944 @@
1
+ """
2
+ Support for traversing the IR, often to search for information.
3
+ """
4
+ from dataclasses import dataclass, field
5
+ from typing import Callable, Optional, TypeVar, cast, Tuple, Union as PyUnion, Generic
6
+ from abc import abstractmethod
7
+ from .util import OrderedSet, flatten_tuple, ordered_set, FrozenOrderedSet, rewrite_list, rewrite_set
8
+ from . import ir
9
+
10
+ #--------------------------------------------------
11
+ # Visitor Abstraction
12
+ #--------------------------------------------------
13
+
14
+ Result = TypeVar('Result')
15
+ class GenericVisitor(Generic[Result]):
16
+ """
17
+ Abstract visitor with handlers for each IR node type.
18
+ Each handler should return a value of type `Result`.
19
+
20
+ Actual behavior (e.g., AST traversal) should be implemented in
21
+ subclasses of `GenericVisitor`.
22
+ """
23
+
24
+ ##################################################
25
+ # Model
26
+
27
+ @abstractmethod
28
+ def visit_model(self, node: ir.Model, parent: Optional[ir.Node]) -> Result:
29
+ pass
30
+
31
+ ##################################################
32
+ # Engine
33
+
34
+ @abstractmethod
35
+ def visit_capability(self, node: ir.Capability, parent: Optional[ir.Node]) -> Result:
36
+ pass
37
+
38
+ @abstractmethod
39
+ def visit_engine(self, node: ir.Engine, parent: Optional[ir.Node]) -> Result:
40
+ pass
41
+
42
+ ##################################################
43
+ # Types
44
+
45
+ @abstractmethod
46
+ def visit_scalartype(self, node: ir.ScalarType, parent: Optional[ir.Node]) -> Result:
47
+ pass
48
+
49
+ @abstractmethod
50
+ def visit_decimaltype(self, node: ir.DecimalType, parent: Optional[ir.Node]) -> Result:
51
+ pass
52
+
53
+ @abstractmethod
54
+ def visit_listtype(self, node: ir.ListType, parent: Optional[ir.Node]) -> Result:
55
+ pass
56
+
57
+ @abstractmethod
58
+ def visit_uniontype(self, node: ir.UnionType, parent: Optional[ir.Node]) -> Result:
59
+ pass
60
+
61
+ @abstractmethod
62
+ def visit_tupletype(self, node: ir.TupleType, parent: Optional[ir.Node]) -> Result:
63
+ pass
64
+
65
+ ##################################################
66
+ # Relations
67
+
68
+ @abstractmethod
69
+ def visit_field(self, node: ir.Field, parent: Optional[ir.Node]) -> Result:
70
+ pass
71
+
72
+ @abstractmethod
73
+ def visit_relation(self, node: ir.Relation, parent: Optional[ir.Node]) -> Result:
74
+ pass
75
+
76
+ ##################################################
77
+ # Variables and values
78
+
79
+ @abstractmethod
80
+ def visit_var(self, node: ir.Var, parent: Optional[ir.Node]) -> Result:
81
+ pass
82
+
83
+ @abstractmethod
84
+ def visit_default(self, node: ir.Default, parent: Optional[ir.Node]) -> Result:
85
+ pass
86
+
87
+ @abstractmethod
88
+ def visit_literal(self, node: ir.Literal, parent: Optional[ir.Node]) -> Result:
89
+ pass
90
+
91
+ @abstractmethod
92
+ def visit_data(self, node: ir.Data, parent: Optional[ir.Node]) -> Result:
93
+ pass
94
+
95
+ ##################################################
96
+ # Composite tasks
97
+
98
+ @abstractmethod
99
+ def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]) -> Result:
100
+ pass
101
+
102
+ @abstractmethod
103
+ def visit_union(self, node: ir.Union, parent: Optional[ir.Node]) -> Result:
104
+ pass
105
+
106
+ @abstractmethod
107
+ def visit_sequence(self, node: ir.Sequence, parent: Optional[ir.Node]) -> Result:
108
+ pass
109
+
110
+ @abstractmethod
111
+ def visit_match(self, node: ir.Match, parent: Optional[ir.Node]) -> Result:
112
+ pass
113
+
114
+ @abstractmethod
115
+ def visit_until(self, node: ir.Until, parent: Optional[ir.Node]) -> Result:
116
+ pass
117
+
118
+ @abstractmethod
119
+ def visit_wait(self, node: ir.Wait, parent: Optional[ir.Node]) -> Result:
120
+ pass
121
+
122
+ @abstractmethod
123
+ def visit_require(self, node: ir.Require, parent: Optional[ir.Node]) -> Result:
124
+ pass
125
+
126
+ @abstractmethod
127
+ def visit_check(self, node: ir.Check, parent: Optional[ir.Node]) -> Result:
128
+ pass
129
+
130
+ ##################################################
131
+ # Logical tasks
132
+
133
+ @abstractmethod
134
+ def visit_not(self, node: ir.Not, parent: Optional[ir.Node]) -> Result:
135
+ pass
136
+
137
+ @abstractmethod
138
+ def visit_exists(self, node: ir.Exists, parent: Optional[ir.Node]) -> Result:
139
+ pass
140
+
141
+ @abstractmethod
142
+ def visit_forall(self, node: ir.ForAll, parent: Optional[ir.Node]) -> Result:
143
+ pass
144
+
145
+ ##################################################
146
+ # Iteration tasks
147
+
148
+ @abstractmethod
149
+ def visit_loop(self, node: ir.Loop, parent: Optional[ir.Node]) -> Result:
150
+ pass
151
+
152
+ @abstractmethod
153
+ def visit_break(self, node: ir.Break, parent: Optional[ir.Node]) -> Result:
154
+ pass
155
+
156
+ ##################################################
157
+ # Leaf tasks
158
+
159
+ @abstractmethod
160
+ def visit_update(self, node: ir.Update, parent: Optional[ir.Node]) -> Result:
161
+ pass
162
+
163
+ @abstractmethod
164
+ def visit_annotation(self, node: ir.Annotation, parent: Optional[ir.Node]) -> Result:
165
+ pass
166
+
167
+ @abstractmethod
168
+ def visit_lookup(self, node: ir.Lookup, parent: Optional[ir.Node]) -> Result:
169
+ pass
170
+
171
+ @abstractmethod
172
+ def visit_output(self, node: ir.Output, parent: Optional[ir.Node]) -> Result:
173
+ pass
174
+
175
+ @abstractmethod
176
+ def visit_construct(self, node: ir.Construct, parent: Optional[ir.Node]) -> Result:
177
+ pass
178
+
179
+ @abstractmethod
180
+ def visit_aggregate(self, node: ir.Aggregate, parent: Optional[ir.Node]) -> Result:
181
+ pass
182
+
183
+ @abstractmethod
184
+ def visit_rank(self, node: ir.Rank, parent: Optional[ir.Node]) -> Result:
185
+ pass
186
+
187
+ @abstractmethod
188
+ def visit_task(self, node: ir.Task, parent: Optional[ir.Node]) -> Result:
189
+ pass
190
+
191
+ @dataclass
192
+ class Visitor(GenericVisitor[None]):
193
+ """
194
+ A visitor that just walks the AST, performing no changes.
195
+ """
196
+
197
+ def enter(self, node: ir.Node, parent: Optional[ir.Node]=None) -> "Visitor":
198
+ """ Visit the node, possibly returning a new visitor to be used to visit the node's children. """
199
+ return self
200
+
201
+ def prune(self):
202
+ """ Return a new Visitor that just returns each node unchanged without traversing its children. """
203
+ return PruneVisitor()
204
+
205
+ def leave(self, node: ir.Node, parent: Optional[ir.Node]=None) -> ir.Node:
206
+ """ Visit the node after visiting it and its children. """
207
+ return node
208
+
209
+ def _walk_node(self, node: ir.Node, parent: Optional[ir.Node]=None):
210
+ # Enter the node, returning a new context.
211
+ v = self.enter(node, parent)
212
+
213
+ # Dispatch to the handler for the node.
214
+ # By default the handler traverses the node's children and reconstructs the node.
215
+ node.accept(v, parent)
216
+
217
+ self.leave(node, parent)
218
+
219
+ # Avoid dispatch overhead for some types.
220
+ # These should never be called directly.
221
+ def _walk_var(self, node: ir.Var, parent: Optional[ir.Node]):
222
+ v = self.enter(node, parent)
223
+ v.visit_var(node, parent)
224
+ self.leave(node, parent)
225
+
226
+ def _walk_var_or_default(self, node: PyUnion[ir.Var, ir.Default], parent: Optional[ir.Node]):
227
+ v = self.enter(node, parent)
228
+ if isinstance(node, ir.Var):
229
+ v.visit_var(node, parent)
230
+ else:
231
+ v.visit_default(node, parent)
232
+ self.leave(node, parent)
233
+
234
+ def _walk_value(self, node: ir.Value, parent: Optional[ir.Node]):
235
+ if node is None:
236
+ return None
237
+ elif isinstance(node, ir.Var):
238
+ return self._walk_var(node, parent)
239
+ elif isinstance(node, ir.Relation):
240
+ return self._walk_relation(node, parent)
241
+ elif isinstance(node, ir.Node):
242
+ return self._walk_node(node, parent)
243
+ elif isinstance(node, Tuple):
244
+ for item in node:
245
+ self._walk_value(item, parent)
246
+ elif isinstance(node, FrozenOrderedSet):
247
+ for item in node:
248
+ self._walk_value(item, parent)
249
+
250
+ def _walk_engine(self, node: ir.Engine, parent: Optional[ir.Node]):
251
+ v = self.enter(node, parent)
252
+ v.visit_engine(node, parent)
253
+ self.leave(node, parent)
254
+
255
+ def _walk_relation(self, node: ir.Relation, parent: Optional[ir.Node]):
256
+ v = self.enter(node, parent)
257
+ v.visit_relation(node, parent)
258
+ self.leave(node, parent)
259
+
260
+ def _walk_type(self, node: ir.Type, parent: Optional[ir.Node]):
261
+ # The if-isinstance chain saves about 10% on a traversal vs. node.accept(v, parent)
262
+ v = self.enter(node, parent)
263
+ if isinstance(node, ir.DecimalType):
264
+ v.visit_decimaltype(node, parent)
265
+ elif isinstance(node, ir.ScalarType):
266
+ v.visit_scalartype(node, parent)
267
+ elif isinstance(node, ir.ListType):
268
+ v.visit_listtype(node, parent)
269
+ elif isinstance(node, ir.UnionType):
270
+ v.visit_uniontype(node, parent)
271
+ elif isinstance(node, ir.TupleType):
272
+ v.visit_tupletype(node, parent)
273
+ else:
274
+ raise NotImplementedError(f"visit_type not implemented for {type(node)}")
275
+ self.leave(node, parent)
276
+
277
+ ##################################################
278
+ # Model
279
+
280
+ def visit_model(self, node: ir.Model, parent: Optional[ir.Node]):
281
+ for c in node.engines:
282
+ self._walk_engine(c, node)
283
+ for c in node.relations:
284
+ self._walk_relation(c, node)
285
+ for c in node.types:
286
+ self._walk_type(c, node)
287
+ self._walk_node(node.root, node)
288
+
289
+ ##################################################
290
+ # Engine
291
+
292
+ def visit_capability(self, node: ir.Capability, parent: Optional[ir.Node]):
293
+ pass
294
+
295
+ def visit_engine(self, node: ir.Engine, parent: Optional[ir.Node]):
296
+ for c in node.capabilities:
297
+ self._walk_node(c, node)
298
+ for c in node.relations:
299
+ self._walk_relation(c, node)
300
+
301
+ ##################################################
302
+ # Types
303
+
304
+ def visit_scalartype(self, node: ir.ScalarType, parent: Optional[ir.Node]):
305
+ for t in node.super_types:
306
+ self._walk_type(t, node)
307
+ for a in node.annotations:
308
+ self._walk_node(a, node)
309
+
310
+ def visit_decimaltype(self, node: ir.DecimalType, parent: Optional[ir.Node]):
311
+ self.visit_scalartype(node, parent)
312
+
313
+ def visit_listtype(self, node: ir.ListType, parent: Optional[ir.Node]):
314
+ self._walk_type(node.element_type, node)
315
+
316
+ def visit_uniontype(self, node: ir.UnionType, parent: Optional[ir.Node]):
317
+ for t in node.types:
318
+ self._walk_type(t, node)
319
+
320
+ def visit_tupletype(self, node: ir.TupleType, parent: Optional[ir.Node]):
321
+ for t in node.types:
322
+ self._walk_type(t, node)
323
+
324
+ ##################################################
325
+ # Relations
326
+
327
+ def visit_field(self, node: ir.Field, parent: Optional[ir.Node]):
328
+ self._walk_type(node.type, node)
329
+
330
+ def visit_relation(self, node: ir.Relation, parent: Optional[ir.Node]):
331
+ for f in node.fields:
332
+ self._walk_node(f, node)
333
+ for r in node.requires:
334
+ self._walk_node(r, node)
335
+ for r in node.overloads:
336
+ self._walk_node(r, node)
337
+
338
+ ##################################################
339
+ # Variables and values
340
+
341
+ def visit_var(self, node: ir.Var, parent: Optional[ir.Node]):
342
+ self._walk_type(node.type, node)
343
+
344
+ def visit_default(self, node: ir.Default, parent: Optional[ir.Node]):
345
+ self._walk_var(node.var, node)
346
+ self._walk_value(node.value, node)
347
+
348
+ def visit_literal(self, node: ir.Literal, parent: Optional[ir.Node]):
349
+ self._walk_type(node.type, node)
350
+
351
+ def visit_data(self, node: ir.Data, parent: Optional[ir.Node]):
352
+ for v in node.vars:
353
+ self._walk_var(v, node)
354
+
355
+ ##################################################
356
+ # Composite tasks
357
+
358
+ def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]):
359
+ if node.engine is not None:
360
+ self._walk_engine(node.engine, node)
361
+ for h in node.hoisted:
362
+ self._walk_var_or_default(h, node)
363
+ for b in node.body:
364
+ self._walk_node(b, node)
365
+ for a in node.annotations:
366
+ self._walk_node(a, node)
367
+
368
+ def visit_union(self, node: ir.Union, parent: Optional[ir.Node]):
369
+ if node.engine is not None:
370
+ self._walk_engine(node.engine, node)
371
+ for h in node.hoisted:
372
+ self._walk_var_or_default(h, node)
373
+ for t in node.tasks:
374
+ self._walk_node(t, node)
375
+ for a in node.annotations:
376
+ self._walk_node(a, node)
377
+
378
+ def visit_sequence(self, node: ir.Sequence, parent: Optional[ir.Node]):
379
+ if node.engine is not None:
380
+ self._walk_engine(node.engine, node)
381
+ for h in node.hoisted:
382
+ self._walk_var_or_default(h, node)
383
+ for t in node.tasks:
384
+ self._walk_node(t, node)
385
+ for a in node.annotations:
386
+ self._walk_node(a, node)
387
+
388
+ def visit_match(self, node: ir.Match, parent: Optional[ir.Node]):
389
+ if node.engine is not None:
390
+ self._walk_engine(node.engine, node)
391
+ for h in node.hoisted:
392
+ self._walk_var_or_default(h, node)
393
+ for t in node.tasks:
394
+ self._walk_node(t, node)
395
+ for a in node.annotations:
396
+ self._walk_node(a, node)
397
+
398
+ def visit_until(self, node: ir.Until, parent: Optional[ir.Node]):
399
+ if node.engine is not None:
400
+ self._walk_engine(node.engine, node)
401
+ for h in node.hoisted:
402
+ self._walk_var_or_default(h, node)
403
+ self._walk_node(node.check, node)
404
+ self._walk_node(node.body, node)
405
+ for a in node.annotations:
406
+ self._walk_node(a, node)
407
+
408
+ def visit_wait(self, node: ir.Wait, parent: Optional[ir.Node]):
409
+ if node.engine is not None:
410
+ self._walk_engine(node.engine, node)
411
+ for h in node.hoisted:
412
+ self._walk_var_or_default(h, node)
413
+ self._walk_node(node.check, node)
414
+ for a in node.annotations:
415
+ self._walk_node(a, node)
416
+
417
+ def visit_require(self, node: ir.Require, parent: Optional[ir.Node]):
418
+ if node.engine is not None:
419
+ self._walk_engine(node.engine, node)
420
+ self._walk_node(node.domain, node)
421
+ for check in node.checks:
422
+ self._walk_node(check, node)
423
+ for a in node.annotations:
424
+ self._walk_node(a, node)
425
+
426
+ def visit_check(self, node: ir.Check, parent: Optional[ir.Node]):
427
+ self._walk_node(node.check, node)
428
+ if node.error:
429
+ self._walk_node(node.error, node)
430
+ for a in node.annotations:
431
+ self._walk_node(a, node)
432
+
433
+ ##################################################
434
+ # Logical tasks
435
+
436
+ def visit_not(self, node: ir.Not, parent: Optional[ir.Node]):
437
+ if node.engine is not None:
438
+ self._walk_engine(node.engine, node)
439
+ self._walk_node(node.task, node)
440
+ for a in node.annotations:
441
+ self._walk_node(a, node)
442
+
443
+ def visit_exists(self, node: ir.Exists, parent: Optional[ir.Node]):
444
+ if node.engine is not None:
445
+ self._walk_engine(node.engine, node)
446
+ for v in node.vars:
447
+ self._walk_var(v, node)
448
+ self._walk_node(node.task, node)
449
+ for a in node.annotations:
450
+ self._walk_node(a, node)
451
+
452
+ def visit_forall(self, node: ir.ForAll, parent: Optional[ir.Node]):
453
+ if node.engine is not None:
454
+ self._walk_engine(node.engine, node)
455
+ for v in node.vars:
456
+ self._walk_var(v, node)
457
+ self._walk_node(node.task, node)
458
+ for a in node.annotations:
459
+ self._walk_node(a, node)
460
+
461
+ ##################################################
462
+ # Iteration tasks
463
+
464
+ def visit_loop(self, node: ir.Loop, parent: Optional[ir.Node]):
465
+ if node.engine is not None:
466
+ self._walk_engine(node.engine, node)
467
+ for h in node.hoisted:
468
+ self._walk_var_or_default(h, node)
469
+ self._walk_var(node.iter, node)
470
+ self._walk_node(node.body, node)
471
+ for a in node.annotations:
472
+ self._walk_node(a, node)
473
+
474
+ def visit_break(self, node: ir.Break, parent: Optional[ir.Node]):
475
+ if node.engine is not None:
476
+ self._walk_engine(node.engine, node)
477
+ self._walk_node(node.check, node)
478
+ for a in node.annotations:
479
+ self._walk_node(a, node)
480
+
481
+ ##################################################
482
+ # Leaf tasks
483
+
484
+ def visit_update(self, node: ir.Update, parent: Optional[ir.Node]):
485
+ if node.engine is not None:
486
+ self._walk_engine(node.engine, node)
487
+ self._walk_relation(node.relation, node)
488
+ for a in node.args:
489
+ self._walk_value(a, node)
490
+ for a in node.annotations:
491
+ self._walk_node(a, node)
492
+
493
+ def visit_annotation(self, node: ir.Annotation, parent: Optional[ir.Node]):
494
+ self._walk_relation(node.relation, node)
495
+ for a in node.args:
496
+ self._walk_value(a, node)
497
+
498
+ def visit_lookup(self, node: ir.Lookup, parent: Optional[ir.Node]):
499
+ if node.engine is not None:
500
+ self._walk_engine(node.engine, node)
501
+ self._walk_relation(node.relation, node)
502
+ for a in node.args:
503
+ self._walk_value(a, node)
504
+ for a in node.annotations:
505
+ self._walk_node(a, node)
506
+
507
+ def visit_output(self, node: ir.Output, parent: Optional[ir.Node]):
508
+ if node.engine is not None:
509
+ self._walk_engine(node.engine, node)
510
+ for _, v in node.aliases:
511
+ self._walk_value(v, node)
512
+ if node.keys:
513
+ for k in node.keys:
514
+ self._walk_var(k, node)
515
+ for a in node.annotations:
516
+ self._walk_node(a, node)
517
+
518
+ def visit_construct(self, node: ir.Construct, parent: Optional[ir.Node]):
519
+ if node.engine is not None:
520
+ self._walk_engine(node.engine, node)
521
+ for v in node.values:
522
+ self._walk_value(v, node)
523
+ self._walk_var(node.id_var, node)
524
+ for a in node.annotations:
525
+ self._walk_node(a, node)
526
+
527
+ def visit_aggregate(self, node: ir.Aggregate, parent: Optional[ir.Node]):
528
+ if node.engine is not None:
529
+ self._walk_engine(node.engine, node)
530
+ self._walk_relation(node.aggregation, node)
531
+ for p in node.projection:
532
+ self._walk_var(p, node)
533
+ for g in node.group:
534
+ self._walk_var(g, node)
535
+ for a in node.args:
536
+ self._walk_value(a, node)
537
+ for a in node.annotations:
538
+ self._walk_node(a, node)
539
+
540
+ def visit_rank(self, node: ir.Rank, parent: Optional[ir.Node]):
541
+ if node.engine is not None:
542
+ self._walk_engine(node.engine, node)
543
+ for p in node.projection:
544
+ self._walk_var(p, node)
545
+ for g in node.group:
546
+ self._walk_var(g, node)
547
+ for a in node.args:
548
+ self._walk_value(a, node)
549
+ self._walk_value(node.result, node)
550
+ for a in node.annotations:
551
+ self._walk_node(a, node)
552
+
553
+ def visit_task(self, node: ir.Task, parent: Optional[ir.Node]):
554
+ if node.engine is not None:
555
+ self._walk_engine(node.engine, node)
556
+
557
+ #--------------------------------------------------
558
+ # Some generally useful visitors
559
+ #--------------------------------------------------
560
+
561
+ @dataclass
562
+ class PruneVisitor(Visitor):
563
+ """ A Visitor that does not walk children. """
564
+
565
+ def _walk_node(self, node: ir.Node, parent: Optional[ir.Node]=None):
566
+ pass
567
+ def _walk_var(self, node: ir.Var, parent: Optional[ir.Node]):
568
+ pass
569
+ def _walk_var_or_default(self, node: ir.VarOrDefault, parent: Optional[ir.Node]):
570
+ pass
571
+ def _walk_engine(self, node: ir.Engine, parent: Optional[ir.Node]):
572
+ pass
573
+ def _walk_relation(self, node: ir.Relation, parent: Optional[ir.Node]):
574
+ pass
575
+ def _walk_type(self, node: ir.Type, parent: Optional[ir.Node]):
576
+ pass
577
+
578
+ @dataclass
579
+ class DAGVisitor(Visitor):
580
+ """ A visitor that just walks the AST, performing no changes. Nodes are visited at most once. """
581
+ seen: set[ir.Node] = field(default_factory=set)
582
+
583
+ def _walk_node(self, node: ir.Node, parent: Optional[ir.Node]=None):
584
+ if node in self.seen:
585
+ return
586
+ self.seen.add(node)
587
+ return super()._walk_node(node, parent)
588
+ def _walk_var(self, node: ir.Var, parent: Optional[ir.Node]):
589
+ if node in self.seen:
590
+ return
591
+ self.seen.add(node)
592
+ return super()._walk_var(node, parent)
593
+ def _walk_var_or_default(self, node: ir.VarOrDefault, parent: Optional[ir.Node]):
594
+ if node in self.seen:
595
+ return
596
+ self.seen.add(node)
597
+ return super()._walk_var_or_default(node, parent)
598
+ def _walk_engine(self, node: ir.Engine, parent: Optional[ir.Node]):
599
+ if node in self.seen:
600
+ return
601
+ self.seen.add(node)
602
+ return super()._walk_engine(node, parent)
603
+ def _walk_relation(self, node: ir.Relation, parent: Optional[ir.Node]):
604
+ if node in self.seen:
605
+ return
606
+ self.seen.add(node)
607
+ return super()._walk_relation(node, parent)
608
+ def _walk_type(self, node: ir.Type, parent: Optional[ir.Node]):
609
+ if node in self.seen:
610
+ return
611
+ self.seen.add(node)
612
+ return super()._walk_type(node, parent)
613
+
614
+ class Collector(Visitor):
615
+ """ A visitor that collects instances that match a predicate. """
616
+ def __init__(self, predicate: Callable[[ir.Node, Optional[ir.Node]], bool]):
617
+ super().__init__()
618
+ self.elements: OrderedSet = ordered_set()
619
+ self.predicate = predicate
620
+
621
+ def enter(self, node: ir.Node, parent: Optional[ir.Node]=None):
622
+ if self.predicate(node, parent):
623
+ self.elements.add(node)
624
+ return self
625
+
626
+ def collect(predicate: Callable[[ir.Node, Optional[ir.Node]], bool], *nodes: ir.Node) -> OrderedSet[ir.Node]:
627
+ """ Collect children of node that match the predicate. """
628
+ c = Collector(predicate)
629
+ for n in nodes:
630
+ n.accept(c)
631
+ return c.elements
632
+
633
+ T = TypeVar('T')
634
+ def collect_by_type(t: PyUnion[type[T], tuple[type[T], ...]], *nodes: ir.Node) -> OrderedSet[T]:
635
+ """ Collect instances of the type t by traversing this node and its children. """
636
+ return cast(OrderedSet[T],
637
+ collect(lambda n, parent: isinstance(n, t), *nodes)
638
+ )
639
+
640
+ @dataclass
641
+ class ReadWriteVisitor(Visitor):
642
+ """
643
+ Compute the set of reads and writes for Logical nodes.
644
+
645
+ Note that reads are Lookups and writes are Updates. We don't consider Output a write
646
+ because it is not targeting a relation.
647
+ """
648
+ # TODO: we currently only compute for Logical nodes, but it may be useful for other nodes
649
+ _reads: dict[int, OrderedSet[ir.Relation]] = field(default_factory=dict)
650
+ _writes: dict[int, OrderedSet[ir.Relation]] = field(default_factory=dict)
651
+
652
+ def reads(self, key: ir.Logical):
653
+ # TODO - use a singleton empty set
654
+ return self._reads[key.id] if key.id in self._reads else ordered_set()
655
+
656
+ def writes(self, key: ir.Logical):
657
+ return self._writes[key.id] if key.id in self._writes else ordered_set()
658
+
659
+ _stack: list[ir.Logical] = field(default_factory=list)
660
+
661
+ def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]):
662
+ self._stack.append(node)
663
+ super().visit_logical(node, parent)
664
+ self._stack.pop()
665
+
666
+ def visit_lookup(self, node: ir.Lookup, parent: Optional[ir.Node]):
667
+ for lu in self._stack:
668
+ if lu.id not in self._reads:
669
+ self._reads[lu.id] = ordered_set()
670
+ self._reads[lu.id].add(node.relation)
671
+ return super().visit_lookup(node, parent)
672
+
673
+ def visit_aggregate(self, node: ir.Aggregate, parent: Optional[ir.Node]):
674
+ for lu in self._stack:
675
+ if lu.id not in self._reads:
676
+ self._reads[lu.id] = ordered_set()
677
+ self._reads[lu.id].add(node.aggregation)
678
+ return super().visit_aggregate(node, parent)
679
+
680
+ def visit_update(self, node: ir.Update, parent: Optional[ir.Node]):
681
+ for lu in self._stack:
682
+ if lu.id not in self._writes:
683
+ self._writes[lu.id] = ordered_set()
684
+ self._writes[lu.id].add(node.relation)
685
+ return super().visit_update(node, parent)
686
+
687
+ @dataclass
688
+ class Rewriter():
689
+ """
690
+ Rewrite a model, being careful to visit nodes only once.
691
+ """
692
+
693
+ rewritten: dict[int, ir.Node] = field(default_factory=dict, init=False, compare=False, hash=False)
694
+ handler_cache: dict[str, Callable[[ir.Node, Optional[ir.Node]], ir.Node]] = field(default_factory=dict, init=False, compare=False, hash=False)
695
+
696
+ T = TypeVar('T', bound=PyUnion[ir.Node, ir.Value])
697
+ def walk(self, node: T, parent=None) -> T:
698
+ # if node is a tuple, walk the list
699
+ if isinstance(node, tuple):
700
+ return self.walk_list(node, parent)
701
+ # if node is a value, just return it
702
+ if not isinstance(node, ir.Node):
703
+ return node
704
+
705
+ result = self.rewritten.get(node.id, None)
706
+ if result:
707
+ return cast(T, result) # type: ignore[reportReturnType]
708
+
709
+ # node is actually some Node type, handle with the appropriate handler
710
+ handler = self.handler_cache.get(node.kind, None)
711
+ if not handler:
712
+ handler = getattr(self, f"handle_{node.kind}", None)
713
+ if handler:
714
+ self.handler_cache[node.kind] = handler
715
+ if handler:
716
+ result = cast(ir.Node, handler(node, parent))
717
+ self.rewritten[node.id] = result
718
+ return cast(T, result) # type: ignore[reportReturnType]
719
+ else:
720
+ raise NotImplementedError(f"walk: {node.kind}")
721
+
722
+ def walk_set(self, items: FrozenOrderedSet[T], parent=None) -> FrozenOrderedSet[T]:
723
+ return ordered_set(*[self.walk(n, parent) for n in items]).frozen()
724
+
725
+ def walk_list(self, items: Tuple[T, ...], parent=None) -> Tuple[T, ...]:
726
+ return tuple([self.walk(n, parent) for n in items])
727
+
728
+ #-------------------------------------------------
729
+ # Public Types - Model
730
+ #-------------------------------------------------
731
+
732
+ def handle_model(self, model: ir.Model, parent: None):
733
+ engines = rewrite_set(ir.Engine, lambda n: self.walk(n, model), model.engines)
734
+ relations = rewrite_set(ir.Relation, lambda n: self.walk(n, model), model.relations)
735
+ types = rewrite_set(ir.Type, lambda n: self.walk(n, model), model.types)
736
+ root = self.walk(model.root, model)
737
+
738
+ return model.reconstruct(engines, relations, types, root, model.annotations)
739
+
740
+ #-------------------------------------------------
741
+ # Public Types - Engine
742
+ #-------------------------------------------------
743
+
744
+ def handle_capability(self, node: ir.Capability, parent: ir.Node):
745
+ return node
746
+
747
+ def handle_engine(self, node: ir.Engine, parent: ir.Node):
748
+ return node
749
+
750
+ #-------------------------------------------------
751
+ # Public Types - Data Model
752
+ #-------------------------------------------------
753
+
754
+ def handle_scalartype(self, node: ir.ScalarType, parent: ir.Node):
755
+ return node
756
+
757
+ def handle_decimaltype(self, node: ir.DecimalType, parent: ir.Node):
758
+ return node
759
+
760
+ def handle_listtype(self, node: ir.ListType, parent: ir.Node):
761
+ return node
762
+
763
+ def handle_uniontype(self, node: ir.UnionType, parent: ir.Node):
764
+ # TODO - we could traverse the children
765
+ return node
766
+
767
+ def handle_tupletype(self, node: ir.TupleType, parent: ir.Node):
768
+ # TODO - we could traverse the children
769
+ return node
770
+
771
+ def handle_field(self, node: ir.Field, parent: ir.Node):
772
+ type_val = self.walk(node.type, node)
773
+ return node.reconstruct(node.name, type_val, node.input)
774
+
775
+ def handle_relation(self, node: ir.Relation, parent: ir.Node):
776
+ fields = rewrite_list(ir.Field, lambda n: self.walk(n, node), node.fields)
777
+ requires = rewrite_set(ir.Capability, lambda n: self.walk(n, node), node.requires)
778
+ annotations = rewrite_set(ir.Annotation, lambda n: self.walk(n, node), node.annotations)
779
+ overloads = rewrite_set(ir.Relation, lambda n: self.walk(n, node), node.overloads)
780
+ return node.reconstruct(node.name, fields, requires, annotations, overloads)
781
+
782
+ #-------------------------------------------------
783
+ # Public Types - Tasks
784
+ #-------------------------------------------------
785
+
786
+ def handle_task(self, node: ir.Task, parent: ir.Node):
787
+ return node
788
+
789
+ #
790
+ # Task composition
791
+ #
792
+
793
+ def handle_logical(self, node: ir.Logical, parent: ir.Node):
794
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
795
+ body = rewrite_list(ir.Task, lambda n: self.walk(n, node), node.body)
796
+
797
+ return node.reconstruct(node.engine, hoisted, flatten_tuple(body, ir.Task), node.annotations)
798
+
799
+ def handle_union(self, node: ir.Union, parent: ir.Node):
800
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
801
+ tasks = rewrite_list(ir.Task, lambda n: self.walk(n, node), node.tasks)
802
+
803
+ return node.reconstruct(node.engine, hoisted, tasks, node.annotations)
804
+
805
+ def handle_sequence(self, node: ir.Sequence, parent: ir.Node):
806
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
807
+ tasks = rewrite_list(ir.Task, lambda n: self.walk(n, node), node.tasks)
808
+
809
+ return node.reconstruct(node.engine, hoisted, flatten_tuple(tasks, ir.Task), node.annotations)
810
+
811
+ def handle_match(self, node: ir.Match, parent: ir.Node):
812
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
813
+ tasks = rewrite_list(ir.Task, lambda n: self.walk(n, node), node.tasks)
814
+
815
+ return node.reconstruct(node.engine, hoisted, tasks, node.annotations)
816
+
817
+ def handle_until(self, node: ir.Until, parent: ir.Node):
818
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
819
+ check = self.walk(node.check, node)
820
+ body = self.walk(node.body, node)
821
+
822
+ return node.reconstruct(node.engine, hoisted, check, body, node.annotations)
823
+
824
+ def handle_wait(self, node: ir.Wait, parent: ir.Node):
825
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
826
+ check = self.walk(node.check, node)
827
+
828
+ return node.reconstruct(node.engine, hoisted, check, node.annotations)
829
+
830
+ def handle_require(self, node: ir.Require, parent: ir.Node):
831
+ domain = self.walk(node.domain, node)
832
+ checks = rewrite_list(ir.Check, lambda n: self.walk(n, node), node.checks)
833
+
834
+ return node.reconstruct(node.engine, domain, checks, node.annotations)
835
+
836
+ def handle_check(self, node: ir.Check, parent: ir.Node):
837
+ check = self.walk(node.check, node)
838
+ error = None
839
+ if node.error:
840
+ error = self.walk(node.error, node)
841
+
842
+ return node.reconstruct(check, error, node.annotations)
843
+
844
+ #
845
+ # Relational Operations
846
+ #
847
+
848
+ def handle_var(self, node: ir.Var, parent: ir.Node):
849
+ type_val = self.walk(node.type, node)
850
+ name_val = node.name or f"v{node.id}"
851
+ return node.reconstruct(type_val, name_val)
852
+
853
+ def handle_default(self, node: ir.Default, parent: ir.Node):
854
+ var = self.walk(node.var, node)
855
+ return node.reconstruct(var, node.value)
856
+
857
+ def handle_literal(self, node: ir.Literal, parent: ir.Node):
858
+ type_val = self.walk(node.type, node)
859
+ return node.reconstruct(type_val, node.value)
860
+
861
+ def handle_data(self, node: ir.Data, parent: ir.Node):
862
+ vars = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.vars)
863
+ return node.reconstruct(node.engine, node.data, vars)
864
+
865
+ def handle_annotation(self, node: ir.Annotation, parent: ir.Node):
866
+ return node
867
+
868
+ def handle_update(self, node: ir.Update, parent: ir.Node):
869
+ relation = self.walk(node.relation, node)
870
+ args = rewrite_list(ir.Value, lambda n: self.walk(n, node), node.args)
871
+ return node.reconstruct(node.engine, relation, args, node.effect, node.annotations)
872
+
873
+ def handle_lookup(self, node: ir.Lookup, parent: ir.Node):
874
+ relation = self.walk(node.relation, node)
875
+ args = rewrite_list(ir.Value, lambda n: self.walk(n, node), node.args)
876
+ return node.reconstruct(node.engine, relation, args, node.annotations)
877
+
878
+ def handle_output(self, node: ir.Output, parent: ir.Node):
879
+ def rewrite_alias(pair: Tuple[str, ir.Value]):
880
+ name, x = pair
881
+ new_x = self.walk(x, node)
882
+ if new_x is not x:
883
+ return (name, new_x)
884
+ else:
885
+ return pair
886
+ # rewrite_set can't be passed a generic type, so just use Tuple and cast the result.
887
+ aliases = cast(
888
+ FrozenOrderedSet[Tuple[str, ir.Value]],
889
+ rewrite_set(
890
+ Tuple,
891
+ rewrite_alias,
892
+ node.aliases))
893
+ keys = rewrite_list(ir.Var, lambda n: self.walk(n, node), tuple(node.keys)) if node.keys else None
894
+ return node.reconstruct(node.engine, aliases, keys, node.annotations)
895
+
896
+ def handle_construct(self, node: ir.Construct, parent: ir.Node):
897
+ values = rewrite_list(ir.Value, lambda n: self.walk(n, node), node.values)
898
+ id_var = self.walk(node.id_var, node)
899
+ return node.reconstruct(node.engine, values, id_var, node.annotations)
900
+
901
+ def handle_aggregate(self, node: ir.Aggregate, parent: ir.Node):
902
+ aggregation = self.walk(node.aggregation, node)
903
+ projection = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.projection)
904
+ group = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.group)
905
+ args = rewrite_list(ir.Value, lambda n: self.walk(n, node), node.args)
906
+ return node.reconstruct(node.engine, aggregation, projection, group, args, node.annotations)
907
+
908
+ def handle_rank(self, node: ir.Rank, parent: ir.Node):
909
+ projection = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.projection)
910
+ group = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.group)
911
+ args = rewrite_list(ir.Value, lambda n: self.walk(n, node), node.args)
912
+ result = self.walk(node.result, node)
913
+ return node.reconstruct(node.engine, projection, group, args, node.arg_is_ascending, result, node.limit,node.annotations)
914
+
915
+ #
916
+ # Logical Quantifiers
917
+ #
918
+
919
+ def handle_not(self, node: ir.Not, parent: ir.Node):
920
+ task = self.walk(node.task, node)
921
+ return node.reconstruct(node.engine, task, node.annotations)
922
+
923
+ def handle_exists(self, node: ir.Exists, parent: ir.Node):
924
+ vars = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.vars)
925
+ task = self.walk(node.task, node)
926
+ return node.reconstruct(node.engine, vars, task, node.annotations)
927
+
928
+ def handle_forall(self, node: ir.ForAll, parent: ir.Node):
929
+ vars = rewrite_list(ir.Var, lambda n: self.walk(n, node), node.vars)
930
+ task = self.walk(node.task, node)
931
+ return node.reconstruct(node.engine, vars, task, node.annotations)
932
+
933
+ #
934
+ # Iteration (Loops)
935
+ #
936
+ def handle_loop(self, node: ir.Loop, parent: ir.Node):
937
+ hoisted = rewrite_list(ir.VarOrDefault, lambda n: self.walk(n, node), node.hoisted)
938
+ iter_val = self.walk(node.iter, node)
939
+ body = self.walk(node.body, node)
940
+ return node.reconstruct(node.engine, hoisted, iter_val, body, node.annotations)
941
+
942
+ def handle_break(self, node: ir.Break, parent: ir.Node):
943
+ check = self.walk(node.check, node)
944
+ return node.reconstruct(node.engine, check, node.annotations)