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

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