relationalai 0.13.0.dev0__py3-none-any.whl → 0.13.1__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 (837) hide show
  1. frontend/debugger/dist/.gitignore +2 -0
  2. frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  3. frontend/debugger/dist/assets/index-Cssla-O7.js +208 -0
  4. frontend/debugger/dist/assets/index-DlHsYx1V.css +9 -0
  5. frontend/debugger/dist/index.html +17 -0
  6. relationalai/__init__.py +256 -1
  7. relationalai/clients/__init__.py +18 -0
  8. relationalai/clients/client.py +912 -0
  9. relationalai/clients/config.py +673 -0
  10. relationalai/clients/direct_access_client.py +118 -0
  11. relationalai/clients/exec_txn_poller.py +91 -0
  12. relationalai/clients/hash_util.py +31 -0
  13. relationalai/clients/local.py +571 -0
  14. relationalai/clients/profile_polling.py +73 -0
  15. relationalai/clients/resources/__init__.py +8 -0
  16. relationalai/clients/resources/azure/azure.py +477 -0
  17. relationalai/clients/resources/snowflake/__init__.py +20 -0
  18. relationalai/clients/resources/snowflake/cli_resources.py +87 -0
  19. relationalai/clients/resources/snowflake/direct_access_resources.py +694 -0
  20. relationalai/clients/resources/snowflake/engine_state_handlers.py +309 -0
  21. relationalai/clients/resources/snowflake/error_handlers.py +199 -0
  22. relationalai/clients/resources/snowflake/export_procedure.py.jinja +249 -0
  23. relationalai/clients/resources/snowflake/resources_factory.py +99 -0
  24. relationalai/clients/resources/snowflake/snowflake.py +3190 -0
  25. relationalai/clients/resources/snowflake/use_index_poller.py +1019 -0
  26. relationalai/clients/resources/snowflake/use_index_resources.py +188 -0
  27. relationalai/clients/resources/snowflake/util.py +387 -0
  28. relationalai/clients/result_helpers.py +420 -0
  29. relationalai/clients/types.py +113 -0
  30. relationalai/clients/util.py +356 -0
  31. relationalai/debugging.py +389 -0
  32. relationalai/dsl.py +1749 -0
  33. relationalai/early_access/builder/__init__.py +30 -0
  34. relationalai/early_access/builder/builder/__init__.py +35 -0
  35. relationalai/early_access/builder/snowflake/__init__.py +12 -0
  36. relationalai/early_access/builder/std/__init__.py +25 -0
  37. relationalai/early_access/builder/std/decimals/__init__.py +12 -0
  38. relationalai/early_access/builder/std/integers/__init__.py +12 -0
  39. relationalai/early_access/builder/std/math/__init__.py +12 -0
  40. relationalai/early_access/builder/std/strings/__init__.py +14 -0
  41. relationalai/early_access/devtools/__init__.py +12 -0
  42. relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
  43. relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
  44. relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
  45. relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
  46. relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
  47. relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
  48. relationalai/early_access/dsl/bindings/common.py +402 -0
  49. relationalai/early_access/dsl/bindings/csv.py +170 -0
  50. relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
  51. relationalai/early_access/dsl/bindings/snowflake.py +64 -0
  52. relationalai/early_access/dsl/codegen/binder.py +411 -0
  53. relationalai/early_access/dsl/codegen/common.py +79 -0
  54. relationalai/early_access/dsl/codegen/helpers.py +23 -0
  55. relationalai/early_access/dsl/codegen/relations.py +700 -0
  56. relationalai/early_access/dsl/codegen/weaver.py +417 -0
  57. relationalai/early_access/dsl/core/builders/__init__.py +47 -0
  58. relationalai/early_access/dsl/core/builders/logic.py +19 -0
  59. relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
  60. relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
  61. relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
  62. relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
  63. relationalai/early_access/dsl/core/context.py +13 -0
  64. relationalai/early_access/dsl/core/cset.py +132 -0
  65. relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
  66. relationalai/early_access/dsl/core/exprs/relational.py +18 -0
  67. relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
  68. relationalai/early_access/dsl/core/instances.py +44 -0
  69. relationalai/early_access/dsl/core/logic/__init__.py +193 -0
  70. relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
  71. relationalai/early_access/dsl/core/logic/exists.py +223 -0
  72. relationalai/early_access/dsl/core/logic/helper.py +163 -0
  73. relationalai/early_access/dsl/core/namespaces.py +32 -0
  74. relationalai/early_access/dsl/core/relations.py +276 -0
  75. relationalai/early_access/dsl/core/rules.py +112 -0
  76. relationalai/early_access/dsl/core/std/__init__.py +45 -0
  77. relationalai/early_access/dsl/core/temporal/recall.py +6 -0
  78. relationalai/early_access/dsl/core/types/__init__.py +270 -0
  79. relationalai/early_access/dsl/core/types/concepts.py +128 -0
  80. relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
  81. relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
  82. relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
  83. relationalai/early_access/dsl/core/types/standard.py +92 -0
  84. relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
  85. relationalai/early_access/dsl/core/types/variables.py +203 -0
  86. relationalai/early_access/dsl/ir/compiler.py +318 -0
  87. relationalai/early_access/dsl/ir/executor.py +260 -0
  88. relationalai/early_access/dsl/ontologies/constraints.py +88 -0
  89. relationalai/early_access/dsl/ontologies/export.py +30 -0
  90. relationalai/early_access/dsl/ontologies/models.py +453 -0
  91. relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
  92. relationalai/early_access/dsl/ontologies/readings.py +60 -0
  93. relationalai/early_access/dsl/ontologies/relationships.py +322 -0
  94. relationalai/early_access/dsl/ontologies/roles.py +87 -0
  95. relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
  96. relationalai/early_access/dsl/orm/constraints.py +438 -0
  97. relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
  98. relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
  99. relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
  100. relationalai/early_access/dsl/orm/measures/measures.py +299 -0
  101. relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
  102. relationalai/early_access/dsl/orm/models.py +256 -0
  103. relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
  104. relationalai/early_access/dsl/orm/printer.py +469 -0
  105. relationalai/early_access/dsl/orm/reasoners.py +480 -0
  106. relationalai/early_access/dsl/orm/relations.py +19 -0
  107. relationalai/early_access/dsl/orm/relationships.py +251 -0
  108. relationalai/early_access/dsl/orm/types.py +42 -0
  109. relationalai/early_access/dsl/orm/utils.py +79 -0
  110. relationalai/early_access/dsl/orm/verb.py +204 -0
  111. relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
  112. relationalai/early_access/dsl/relations.py +170 -0
  113. relationalai/early_access/dsl/rulesets.py +69 -0
  114. relationalai/early_access/dsl/schemas/__init__.py +450 -0
  115. relationalai/early_access/dsl/schemas/builder.py +48 -0
  116. relationalai/early_access/dsl/schemas/comp_names.py +51 -0
  117. relationalai/early_access/dsl/schemas/components.py +203 -0
  118. relationalai/early_access/dsl/schemas/contexts.py +156 -0
  119. relationalai/early_access/dsl/schemas/exprs.py +89 -0
  120. relationalai/early_access/dsl/schemas/fragments.py +464 -0
  121. relationalai/early_access/dsl/serialization.py +79 -0
  122. relationalai/early_access/dsl/serialize/exporter.py +163 -0
  123. relationalai/early_access/dsl/snow/api.py +105 -0
  124. relationalai/early_access/dsl/snow/common.py +76 -0
  125. relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
  126. relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
  127. relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
  128. relationalai/early_access/dsl/types/__init__.py +40 -0
  129. relationalai/early_access/dsl/types/concepts.py +12 -0
  130. relationalai/early_access/dsl/types/entities.py +135 -0
  131. relationalai/early_access/dsl/types/values.py +17 -0
  132. relationalai/early_access/dsl/utils.py +102 -0
  133. relationalai/early_access/graphs/__init__.py +13 -0
  134. relationalai/early_access/lqp/__init__.py +12 -0
  135. relationalai/early_access/lqp/compiler/__init__.py +12 -0
  136. relationalai/early_access/lqp/constructors/__init__.py +18 -0
  137. relationalai/early_access/lqp/executor/__init__.py +12 -0
  138. relationalai/early_access/lqp/ir/__init__.py +12 -0
  139. relationalai/early_access/lqp/passes/__init__.py +12 -0
  140. relationalai/early_access/lqp/pragmas/__init__.py +12 -0
  141. relationalai/early_access/lqp/primitives/__init__.py +12 -0
  142. relationalai/early_access/lqp/types/__init__.py +12 -0
  143. relationalai/early_access/lqp/utils/__init__.py +12 -0
  144. relationalai/early_access/lqp/validators/__init__.py +12 -0
  145. relationalai/early_access/metamodel/__init__.py +58 -0
  146. relationalai/early_access/metamodel/builtins/__init__.py +12 -0
  147. relationalai/early_access/metamodel/compiler/__init__.py +12 -0
  148. relationalai/early_access/metamodel/dependency/__init__.py +12 -0
  149. relationalai/early_access/metamodel/factory/__init__.py +17 -0
  150. relationalai/early_access/metamodel/helpers/__init__.py +12 -0
  151. relationalai/early_access/metamodel/ir/__init__.py +14 -0
  152. relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
  153. relationalai/early_access/metamodel/typer/__init__.py +3 -0
  154. relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
  155. relationalai/early_access/metamodel/types/__init__.py +15 -0
  156. relationalai/early_access/metamodel/util/__init__.py +15 -0
  157. relationalai/early_access/metamodel/visitor/__init__.py +12 -0
  158. relationalai/early_access/rel/__init__.py +12 -0
  159. relationalai/early_access/rel/executor/__init__.py +12 -0
  160. relationalai/early_access/rel/rel_utils/__init__.py +12 -0
  161. relationalai/early_access/rel/rewrite/__init__.py +7 -0
  162. relationalai/early_access/solvers/__init__.py +19 -0
  163. relationalai/early_access/sql/__init__.py +11 -0
  164. relationalai/early_access/sql/executor/__init__.py +3 -0
  165. relationalai/early_access/sql/rewrite/__init__.py +3 -0
  166. relationalai/early_access/tests/logging/__init__.py +12 -0
  167. relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
  168. relationalai/early_access/tests/utils/__init__.py +12 -0
  169. relationalai/environments/__init__.py +35 -0
  170. relationalai/environments/base.py +381 -0
  171. relationalai/environments/colab.py +14 -0
  172. relationalai/environments/generic.py +71 -0
  173. relationalai/environments/ipython.py +68 -0
  174. relationalai/environments/jupyter.py +9 -0
  175. relationalai/environments/snowbook.py +169 -0
  176. relationalai/errors.py +2496 -0
  177. relationalai/experimental/SF.py +38 -0
  178. relationalai/experimental/inspect.py +47 -0
  179. relationalai/experimental/pathfinder/__init__.py +158 -0
  180. relationalai/experimental/pathfinder/api.py +160 -0
  181. relationalai/experimental/pathfinder/automaton.py +584 -0
  182. relationalai/experimental/pathfinder/bridge.py +226 -0
  183. relationalai/experimental/pathfinder/compiler.py +416 -0
  184. relationalai/experimental/pathfinder/datalog.py +214 -0
  185. relationalai/experimental/pathfinder/diagnostics.py +56 -0
  186. relationalai/experimental/pathfinder/filter.py +236 -0
  187. relationalai/experimental/pathfinder/glushkov.py +439 -0
  188. relationalai/experimental/pathfinder/options.py +265 -0
  189. relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +1951 -0
  190. relationalai/experimental/pathfinder/rpq.py +344 -0
  191. relationalai/experimental/pathfinder/transition.py +200 -0
  192. relationalai/experimental/pathfinder/utils.py +26 -0
  193. relationalai/experimental/paths/README.md +107 -0
  194. relationalai/experimental/paths/api.py +143 -0
  195. relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
  196. relationalai/experimental/paths/code_organization.md +2 -0
  197. relationalai/experimental/paths/examples/Movies.ipynb +16328 -0
  198. relationalai/experimental/paths/examples/basic_example.py +40 -0
  199. relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
  200. relationalai/experimental/paths/examples/movie_example.py +77 -0
  201. relationalai/experimental/paths/examples/movies_data/actedin.csv +193 -0
  202. relationalai/experimental/paths/examples/movies_data/directed.csv +45 -0
  203. relationalai/experimental/paths/examples/movies_data/follows.csv +7 -0
  204. relationalai/experimental/paths/examples/movies_data/movies.csv +39 -0
  205. relationalai/experimental/paths/examples/movies_data/person.csv +134 -0
  206. relationalai/experimental/paths/examples/movies_data/produced.csv +16 -0
  207. relationalai/experimental/paths/examples/movies_data/ratings.csv +10 -0
  208. relationalai/experimental/paths/examples/movies_data/wrote.csv +11 -0
  209. relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
  210. relationalai/experimental/paths/examples/paths_example.py +116 -0
  211. relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
  212. relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
  213. relationalai/experimental/paths/graph.py +185 -0
  214. relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
  215. relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
  216. relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
  217. relationalai/experimental/paths/path_algorithms/single.py +59 -0
  218. relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
  219. relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
  220. relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
  221. relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
  222. relationalai/experimental/paths/path_algorithms/usp.py +150 -0
  223. relationalai/experimental/paths/product_graph.py +93 -0
  224. relationalai/experimental/paths/rpq/automaton.py +584 -0
  225. relationalai/experimental/paths/rpq/diagnostics.py +56 -0
  226. relationalai/experimental/paths/rpq/rpq.py +378 -0
  227. relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
  228. relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
  229. relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
  230. relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
  231. relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
  232. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
  233. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
  234. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
  235. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
  236. relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
  237. relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
  238. relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
  239. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
  240. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
  241. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
  242. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
  243. relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
  244. relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
  245. relationalai/experimental/paths/tree_agg.py +168 -0
  246. relationalai/experimental/paths/utilities/iterators.py +27 -0
  247. relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
  248. relationalai/experimental/solvers.py +1087 -0
  249. relationalai/loaders/csv.py +195 -0
  250. relationalai/loaders/loader.py +177 -0
  251. relationalai/loaders/types.py +23 -0
  252. relationalai/rel_emitter.py +373 -0
  253. relationalai/rel_utils.py +185 -0
  254. relationalai/semantics/__init__.py +22 -146
  255. relationalai/semantics/designs/query_builder/identify_by.md +106 -0
  256. relationalai/semantics/devtools/benchmark_lqp.py +535 -0
  257. relationalai/semantics/devtools/compilation_manager.py +294 -0
  258. relationalai/semantics/devtools/extract_lqp.py +110 -0
  259. relationalai/semantics/internal/internal.py +3785 -0
  260. relationalai/semantics/internal/snowflake.py +325 -0
  261. relationalai/semantics/lqp/README.md +34 -0
  262. relationalai/semantics/lqp/builtins.py +16 -0
  263. relationalai/semantics/lqp/compiler.py +22 -0
  264. relationalai/semantics/lqp/constructors.py +68 -0
  265. relationalai/semantics/lqp/executor.py +469 -0
  266. relationalai/semantics/lqp/intrinsics.py +24 -0
  267. relationalai/semantics/lqp/model2lqp.py +877 -0
  268. relationalai/semantics/lqp/passes.py +680 -0
  269. relationalai/semantics/lqp/primitives.py +252 -0
  270. relationalai/semantics/lqp/result_helpers.py +202 -0
  271. relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
  272. relationalai/semantics/lqp/rewrite/cdc.py +216 -0
  273. relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
  274. relationalai/semantics/lqp/rewrite/extract_keys.py +512 -0
  275. relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
  276. relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
  277. relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
  278. relationalai/semantics/lqp/rewrite/splinter.py +76 -0
  279. relationalai/semantics/lqp/types.py +101 -0
  280. relationalai/semantics/lqp/utils.py +160 -0
  281. relationalai/semantics/lqp/validators.py +57 -0
  282. relationalai/semantics/metamodel/__init__.py +40 -6
  283. relationalai/semantics/metamodel/builtins.py +771 -205
  284. relationalai/semantics/metamodel/compiler.py +133 -0
  285. relationalai/semantics/metamodel/dependency.py +862 -0
  286. relationalai/semantics/metamodel/executor.py +61 -0
  287. relationalai/semantics/metamodel/factory.py +287 -0
  288. relationalai/semantics/metamodel/helpers.py +361 -0
  289. relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
  290. relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
  291. relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
  292. relationalai/semantics/metamodel/rewrite/flatten.py +554 -0
  293. relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
  294. relationalai/semantics/metamodel/typer/checker.py +353 -0
  295. relationalai/semantics/metamodel/typer/typer.py +1395 -0
  296. relationalai/semantics/metamodel/util.py +506 -0
  297. relationalai/semantics/reasoners/__init__.py +10 -0
  298. relationalai/semantics/reasoners/graph/README.md +620 -0
  299. relationalai/semantics/reasoners/graph/__init__.py +37 -0
  300. relationalai/semantics/reasoners/graph/core.py +9019 -0
  301. relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +797 -0
  302. relationalai/semantics/reasoners/graph/tests/README.md +21 -0
  303. relationalai/semantics/reasoners/optimization/__init__.py +68 -0
  304. relationalai/semantics/reasoners/optimization/common.py +88 -0
  305. relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
  306. relationalai/semantics/reasoners/optimization/solvers_pb.py +1414 -0
  307. relationalai/semantics/rel/builtins.py +40 -0
  308. relationalai/semantics/rel/compiler.py +989 -0
  309. relationalai/semantics/rel/executor.py +362 -0
  310. relationalai/semantics/rel/rel.py +482 -0
  311. relationalai/semantics/rel/rel_utils.py +276 -0
  312. relationalai/semantics/snowflake/__init__.py +3 -0
  313. relationalai/semantics/sql/compiler.py +2503 -0
  314. relationalai/semantics/sql/executor/duck_db.py +52 -0
  315. relationalai/semantics/sql/executor/result_helpers.py +64 -0
  316. relationalai/semantics/sql/executor/snowflake.py +149 -0
  317. relationalai/semantics/sql/rewrite/denormalize.py +222 -0
  318. relationalai/semantics/sql/rewrite/double_negation.py +49 -0
  319. relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
  320. relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
  321. relationalai/semantics/sql/sql.py +504 -0
  322. relationalai/semantics/std/__init__.py +40 -60
  323. relationalai/semantics/std/constraints.py +43 -37
  324. relationalai/semantics/std/datetime.py +135 -246
  325. relationalai/semantics/std/decimals.py +52 -45
  326. relationalai/semantics/std/floats.py +5 -13
  327. relationalai/semantics/std/integers.py +11 -26
  328. relationalai/semantics/std/math.py +112 -183
  329. relationalai/semantics/std/pragmas.py +11 -0
  330. relationalai/semantics/std/re.py +62 -80
  331. relationalai/semantics/std/std.py +14 -0
  332. relationalai/semantics/std/strings.py +60 -117
  333. relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
  334. relationalai/semantics/tests/test_snapshot_base.py +9 -0
  335. relationalai/semantics/tests/utils.py +46 -0
  336. relationalai/std/__init__.py +70 -0
  337. relationalai/tools/cli.py +1936 -0
  338. relationalai/tools/cli_controls.py +1826 -0
  339. relationalai/tools/cli_helpers.py +398 -0
  340. relationalai/tools/debugger.py +183 -289
  341. relationalai/tools/debugger_client.py +109 -0
  342. relationalai/tools/debugger_server.py +302 -0
  343. relationalai/tools/dev.py +685 -0
  344. relationalai/tools/notes +7 -0
  345. relationalai/tools/qb_debugger.py +425 -0
  346. relationalai/util/clean_up_databases.py +95 -0
  347. relationalai/util/format.py +106 -48
  348. relationalai/util/list_databases.py +9 -0
  349. relationalai/util/otel_configuration.py +26 -0
  350. relationalai/util/otel_handler.py +484 -0
  351. relationalai/util/snowflake_handler.py +88 -0
  352. relationalai/util/span_format_test.py +43 -0
  353. relationalai/util/span_tracker.py +207 -0
  354. relationalai/util/spans_file_handler.py +72 -0
  355. relationalai/util/tracing_handler.py +34 -0
  356. relationalai-0.13.1.dist-info/METADATA +74 -0
  357. relationalai-0.13.1.dist-info/RECORD +459 -0
  358. relationalai-0.13.1.dist-info/WHEEL +4 -0
  359. relationalai-0.13.1.dist-info/entry_points.txt +3 -0
  360. relationalai-0.13.1.dist-info/licenses/LICENSE +202 -0
  361. relationalai_test_util/__init__.py +4 -0
  362. relationalai_test_util/fixtures.py +233 -0
  363. relationalai_test_util/snapshot.py +252 -0
  364. relationalai_test_util/traceback.py +118 -0
  365. relationalai/config/__init__.py +0 -56
  366. relationalai/config/config.py +0 -289
  367. relationalai/config/config_fields.py +0 -86
  368. relationalai/config/connections/__init__.py +0 -46
  369. relationalai/config/connections/base.py +0 -23
  370. relationalai/config/connections/duckdb.py +0 -29
  371. relationalai/config/connections/snowflake.py +0 -243
  372. relationalai/config/external/__init__.py +0 -17
  373. relationalai/config/external/dbt_converter.py +0 -101
  374. relationalai/config/external/dbt_models.py +0 -93
  375. relationalai/config/external/snowflake_converter.py +0 -41
  376. relationalai/config/external/snowflake_models.py +0 -85
  377. relationalai/config/external/utils.py +0 -19
  378. relationalai/semantics/backends/lqp/annotations.py +0 -11
  379. relationalai/semantics/backends/sql/sql_compiler.py +0 -327
  380. relationalai/semantics/frontend/base.py +0 -1707
  381. relationalai/semantics/frontend/core.py +0 -179
  382. relationalai/semantics/frontend/front_compiler.py +0 -1313
  383. relationalai/semantics/frontend/pprint.py +0 -408
  384. relationalai/semantics/metamodel/metamodel.py +0 -437
  385. relationalai/semantics/metamodel/metamodel_analyzer.py +0 -519
  386. relationalai/semantics/metamodel/metamodel_compiler.py +0 -0
  387. relationalai/semantics/metamodel/pprint.py +0 -412
  388. relationalai/semantics/metamodel/rewriter.py +0 -266
  389. relationalai/semantics/metamodel/typer.py +0 -1378
  390. relationalai/semantics/std/aggregates.py +0 -149
  391. relationalai/semantics/std/common.py +0 -44
  392. relationalai/semantics/std/numbers.py +0 -86
  393. relationalai/shims/executor.py +0 -147
  394. relationalai/shims/helpers.py +0 -126
  395. relationalai/shims/hoister.py +0 -221
  396. relationalai/shims/mm2v0.py +0 -1290
  397. relationalai/tools/cli/__init__.py +0 -6
  398. relationalai/tools/cli/cli.py +0 -90
  399. relationalai/tools/cli/components/__init__.py +0 -5
  400. relationalai/tools/cli/components/progress_reader.py +0 -1524
  401. relationalai/tools/cli/components/utils.py +0 -58
  402. relationalai/tools/cli/config_template.py +0 -45
  403. relationalai/tools/cli/dev.py +0 -19
  404. relationalai/tools/typer_debugger.py +0 -93
  405. relationalai/util/dataclasses.py +0 -43
  406. relationalai/util/docutils.py +0 -40
  407. relationalai/util/error.py +0 -199
  408. relationalai/util/naming.py +0 -145
  409. relationalai/util/python.py +0 -35
  410. relationalai/util/runtime.py +0 -156
  411. relationalai/util/schema.py +0 -197
  412. relationalai/util/source.py +0 -185
  413. relationalai/util/structures.py +0 -163
  414. relationalai/util/tracing.py +0 -261
  415. relationalai-0.13.0.dev0.dist-info/METADATA +0 -46
  416. relationalai-0.13.0.dev0.dist-info/RECORD +0 -488
  417. relationalai-0.13.0.dev0.dist-info/WHEEL +0 -5
  418. relationalai-0.13.0.dev0.dist-info/entry_points.txt +0 -3
  419. relationalai-0.13.0.dev0.dist-info/top_level.txt +0 -2
  420. v0/relationalai/__init__.py +0 -216
  421. v0/relationalai/clients/__init__.py +0 -5
  422. v0/relationalai/clients/azure.py +0 -477
  423. v0/relationalai/clients/client.py +0 -912
  424. v0/relationalai/clients/config.py +0 -673
  425. v0/relationalai/clients/direct_access_client.py +0 -118
  426. v0/relationalai/clients/hash_util.py +0 -31
  427. v0/relationalai/clients/local.py +0 -571
  428. v0/relationalai/clients/profile_polling.py +0 -73
  429. v0/relationalai/clients/result_helpers.py +0 -420
  430. v0/relationalai/clients/snowflake.py +0 -3869
  431. v0/relationalai/clients/types.py +0 -113
  432. v0/relationalai/clients/use_index_poller.py +0 -980
  433. v0/relationalai/clients/util.py +0 -356
  434. v0/relationalai/debugging.py +0 -389
  435. v0/relationalai/dsl.py +0 -1749
  436. v0/relationalai/early_access/builder/__init__.py +0 -30
  437. v0/relationalai/early_access/builder/builder/__init__.py +0 -35
  438. v0/relationalai/early_access/builder/snowflake/__init__.py +0 -12
  439. v0/relationalai/early_access/builder/std/__init__.py +0 -25
  440. v0/relationalai/early_access/builder/std/decimals/__init__.py +0 -12
  441. v0/relationalai/early_access/builder/std/integers/__init__.py +0 -12
  442. v0/relationalai/early_access/builder/std/math/__init__.py +0 -12
  443. v0/relationalai/early_access/builder/std/strings/__init__.py +0 -14
  444. v0/relationalai/early_access/devtools/__init__.py +0 -12
  445. v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
  446. v0/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
  447. v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
  448. v0/relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
  449. v0/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
  450. v0/relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
  451. v0/relationalai/early_access/dsl/bindings/common.py +0 -402
  452. v0/relationalai/early_access/dsl/bindings/csv.py +0 -170
  453. v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
  454. v0/relationalai/early_access/dsl/bindings/snowflake.py +0 -64
  455. v0/relationalai/early_access/dsl/codegen/binder.py +0 -411
  456. v0/relationalai/early_access/dsl/codegen/common.py +0 -79
  457. v0/relationalai/early_access/dsl/codegen/helpers.py +0 -23
  458. v0/relationalai/early_access/dsl/codegen/relations.py +0 -700
  459. v0/relationalai/early_access/dsl/codegen/weaver.py +0 -417
  460. v0/relationalai/early_access/dsl/core/builders/__init__.py +0 -47
  461. v0/relationalai/early_access/dsl/core/builders/logic.py +0 -19
  462. v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
  463. v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
  464. v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
  465. v0/relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
  466. v0/relationalai/early_access/dsl/core/context.py +0 -13
  467. v0/relationalai/early_access/dsl/core/cset.py +0 -132
  468. v0/relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
  469. v0/relationalai/early_access/dsl/core/exprs/relational.py +0 -18
  470. v0/relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
  471. v0/relationalai/early_access/dsl/core/instances.py +0 -44
  472. v0/relationalai/early_access/dsl/core/logic/__init__.py +0 -193
  473. v0/relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
  474. v0/relationalai/early_access/dsl/core/logic/exists.py +0 -223
  475. v0/relationalai/early_access/dsl/core/logic/helper.py +0 -163
  476. v0/relationalai/early_access/dsl/core/namespaces.py +0 -32
  477. v0/relationalai/early_access/dsl/core/relations.py +0 -276
  478. v0/relationalai/early_access/dsl/core/rules.py +0 -112
  479. v0/relationalai/early_access/dsl/core/std/__init__.py +0 -45
  480. v0/relationalai/early_access/dsl/core/temporal/recall.py +0 -6
  481. v0/relationalai/early_access/dsl/core/types/__init__.py +0 -270
  482. v0/relationalai/early_access/dsl/core/types/concepts.py +0 -128
  483. v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
  484. v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
  485. v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
  486. v0/relationalai/early_access/dsl/core/types/standard.py +0 -92
  487. v0/relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
  488. v0/relationalai/early_access/dsl/core/types/variables.py +0 -203
  489. v0/relationalai/early_access/dsl/ir/compiler.py +0 -318
  490. v0/relationalai/early_access/dsl/ir/executor.py +0 -260
  491. v0/relationalai/early_access/dsl/ontologies/constraints.py +0 -88
  492. v0/relationalai/early_access/dsl/ontologies/export.py +0 -30
  493. v0/relationalai/early_access/dsl/ontologies/models.py +0 -453
  494. v0/relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
  495. v0/relationalai/early_access/dsl/ontologies/readings.py +0 -60
  496. v0/relationalai/early_access/dsl/ontologies/relationships.py +0 -322
  497. v0/relationalai/early_access/dsl/ontologies/roles.py +0 -87
  498. v0/relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
  499. v0/relationalai/early_access/dsl/orm/constraints.py +0 -438
  500. v0/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
  501. v0/relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
  502. v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
  503. v0/relationalai/early_access/dsl/orm/measures/measures.py +0 -299
  504. v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
  505. v0/relationalai/early_access/dsl/orm/models.py +0 -256
  506. v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
  507. v0/relationalai/early_access/dsl/orm/printer.py +0 -469
  508. v0/relationalai/early_access/dsl/orm/reasoners.py +0 -480
  509. v0/relationalai/early_access/dsl/orm/relations.py +0 -19
  510. v0/relationalai/early_access/dsl/orm/relationships.py +0 -251
  511. v0/relationalai/early_access/dsl/orm/types.py +0 -42
  512. v0/relationalai/early_access/dsl/orm/utils.py +0 -79
  513. v0/relationalai/early_access/dsl/orm/verb.py +0 -204
  514. v0/relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
  515. v0/relationalai/early_access/dsl/relations.py +0 -170
  516. v0/relationalai/early_access/dsl/rulesets.py +0 -69
  517. v0/relationalai/early_access/dsl/schemas/__init__.py +0 -450
  518. v0/relationalai/early_access/dsl/schemas/builder.py +0 -48
  519. v0/relationalai/early_access/dsl/schemas/comp_names.py +0 -51
  520. v0/relationalai/early_access/dsl/schemas/components.py +0 -203
  521. v0/relationalai/early_access/dsl/schemas/contexts.py +0 -156
  522. v0/relationalai/early_access/dsl/schemas/exprs.py +0 -89
  523. v0/relationalai/early_access/dsl/schemas/fragments.py +0 -464
  524. v0/relationalai/early_access/dsl/serialization.py +0 -79
  525. v0/relationalai/early_access/dsl/serialize/exporter.py +0 -163
  526. v0/relationalai/early_access/dsl/snow/api.py +0 -104
  527. v0/relationalai/early_access/dsl/snow/common.py +0 -76
  528. v0/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
  529. v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
  530. v0/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
  531. v0/relationalai/early_access/dsl/types/__init__.py +0 -40
  532. v0/relationalai/early_access/dsl/types/concepts.py +0 -12
  533. v0/relationalai/early_access/dsl/types/entities.py +0 -135
  534. v0/relationalai/early_access/dsl/types/values.py +0 -17
  535. v0/relationalai/early_access/dsl/utils.py +0 -102
  536. v0/relationalai/early_access/graphs/__init__.py +0 -13
  537. v0/relationalai/early_access/lqp/__init__.py +0 -12
  538. v0/relationalai/early_access/lqp/compiler/__init__.py +0 -12
  539. v0/relationalai/early_access/lqp/constructors/__init__.py +0 -18
  540. v0/relationalai/early_access/lqp/executor/__init__.py +0 -12
  541. v0/relationalai/early_access/lqp/ir/__init__.py +0 -12
  542. v0/relationalai/early_access/lqp/passes/__init__.py +0 -12
  543. v0/relationalai/early_access/lqp/pragmas/__init__.py +0 -12
  544. v0/relationalai/early_access/lqp/primitives/__init__.py +0 -12
  545. v0/relationalai/early_access/lqp/types/__init__.py +0 -12
  546. v0/relationalai/early_access/lqp/utils/__init__.py +0 -12
  547. v0/relationalai/early_access/lqp/validators/__init__.py +0 -12
  548. v0/relationalai/early_access/metamodel/__init__.py +0 -58
  549. v0/relationalai/early_access/metamodel/builtins/__init__.py +0 -12
  550. v0/relationalai/early_access/metamodel/compiler/__init__.py +0 -12
  551. v0/relationalai/early_access/metamodel/dependency/__init__.py +0 -12
  552. v0/relationalai/early_access/metamodel/factory/__init__.py +0 -17
  553. v0/relationalai/early_access/metamodel/helpers/__init__.py +0 -12
  554. v0/relationalai/early_access/metamodel/ir/__init__.py +0 -14
  555. v0/relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
  556. v0/relationalai/early_access/metamodel/typer/__init__.py +0 -3
  557. v0/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
  558. v0/relationalai/early_access/metamodel/types/__init__.py +0 -15
  559. v0/relationalai/early_access/metamodel/util/__init__.py +0 -15
  560. v0/relationalai/early_access/metamodel/visitor/__init__.py +0 -12
  561. v0/relationalai/early_access/rel/__init__.py +0 -12
  562. v0/relationalai/early_access/rel/executor/__init__.py +0 -12
  563. v0/relationalai/early_access/rel/rel_utils/__init__.py +0 -12
  564. v0/relationalai/early_access/rel/rewrite/__init__.py +0 -7
  565. v0/relationalai/early_access/solvers/__init__.py +0 -19
  566. v0/relationalai/early_access/sql/__init__.py +0 -11
  567. v0/relationalai/early_access/sql/executor/__init__.py +0 -3
  568. v0/relationalai/early_access/sql/rewrite/__init__.py +0 -3
  569. v0/relationalai/early_access/tests/logging/__init__.py +0 -12
  570. v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
  571. v0/relationalai/early_access/tests/utils/__init__.py +0 -12
  572. v0/relationalai/environments/__init__.py +0 -35
  573. v0/relationalai/environments/base.py +0 -381
  574. v0/relationalai/environments/colab.py +0 -14
  575. v0/relationalai/environments/generic.py +0 -71
  576. v0/relationalai/environments/ipython.py +0 -68
  577. v0/relationalai/environments/jupyter.py +0 -9
  578. v0/relationalai/environments/snowbook.py +0 -169
  579. v0/relationalai/errors.py +0 -2455
  580. v0/relationalai/experimental/SF.py +0 -38
  581. v0/relationalai/experimental/inspect.py +0 -47
  582. v0/relationalai/experimental/pathfinder/__init__.py +0 -158
  583. v0/relationalai/experimental/pathfinder/api.py +0 -160
  584. v0/relationalai/experimental/pathfinder/automaton.py +0 -584
  585. v0/relationalai/experimental/pathfinder/bridge.py +0 -226
  586. v0/relationalai/experimental/pathfinder/compiler.py +0 -416
  587. v0/relationalai/experimental/pathfinder/datalog.py +0 -214
  588. v0/relationalai/experimental/pathfinder/diagnostics.py +0 -56
  589. v0/relationalai/experimental/pathfinder/filter.py +0 -236
  590. v0/relationalai/experimental/pathfinder/glushkov.py +0 -439
  591. v0/relationalai/experimental/pathfinder/options.py +0 -265
  592. v0/relationalai/experimental/pathfinder/rpq.py +0 -344
  593. v0/relationalai/experimental/pathfinder/transition.py +0 -200
  594. v0/relationalai/experimental/pathfinder/utils.py +0 -26
  595. v0/relationalai/experimental/paths/api.py +0 -143
  596. v0/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
  597. v0/relationalai/experimental/paths/examples/basic_example.py +0 -40
  598. v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
  599. v0/relationalai/experimental/paths/examples/movie_example.py +0 -77
  600. v0/relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
  601. v0/relationalai/experimental/paths/examples/paths_example.py +0 -116
  602. v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
  603. v0/relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
  604. v0/relationalai/experimental/paths/graph.py +0 -185
  605. v0/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
  606. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
  607. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
  608. v0/relationalai/experimental/paths/path_algorithms/single.py +0 -59
  609. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
  610. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
  611. v0/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
  612. v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
  613. v0/relationalai/experimental/paths/path_algorithms/usp.py +0 -150
  614. v0/relationalai/experimental/paths/product_graph.py +0 -93
  615. v0/relationalai/experimental/paths/rpq/automaton.py +0 -584
  616. v0/relationalai/experimental/paths/rpq/diagnostics.py +0 -56
  617. v0/relationalai/experimental/paths/rpq/rpq.py +0 -378
  618. v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
  619. v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
  620. v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
  621. v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
  622. v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
  623. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
  624. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
  625. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
  626. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
  627. v0/relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
  628. v0/relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
  629. v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
  630. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
  631. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
  632. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
  633. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
  634. v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
  635. v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
  636. v0/relationalai/experimental/paths/tree_agg.py +0 -168
  637. v0/relationalai/experimental/paths/utilities/iterators.py +0 -27
  638. v0/relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
  639. v0/relationalai/experimental/solvers.py +0 -1087
  640. v0/relationalai/loaders/csv.py +0 -195
  641. v0/relationalai/loaders/loader.py +0 -177
  642. v0/relationalai/loaders/types.py +0 -23
  643. v0/relationalai/rel_emitter.py +0 -373
  644. v0/relationalai/rel_utils.py +0 -185
  645. v0/relationalai/semantics/__init__.py +0 -29
  646. v0/relationalai/semantics/devtools/benchmark_lqp.py +0 -536
  647. v0/relationalai/semantics/devtools/compilation_manager.py +0 -294
  648. v0/relationalai/semantics/devtools/extract_lqp.py +0 -110
  649. v0/relationalai/semantics/internal/internal.py +0 -3785
  650. v0/relationalai/semantics/internal/snowflake.py +0 -324
  651. v0/relationalai/semantics/lqp/builtins.py +0 -16
  652. v0/relationalai/semantics/lqp/compiler.py +0 -22
  653. v0/relationalai/semantics/lqp/constructors.py +0 -68
  654. v0/relationalai/semantics/lqp/executor.py +0 -469
  655. v0/relationalai/semantics/lqp/intrinsics.py +0 -24
  656. v0/relationalai/semantics/lqp/model2lqp.py +0 -839
  657. v0/relationalai/semantics/lqp/passes.py +0 -680
  658. v0/relationalai/semantics/lqp/primitives.py +0 -252
  659. v0/relationalai/semantics/lqp/result_helpers.py +0 -202
  660. v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
  661. v0/relationalai/semantics/lqp/rewrite/cdc.py +0 -216
  662. v0/relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
  663. v0/relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
  664. v0/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
  665. v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
  666. v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
  667. v0/relationalai/semantics/lqp/rewrite/splinter.py +0 -76
  668. v0/relationalai/semantics/lqp/types.py +0 -101
  669. v0/relationalai/semantics/lqp/utils.py +0 -160
  670. v0/relationalai/semantics/lqp/validators.py +0 -57
  671. v0/relationalai/semantics/metamodel/__init__.py +0 -40
  672. v0/relationalai/semantics/metamodel/builtins.py +0 -774
  673. v0/relationalai/semantics/metamodel/compiler.py +0 -133
  674. v0/relationalai/semantics/metamodel/dependency.py +0 -862
  675. v0/relationalai/semantics/metamodel/executor.py +0 -61
  676. v0/relationalai/semantics/metamodel/factory.py +0 -287
  677. v0/relationalai/semantics/metamodel/helpers.py +0 -361
  678. v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
  679. v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
  680. v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
  681. v0/relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
  682. v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
  683. v0/relationalai/semantics/metamodel/typer/checker.py +0 -353
  684. v0/relationalai/semantics/metamodel/typer/typer.py +0 -1395
  685. v0/relationalai/semantics/metamodel/util.py +0 -505
  686. v0/relationalai/semantics/reasoners/__init__.py +0 -10
  687. v0/relationalai/semantics/reasoners/graph/__init__.py +0 -37
  688. v0/relationalai/semantics/reasoners/graph/core.py +0 -9020
  689. v0/relationalai/semantics/reasoners/optimization/__init__.py +0 -68
  690. v0/relationalai/semantics/reasoners/optimization/common.py +0 -88
  691. v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
  692. v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
  693. v0/relationalai/semantics/rel/builtins.py +0 -40
  694. v0/relationalai/semantics/rel/compiler.py +0 -989
  695. v0/relationalai/semantics/rel/executor.py +0 -359
  696. v0/relationalai/semantics/rel/rel.py +0 -482
  697. v0/relationalai/semantics/rel/rel_utils.py +0 -276
  698. v0/relationalai/semantics/snowflake/__init__.py +0 -3
  699. v0/relationalai/semantics/sql/compiler.py +0 -2503
  700. v0/relationalai/semantics/sql/executor/duck_db.py +0 -52
  701. v0/relationalai/semantics/sql/executor/result_helpers.py +0 -64
  702. v0/relationalai/semantics/sql/executor/snowflake.py +0 -145
  703. v0/relationalai/semantics/sql/rewrite/denormalize.py +0 -222
  704. v0/relationalai/semantics/sql/rewrite/double_negation.py +0 -49
  705. v0/relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
  706. v0/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
  707. v0/relationalai/semantics/sql/sql.py +0 -504
  708. v0/relationalai/semantics/std/__init__.py +0 -54
  709. v0/relationalai/semantics/std/constraints.py +0 -43
  710. v0/relationalai/semantics/std/datetime.py +0 -363
  711. v0/relationalai/semantics/std/decimals.py +0 -62
  712. v0/relationalai/semantics/std/floats.py +0 -7
  713. v0/relationalai/semantics/std/integers.py +0 -22
  714. v0/relationalai/semantics/std/math.py +0 -141
  715. v0/relationalai/semantics/std/pragmas.py +0 -11
  716. v0/relationalai/semantics/std/re.py +0 -83
  717. v0/relationalai/semantics/std/std.py +0 -14
  718. v0/relationalai/semantics/std/strings.py +0 -63
  719. v0/relationalai/semantics/tests/__init__.py +0 -0
  720. v0/relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
  721. v0/relationalai/semantics/tests/test_snapshot_base.py +0 -9
  722. v0/relationalai/semantics/tests/utils.py +0 -46
  723. v0/relationalai/std/__init__.py +0 -70
  724. v0/relationalai/tools/__init__.py +0 -0
  725. v0/relationalai/tools/cli.py +0 -1940
  726. v0/relationalai/tools/cli_controls.py +0 -1826
  727. v0/relationalai/tools/cli_helpers.py +0 -390
  728. v0/relationalai/tools/debugger.py +0 -183
  729. v0/relationalai/tools/debugger_client.py +0 -109
  730. v0/relationalai/tools/debugger_server.py +0 -302
  731. v0/relationalai/tools/dev.py +0 -685
  732. v0/relationalai/tools/qb_debugger.py +0 -425
  733. v0/relationalai/util/clean_up_databases.py +0 -95
  734. v0/relationalai/util/format.py +0 -123
  735. v0/relationalai/util/list_databases.py +0 -9
  736. v0/relationalai/util/otel_configuration.py +0 -25
  737. v0/relationalai/util/otel_handler.py +0 -484
  738. v0/relationalai/util/snowflake_handler.py +0 -88
  739. v0/relationalai/util/span_format_test.py +0 -43
  740. v0/relationalai/util/span_tracker.py +0 -207
  741. v0/relationalai/util/spans_file_handler.py +0 -72
  742. v0/relationalai/util/tracing_handler.py +0 -34
  743. /relationalai/{semantics/frontend → analysis}/__init__.py +0 -0
  744. {v0/relationalai → relationalai}/analysis/mechanistic.py +0 -0
  745. {v0/relationalai → relationalai}/analysis/whynot.py +0 -0
  746. /relationalai/{shims → auth}/__init__.py +0 -0
  747. {v0/relationalai → relationalai}/auth/jwt_generator.py +0 -0
  748. {v0/relationalai → relationalai}/auth/oauth_callback_server.py +0 -0
  749. {v0/relationalai → relationalai}/auth/token_handler.py +0 -0
  750. {v0/relationalai → relationalai}/auth/util.py +0 -0
  751. {v0/relationalai/clients → relationalai/clients/resources/snowflake}/cache_store.py +0 -0
  752. {v0/relationalai → relationalai}/compiler.py +0 -0
  753. {v0/relationalai → relationalai}/dependencies.py +0 -0
  754. {v0/relationalai → relationalai}/docutils.py +0 -0
  755. {v0/relationalai/analysis → relationalai/early_access}/__init__.py +0 -0
  756. {v0/relationalai → relationalai}/early_access/dsl/__init__.py +0 -0
  757. {v0/relationalai/auth → relationalai/early_access/dsl/adapters}/__init__.py +0 -0
  758. {v0/relationalai/early_access → relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
  759. {v0/relationalai → relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
  760. {v0/relationalai/early_access/dsl/adapters → relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
  761. {v0/relationalai → relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
  762. {v0/relationalai/early_access/dsl/adapters/orm → relationalai/early_access/dsl/bindings}/__init__.py +0 -0
  763. {v0/relationalai/early_access/dsl/adapters/owl → relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
  764. {v0/relationalai/early_access/dsl/bindings → relationalai/early_access/dsl/codegen}/__init__.py +0 -0
  765. {v0/relationalai → relationalai}/early_access/dsl/constants.py +0 -0
  766. {v0/relationalai → relationalai}/early_access/dsl/core/__init__.py +0 -0
  767. {v0/relationalai → relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
  768. {v0/relationalai → relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  769. {v0/relationalai → relationalai}/early_access/dsl/core/stack.py +0 -0
  770. {v0/relationalai/early_access/dsl/bindings/legacy → relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
  771. {v0/relationalai → relationalai}/early_access/dsl/core/utils.py +0 -0
  772. {v0/relationalai/early_access/dsl/codegen → relationalai/early_access/dsl/ir}/__init__.py +0 -0
  773. {v0/relationalai/early_access/dsl/core/temporal → relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
  774. {v0/relationalai → relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
  775. {v0/relationalai/early_access/dsl/ir → relationalai/early_access/dsl/orm}/__init__.py +0 -0
  776. {v0/relationalai/early_access/dsl/ontologies → relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
  777. {v0/relationalai → relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
  778. {v0/relationalai/early_access/dsl/orm → relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
  779. {v0/relationalai/early_access/dsl/orm/measures → relationalai/early_access/dsl/serialize}/__init__.py +0 -0
  780. {v0/relationalai → relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
  781. {v0/relationalai → relationalai}/early_access/dsl/serialize/model.py +0 -0
  782. {v0/relationalai/early_access/dsl/physical_metadata → relationalai/early_access/dsl/snow}/__init__.py +0 -0
  783. {v0/relationalai → relationalai}/early_access/tests/__init__.py +0 -0
  784. {v0/relationalai → relationalai}/environments/ci.py +0 -0
  785. {v0/relationalai → relationalai}/environments/hex.py +0 -0
  786. {v0/relationalai → relationalai}/environments/terminal.py +0 -0
  787. {v0/relationalai → relationalai}/experimental/__init__.py +0 -0
  788. {v0/relationalai → relationalai}/experimental/graphs.py +0 -0
  789. {v0/relationalai → relationalai}/experimental/paths/__init__.py +0 -0
  790. {v0/relationalai → relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
  791. {v0/relationalai → relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
  792. {v0/relationalai → relationalai}/experimental/paths/rpq/__init__.py +0 -0
  793. {v0/relationalai → relationalai}/experimental/paths/rpq/filter.py +0 -0
  794. {v0/relationalai → relationalai}/experimental/paths/rpq/glushkov.py +0 -0
  795. {v0/relationalai → relationalai}/experimental/paths/rpq/transition.py +0 -0
  796. {v0/relationalai → relationalai}/experimental/paths/utilities/__init__.py +0 -0
  797. {v0/relationalai → relationalai}/experimental/paths/utilities/utilities.py +0 -0
  798. {v0/relationalai/early_access/dsl/serialize → relationalai/loaders}/__init__.py +0 -0
  799. {v0/relationalai → relationalai}/metagen.py +0 -0
  800. {v0/relationalai → relationalai}/metamodel.py +0 -0
  801. {v0/relationalai → relationalai}/rel.py +0 -0
  802. {v0/relationalai → relationalai}/semantics/devtools/__init__.py +0 -0
  803. {v0/relationalai → relationalai}/semantics/internal/__init__.py +0 -0
  804. {v0/relationalai → relationalai}/semantics/internal/annotations.py +0 -0
  805. {v0/relationalai → relationalai}/semantics/lqp/__init__.py +0 -0
  806. {v0/relationalai → relationalai}/semantics/lqp/ir.py +0 -0
  807. {v0/relationalai → relationalai}/semantics/lqp/pragmas.py +0 -0
  808. {v0/relationalai → relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
  809. {v0/relationalai → relationalai}/semantics/metamodel/dataflow.py +0 -0
  810. {v0/relationalai → relationalai}/semantics/metamodel/ir.py +0 -0
  811. {v0/relationalai → relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
  812. {v0/relationalai → relationalai}/semantics/metamodel/typer/__init__.py +0 -0
  813. {v0/relationalai → relationalai}/semantics/metamodel/types.py +0 -0
  814. {v0/relationalai → relationalai}/semantics/metamodel/visitor.py +0 -0
  815. {v0/relationalai → relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
  816. {v0/relationalai → relationalai}/semantics/rel/__init__.py +0 -0
  817. {v0/relationalai → relationalai}/semantics/sql/__init__.py +0 -0
  818. {v0/relationalai → relationalai}/semantics/sql/executor/__init__.py +0 -0
  819. {v0/relationalai → relationalai}/semantics/sql/rewrite/__init__.py +0 -0
  820. {v0/relationalai/early_access/dsl/snow → relationalai/semantics/tests}/__init__.py +0 -0
  821. {v0/relationalai → relationalai}/semantics/tests/logging.py +0 -0
  822. {v0/relationalai → relationalai}/std/aggregates.py +0 -0
  823. {v0/relationalai → relationalai}/std/dates.py +0 -0
  824. {v0/relationalai → relationalai}/std/graphs.py +0 -0
  825. {v0/relationalai → relationalai}/std/inspect.py +0 -0
  826. {v0/relationalai → relationalai}/std/math.py +0 -0
  827. {v0/relationalai → relationalai}/std/re.py +0 -0
  828. {v0/relationalai → relationalai}/std/strings.py +0 -0
  829. {v0/relationalai/loaders → relationalai/tools}/__init__.py +0 -0
  830. {v0/relationalai → relationalai}/tools/cleanup_snapshots.py +0 -0
  831. {v0/relationalai → relationalai}/tools/constants.py +0 -0
  832. {v0/relationalai → relationalai}/tools/query_utils.py +0 -0
  833. {v0/relationalai → relationalai}/tools/snapshot_viewer.py +0 -0
  834. {v0/relationalai → relationalai}/util/__init__.py +0 -0
  835. {v0/relationalai → relationalai}/util/constants.py +0 -0
  836. {v0/relationalai → relationalai}/util/graph.py +0 -0
  837. {v0/relationalai → relationalai}/util/timeout.py +0 -0
@@ -0,0 +1,912 @@
1
+ from __future__ import annotations
2
+ import atexit
3
+ from datetime import datetime, timedelta, timezone
4
+ import re
5
+ from collections import defaultdict
6
+ from typing import Dict, List, Any, Optional, Tuple, cast, Callable
7
+
8
+ from abc import ABC, abstractmethod
9
+ from dataclasses import dataclass
10
+ from pandas import DataFrame
11
+ import time
12
+
13
+ from .hash_util import database_name_from_sproc_name
14
+ from ..tools.constants import USE_GRAPH_INDEX, USE_PACKAGE_MANAGER
15
+
16
+
17
+ from .types import AvailableModel, EngineState, Import, ImportSource, ImportsStatus, SourceMapEntry
18
+ from .config import Config
19
+ from ..compiler import Compiler
20
+ from ..environments import runtime_env, NotebookRuntimeEnvironment
21
+ from .. import dsl, debugging, metamodel as m
22
+ from .. import dependencies
23
+
24
+ #--------------------------------------------------
25
+ # InstallBatch
26
+ #--------------------------------------------------
27
+
28
+ class InstallBatch:
29
+ def __init__(self):
30
+ self.dirty = set()
31
+ self.content:Dict[str, Dict[str, List[tuple[str, m.Task|None]]]] = defaultdict(lambda: defaultdict(list))
32
+ self.control_items:List[Tuple[str, Callable|None]] = []
33
+ # source name -> {task -> (start, end)}
34
+ self.task_map:dict[str, dict[m.Task, tuple[int, int]]] = defaultdict(dict)
35
+ self.task_map = defaultdict(dict)
36
+
37
+ def _cell(self):
38
+ if not isinstance(runtime_env, NotebookRuntimeEnvironment):
39
+ return ""
40
+ return runtime_env.active_cell_id() or ""
41
+
42
+ def _check_dirty_cells(self, name:str):
43
+ if not isinstance(runtime_env, NotebookRuntimeEnvironment):
44
+ return
45
+
46
+ for cell in runtime_env.dirty_cells:
47
+ self.content[name][cell].clear()
48
+ runtime_env.dirty_cells.clear()
49
+
50
+ def append(self, name:str, code:str, task:m.Task|None=None):
51
+ self._check_dirty_cells(name)
52
+ self.dirty.add(name)
53
+ self.content[name][self._cell()].append((code, task))
54
+
55
+ def set(self, name:str, code:str, task:m.Task|None=None):
56
+ self.dirty.add(name)
57
+ self.content[name][self._cell()] = [(code, task)]
58
+
59
+ def flush(self, force=False):
60
+ items = []
61
+ dirty = self.content.keys() if force else self.dirty
62
+ for name in dirty:
63
+ all_cells = []
64
+ cur_line = 0
65
+ task_map = self.task_map[name]
66
+ for _, content in self.content[name].items():
67
+ for (code, task) in content:
68
+ end = code.count("\n") + cur_line + 2
69
+ all_cells.append(code)
70
+ if task:
71
+ task_map[task] = (cur_line, end)
72
+
73
+ cur_line = end
74
+ items.append((name, "\n\n".join(all_cells)))
75
+ return items
76
+
77
+ def get_all_models(self):
78
+ items = []
79
+ for name in self.content:
80
+ all_cells = []
81
+ for _, content in self.content[name].items():
82
+ for code, _ in content:
83
+ all_cells.append(code)
84
+ items.append((name, "\n\n".join(all_cells)))
85
+ return items
86
+
87
+ def flush_control_items(self):
88
+ cur = self.control_items
89
+ self.control_items = []
90
+ return cur
91
+
92
+ def is_dirty(self):
93
+ return len(self.dirty) > 0
94
+
95
+ def clear_dirty(self):
96
+ self.dirty.clear()
97
+
98
+ def line_to_task(self, name:str, line:int):
99
+ for task, (start, end) in self.task_map[name].items():
100
+ if start <= line <= end:
101
+ return task
102
+ return None
103
+
104
+ #--------------------------------------------------
105
+ # Helpers
106
+ #--------------------------------------------------
107
+ @dataclass
108
+ class ExportParams:
109
+ root_database: str
110
+ model_database: str
111
+ proc_database: str
112
+ engine: str
113
+ func_name: str
114
+ inputs: List[Tuple[str, str, Any]]
115
+ out_fields: List[Tuple[str, Any]] | List[str]
116
+ code: str
117
+ install_code: str
118
+ dry_run: bool
119
+ skip_invalid_data: bool
120
+ sources: List[str]
121
+
122
+ #--------------------------------------------------
123
+ # Resources
124
+ #--------------------------------------------------
125
+
126
+ class ResourcesBase(ABC):
127
+ def __init__(self, profile: str | None = None, config:Config|None=None):
128
+ super().__init__()
129
+ self.config = config or Config(profile)
130
+
131
+ @property
132
+ def platform(self):
133
+ return self.config.get("platform")
134
+
135
+ @abstractmethod
136
+ def reset(self):
137
+ pass
138
+
139
+ @abstractmethod
140
+ def is_account_flag_set(self, flag: str) -> bool:
141
+ pass
142
+
143
+ @abstractmethod
144
+ def is_direct_access_enabled(self) -> bool:
145
+ pass
146
+
147
+ def get_app_name(self) -> str:
148
+ return cast(str, self.config.get("rai_app_name", "relationalai"))
149
+
150
+ #--------------------------------------------------
151
+ # Generic
152
+ #--------------------------------------------------
153
+
154
+ @abstractmethod
155
+ def get_version(self):
156
+ pass
157
+
158
+ #--------------------------------------------------
159
+ # Engines
160
+ #--------------------------------------------------
161
+
162
+ @abstractmethod
163
+ def get_engine_sizes(self, cloud_provider: str|None=None) -> List[Any]:
164
+ pass
165
+
166
+ @abstractmethod
167
+ def list_engines(self, state: str|None = None) -> List[Any]:
168
+ pass
169
+
170
+ @abstractmethod
171
+ def get_engine(self, name: str) -> EngineState | None:
172
+ pass
173
+
174
+ @abstractmethod
175
+ def get_cloud_provider(self) -> str:
176
+ pass
177
+
178
+ @abstractmethod
179
+ def is_valid_engine_state(self, name: str) -> bool:
180
+ pass
181
+
182
+ @abstractmethod
183
+ def create_engine(self, name: str, size: str|None, auto_suspend_mins: int|None) -> dict | None:
184
+ pass
185
+
186
+ @abstractmethod
187
+ def delete_engine(self, name:str, force:bool=False) -> dict | None:
188
+ pass
189
+
190
+ @abstractmethod
191
+ def suspend_engine(self, name: str):
192
+ pass
193
+
194
+ @abstractmethod
195
+ def resume_engine(self, name: str, headers: Dict | None = None) -> dict:
196
+ pass
197
+
198
+ @abstractmethod
199
+ def resume_engine_async(self, name: str) -> dict:
200
+ pass
201
+
202
+ @abstractmethod
203
+ def alter_engine_pool(self, size: str | None = None, mins: int | None = None, maxs: int | None = None):
204
+ pass
205
+
206
+ def get_default_engine_name(self) -> str:
207
+ engine = self._get_active_engine() or self.config.get("engine")
208
+ if not engine:
209
+ raise Exception("No default engine in your configuration")
210
+ return engine
211
+
212
+ @abstractmethod
213
+ def auto_create_engine_async(self, name: str | None = None) -> str:
214
+ pass
215
+
216
+ _active_engine: EngineState|None = None
217
+
218
+ def _get_active_engine(self):
219
+ engine = self._active_engine
220
+
221
+ if engine:
222
+ # Apparently any timezone is fine, but you need to explicitly pass one to get a tz-aware datetime.
223
+ cur_time = datetime.now(timezone.utc)
224
+ suspends_at = engine.get("suspends_at")
225
+ auto_suspend = engine.get("auto_suspend")
226
+ if suspends_at is None or cur_time < suspends_at - timedelta(seconds=30): # 30s buffer to try and stave off timing issues
227
+ if auto_suspend:
228
+ engine["suspends_at"] = cur_time + timedelta(minutes=auto_suspend)
229
+
230
+ self._maybe_update_engine(engine)
231
+ return engine["name"]
232
+
233
+ else:
234
+ self._active_engine = None
235
+
236
+ def _set_active_engine(self, engine: EngineState|None):
237
+ self._active_engine = self._maybe_update_engine({**engine}) if engine else None
238
+
239
+ def _maybe_update_engine(self, engine: EngineState):
240
+ auto_suspend = engine.get("auto_suspend")
241
+ expected_auto_suspend = self.config.get_default_auto_suspend_mins()
242
+ if auto_suspend != expected_auto_suspend and expected_auto_suspend is not None:
243
+ with debugging.span("sync_engine_suspend"):
244
+ try:
245
+ self._exec(f"call {self.get_app_name()}.api.alter_engine_auto_suspend_mins(?, ?);", [engine["name"], expected_auto_suspend])
246
+ engine["auto_suspend"] = expected_auto_suspend
247
+ except Exception as err:
248
+ debugging.warn(Warning(f"Failed to update engine suspend time. Caused by: {err}"))
249
+
250
+ return engine
251
+
252
+ #--------------------------------------------------
253
+ # Transactions
254
+ #--------------------------------------------------
255
+ @abstractmethod
256
+ def get_transaction(self, transaction_id) -> dict|None:
257
+ pass
258
+
259
+ @abstractmethod
260
+ def list_transactions(self, *, limit:int, only_active=False, **kwargs) -> List[dict]:
261
+ pass
262
+
263
+ @abstractmethod
264
+ def cancel_transaction(self, transaction_id) -> dict|None:
265
+ pass
266
+
267
+ @abstractmethod
268
+ def cancel_pending_transactions(self):
269
+ pass
270
+
271
+ @abstractmethod
272
+ def get_transaction_events(self, transaction_id:str, continuation_token:str) -> dict:
273
+ pass
274
+
275
+ #--------------------------------------------------
276
+ # Graphs
277
+ #--------------------------------------------------
278
+
279
+ @abstractmethod
280
+ def list_graphs(self) -> List[AvailableModel]:
281
+ pass
282
+
283
+ @abstractmethod
284
+ def get_graph(self, name:str) -> dict|None:
285
+ pass
286
+
287
+ @abstractmethod
288
+ def create_graph(self, name: str) -> dict|None:
289
+ pass
290
+
291
+ @abstractmethod
292
+ def delete_graph(self, name: str) -> dict|None:
293
+ pass
294
+
295
+ @abstractmethod
296
+ def clone_graph(self, target_name: str, source_name: str, nowait_durable: bool = True) -> dict|None:
297
+ pass
298
+
299
+ #--------------------------------------------------
300
+ # Databases
301
+ #--------------------------------------------------
302
+
303
+ @abstractmethod
304
+ def get_database(self, database: str) -> dict | None:
305
+ pass
306
+
307
+ @abstractmethod
308
+ def get_installed_packages(self, database: str) -> Dict | None:
309
+ pass
310
+
311
+ #--------------------------------------------------
312
+ # Models
313
+ #--------------------------------------------------
314
+
315
+ @abstractmethod
316
+ def list_models(self, database: str, engine: str) -> list | None:
317
+ pass
318
+
319
+ @abstractmethod
320
+ def create_models(self, database: str, engine: str, models:List[Tuple[str, str]]) -> List[Any]:
321
+ pass
322
+
323
+ @abstractmethod
324
+ def delete_model(self, database: str, engine: str, name: str) -> dict|None:
325
+ pass
326
+
327
+ @abstractmethod
328
+ def create_models_code(self, models:List[Tuple[str, str]]) -> str:
329
+ pass
330
+
331
+ #--------------------------------------------------
332
+ # Exports
333
+ #--------------------------------------------------
334
+
335
+ @abstractmethod
336
+ def list_exports(self, database: str, engine: str) -> List:
337
+ pass
338
+
339
+ @abstractmethod
340
+ def create_export(self, params: ExportParams):
341
+ pass
342
+
343
+ @abstractmethod
344
+ def create_export_table(self, database: str, engine: str, table: str, relation: str, columns: Dict[str, str], code: str, refresh: str|None=None):
345
+ pass
346
+
347
+ @abstractmethod
348
+ def delete_export(self, database: str, engine: str, name: str):
349
+ pass
350
+
351
+ #--------------------------------------------------
352
+ # Imports
353
+ #--------------------------------------------------
354
+
355
+ @abstractmethod
356
+ def list_imports(self, id:str|None=None, name:str|None=None, model:str|None=None, status:str|None=None, creator:str|None=None) -> list[Import]:
357
+ pass
358
+
359
+ @abstractmethod
360
+ def poll_imports(self, sources:List[str], model:str):
361
+ pass
362
+
363
+ @abstractmethod
364
+ def get_import_stream(self, name:str|None, model:str|None) -> List|None:
365
+ pass
366
+
367
+ @abstractmethod
368
+ def create_import_stream(self, source: ImportSource, model: str, rate: int|None = None, options: dict|None = None):
369
+ pass
370
+
371
+ @abstractmethod
372
+ def change_stream_status(self, stream_id: str, model: str, suspend: bool):
373
+ pass
374
+
375
+ @abstractmethod
376
+ def set_imports_engine_size(self, size: str):
377
+ pass
378
+
379
+ @abstractmethod
380
+ def change_imports_status(self, suspend: bool):
381
+ pass
382
+
383
+ @abstractmethod
384
+ def get_imports_status(self) -> ImportsStatus|None:
385
+ pass
386
+
387
+ @abstractmethod
388
+ def create_import_snapshot(self, source: ImportSource, model: str, options: dict|None):
389
+ pass
390
+
391
+ @abstractmethod
392
+ def delete_import(self, import_name: str, model: str, force = False):
393
+ pass
394
+
395
+ #--------------------------------------------------
396
+ # Exec
397
+ #--------------------------------------------------
398
+
399
+ @abstractmethod
400
+ def _exec(self, code:str, params:List[Any]|Any|None = None, raw=False, help=True) -> Any:
401
+ pass
402
+
403
+ @abstractmethod
404
+ def exec_lqp(self, database: str, engine: str | None, raw_code: bytes, readonly: bool = True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, query_timeout_mins: int | None = None) -> Any: # @FIXME: Better type annotation
405
+ pass
406
+
407
+ @abstractmethod
408
+ def exec_raw(self, database: str, engine: str | None, raw_code: str, readonly: bool = True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, query_timeout_mins: Optional[int]=None) -> Any: # @FIXME: Better type annotation
409
+ pass
410
+
411
+ @abstractmethod
412
+ def exec_format(self, database: str, engine: str, raw_code: str, cols:List[str], format:str, inputs: Dict | None = None, readonly: bool = True, nowait_durable=False, skip_invalid_data=False, headers: Dict | None = None, query_timeout_mins: Optional[int]=None) -> Any: # @FIXME: Better type annotation
413
+ pass
414
+
415
+ @abstractmethod
416
+ def format_results(self, results, task:m.Task|None=None) -> Tuple[DataFrame, List[Any]]:
417
+ pass
418
+
419
+ #--------------------------------------------------
420
+ # Types
421
+ #--------------------------------------------------
422
+
423
+ @abstractmethod
424
+ def to_model_type(self, model:dsl.Graph, name:str, source:str) -> dsl.Type:
425
+ pass
426
+
427
+ class ProviderBase(ABC):
428
+
429
+ resources: ResourcesBase
430
+
431
+ def list_engines(self, state: str | None = None):
432
+ return self.resources.list_engines(state)
433
+
434
+ def create_engine(self, name:str, size:str|None=None, auto_suspend_mins:int|None=None):
435
+ return self.resources.create_engine(name, size, auto_suspend_mins)
436
+
437
+ def delete_engine(self, name:str):
438
+ return self.resources.delete_engine(name)
439
+
440
+ def get_transaction(self, transaction_id:str):
441
+ return self.resources.get_transaction(transaction_id)
442
+
443
+ def list_transactions(self, *, limit:int, only_active=False, **kwargs):
444
+ return self.resources.list_transactions(limit=limit, only_active=only_active, **kwargs)
445
+
446
+ def cancel_transaction(self, transaction_id:str):
447
+ return self.resources.cancel_transaction(transaction_id)
448
+
449
+ def create_model(self, name:str):
450
+ return self.resources.create_graph(name)
451
+
452
+ def clone_model(self, target:str, source:str):
453
+ return self.resources.clone_graph(target, source)
454
+
455
+ def delete_model(self, name:str):
456
+ return self.resources.delete_graph(name)
457
+
458
+ def list_models(self):
459
+ return self.resources.list_graphs()
460
+
461
+ def cancel_pending_transactions(self):
462
+ self.resources.cancel_pending_transactions()
463
+
464
+ #--------------------------------------------------
465
+ # Client
466
+ #--------------------------------------------------
467
+
468
+ class Client():
469
+ def __init__(
470
+ self,
471
+ resources: ResourcesBase,
472
+ compiler: Compiler,
473
+ database: str,
474
+ config: Config,
475
+ dry_run=False,
476
+ isolated=True,
477
+ keep_model=False,
478
+ nowait_durable=True,
479
+ ):
480
+ self.dry_run = dry_run
481
+ self._source_database = database
482
+ self.use_graph_index = config.get("use_graph_index", USE_GRAPH_INDEX)
483
+ if config.get("platform", "") == "azure":
484
+ self.use_graph_index = False
485
+ if self.use_graph_index:
486
+ self._database = database
487
+ else:
488
+ self._database = database[:30] + "_" + config.get_hash() if isolated else database
489
+ self._config = config
490
+ self.compiler = compiler
491
+ self._install_batch = InstallBatch()
492
+ self.resources = resources
493
+ self.keep_model = keep_model
494
+ self.isolated = isolated
495
+ self.batch_span: debugging.Span|None = None
496
+ self.last_database_version:int|None = None
497
+
498
+ if not dry_run:
499
+ if not self.use_graph_index:
500
+ self.create_database(isolated=isolated)
501
+
502
+ #--------------------------------------------------
503
+ # Database management
504
+ #--------------------------------------------------
505
+
506
+ def create_database(self, isolated=True, nowait_durable=True, headers: Dict | None = None):
507
+ if self.last_database_version:
508
+ return
509
+
510
+ self.last_database_version = 1
511
+ start = time.perf_counter()
512
+ with debugging.span("create_database", source=self._source_database, target=self._database):
513
+ database_exists = self.resources.get_graph(self._source_database)
514
+ if not database_exists:
515
+ self.resources.create_graph(self._source_database)
516
+ else:
517
+ # ensure the packages in the source databases are up to date; this is not
518
+ # necessary if the source_database is being created now, because it will be
519
+ # by definition up to date.
520
+ self._manage_packages()
521
+
522
+ if isolated:
523
+ # if the database was just created now, exec empty txn on source_db to
524
+ # ensure it can be cloned and that it is upgraded by a potential new engine
525
+ if not database_exists:
526
+ temp = self._database
527
+ self._database = self._source_database
528
+ self.exec_raw("", readonly=False, internal=True, nowait_durable=True, abort_on_error=False)
529
+ self._database = temp
530
+ # now clone the source db into the database
531
+ self.resources.clone_graph(self._database, self._source_database, nowait_durable=nowait_durable)
532
+ if not self.keep_model:
533
+ atexit.register(self.delete_database)
534
+ debugging.time("create_database", time.perf_counter() - start)
535
+
536
+ def delete_database(self):
537
+ if not self.dry_run:
538
+ self.resources.delete_graph(self._database)
539
+
540
+ def _manage_packages(self):
541
+ database_name = self._database
542
+ try:
543
+ # without graph_index we can manage the source database because we will clone it
544
+ # later, but with graph index it was already cloned, so we manage packages in
545
+ # the actual database
546
+ if not self.use_graph_index:
547
+ self._database = self._source_database
548
+
549
+ platform = self.resources.platform or "snowflake"
550
+ app_name = self.resources.get_app_name()
551
+ engine_name = self.resources.get_default_engine_name()
552
+
553
+ enable_full_package_manager = self._config.get("use_package_manager", USE_PACKAGE_MANAGER) or self._config.get("compiler.use_monotype_operators", False)
554
+ # Query the currently installed packages in the database from the erp metadata
555
+ # Only query the engine for the current state of the registry and packages in
556
+ # the database if erp metadata is not available
557
+ installed_packages = self.resources.get_installed_packages(database_name)
558
+ if enable_full_package_manager:
559
+
560
+ if installed_packages:
561
+ update_registry, update_project = dependencies.check_package_manager(
562
+ installed_packages, platform, app_name, engine_name, database_name,
563
+ )
564
+ else:
565
+ # fallback to querying the engine as no metadata was yet stored in the
566
+ # erp metadata for that database
567
+ _, raw = self._timed_query(
568
+ "query_package_manager",
569
+ dependencies.generate_query_package_manager(),
570
+ abort_on_error=False,
571
+ )
572
+ update_registry, update_project = dependencies.check_package_manager_fallback(
573
+ raw, platform, app_name, engine_name, database_name,
574
+ )
575
+
576
+
577
+ # it may be necessary to update (refresh) the registry
578
+ if update_registry:
579
+ self._timed_query(
580
+ "update_registry",
581
+ dependencies.generate_update_registry(),
582
+ readonly=False,
583
+ abort_on_error=False,
584
+ )
585
+
586
+ # it may be necessary to update the packages
587
+ if update_project:
588
+ self._timed_query(
589
+ "update_packages",
590
+ dependencies.generate_update_packages(),
591
+ readonly=False,
592
+ abort_on_error=False,
593
+ )
594
+ else:
595
+ if installed_packages:
596
+ dependencies.check_static_dependencies(
597
+ installed_packages, platform, app_name, engine_name, database_name,
598
+ )
599
+ else:
600
+ # fallback to querying the engine as no metadata was yet stored in the
601
+ # erp metadata for that database
602
+ _, raw = self._timed_query(
603
+ "query_version_check",
604
+ dependencies.generate_query_version_check(),
605
+ abort_on_error=False,
606
+ )
607
+ dependencies.check_static_dependencies_fallback(
608
+ raw, platform, app_name, engine_name, database_name, warn_on_packages=True,
609
+ )
610
+
611
+ finally:
612
+ self._database = database_name
613
+
614
+ def _timed_query(self, span_name:str, code: str, readonly=True, abort_on_error=True):
615
+ with debugging.span(span_name, model=self._database) as end_span:
616
+ start = time.perf_counter()
617
+ res, raw = self._query(code, None, end_span, readonly=readonly, abort_on_error=abort_on_error)
618
+ debugging.time(span_name, time.perf_counter() - start, code=code)
619
+ return res, raw
620
+
621
+ #--------------------------------------------------
622
+ # Engine
623
+ #--------------------------------------------------
624
+
625
+ def get_engine_name(self, name:str|None=None) -> str:
626
+ return str(name or self.resources.get_default_engine_name())
627
+
628
+ #--------------------------------------------------
629
+ # Error Handling
630
+ #--------------------------------------------------
631
+
632
+ def report_errors(self, problems: List[Dict[str, Any]], abort_on_error=True, task=None):
633
+ from .. import errors
634
+ all_errors = []
635
+ undefineds = []
636
+ pyrel_errors = defaultdict(list)
637
+ pyrel_warnings = defaultdict(list)
638
+
639
+ for problem in problems:
640
+ message = problem.get("message", "")
641
+ report = problem.get("report", "")
642
+ path = problem.get("path", "")
643
+ source_task = self._install_batch.line_to_task(path, problem["start_line"]) or task
644
+ source = debugging.get_source(source_task) or debugging.SourceInfo()
645
+ severity = problem.get("severity", "warning")
646
+ code = problem.get("code")
647
+
648
+ if severity in ["error", "exception"]:
649
+ if code == "UNDEFINED_IDENTIFIER":
650
+ match = re.search(r'`(.+?)` is undefined', message)
651
+ if match:
652
+ undefineds.append((match.group(1), source))
653
+ else:
654
+ all_errors.append(errors.RelQueryError(problem, source))
655
+ elif "overflowed" in report:
656
+ all_errors.append(errors.NumericOverflow(problem, source))
657
+ elif code == "PYREL_ERROR":
658
+ pyrel_errors[problem["props"]["pyrel_id"]].append(problem)
659
+ elif abort_on_error:
660
+ all_errors.append(errors.RelQueryError(problem, source))
661
+ else:
662
+ if code == "ARITY_MISMATCH":
663
+ errors.ArityMismatch(problem, source)
664
+ elif code == "IC_VIOLATION":
665
+ all_errors.append(errors.IntegrityConstraintViolation(problem, source))
666
+ elif code == "PYREL_ERROR":
667
+ pyrel_warnings[problem["props"]["pyrel_id"]].append(problem)
668
+ elif "corerel" in message and not self._config.get("compiler.show_corerel_errors", True):
669
+ pass
670
+ else:
671
+ errors.RelQueryWarning(problem, source)
672
+
673
+ if abort_on_error and len(undefineds):
674
+ all_errors.append(errors.UninitializedPropertyException(undefineds))
675
+
676
+ if abort_on_error:
677
+ for pyrel_id, pyrel_problems in pyrel_errors.items():
678
+ all_errors.append(errors.ModelError(pyrel_problems))
679
+
680
+ for pyrel_id, pyrel_problems in pyrel_warnings.items():
681
+ errors.ModelWarning(pyrel_problems)
682
+
683
+
684
+ if len(all_errors) == 1:
685
+ raise all_errors[0]
686
+ elif len(all_errors) > 1:
687
+ raise errors.RAIExceptionSet(all_errors)
688
+
689
+ #--------------------------------------------------
690
+ # Raw
691
+ #--------------------------------------------------
692
+
693
+ def load_raw_file(self, path:str):
694
+ content = open(path).read()
695
+ code = self.compiler.compile(dsl.build.raw_task(content))
696
+ self._install_batch.set(path, code)
697
+
698
+ def exec_raw(self, code:str, readonly=True, raw_results=True, inputs: Dict | None = None, internal=False, nowait_durable=None, abort_on_error=True, headers: Dict | None = None, query_timeout_mins: Optional[int]=None) -> DataFrame|Any:
699
+ task = dsl.build.raw_task(code)
700
+ debugging.set_source(task)
701
+ return self.query(task, read_only=readonly, raw_results=raw_results, inputs=inputs, internal=internal, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error, query_timeout_mins=query_timeout_mins)
702
+
703
+ def exec_control(self, code:str, cb:Callable[[DataFrame]]|None=None):
704
+ self._install_batch.control_items.append((code, cb))
705
+
706
+ def install_raw(self, code:str, name:str|None="pyrel_batch_0", overwrite=False):
707
+ if not name:
708
+ name = "pyrel_batch_0"
709
+ self._ensure_span()
710
+ task = dsl.build.raw_task(code)
711
+ debugging.set_source(task)
712
+ out = self.compiler.compile(task)
713
+ if overwrite:
714
+ self._install_batch.set(name, out, task)
715
+ else:
716
+ self._install_batch.append(name, out, task)
717
+
718
+ #--------------------------------------------------
719
+ # Query
720
+ #--------------------------------------------------
721
+
722
+ def _query(self, code:str, task:m.Task|None, end_span, readonly=False, inputs: Dict | None = None, nowait_durable=None, headers: Dict | None = None, abort_on_error=True, query_timeout_mins: Optional[int]=None):
723
+ if nowait_durable is None:
724
+ nowait_durable = self.isolated
725
+
726
+ try:
727
+ results = self.resources.exec_raw(self._database, self.get_engine_name(), code, readonly=readonly, inputs=inputs, nowait_durable=nowait_durable, headers=headers, query_timeout_mins=query_timeout_mins)
728
+ dataframe, errors = self.resources.format_results(results, task)
729
+ end_span["results"] = dataframe
730
+ end_span["errors"] = errors
731
+ self.report_errors(errors, task=task, abort_on_error=abort_on_error)
732
+ return dataframe, results
733
+ except Exception as e:
734
+ if "engine is suspended" in f"{e}":
735
+ # we need to ensure the engine is running before we execute the query
736
+ engine_name = self.get_engine_name()
737
+ self.resources.resume_engine(engine_name, headers=headers)
738
+ # invoke _query again to retry the query
739
+ return self._query(code, task, end_span, readonly=readonly, inputs=inputs, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error, query_timeout_mins=query_timeout_mins)
740
+ else:
741
+ raise e
742
+
743
+
744
+ def _query_format(self, code:str, task:m.Task, end_span, format, readonly=False, skip_invalid_data=False, inputs: Dict | None = None, query_timeout_mins: Optional[int]=None):
745
+ cols = task.return_cols(allow_dups=False)
746
+ results, raw = self.resources.exec_format(self._database, self.get_engine_name(), code, cols, readonly=readonly, inputs=inputs, format=format, skip_invalid_data=skip_invalid_data, query_timeout_mins=query_timeout_mins)
747
+ errors = []
748
+ if raw:
749
+ dataframe, errors = self.resources.format_results(raw, task)
750
+ self.report_errors(errors, task=task, abort_on_error=True)
751
+ end_span["results"] = results
752
+ end_span["errors"] = errors
753
+ # return results if raw_results else dataframe
754
+ return results, raw
755
+
756
+ def query(self, task:m.Task, rentrant=False, read_only=False, raw_results=False, inputs: Dict | None = None, format="pandas", tag=None, nowait_durable=None, headers: Dict | None = None, internal=False, abort_on_error=True, skip_invalid_data = False, query_timeout_mins: Optional[int]=None) -> DataFrame|Any:
757
+ if not self.dry_run and self.use_graph_index:
758
+ self.create_database(isolated=self.isolated, headers=headers)
759
+
760
+ rules, control_items = self._install_batch_flush()
761
+
762
+ # force all queries to be write queries to preserve result caches
763
+ # per: https://github.com/RelationalAI/relationalai-python/pull/844#issuecomment-2486642508
764
+ if read_only is not True:
765
+ read_only = False
766
+
767
+ if read_only and rules:
768
+ raise Exception("Cannot run read-only queries with new rules")
769
+
770
+ with debugging.span("query", model=self._database, task=task, tag=tag, internal=internal, task_id=task.id, readonly=read_only) as end_span:
771
+ code = self.compiler.compile(task)
772
+
773
+ # Inject monotyped operatores prefix
774
+ use_monotype_operators = self._config.get("compiler.use_monotype_operators", False)
775
+ if use_monotype_operators:
776
+ code = f"""
777
+ // use monotyped operators
778
+ from ::std::monotype import +, -, *, /, <, <=, >, >=
779
+ {rules}
780
+
781
+ {code}
782
+ """
783
+ elif rules:
784
+ code = f"""
785
+ {rules}
786
+
787
+ {code}
788
+ """
789
+
790
+ source_map = build_source_map({f"query{task.id}": {task: (0, code.count("\n"))}})
791
+ debugging.event("source_map", type="query", code=code, source_map=source_map)
792
+ if self.dry_run:
793
+ return DataFrame()
794
+
795
+ start = time.perf_counter()
796
+ if format == "pandas":
797
+ results, raw = self._query(code, task, end_span, readonly=read_only, inputs=inputs, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error, query_timeout_mins=query_timeout_mins)
798
+ debugging.time("query", time.perf_counter() - start, DataFrame() if raw_results else results, internal=internal, source_map=source_map)
799
+ else:
800
+ results, raw = self._query_format(code, task, end_span, readonly=read_only, inputs=inputs, format=format, skip_invalid_data=skip_invalid_data, query_timeout_mins=query_timeout_mins)
801
+ debugging.time("query", time.perf_counter() - start, DataFrame(), source_map=source_map, alt_format_results=results)
802
+
803
+ self._install_batch.clear_dirty()
804
+ for (_, cb) in control_items:
805
+ if cb:
806
+ cb(raw)
807
+ if raw_results:
808
+ return raw
809
+ return results
810
+
811
+ def _ensure_span(self):
812
+ if not self.batch_span:
813
+ self.batch_span = debugging.span_start("rule_batch")
814
+
815
+ def _install_batch_flush(self, force=False):
816
+ install_code = ""
817
+ control_items = []
818
+
819
+ if not self._install_batch.is_dirty() and not force:
820
+ return install_code, control_items
821
+
822
+ if not self.dry_run:
823
+ with debugging.span("install_batch", model=self._database):
824
+ start = time.perf_counter()
825
+ rules = self._install_batch.flush(force=force)
826
+ source_map = self._get_source_map() # keep after flush, since flush builds task_map
827
+ control_items = self._install_batch.flush_control_items()
828
+ control_code = "\n\n".join([c[0] for c in control_items])
829
+ rule_code = self.resources.create_models_code(rules)
830
+ install_code = control_code + rule_code
831
+ debugging.time("install_batch", time.perf_counter() - start, code=install_code, source_map=source_map)
832
+
833
+ if self.batch_span and self.batch_span.end_timestamp:
834
+ raise Exception("This span has somehow already been ended?")
835
+ debugging.span_end(self.batch_span)
836
+ self.batch_span = None
837
+ return install_code, control_items
838
+
839
+ def _get_source_map(self):
840
+ return build_source_map(self._install_batch.task_map)
841
+
842
+ def get_install_models(self):
843
+ return self._install_batch.get_all_models()
844
+
845
+ def install(self, name, task:m.Task):
846
+ self._ensure_span()
847
+ with debugging.span("rule", model=self._database, task=task, name=name):
848
+ code = self.compiler.compile(task)
849
+ self._install_batch.append("pyrel_batch_0", code, task=task)
850
+
851
+ def export_udf(self, name, inputs:List[Tuple[str, m.Var, Any]], outputs, task:m.Task, engine:str|None, skip_invalid_data:bool=False):
852
+ if engine is None:
853
+ engine = ""
854
+
855
+ self.create_database(isolated=self.isolated)
856
+
857
+ installs, _ = self._install_batch_flush(force=True)
858
+
859
+ cols = task.return_cols()
860
+ if outputs is not None and len(outputs) != len(cols):
861
+ raise Exception(f"Expected {len(outputs)} outputs, got {len(cols)}")
862
+ rel_code = self.compiler.compile(task)
863
+ emitted_inputs = [(name, self.compiler.emitter.emit(var), type) for (name, var, type) in inputs]
864
+ if outputs is not None:
865
+ outputs = list(zip(cols, outputs))
866
+ else:
867
+ outputs = cols
868
+ if not engine:
869
+ engine = self.get_engine_name()
870
+ proc_database = database_name_from_sproc_name(name)
871
+ params = ExportParams(
872
+ root_database=self._source_database,
873
+ model_database=self._database,
874
+ proc_database=proc_database,
875
+ engine=engine,
876
+ func_name=name,
877
+ inputs=emitted_inputs,
878
+ out_fields=outputs,
879
+ code=rel_code,
880
+ install_code=installs,
881
+ dry_run=self.dry_run,
882
+ skip_invalid_data=skip_invalid_data,
883
+ sources=[]
884
+ )
885
+ self.resources.create_export(params)
886
+
887
+ def export_table(self, relation, name, cols, task:m.Task, engine:str|None, refresh:str|None):
888
+ if engine is None:
889
+ engine = ""
890
+ if refresh is None:
891
+ refresh = ""
892
+
893
+ code = self.compiler.compile(task)
894
+ if not engine:
895
+ engine = self.get_engine_name()
896
+ if not self.dry_run:
897
+ self.resources.create_export_table(self._database, engine, name, relation, cols, code, refresh=refresh)
898
+
899
+
900
+ def build_source_map(tasks: Dict[str, Dict[m.Task, Tuple[int, int]]]):
901
+ out: dict[str, list[SourceMapEntry]] = {} # file name -> (rel start, rel end) -> (python start, python end)
902
+ for name, items in tasks.items():
903
+ out[name] = []
904
+ for task, (_, end) in items.items():
905
+ source = debugging.get_source(task)
906
+ if source:
907
+ out[name].append({
908
+ "rel_end_line": end,
909
+ "task_id": task.id,
910
+ "py_line": source.line,
911
+ })
912
+ return out