relationalai 0.13.0.dev0__py3-none-any.whl → 0.13.2__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 (838) 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 +947 -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 +586 -0
  14. relationalai/clients/profile_polling.py +73 -0
  15. relationalai/clients/resources/__init__.py +8 -0
  16. relationalai/clients/resources/azure/azure.py +502 -0
  17. relationalai/clients/resources/snowflake/__init__.py +20 -0
  18. relationalai/clients/resources/snowflake/cli_resources.py +98 -0
  19. relationalai/clients/resources/snowflake/direct_access_resources.py +734 -0
  20. relationalai/clients/resources/snowflake/engine_service.py +381 -0
  21. relationalai/clients/resources/snowflake/engine_state_handlers.py +315 -0
  22. relationalai/clients/resources/snowflake/error_handlers.py +240 -0
  23. relationalai/clients/resources/snowflake/export_procedure.py.jinja +249 -0
  24. relationalai/clients/resources/snowflake/resources_factory.py +99 -0
  25. relationalai/clients/resources/snowflake/snowflake.py +3185 -0
  26. relationalai/clients/resources/snowflake/use_index_poller.py +1019 -0
  27. relationalai/clients/resources/snowflake/use_index_resources.py +188 -0
  28. relationalai/clients/resources/snowflake/util.py +387 -0
  29. relationalai/clients/result_helpers.py +420 -0
  30. relationalai/clients/types.py +118 -0
  31. relationalai/clients/util.py +356 -0
  32. relationalai/debugging.py +389 -0
  33. relationalai/dsl.py +1749 -0
  34. relationalai/early_access/builder/__init__.py +30 -0
  35. relationalai/early_access/builder/builder/__init__.py +35 -0
  36. relationalai/early_access/builder/snowflake/__init__.py +12 -0
  37. relationalai/early_access/builder/std/__init__.py +25 -0
  38. relationalai/early_access/builder/std/decimals/__init__.py +12 -0
  39. relationalai/early_access/builder/std/integers/__init__.py +12 -0
  40. relationalai/early_access/builder/std/math/__init__.py +12 -0
  41. relationalai/early_access/builder/std/strings/__init__.py +14 -0
  42. relationalai/early_access/devtools/__init__.py +12 -0
  43. relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
  44. relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
  45. relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
  46. relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
  47. relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
  48. relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
  49. relationalai/early_access/dsl/bindings/common.py +402 -0
  50. relationalai/early_access/dsl/bindings/csv.py +170 -0
  51. relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
  52. relationalai/early_access/dsl/bindings/snowflake.py +64 -0
  53. relationalai/early_access/dsl/codegen/binder.py +411 -0
  54. relationalai/early_access/dsl/codegen/common.py +79 -0
  55. relationalai/early_access/dsl/codegen/helpers.py +23 -0
  56. relationalai/early_access/dsl/codegen/relations.py +700 -0
  57. relationalai/early_access/dsl/codegen/weaver.py +417 -0
  58. relationalai/early_access/dsl/core/builders/__init__.py +47 -0
  59. relationalai/early_access/dsl/core/builders/logic.py +19 -0
  60. relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
  61. relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
  62. relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
  63. relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
  64. relationalai/early_access/dsl/core/context.py +13 -0
  65. relationalai/early_access/dsl/core/cset.py +132 -0
  66. relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
  67. relationalai/early_access/dsl/core/exprs/relational.py +18 -0
  68. relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
  69. relationalai/early_access/dsl/core/instances.py +44 -0
  70. relationalai/early_access/dsl/core/logic/__init__.py +193 -0
  71. relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
  72. relationalai/early_access/dsl/core/logic/exists.py +223 -0
  73. relationalai/early_access/dsl/core/logic/helper.py +163 -0
  74. relationalai/early_access/dsl/core/namespaces.py +32 -0
  75. relationalai/early_access/dsl/core/relations.py +276 -0
  76. relationalai/early_access/dsl/core/rules.py +112 -0
  77. relationalai/early_access/dsl/core/std/__init__.py +45 -0
  78. relationalai/early_access/dsl/core/temporal/recall.py +6 -0
  79. relationalai/early_access/dsl/core/types/__init__.py +270 -0
  80. relationalai/early_access/dsl/core/types/concepts.py +128 -0
  81. relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
  82. relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
  83. relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
  84. relationalai/early_access/dsl/core/types/standard.py +92 -0
  85. relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
  86. relationalai/early_access/dsl/core/types/variables.py +203 -0
  87. relationalai/early_access/dsl/ir/compiler.py +318 -0
  88. relationalai/early_access/dsl/ir/executor.py +260 -0
  89. relationalai/early_access/dsl/ontologies/constraints.py +88 -0
  90. relationalai/early_access/dsl/ontologies/export.py +30 -0
  91. relationalai/early_access/dsl/ontologies/models.py +453 -0
  92. relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
  93. relationalai/early_access/dsl/ontologies/readings.py +60 -0
  94. relationalai/early_access/dsl/ontologies/relationships.py +322 -0
  95. relationalai/early_access/dsl/ontologies/roles.py +87 -0
  96. relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
  97. relationalai/early_access/dsl/orm/constraints.py +438 -0
  98. relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
  99. relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
  100. relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
  101. relationalai/early_access/dsl/orm/measures/measures.py +299 -0
  102. relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
  103. relationalai/early_access/dsl/orm/models.py +256 -0
  104. relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
  105. relationalai/early_access/dsl/orm/printer.py +469 -0
  106. relationalai/early_access/dsl/orm/reasoners.py +480 -0
  107. relationalai/early_access/dsl/orm/relations.py +19 -0
  108. relationalai/early_access/dsl/orm/relationships.py +251 -0
  109. relationalai/early_access/dsl/orm/types.py +42 -0
  110. relationalai/early_access/dsl/orm/utils.py +79 -0
  111. relationalai/early_access/dsl/orm/verb.py +204 -0
  112. relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
  113. relationalai/early_access/dsl/relations.py +170 -0
  114. relationalai/early_access/dsl/rulesets.py +69 -0
  115. relationalai/early_access/dsl/schemas/__init__.py +450 -0
  116. relationalai/early_access/dsl/schemas/builder.py +48 -0
  117. relationalai/early_access/dsl/schemas/comp_names.py +51 -0
  118. relationalai/early_access/dsl/schemas/components.py +203 -0
  119. relationalai/early_access/dsl/schemas/contexts.py +156 -0
  120. relationalai/early_access/dsl/schemas/exprs.py +89 -0
  121. relationalai/early_access/dsl/schemas/fragments.py +464 -0
  122. relationalai/early_access/dsl/serialization.py +79 -0
  123. relationalai/early_access/dsl/serialize/exporter.py +163 -0
  124. relationalai/early_access/dsl/snow/api.py +105 -0
  125. relationalai/early_access/dsl/snow/common.py +76 -0
  126. relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
  127. relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
  128. relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
  129. relationalai/early_access/dsl/types/__init__.py +40 -0
  130. relationalai/early_access/dsl/types/concepts.py +12 -0
  131. relationalai/early_access/dsl/types/entities.py +135 -0
  132. relationalai/early_access/dsl/types/values.py +17 -0
  133. relationalai/early_access/dsl/utils.py +102 -0
  134. relationalai/early_access/graphs/__init__.py +13 -0
  135. relationalai/early_access/lqp/__init__.py +12 -0
  136. relationalai/early_access/lqp/compiler/__init__.py +12 -0
  137. relationalai/early_access/lqp/constructors/__init__.py +18 -0
  138. relationalai/early_access/lqp/executor/__init__.py +12 -0
  139. relationalai/early_access/lqp/ir/__init__.py +12 -0
  140. relationalai/early_access/lqp/passes/__init__.py +12 -0
  141. relationalai/early_access/lqp/pragmas/__init__.py +12 -0
  142. relationalai/early_access/lqp/primitives/__init__.py +12 -0
  143. relationalai/early_access/lqp/types/__init__.py +12 -0
  144. relationalai/early_access/lqp/utils/__init__.py +12 -0
  145. relationalai/early_access/lqp/validators/__init__.py +12 -0
  146. relationalai/early_access/metamodel/__init__.py +58 -0
  147. relationalai/early_access/metamodel/builtins/__init__.py +12 -0
  148. relationalai/early_access/metamodel/compiler/__init__.py +12 -0
  149. relationalai/early_access/metamodel/dependency/__init__.py +12 -0
  150. relationalai/early_access/metamodel/factory/__init__.py +17 -0
  151. relationalai/early_access/metamodel/helpers/__init__.py +12 -0
  152. relationalai/early_access/metamodel/ir/__init__.py +14 -0
  153. relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
  154. relationalai/early_access/metamodel/typer/__init__.py +3 -0
  155. relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
  156. relationalai/early_access/metamodel/types/__init__.py +15 -0
  157. relationalai/early_access/metamodel/util/__init__.py +15 -0
  158. relationalai/early_access/metamodel/visitor/__init__.py +12 -0
  159. relationalai/early_access/rel/__init__.py +12 -0
  160. relationalai/early_access/rel/executor/__init__.py +12 -0
  161. relationalai/early_access/rel/rel_utils/__init__.py +12 -0
  162. relationalai/early_access/rel/rewrite/__init__.py +7 -0
  163. relationalai/early_access/solvers/__init__.py +19 -0
  164. relationalai/early_access/sql/__init__.py +11 -0
  165. relationalai/early_access/sql/executor/__init__.py +3 -0
  166. relationalai/early_access/sql/rewrite/__init__.py +3 -0
  167. relationalai/early_access/tests/logging/__init__.py +12 -0
  168. relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
  169. relationalai/early_access/tests/utils/__init__.py +12 -0
  170. relationalai/environments/__init__.py +35 -0
  171. relationalai/environments/base.py +381 -0
  172. relationalai/environments/colab.py +14 -0
  173. relationalai/environments/generic.py +71 -0
  174. relationalai/environments/ipython.py +68 -0
  175. relationalai/environments/jupyter.py +9 -0
  176. relationalai/environments/snowbook.py +169 -0
  177. relationalai/errors.py +2496 -0
  178. relationalai/experimental/SF.py +38 -0
  179. relationalai/experimental/inspect.py +47 -0
  180. relationalai/experimental/pathfinder/__init__.py +158 -0
  181. relationalai/experimental/pathfinder/api.py +160 -0
  182. relationalai/experimental/pathfinder/automaton.py +584 -0
  183. relationalai/experimental/pathfinder/bridge.py +226 -0
  184. relationalai/experimental/pathfinder/compiler.py +416 -0
  185. relationalai/experimental/pathfinder/datalog.py +214 -0
  186. relationalai/experimental/pathfinder/diagnostics.py +56 -0
  187. relationalai/experimental/pathfinder/filter.py +236 -0
  188. relationalai/experimental/pathfinder/glushkov.py +439 -0
  189. relationalai/experimental/pathfinder/options.py +265 -0
  190. relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +1951 -0
  191. relationalai/experimental/pathfinder/rpq.py +344 -0
  192. relationalai/experimental/pathfinder/transition.py +200 -0
  193. relationalai/experimental/pathfinder/utils.py +26 -0
  194. relationalai/experimental/paths/README.md +107 -0
  195. relationalai/experimental/paths/api.py +143 -0
  196. relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
  197. relationalai/experimental/paths/code_organization.md +2 -0
  198. relationalai/experimental/paths/examples/Movies.ipynb +16328 -0
  199. relationalai/experimental/paths/examples/basic_example.py +40 -0
  200. relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
  201. relationalai/experimental/paths/examples/movie_example.py +77 -0
  202. relationalai/experimental/paths/examples/movies_data/actedin.csv +193 -0
  203. relationalai/experimental/paths/examples/movies_data/directed.csv +45 -0
  204. relationalai/experimental/paths/examples/movies_data/follows.csv +7 -0
  205. relationalai/experimental/paths/examples/movies_data/movies.csv +39 -0
  206. relationalai/experimental/paths/examples/movies_data/person.csv +134 -0
  207. relationalai/experimental/paths/examples/movies_data/produced.csv +16 -0
  208. relationalai/experimental/paths/examples/movies_data/ratings.csv +10 -0
  209. relationalai/experimental/paths/examples/movies_data/wrote.csv +11 -0
  210. relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
  211. relationalai/experimental/paths/examples/paths_example.py +116 -0
  212. relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
  213. relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
  214. relationalai/experimental/paths/graph.py +185 -0
  215. relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
  216. relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
  217. relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
  218. relationalai/experimental/paths/path_algorithms/single.py +59 -0
  219. relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
  220. relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
  221. relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
  222. relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
  223. relationalai/experimental/paths/path_algorithms/usp.py +150 -0
  224. relationalai/experimental/paths/product_graph.py +93 -0
  225. relationalai/experimental/paths/rpq/automaton.py +584 -0
  226. relationalai/experimental/paths/rpq/diagnostics.py +56 -0
  227. relationalai/experimental/paths/rpq/rpq.py +378 -0
  228. relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
  229. relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
  230. relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
  231. relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
  232. relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
  233. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
  234. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
  235. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
  236. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
  237. relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
  238. relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
  239. relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
  240. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
  241. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
  242. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
  243. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
  244. relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
  245. relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
  246. relationalai/experimental/paths/tree_agg.py +168 -0
  247. relationalai/experimental/paths/utilities/iterators.py +27 -0
  248. relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
  249. relationalai/experimental/solvers.py +1087 -0
  250. relationalai/loaders/csv.py +195 -0
  251. relationalai/loaders/loader.py +177 -0
  252. relationalai/loaders/types.py +23 -0
  253. relationalai/rel_emitter.py +373 -0
  254. relationalai/rel_utils.py +185 -0
  255. relationalai/semantics/__init__.py +22 -146
  256. relationalai/semantics/designs/query_builder/identify_by.md +106 -0
  257. relationalai/semantics/devtools/benchmark_lqp.py +535 -0
  258. relationalai/semantics/devtools/compilation_manager.py +294 -0
  259. relationalai/semantics/devtools/extract_lqp.py +110 -0
  260. relationalai/semantics/internal/internal.py +3785 -0
  261. relationalai/semantics/internal/snowflake.py +325 -0
  262. relationalai/semantics/lqp/README.md +34 -0
  263. relationalai/semantics/lqp/builtins.py +16 -0
  264. relationalai/semantics/lqp/compiler.py +22 -0
  265. relationalai/semantics/lqp/constructors.py +68 -0
  266. relationalai/semantics/lqp/executor.py +469 -0
  267. relationalai/semantics/lqp/intrinsics.py +24 -0
  268. relationalai/semantics/lqp/model2lqp.py +877 -0
  269. relationalai/semantics/lqp/passes.py +680 -0
  270. relationalai/semantics/lqp/primitives.py +252 -0
  271. relationalai/semantics/lqp/result_helpers.py +202 -0
  272. relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
  273. relationalai/semantics/lqp/rewrite/cdc.py +216 -0
  274. relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
  275. relationalai/semantics/lqp/rewrite/extract_keys.py +512 -0
  276. relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
  277. relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
  278. relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
  279. relationalai/semantics/lqp/rewrite/splinter.py +76 -0
  280. relationalai/semantics/lqp/types.py +101 -0
  281. relationalai/semantics/lqp/utils.py +160 -0
  282. relationalai/semantics/lqp/validators.py +57 -0
  283. relationalai/semantics/metamodel/__init__.py +40 -6
  284. relationalai/semantics/metamodel/builtins.py +771 -205
  285. relationalai/semantics/metamodel/compiler.py +133 -0
  286. relationalai/semantics/metamodel/dependency.py +862 -0
  287. relationalai/semantics/metamodel/executor.py +61 -0
  288. relationalai/semantics/metamodel/factory.py +287 -0
  289. relationalai/semantics/metamodel/helpers.py +361 -0
  290. relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
  291. relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
  292. relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
  293. relationalai/semantics/metamodel/rewrite/flatten.py +554 -0
  294. relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
  295. relationalai/semantics/metamodel/typer/checker.py +353 -0
  296. relationalai/semantics/metamodel/typer/typer.py +1399 -0
  297. relationalai/semantics/metamodel/util.py +506 -0
  298. relationalai/semantics/reasoners/__init__.py +10 -0
  299. relationalai/semantics/reasoners/graph/README.md +620 -0
  300. relationalai/semantics/reasoners/graph/__init__.py +37 -0
  301. relationalai/semantics/reasoners/graph/core.py +9019 -0
  302. relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +797 -0
  303. relationalai/semantics/reasoners/graph/tests/README.md +21 -0
  304. relationalai/semantics/reasoners/optimization/__init__.py +68 -0
  305. relationalai/semantics/reasoners/optimization/common.py +88 -0
  306. relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
  307. relationalai/semantics/reasoners/optimization/solvers_pb.py +1414 -0
  308. relationalai/semantics/rel/builtins.py +40 -0
  309. relationalai/semantics/rel/compiler.py +989 -0
  310. relationalai/semantics/rel/executor.py +362 -0
  311. relationalai/semantics/rel/rel.py +482 -0
  312. relationalai/semantics/rel/rel_utils.py +276 -0
  313. relationalai/semantics/snowflake/__init__.py +3 -0
  314. relationalai/semantics/sql/compiler.py +2503 -0
  315. relationalai/semantics/sql/executor/duck_db.py +52 -0
  316. relationalai/semantics/sql/executor/result_helpers.py +64 -0
  317. relationalai/semantics/sql/executor/snowflake.py +149 -0
  318. relationalai/semantics/sql/rewrite/denormalize.py +222 -0
  319. relationalai/semantics/sql/rewrite/double_negation.py +49 -0
  320. relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
  321. relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
  322. relationalai/semantics/sql/sql.py +504 -0
  323. relationalai/semantics/std/__init__.py +40 -60
  324. relationalai/semantics/std/constraints.py +43 -37
  325. relationalai/semantics/std/datetime.py +135 -246
  326. relationalai/semantics/std/decimals.py +52 -45
  327. relationalai/semantics/std/floats.py +5 -13
  328. relationalai/semantics/std/integers.py +11 -26
  329. relationalai/semantics/std/math.py +112 -183
  330. relationalai/semantics/std/pragmas.py +11 -0
  331. relationalai/semantics/std/re.py +62 -80
  332. relationalai/semantics/std/std.py +14 -0
  333. relationalai/semantics/std/strings.py +60 -117
  334. relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
  335. relationalai/semantics/tests/test_snapshot_base.py +9 -0
  336. relationalai/semantics/tests/utils.py +46 -0
  337. relationalai/std/__init__.py +70 -0
  338. relationalai/tools/cli.py +2089 -0
  339. relationalai/tools/cli_controls.py +1826 -0
  340. relationalai/tools/cli_helpers.py +802 -0
  341. relationalai/tools/debugger.py +183 -289
  342. relationalai/tools/debugger_client.py +109 -0
  343. relationalai/tools/debugger_server.py +302 -0
  344. relationalai/tools/dev.py +685 -0
  345. relationalai/tools/notes +7 -0
  346. relationalai/tools/qb_debugger.py +425 -0
  347. relationalai/util/clean_up_databases.py +95 -0
  348. relationalai/util/format.py +106 -48
  349. relationalai/util/list_databases.py +9 -0
  350. relationalai/util/otel_configuration.py +26 -0
  351. relationalai/util/otel_handler.py +484 -0
  352. relationalai/util/snowflake_handler.py +88 -0
  353. relationalai/util/span_format_test.py +43 -0
  354. relationalai/util/span_tracker.py +207 -0
  355. relationalai/util/spans_file_handler.py +72 -0
  356. relationalai/util/tracing_handler.py +34 -0
  357. relationalai-0.13.2.dist-info/METADATA +74 -0
  358. relationalai-0.13.2.dist-info/RECORD +460 -0
  359. relationalai-0.13.2.dist-info/WHEEL +4 -0
  360. relationalai-0.13.2.dist-info/entry_points.txt +3 -0
  361. relationalai-0.13.2.dist-info/licenses/LICENSE +202 -0
  362. relationalai_test_util/__init__.py +4 -0
  363. relationalai_test_util/fixtures.py +233 -0
  364. relationalai_test_util/snapshot.py +252 -0
  365. relationalai_test_util/traceback.py +118 -0
  366. relationalai/config/__init__.py +0 -56
  367. relationalai/config/config.py +0 -289
  368. relationalai/config/config_fields.py +0 -86
  369. relationalai/config/connections/__init__.py +0 -46
  370. relationalai/config/connections/base.py +0 -23
  371. relationalai/config/connections/duckdb.py +0 -29
  372. relationalai/config/connections/snowflake.py +0 -243
  373. relationalai/config/external/__init__.py +0 -17
  374. relationalai/config/external/dbt_converter.py +0 -101
  375. relationalai/config/external/dbt_models.py +0 -93
  376. relationalai/config/external/snowflake_converter.py +0 -41
  377. relationalai/config/external/snowflake_models.py +0 -85
  378. relationalai/config/external/utils.py +0 -19
  379. relationalai/semantics/backends/lqp/annotations.py +0 -11
  380. relationalai/semantics/backends/sql/sql_compiler.py +0 -327
  381. relationalai/semantics/frontend/base.py +0 -1707
  382. relationalai/semantics/frontend/core.py +0 -179
  383. relationalai/semantics/frontend/front_compiler.py +0 -1313
  384. relationalai/semantics/frontend/pprint.py +0 -408
  385. relationalai/semantics/metamodel/metamodel.py +0 -437
  386. relationalai/semantics/metamodel/metamodel_analyzer.py +0 -519
  387. relationalai/semantics/metamodel/metamodel_compiler.py +0 -0
  388. relationalai/semantics/metamodel/pprint.py +0 -412
  389. relationalai/semantics/metamodel/rewriter.py +0 -266
  390. relationalai/semantics/metamodel/typer.py +0 -1378
  391. relationalai/semantics/std/aggregates.py +0 -149
  392. relationalai/semantics/std/common.py +0 -44
  393. relationalai/semantics/std/numbers.py +0 -86
  394. relationalai/shims/executor.py +0 -147
  395. relationalai/shims/helpers.py +0 -126
  396. relationalai/shims/hoister.py +0 -221
  397. relationalai/shims/mm2v0.py +0 -1290
  398. relationalai/tools/cli/__init__.py +0 -6
  399. relationalai/tools/cli/cli.py +0 -90
  400. relationalai/tools/cli/components/__init__.py +0 -5
  401. relationalai/tools/cli/components/progress_reader.py +0 -1524
  402. relationalai/tools/cli/components/utils.py +0 -58
  403. relationalai/tools/cli/config_template.py +0 -45
  404. relationalai/tools/cli/dev.py +0 -19
  405. relationalai/tools/typer_debugger.py +0 -93
  406. relationalai/util/dataclasses.py +0 -43
  407. relationalai/util/docutils.py +0 -40
  408. relationalai/util/error.py +0 -199
  409. relationalai/util/naming.py +0 -145
  410. relationalai/util/python.py +0 -35
  411. relationalai/util/runtime.py +0 -156
  412. relationalai/util/schema.py +0 -197
  413. relationalai/util/source.py +0 -185
  414. relationalai/util/structures.py +0 -163
  415. relationalai/util/tracing.py +0 -261
  416. relationalai-0.13.0.dev0.dist-info/METADATA +0 -46
  417. relationalai-0.13.0.dev0.dist-info/RECORD +0 -488
  418. relationalai-0.13.0.dev0.dist-info/WHEEL +0 -5
  419. relationalai-0.13.0.dev0.dist-info/entry_points.txt +0 -3
  420. relationalai-0.13.0.dev0.dist-info/top_level.txt +0 -2
  421. v0/relationalai/__init__.py +0 -216
  422. v0/relationalai/clients/__init__.py +0 -5
  423. v0/relationalai/clients/azure.py +0 -477
  424. v0/relationalai/clients/client.py +0 -912
  425. v0/relationalai/clients/config.py +0 -673
  426. v0/relationalai/clients/direct_access_client.py +0 -118
  427. v0/relationalai/clients/hash_util.py +0 -31
  428. v0/relationalai/clients/local.py +0 -571
  429. v0/relationalai/clients/profile_polling.py +0 -73
  430. v0/relationalai/clients/result_helpers.py +0 -420
  431. v0/relationalai/clients/snowflake.py +0 -3869
  432. v0/relationalai/clients/types.py +0 -113
  433. v0/relationalai/clients/use_index_poller.py +0 -980
  434. v0/relationalai/clients/util.py +0 -356
  435. v0/relationalai/debugging.py +0 -389
  436. v0/relationalai/dsl.py +0 -1749
  437. v0/relationalai/early_access/builder/__init__.py +0 -30
  438. v0/relationalai/early_access/builder/builder/__init__.py +0 -35
  439. v0/relationalai/early_access/builder/snowflake/__init__.py +0 -12
  440. v0/relationalai/early_access/builder/std/__init__.py +0 -25
  441. v0/relationalai/early_access/builder/std/decimals/__init__.py +0 -12
  442. v0/relationalai/early_access/builder/std/integers/__init__.py +0 -12
  443. v0/relationalai/early_access/builder/std/math/__init__.py +0 -12
  444. v0/relationalai/early_access/builder/std/strings/__init__.py +0 -14
  445. v0/relationalai/early_access/devtools/__init__.py +0 -12
  446. v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
  447. v0/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
  448. v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
  449. v0/relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
  450. v0/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
  451. v0/relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
  452. v0/relationalai/early_access/dsl/bindings/common.py +0 -402
  453. v0/relationalai/early_access/dsl/bindings/csv.py +0 -170
  454. v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
  455. v0/relationalai/early_access/dsl/bindings/snowflake.py +0 -64
  456. v0/relationalai/early_access/dsl/codegen/binder.py +0 -411
  457. v0/relationalai/early_access/dsl/codegen/common.py +0 -79
  458. v0/relationalai/early_access/dsl/codegen/helpers.py +0 -23
  459. v0/relationalai/early_access/dsl/codegen/relations.py +0 -700
  460. v0/relationalai/early_access/dsl/codegen/weaver.py +0 -417
  461. v0/relationalai/early_access/dsl/core/builders/__init__.py +0 -47
  462. v0/relationalai/early_access/dsl/core/builders/logic.py +0 -19
  463. v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
  464. v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
  465. v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
  466. v0/relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
  467. v0/relationalai/early_access/dsl/core/context.py +0 -13
  468. v0/relationalai/early_access/dsl/core/cset.py +0 -132
  469. v0/relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
  470. v0/relationalai/early_access/dsl/core/exprs/relational.py +0 -18
  471. v0/relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
  472. v0/relationalai/early_access/dsl/core/instances.py +0 -44
  473. v0/relationalai/early_access/dsl/core/logic/__init__.py +0 -193
  474. v0/relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
  475. v0/relationalai/early_access/dsl/core/logic/exists.py +0 -223
  476. v0/relationalai/early_access/dsl/core/logic/helper.py +0 -163
  477. v0/relationalai/early_access/dsl/core/namespaces.py +0 -32
  478. v0/relationalai/early_access/dsl/core/relations.py +0 -276
  479. v0/relationalai/early_access/dsl/core/rules.py +0 -112
  480. v0/relationalai/early_access/dsl/core/std/__init__.py +0 -45
  481. v0/relationalai/early_access/dsl/core/temporal/recall.py +0 -6
  482. v0/relationalai/early_access/dsl/core/types/__init__.py +0 -270
  483. v0/relationalai/early_access/dsl/core/types/concepts.py +0 -128
  484. v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
  485. v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
  486. v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
  487. v0/relationalai/early_access/dsl/core/types/standard.py +0 -92
  488. v0/relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
  489. v0/relationalai/early_access/dsl/core/types/variables.py +0 -203
  490. v0/relationalai/early_access/dsl/ir/compiler.py +0 -318
  491. v0/relationalai/early_access/dsl/ir/executor.py +0 -260
  492. v0/relationalai/early_access/dsl/ontologies/constraints.py +0 -88
  493. v0/relationalai/early_access/dsl/ontologies/export.py +0 -30
  494. v0/relationalai/early_access/dsl/ontologies/models.py +0 -453
  495. v0/relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
  496. v0/relationalai/early_access/dsl/ontologies/readings.py +0 -60
  497. v0/relationalai/early_access/dsl/ontologies/relationships.py +0 -322
  498. v0/relationalai/early_access/dsl/ontologies/roles.py +0 -87
  499. v0/relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
  500. v0/relationalai/early_access/dsl/orm/constraints.py +0 -438
  501. v0/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
  502. v0/relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
  503. v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
  504. v0/relationalai/early_access/dsl/orm/measures/measures.py +0 -299
  505. v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
  506. v0/relationalai/early_access/dsl/orm/models.py +0 -256
  507. v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
  508. v0/relationalai/early_access/dsl/orm/printer.py +0 -469
  509. v0/relationalai/early_access/dsl/orm/reasoners.py +0 -480
  510. v0/relationalai/early_access/dsl/orm/relations.py +0 -19
  511. v0/relationalai/early_access/dsl/orm/relationships.py +0 -251
  512. v0/relationalai/early_access/dsl/orm/types.py +0 -42
  513. v0/relationalai/early_access/dsl/orm/utils.py +0 -79
  514. v0/relationalai/early_access/dsl/orm/verb.py +0 -204
  515. v0/relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
  516. v0/relationalai/early_access/dsl/relations.py +0 -170
  517. v0/relationalai/early_access/dsl/rulesets.py +0 -69
  518. v0/relationalai/early_access/dsl/schemas/__init__.py +0 -450
  519. v0/relationalai/early_access/dsl/schemas/builder.py +0 -48
  520. v0/relationalai/early_access/dsl/schemas/comp_names.py +0 -51
  521. v0/relationalai/early_access/dsl/schemas/components.py +0 -203
  522. v0/relationalai/early_access/dsl/schemas/contexts.py +0 -156
  523. v0/relationalai/early_access/dsl/schemas/exprs.py +0 -89
  524. v0/relationalai/early_access/dsl/schemas/fragments.py +0 -464
  525. v0/relationalai/early_access/dsl/serialization.py +0 -79
  526. v0/relationalai/early_access/dsl/serialize/exporter.py +0 -163
  527. v0/relationalai/early_access/dsl/snow/api.py +0 -104
  528. v0/relationalai/early_access/dsl/snow/common.py +0 -76
  529. v0/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
  530. v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
  531. v0/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
  532. v0/relationalai/early_access/dsl/types/__init__.py +0 -40
  533. v0/relationalai/early_access/dsl/types/concepts.py +0 -12
  534. v0/relationalai/early_access/dsl/types/entities.py +0 -135
  535. v0/relationalai/early_access/dsl/types/values.py +0 -17
  536. v0/relationalai/early_access/dsl/utils.py +0 -102
  537. v0/relationalai/early_access/graphs/__init__.py +0 -13
  538. v0/relationalai/early_access/lqp/__init__.py +0 -12
  539. v0/relationalai/early_access/lqp/compiler/__init__.py +0 -12
  540. v0/relationalai/early_access/lqp/constructors/__init__.py +0 -18
  541. v0/relationalai/early_access/lqp/executor/__init__.py +0 -12
  542. v0/relationalai/early_access/lqp/ir/__init__.py +0 -12
  543. v0/relationalai/early_access/lqp/passes/__init__.py +0 -12
  544. v0/relationalai/early_access/lqp/pragmas/__init__.py +0 -12
  545. v0/relationalai/early_access/lqp/primitives/__init__.py +0 -12
  546. v0/relationalai/early_access/lqp/types/__init__.py +0 -12
  547. v0/relationalai/early_access/lqp/utils/__init__.py +0 -12
  548. v0/relationalai/early_access/lqp/validators/__init__.py +0 -12
  549. v0/relationalai/early_access/metamodel/__init__.py +0 -58
  550. v0/relationalai/early_access/metamodel/builtins/__init__.py +0 -12
  551. v0/relationalai/early_access/metamodel/compiler/__init__.py +0 -12
  552. v0/relationalai/early_access/metamodel/dependency/__init__.py +0 -12
  553. v0/relationalai/early_access/metamodel/factory/__init__.py +0 -17
  554. v0/relationalai/early_access/metamodel/helpers/__init__.py +0 -12
  555. v0/relationalai/early_access/metamodel/ir/__init__.py +0 -14
  556. v0/relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
  557. v0/relationalai/early_access/metamodel/typer/__init__.py +0 -3
  558. v0/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
  559. v0/relationalai/early_access/metamodel/types/__init__.py +0 -15
  560. v0/relationalai/early_access/metamodel/util/__init__.py +0 -15
  561. v0/relationalai/early_access/metamodel/visitor/__init__.py +0 -12
  562. v0/relationalai/early_access/rel/__init__.py +0 -12
  563. v0/relationalai/early_access/rel/executor/__init__.py +0 -12
  564. v0/relationalai/early_access/rel/rel_utils/__init__.py +0 -12
  565. v0/relationalai/early_access/rel/rewrite/__init__.py +0 -7
  566. v0/relationalai/early_access/solvers/__init__.py +0 -19
  567. v0/relationalai/early_access/sql/__init__.py +0 -11
  568. v0/relationalai/early_access/sql/executor/__init__.py +0 -3
  569. v0/relationalai/early_access/sql/rewrite/__init__.py +0 -3
  570. v0/relationalai/early_access/tests/logging/__init__.py +0 -12
  571. v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
  572. v0/relationalai/early_access/tests/utils/__init__.py +0 -12
  573. v0/relationalai/environments/__init__.py +0 -35
  574. v0/relationalai/environments/base.py +0 -381
  575. v0/relationalai/environments/colab.py +0 -14
  576. v0/relationalai/environments/generic.py +0 -71
  577. v0/relationalai/environments/ipython.py +0 -68
  578. v0/relationalai/environments/jupyter.py +0 -9
  579. v0/relationalai/environments/snowbook.py +0 -169
  580. v0/relationalai/errors.py +0 -2455
  581. v0/relationalai/experimental/SF.py +0 -38
  582. v0/relationalai/experimental/inspect.py +0 -47
  583. v0/relationalai/experimental/pathfinder/__init__.py +0 -158
  584. v0/relationalai/experimental/pathfinder/api.py +0 -160
  585. v0/relationalai/experimental/pathfinder/automaton.py +0 -584
  586. v0/relationalai/experimental/pathfinder/bridge.py +0 -226
  587. v0/relationalai/experimental/pathfinder/compiler.py +0 -416
  588. v0/relationalai/experimental/pathfinder/datalog.py +0 -214
  589. v0/relationalai/experimental/pathfinder/diagnostics.py +0 -56
  590. v0/relationalai/experimental/pathfinder/filter.py +0 -236
  591. v0/relationalai/experimental/pathfinder/glushkov.py +0 -439
  592. v0/relationalai/experimental/pathfinder/options.py +0 -265
  593. v0/relationalai/experimental/pathfinder/rpq.py +0 -344
  594. v0/relationalai/experimental/pathfinder/transition.py +0 -200
  595. v0/relationalai/experimental/pathfinder/utils.py +0 -26
  596. v0/relationalai/experimental/paths/api.py +0 -143
  597. v0/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
  598. v0/relationalai/experimental/paths/examples/basic_example.py +0 -40
  599. v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
  600. v0/relationalai/experimental/paths/examples/movie_example.py +0 -77
  601. v0/relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
  602. v0/relationalai/experimental/paths/examples/paths_example.py +0 -116
  603. v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
  604. v0/relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
  605. v0/relationalai/experimental/paths/graph.py +0 -185
  606. v0/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
  607. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
  608. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
  609. v0/relationalai/experimental/paths/path_algorithms/single.py +0 -59
  610. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
  611. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
  612. v0/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
  613. v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
  614. v0/relationalai/experimental/paths/path_algorithms/usp.py +0 -150
  615. v0/relationalai/experimental/paths/product_graph.py +0 -93
  616. v0/relationalai/experimental/paths/rpq/automaton.py +0 -584
  617. v0/relationalai/experimental/paths/rpq/diagnostics.py +0 -56
  618. v0/relationalai/experimental/paths/rpq/rpq.py +0 -378
  619. v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
  620. v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
  621. v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
  622. v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
  623. v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
  624. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
  625. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
  626. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
  627. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
  628. v0/relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
  629. v0/relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
  630. v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
  631. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
  632. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
  633. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
  634. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
  635. v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
  636. v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
  637. v0/relationalai/experimental/paths/tree_agg.py +0 -168
  638. v0/relationalai/experimental/paths/utilities/iterators.py +0 -27
  639. v0/relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
  640. v0/relationalai/experimental/solvers.py +0 -1087
  641. v0/relationalai/loaders/csv.py +0 -195
  642. v0/relationalai/loaders/loader.py +0 -177
  643. v0/relationalai/loaders/types.py +0 -23
  644. v0/relationalai/rel_emitter.py +0 -373
  645. v0/relationalai/rel_utils.py +0 -185
  646. v0/relationalai/semantics/__init__.py +0 -29
  647. v0/relationalai/semantics/devtools/benchmark_lqp.py +0 -536
  648. v0/relationalai/semantics/devtools/compilation_manager.py +0 -294
  649. v0/relationalai/semantics/devtools/extract_lqp.py +0 -110
  650. v0/relationalai/semantics/internal/internal.py +0 -3785
  651. v0/relationalai/semantics/internal/snowflake.py +0 -324
  652. v0/relationalai/semantics/lqp/builtins.py +0 -16
  653. v0/relationalai/semantics/lqp/compiler.py +0 -22
  654. v0/relationalai/semantics/lqp/constructors.py +0 -68
  655. v0/relationalai/semantics/lqp/executor.py +0 -469
  656. v0/relationalai/semantics/lqp/intrinsics.py +0 -24
  657. v0/relationalai/semantics/lqp/model2lqp.py +0 -839
  658. v0/relationalai/semantics/lqp/passes.py +0 -680
  659. v0/relationalai/semantics/lqp/primitives.py +0 -252
  660. v0/relationalai/semantics/lqp/result_helpers.py +0 -202
  661. v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
  662. v0/relationalai/semantics/lqp/rewrite/cdc.py +0 -216
  663. v0/relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
  664. v0/relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
  665. v0/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
  666. v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
  667. v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
  668. v0/relationalai/semantics/lqp/rewrite/splinter.py +0 -76
  669. v0/relationalai/semantics/lqp/types.py +0 -101
  670. v0/relationalai/semantics/lqp/utils.py +0 -160
  671. v0/relationalai/semantics/lqp/validators.py +0 -57
  672. v0/relationalai/semantics/metamodel/__init__.py +0 -40
  673. v0/relationalai/semantics/metamodel/builtins.py +0 -774
  674. v0/relationalai/semantics/metamodel/compiler.py +0 -133
  675. v0/relationalai/semantics/metamodel/dependency.py +0 -862
  676. v0/relationalai/semantics/metamodel/executor.py +0 -61
  677. v0/relationalai/semantics/metamodel/factory.py +0 -287
  678. v0/relationalai/semantics/metamodel/helpers.py +0 -361
  679. v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
  680. v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
  681. v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
  682. v0/relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
  683. v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
  684. v0/relationalai/semantics/metamodel/typer/checker.py +0 -353
  685. v0/relationalai/semantics/metamodel/typer/typer.py +0 -1395
  686. v0/relationalai/semantics/metamodel/util.py +0 -505
  687. v0/relationalai/semantics/reasoners/__init__.py +0 -10
  688. v0/relationalai/semantics/reasoners/graph/__init__.py +0 -37
  689. v0/relationalai/semantics/reasoners/graph/core.py +0 -9020
  690. v0/relationalai/semantics/reasoners/optimization/__init__.py +0 -68
  691. v0/relationalai/semantics/reasoners/optimization/common.py +0 -88
  692. v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
  693. v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
  694. v0/relationalai/semantics/rel/builtins.py +0 -40
  695. v0/relationalai/semantics/rel/compiler.py +0 -989
  696. v0/relationalai/semantics/rel/executor.py +0 -359
  697. v0/relationalai/semantics/rel/rel.py +0 -482
  698. v0/relationalai/semantics/rel/rel_utils.py +0 -276
  699. v0/relationalai/semantics/snowflake/__init__.py +0 -3
  700. v0/relationalai/semantics/sql/compiler.py +0 -2503
  701. v0/relationalai/semantics/sql/executor/duck_db.py +0 -52
  702. v0/relationalai/semantics/sql/executor/result_helpers.py +0 -64
  703. v0/relationalai/semantics/sql/executor/snowflake.py +0 -145
  704. v0/relationalai/semantics/sql/rewrite/denormalize.py +0 -222
  705. v0/relationalai/semantics/sql/rewrite/double_negation.py +0 -49
  706. v0/relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
  707. v0/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
  708. v0/relationalai/semantics/sql/sql.py +0 -504
  709. v0/relationalai/semantics/std/__init__.py +0 -54
  710. v0/relationalai/semantics/std/constraints.py +0 -43
  711. v0/relationalai/semantics/std/datetime.py +0 -363
  712. v0/relationalai/semantics/std/decimals.py +0 -62
  713. v0/relationalai/semantics/std/floats.py +0 -7
  714. v0/relationalai/semantics/std/integers.py +0 -22
  715. v0/relationalai/semantics/std/math.py +0 -141
  716. v0/relationalai/semantics/std/pragmas.py +0 -11
  717. v0/relationalai/semantics/std/re.py +0 -83
  718. v0/relationalai/semantics/std/std.py +0 -14
  719. v0/relationalai/semantics/std/strings.py +0 -63
  720. v0/relationalai/semantics/tests/__init__.py +0 -0
  721. v0/relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
  722. v0/relationalai/semantics/tests/test_snapshot_base.py +0 -9
  723. v0/relationalai/semantics/tests/utils.py +0 -46
  724. v0/relationalai/std/__init__.py +0 -70
  725. v0/relationalai/tools/__init__.py +0 -0
  726. v0/relationalai/tools/cli.py +0 -1940
  727. v0/relationalai/tools/cli_controls.py +0 -1826
  728. v0/relationalai/tools/cli_helpers.py +0 -390
  729. v0/relationalai/tools/debugger.py +0 -183
  730. v0/relationalai/tools/debugger_client.py +0 -109
  731. v0/relationalai/tools/debugger_server.py +0 -302
  732. v0/relationalai/tools/dev.py +0 -685
  733. v0/relationalai/tools/qb_debugger.py +0 -425
  734. v0/relationalai/util/clean_up_databases.py +0 -95
  735. v0/relationalai/util/format.py +0 -123
  736. v0/relationalai/util/list_databases.py +0 -9
  737. v0/relationalai/util/otel_configuration.py +0 -25
  738. v0/relationalai/util/otel_handler.py +0 -484
  739. v0/relationalai/util/snowflake_handler.py +0 -88
  740. v0/relationalai/util/span_format_test.py +0 -43
  741. v0/relationalai/util/span_tracker.py +0 -207
  742. v0/relationalai/util/spans_file_handler.py +0 -72
  743. v0/relationalai/util/tracing_handler.py +0 -34
  744. /relationalai/{semantics/frontend → analysis}/__init__.py +0 -0
  745. {v0/relationalai → relationalai}/analysis/mechanistic.py +0 -0
  746. {v0/relationalai → relationalai}/analysis/whynot.py +0 -0
  747. /relationalai/{shims → auth}/__init__.py +0 -0
  748. {v0/relationalai → relationalai}/auth/jwt_generator.py +0 -0
  749. {v0/relationalai → relationalai}/auth/oauth_callback_server.py +0 -0
  750. {v0/relationalai → relationalai}/auth/token_handler.py +0 -0
  751. {v0/relationalai → relationalai}/auth/util.py +0 -0
  752. {v0/relationalai/clients → relationalai/clients/resources/snowflake}/cache_store.py +0 -0
  753. {v0/relationalai → relationalai}/compiler.py +0 -0
  754. {v0/relationalai → relationalai}/dependencies.py +0 -0
  755. {v0/relationalai → relationalai}/docutils.py +0 -0
  756. {v0/relationalai/analysis → relationalai/early_access}/__init__.py +0 -0
  757. {v0/relationalai → relationalai}/early_access/dsl/__init__.py +0 -0
  758. {v0/relationalai/auth → relationalai/early_access/dsl/adapters}/__init__.py +0 -0
  759. {v0/relationalai/early_access → relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
  760. {v0/relationalai → relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
  761. {v0/relationalai/early_access/dsl/adapters → relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
  762. {v0/relationalai → relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
  763. {v0/relationalai/early_access/dsl/adapters/orm → relationalai/early_access/dsl/bindings}/__init__.py +0 -0
  764. {v0/relationalai/early_access/dsl/adapters/owl → relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
  765. {v0/relationalai/early_access/dsl/bindings → relationalai/early_access/dsl/codegen}/__init__.py +0 -0
  766. {v0/relationalai → relationalai}/early_access/dsl/constants.py +0 -0
  767. {v0/relationalai → relationalai}/early_access/dsl/core/__init__.py +0 -0
  768. {v0/relationalai → relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
  769. {v0/relationalai → relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  770. {v0/relationalai → relationalai}/early_access/dsl/core/stack.py +0 -0
  771. {v0/relationalai/early_access/dsl/bindings/legacy → relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
  772. {v0/relationalai → relationalai}/early_access/dsl/core/utils.py +0 -0
  773. {v0/relationalai/early_access/dsl/codegen → relationalai/early_access/dsl/ir}/__init__.py +0 -0
  774. {v0/relationalai/early_access/dsl/core/temporal → relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
  775. {v0/relationalai → relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
  776. {v0/relationalai/early_access/dsl/ir → relationalai/early_access/dsl/orm}/__init__.py +0 -0
  777. {v0/relationalai/early_access/dsl/ontologies → relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
  778. {v0/relationalai → relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
  779. {v0/relationalai/early_access/dsl/orm → relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
  780. {v0/relationalai/early_access/dsl/orm/measures → relationalai/early_access/dsl/serialize}/__init__.py +0 -0
  781. {v0/relationalai → relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
  782. {v0/relationalai → relationalai}/early_access/dsl/serialize/model.py +0 -0
  783. {v0/relationalai/early_access/dsl/physical_metadata → relationalai/early_access/dsl/snow}/__init__.py +0 -0
  784. {v0/relationalai → relationalai}/early_access/tests/__init__.py +0 -0
  785. {v0/relationalai → relationalai}/environments/ci.py +0 -0
  786. {v0/relationalai → relationalai}/environments/hex.py +0 -0
  787. {v0/relationalai → relationalai}/environments/terminal.py +0 -0
  788. {v0/relationalai → relationalai}/experimental/__init__.py +0 -0
  789. {v0/relationalai → relationalai}/experimental/graphs.py +0 -0
  790. {v0/relationalai → relationalai}/experimental/paths/__init__.py +0 -0
  791. {v0/relationalai → relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
  792. {v0/relationalai → relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
  793. {v0/relationalai → relationalai}/experimental/paths/rpq/__init__.py +0 -0
  794. {v0/relationalai → relationalai}/experimental/paths/rpq/filter.py +0 -0
  795. {v0/relationalai → relationalai}/experimental/paths/rpq/glushkov.py +0 -0
  796. {v0/relationalai → relationalai}/experimental/paths/rpq/transition.py +0 -0
  797. {v0/relationalai → relationalai}/experimental/paths/utilities/__init__.py +0 -0
  798. {v0/relationalai → relationalai}/experimental/paths/utilities/utilities.py +0 -0
  799. {v0/relationalai/early_access/dsl/serialize → relationalai/loaders}/__init__.py +0 -0
  800. {v0/relationalai → relationalai}/metagen.py +0 -0
  801. {v0/relationalai → relationalai}/metamodel.py +0 -0
  802. {v0/relationalai → relationalai}/rel.py +0 -0
  803. {v0/relationalai → relationalai}/semantics/devtools/__init__.py +0 -0
  804. {v0/relationalai → relationalai}/semantics/internal/__init__.py +0 -0
  805. {v0/relationalai → relationalai}/semantics/internal/annotations.py +0 -0
  806. {v0/relationalai → relationalai}/semantics/lqp/__init__.py +0 -0
  807. {v0/relationalai → relationalai}/semantics/lqp/ir.py +0 -0
  808. {v0/relationalai → relationalai}/semantics/lqp/pragmas.py +0 -0
  809. {v0/relationalai → relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
  810. {v0/relationalai → relationalai}/semantics/metamodel/dataflow.py +0 -0
  811. {v0/relationalai → relationalai}/semantics/metamodel/ir.py +0 -0
  812. {v0/relationalai → relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
  813. {v0/relationalai → relationalai}/semantics/metamodel/typer/__init__.py +0 -0
  814. {v0/relationalai → relationalai}/semantics/metamodel/types.py +0 -0
  815. {v0/relationalai → relationalai}/semantics/metamodel/visitor.py +0 -0
  816. {v0/relationalai → relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
  817. {v0/relationalai → relationalai}/semantics/rel/__init__.py +0 -0
  818. {v0/relationalai → relationalai}/semantics/sql/__init__.py +0 -0
  819. {v0/relationalai → relationalai}/semantics/sql/executor/__init__.py +0 -0
  820. {v0/relationalai → relationalai}/semantics/sql/rewrite/__init__.py +0 -0
  821. {v0/relationalai/early_access/dsl/snow → relationalai/semantics/tests}/__init__.py +0 -0
  822. {v0/relationalai → relationalai}/semantics/tests/logging.py +0 -0
  823. {v0/relationalai → relationalai}/std/aggregates.py +0 -0
  824. {v0/relationalai → relationalai}/std/dates.py +0 -0
  825. {v0/relationalai → relationalai}/std/graphs.py +0 -0
  826. {v0/relationalai → relationalai}/std/inspect.py +0 -0
  827. {v0/relationalai → relationalai}/std/math.py +0 -0
  828. {v0/relationalai → relationalai}/std/re.py +0 -0
  829. {v0/relationalai → relationalai}/std/strings.py +0 -0
  830. {v0/relationalai/loaders → relationalai/tools}/__init__.py +0 -0
  831. {v0/relationalai → relationalai}/tools/cleanup_snapshots.py +0 -0
  832. {v0/relationalai → relationalai}/tools/constants.py +0 -0
  833. {v0/relationalai → relationalai}/tools/query_utils.py +0 -0
  834. {v0/relationalai → relationalai}/tools/snapshot_viewer.py +0 -0
  835. {v0/relationalai → relationalai}/util/__init__.py +0 -0
  836. {v0/relationalai → relationalai}/util/constants.py +0 -0
  837. {v0/relationalai → relationalai}/util/graph.py +0 -0
  838. {v0/relationalai → relationalai}/util/timeout.py +0 -0
@@ -0,0 +1,802 @@
1
+ #pyright: reportPrivateImportUsage=false
2
+ from __future__ import annotations
3
+ import io
4
+ import json
5
+ import os
6
+ import re
7
+ import sys
8
+ import requests
9
+ import rich
10
+ import click
11
+ import functools
12
+ import pytz
13
+ from typing import NoReturn
14
+
15
+ from relationalai.util.constants import TOP_LEVEL_PROFILE_NAME
16
+ from relationalai.errors import RAIException
17
+ from rich.table import Table
18
+ from typing import Callable, Dict, Any, List, cast
19
+ from ..clients import config
20
+ from click.core import Context
21
+ from rich.console import Console
22
+ from rich import box as rich_box
23
+ from collections import defaultdict
24
+ from packaging.version import Version
25
+ from ..clients.config import ConfigFile
26
+ from datetime import datetime, timedelta
27
+ from click.formatting import HelpFormatter
28
+ from ..clients.client import ResourcesBase
29
+ from relationalai.tools.constants import GlobalProfile, SHOW_FULL_TRACES
30
+ from relationalai.tools.cli_controls import divider
31
+ from relationalai.util.format import humanized_bytes, humanized_duration
32
+ from InquirerPy.base.control import Choice
33
+
34
+ #--------------------------------------------------
35
+ # Helpers
36
+ #--------------------------------------------------
37
+
38
+ @functools.cache
39
+ def get_config(profile:str|Dict[str, Any]|None = None):
40
+ return config.Config(profile or GlobalProfile.get())
41
+
42
+ @functools.cache
43
+ def get_resource_provider(platform:str|None=None, _cfg:config.Config|None = None) -> ResourcesBase:
44
+ cfg = _cfg or get_config()
45
+ platform = platform or cfg.get("platform", "snowflake")
46
+ if platform == "snowflake":
47
+ from relationalai.clients.resources.snowflake.cli_resources import CLIResources
48
+ provider = CLIResources(config=cfg)
49
+ elif platform == "azure":
50
+ from relationalai.clients.resources.azure.azure import Resources
51
+ provider = Resources(config=cfg)
52
+ else:
53
+ from .. import Resources
54
+ provider = Resources(config=cfg)
55
+ return provider
56
+
57
+ def unexpand_user_path(path):
58
+ """Inverse of os.path.expanduser"""
59
+ home_dir = os.path.expanduser('~')
60
+ if path.startswith(home_dir):
61
+ return '~' + path[len(home_dir):]
62
+ return path
63
+
64
+ def account_from_url(account_or_url:str):
65
+ regex = r"https://app.snowflake.com/([^/]+)/([^/]+)/?.*"
66
+ match = re.match(regex, account_or_url)
67
+ if match:
68
+ org = match.group(1)
69
+ account = match.group(2)
70
+ return f"{org}-{account}"
71
+ elif "app.snowflake.com" in account_or_url or "https://" in account_or_url:
72
+ raise ValueError("URL not of the form https://app.snowflake.com/[org]/[account]")
73
+ else:
74
+ return account_or_url
75
+
76
+ def supports_platform(*platform_names: str):
77
+ def decorator(cmd: click.Command):
78
+ setattr(cmd, "__available_platforms", platform_names)
79
+ cb = cmd.callback
80
+ assert cb
81
+ def checked(*args, **kwargs):
82
+ assert cmd.name
83
+ assert_command_available(cmd.name, command_available(cmd))
84
+ return cb(*args, **kwargs)
85
+
86
+ cmd.callback = checked
87
+ return cmd
88
+ return decorator
89
+
90
+ def command_available(cmd: click.Command) -> bool:
91
+ available_platforms = getattr(cmd, "__available_platforms", ())
92
+ platform = get_config().get("platform", "")
93
+ return not available_platforms or not platform or platform in available_platforms
94
+
95
+ def assert_command_available(name: str, available: bool, plural=False):
96
+ if not available:
97
+ platform = get_config().get("platform", "")
98
+ rich.print(f"[yellow]{name} {'are' if plural else 'is'} not available for {platform}")
99
+ divider()
100
+ sys.exit(1)
101
+
102
+ def coming_soon():
103
+ rich.print("[yellow]This isn't quite ready yet, but it's coming soon!")
104
+ divider()
105
+ sys.exit(1)
106
+
107
+ def issue_top_level_profile_warning():
108
+ rich.print("[yellow]Warning: Using a top-level profile is not recommended")
109
+ rich.print("[yellow]Consider naming the profile by adding \\[profile.<name>] to your raiconfig.toml file\n")
110
+ rich.print("[yellow]Example:")
111
+ rich.print("[yellow]\\[profile.default]")
112
+ rich.print("[yellow]platform = \"snowflake\"")
113
+ rich.print("[yellow]account = ...")
114
+ divider()
115
+
116
+ def ensure_config(profile:str|None=None) -> config.Config:
117
+ cfg = get_config(profile)
118
+ if not cfg.file_path:
119
+ rich.print("[yellow bold]No configuration file found.")
120
+ rich.print("To create one, run: [green bold]rai init[/green bold]")
121
+ divider()
122
+ sys.exit(1)
123
+ return cfg
124
+
125
+ def latest_version(package_name):
126
+ """Get the current version of a package on PyPI."""
127
+ url = f"https://pypi.org/pypi/{package_name}/json"
128
+ response = requests.get(url)
129
+ if response.status_code == 200:
130
+ data = response.json()
131
+ version = data['info']['version']
132
+ return version
133
+ else:
134
+ return None
135
+
136
+ def is_latest_cli_version():
137
+ from .. import __version__
138
+ latest_ver_str = latest_version("relationalai")
139
+ latest_ver = Version(latest_ver_str) if latest_ver_str else Version("0.0.0")
140
+ version = Version(__version__)
141
+ return version >= latest_ver, version, latest_ver
142
+
143
+ #--------------------------------------------------
144
+ # Validation
145
+ #--------------------------------------------------
146
+
147
+ EMPTY_STRING_REGEX = re.compile(r'^\S+$')
148
+ ENGINE_NAME_REGEX = re.compile(r'^[a-zA-Z]\w{2,}$')
149
+ COMPUTE_POOL_REGEX = re.compile(r'^[a-zA-Z][a-zA-Z0-9_]*$')
150
+ PASSCODE_REGEX = re.compile(r'^(\d{6})?$')
151
+ ENGINE_NAME_ERROR = "Min 3 chars, start with letter, only letters, numbers, underscores allowed."
152
+ UUID = re.compile('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
153
+
154
+ def validate_engine_name(name:str) -> tuple[bool, str|None]:
155
+ if not ENGINE_NAME_REGEX.match(name):
156
+ return False, ENGINE_NAME_ERROR
157
+ return True, None
158
+
159
+ #--------------------------------------------------
160
+ # Engine types & selection helpers (Snowflake)
161
+ #--------------------------------------------------
162
+
163
+ def format_state_with_color(state: str) -> str:
164
+ """Format engine state with colors for display."""
165
+ if not state:
166
+ return ""
167
+ state_upper = state.upper()
168
+ if state_upper == "READY":
169
+ return f"[green]{state_upper}[/green]"
170
+ if state_upper == "SUSPENDED":
171
+ return f"[yellow]{state_upper}[/yellow]"
172
+ if state_upper in ("PENDING", "SYNCING", "PROCESSING"):
173
+ return f"[bold yellow]{state_upper}[/bold yellow]"
174
+ if state_upper in ("ABORTED", "QUARANTINED", "GONE"):
175
+ return f"[red]{state_upper}[/red]"
176
+ return state_upper
177
+
178
+ def _get_engine_type_api():
179
+ # Local import to avoid importing snowflake modules for non-snowflake usage
180
+ from relationalai.clients.resources.snowflake import EngineType
181
+ return EngineType
182
+
183
+ def _get_internal_engine_sizes() -> list[str]:
184
+ # Local import to avoid snowflake imports for non-snowflake usage
185
+ from relationalai.clients.resources.snowflake import INTERNAL_ENGINE_SIZES
186
+ return list(INTERNAL_ENGINE_SIZES)
187
+
188
+ def get_engine_type_choices(cfg: config.Config, exclude_types: List[str] | None = None) -> List[Choice]:
189
+ """Get sorted list of engine type choices for interactive selection."""
190
+ EngineType = _get_engine_type_api()
191
+ if exclude_types is None:
192
+ exclude_types = []
193
+ exclude_types_upper = [et.upper() for et in exclude_types]
194
+ engine_types_list = [EngineType.LOGIC, EngineType.ML, EngineType.SOLVER]
195
+ engine_types_list = [et for et in engine_types_list if et.upper() not in exclude_types_upper]
196
+ engine_types_list.sort(key=lambda et: EngineType.get_label(et))
197
+ return [
198
+ Choice(value=et, name=f"{EngineType.get_label(et)}: {EngineType.get_description(et)}")
199
+ for et in engine_types_list
200
+ ]
201
+
202
+ def select_engine_type_interactive(cfg: config.Config) -> str:
203
+ """Show interactive engine type selection and return the selected type."""
204
+ from . import cli_controls as controls
205
+ rich.print("")
206
+ engine_type_choices = get_engine_type_choices(cfg)
207
+ return controls.select("Engine type:", cast("list[str | Choice]", engine_type_choices), None, newline=True)
208
+
209
+ def select_engine_interactive(
210
+ provider: ResourcesBase,
211
+ prompt: str = "Select an engine:",
212
+ engine_name: str | None = None,
213
+ engines: List[Dict[str, Any]] | None = None,
214
+ ) -> tuple[str, str | None] | None:
215
+ """Interactive engine picker returning (name, type)."""
216
+ from . import cli_controls as controls
217
+
218
+ engine_map: Dict[str, tuple[str, str | None]] = {}
219
+
220
+ def get_engines():
221
+ engine_list = engines if engines is not None else provider.list_engines()
222
+ engine_map.clear()
223
+ items: List[str] = []
224
+ EngineType = _get_engine_type_api()
225
+ for engine in engine_list:
226
+ eng_name = engine.get("name", "")
227
+ if engine_name and eng_name.upper() != engine_name.upper():
228
+ continue
229
+ eng_type = engine.get("type", "")
230
+ eng_size = engine.get("size", "")
231
+ if eng_type:
232
+ label = f"{EngineType.get_label(eng_type)} ({eng_type})" if EngineType.is_valid(eng_type) else f"{eng_type} ({eng_type})"
233
+ display = f"{eng_name}, {label}, {eng_size}"
234
+ else:
235
+ display = f"{eng_name}, {eng_size}" if eng_size else eng_name
236
+ engine_map[display] = (eng_name, eng_type or None)
237
+ items.append(display)
238
+ return items
239
+
240
+ # Auto-select when engine_name uniquely identifies an engine
241
+ if engine_name:
242
+ engine_list = engines if engines is not None else provider.list_engines()
243
+ matches = [e for e in engine_list if e.get("name", "").upper() == engine_name.upper()]
244
+ if len(matches) == 1:
245
+ e = matches[0]
246
+ return (e.get("name", ""), e.get("type"))
247
+ if len(matches) == 0:
248
+ return None
249
+
250
+ selected = controls.fuzzy_with_refetch(prompt, "engines", get_engines)
251
+ if not selected or isinstance(selected, Exception):
252
+ return None
253
+ return engine_map.get(selected)
254
+
255
+ def select_engine_with_state_filter(
256
+ provider: ResourcesBase,
257
+ engine_name: str | None,
258
+ engine_type: str | None,
259
+ state_filter: str,
260
+ prompt_no_name: str,
261
+ prompt_with_name: str,
262
+ error_no_engines: str,
263
+ error_no_matching: str,
264
+ ) -> tuple[str, str | None] | None:
265
+ """Select an engine with optional state filtering + optional name filtering."""
266
+ EngineType = _get_engine_type_api()
267
+
268
+ if not engine_name:
269
+ filtered = provider.list_engines(state_filter)
270
+ if not filtered:
271
+ exit_with_error(error_no_engines)
272
+ return select_engine_interactive(provider, prompt_no_name, engines=filtered)
273
+
274
+ # If type provided and valid, return directly
275
+ if engine_type and EngineType.is_valid(engine_type):
276
+ return (engine_name, engine_type)
277
+
278
+ # Filter by name + state; selection handles (name,type)
279
+ filtered = provider.list_engines(state_filter, name=engine_name)
280
+ if not filtered:
281
+ exit_with_error(error_no_matching)
282
+ return select_engine_interactive(provider, prompt_with_name, engine_name=engine_name, engines=filtered)
283
+
284
+ def ensure_engine_type_for_snowflake(
285
+ provider: ResourcesBase,
286
+ engine_name: str,
287
+ engine_type: str | None,
288
+ error_message: str,
289
+ ) -> str:
290
+ """Ensure engine_type is provided and valid; default to LOGIC if omitted."""
291
+ EngineType = _get_engine_type_api()
292
+ # If --type was omitted, default to LOGIC for backwards compatibility
293
+ if engine_type is None:
294
+ return EngineType.LOGIC
295
+ assert isinstance(engine_type, str)
296
+ if engine_type == "" or not EngineType.is_valid(engine_type):
297
+ cfg = get_config()
298
+ if engine_type == "":
299
+ rich.print(f"[yellow]Empty engine type provided for engine '{engine_name}'.")
300
+ else:
301
+ rich.print(f"[yellow]Invalid engine type '{engine_type}' for engine '{engine_name}'.")
302
+ return select_engine_type_interactive(cfg)
303
+ return engine_type
304
+
305
+ def build_engine_operation_messages(
306
+ provider: ResourcesBase,
307
+ engine_name: str,
308
+ engine_type: str | None,
309
+ action: str,
310
+ action_past: str,
311
+ ) -> tuple[str, str]:
312
+ EngineType = _get_engine_type_api()
313
+ if engine_type:
314
+ label = EngineType.get_label(engine_type) if EngineType.is_valid(engine_type) else engine_type
315
+ return (f"{action} {label} engine '{engine_name}'", f"{label} Engine '{engine_name}' {action_past.lower()}")
316
+ return (f"{action} '{engine_name}' engine", f"Engine '{engine_name}' {action_past.lower()}")
317
+
318
+ def prompt_and_validate_engine_name(name: str | None) -> str:
319
+ """Prompt for engine name if missing; validate using ENGINE_NAME_REGEX."""
320
+ from . import cli_controls as controls
321
+ if not name:
322
+ name = controls.prompt(
323
+ "Engine name:",
324
+ name,
325
+ validator=ENGINE_NAME_REGEX.match,
326
+ invalid_message=ENGINE_NAME_ERROR,
327
+ newline=True,
328
+ )
329
+ assert isinstance(name, str)
330
+ return name
331
+
332
+ def validate_auto_suspend_mins(auto_suspend_mins: int | str | None) -> int | None:
333
+ if auto_suspend_mins is None:
334
+ return None
335
+ if isinstance(auto_suspend_mins, int):
336
+ return auto_suspend_mins
337
+ error_msg = f"[yellow]Error: auto_suspend_mins must be an integer instead of {type(auto_suspend_mins)}"
338
+ try:
339
+ return int(auto_suspend_mins)
340
+ except ValueError:
341
+ exit_with_error(error_msg)
342
+ return None
343
+
344
+ def get_engine_type_for_creation(provider: ResourcesBase, cfg: config.Config, engine_type: str | None) -> str | None:
345
+ """Get engine type for engine creation; defaults to LOGIC when omitted."""
346
+ EngineType = _get_engine_type_api()
347
+ if engine_type is None:
348
+ return EngineType.LOGIC
349
+ if engine_type == "" or not EngineType.is_valid(engine_type):
350
+ if engine_type == "":
351
+ rich.print("[yellow]Empty engine type provided.")
352
+ else:
353
+ valid_types_display = ", ".join(EngineType.get_all_types())
354
+ rich.print(f"[yellow]Invalid engine type '{engine_type}'. Valid types: {valid_types_display}")
355
+ return select_engine_type_interactive(cfg)
356
+ return engine_type
357
+
358
+ def get_and_validate_engine_size(
359
+ provider: ResourcesBase,
360
+ cfg: config.Config,
361
+ size: str | None,
362
+ engine_type: str | None = None,
363
+ ) -> str:
364
+ from . import cli_controls as controls
365
+ EngineType = _get_engine_type_api()
366
+ internal_sizes = set(_get_internal_engine_sizes())
367
+
368
+ cloud_provider = provider.get_cloud_provider()
369
+ valid_sizes = provider.get_engine_sizes(cloud_provider)
370
+
371
+ # Engine-type-aware filtering:
372
+ # Internal sizes (XS/S/M/L) are only valid for LOGIC engines (and only on some accounts).
373
+ # For ML/SOLVER, hide them to avoid presenting invalid options.
374
+ if engine_type and EngineType.is_valid(engine_type) and engine_type != EngineType.LOGIC:
375
+ valid_sizes = [s for s in valid_sizes if s not in internal_sizes]
376
+
377
+ # Ask if missing and not in config
378
+ if not size and not cfg.get("engine_size", None):
379
+ rich.print("")
380
+ # This refers to the cloud backing your Snowflake account (AWS/Azure), not the engine "platform".
381
+ size = controls.fuzzy(f"Engine size (Snowflake cloud: {cloud_provider.upper()}):", choices=valid_sizes)
382
+ elif size is None and cfg.get("engine_size", None):
383
+ size = cfg.get("engine_size", None)
384
+ if not isinstance(size, str) or size not in valid_sizes:
385
+ exit_with_error(f"\nInvalid engine size [yellow]{size}[/yellow] provided. Please check your config.\n\nValid sizes: [green]{valid_sizes}[/green]")
386
+ return size
387
+
388
+ def create_engine_with_spinner(
389
+ provider: ResourcesBase,
390
+ engine_name: str,
391
+ engine_size: str,
392
+ engine_type: str | None,
393
+ auto_suspend_mins: int | None,
394
+ ) -> None:
395
+ """Create an engine with appropriate spinner messages and error handling."""
396
+ from .cli_controls import Spinner
397
+
398
+ EngineType = _get_engine_type_api()
399
+ # Build creation message with engine type when available
400
+ if engine_type:
401
+ creation_message = (
402
+ f"Creating {EngineType.get_label(engine_type)} engine '{engine_name}' with size {engine_size}... "
403
+ f"(this may take several minutes)"
404
+ )
405
+ else:
406
+ creation_message = (
407
+ f"Creating engine '{engine_name}' with size {engine_size}... "
408
+ f"(this may take several minutes)"
409
+ )
410
+
411
+ with Spinner(
412
+ creation_message,
413
+ f"Engine '{engine_name}' created!",
414
+ failed_message=None, # We handle error display ourselves below
415
+ ):
416
+ try:
417
+ provider.create_engine(
418
+ engine_name,
419
+ type=engine_type,
420
+ size=engine_size,
421
+ auto_suspend_mins=auto_suspend_mins,
422
+ )
423
+ except Exception as e:
424
+ # Prefer richer error messages when available
425
+ error_msg = None
426
+
427
+ # EngineProvisioningFailed has a format_message() method that provides better error details
428
+ if hasattr(e, "format_message"):
429
+ try:
430
+ error_msg = getattr(e, "format_message")()
431
+ except Exception:
432
+ pass
433
+
434
+ # Try content/message fallbacks
435
+ if not error_msg and hasattr(e, "content"):
436
+ error_msg = getattr(e, "content", None)
437
+ if not error_msg and hasattr(e, "message"):
438
+ error_msg = str(getattr(e, "message", ""))
439
+ if not error_msg:
440
+ error_msg = str(e)
441
+
442
+ raise Exception(error_msg)
443
+
444
+ #--------------------------------------------------
445
+ # Tables
446
+ #--------------------------------------------------
447
+
448
+ def get_color_by_state(state: str) -> str:
449
+ if state and isinstance(state, str):
450
+ state_lower = state.lower()
451
+ if state_lower in ("aborted", "quarantined"):
452
+ return "red"
453
+ elif state_lower == "completed":
454
+ return "white"
455
+ elif state_lower in ("running", "cancelling", "syncing", "pending", "processing"):
456
+ return "bold yellow"
457
+ elif state_lower == "suspended":
458
+ return "dim"
459
+ else:
460
+ return ""
461
+ return ""
462
+
463
+ def format_value(value) -> str:
464
+ if value is None:
465
+ return "N/A"
466
+ elif isinstance(value, (int, float)):
467
+ return f"{value}"
468
+ elif isinstance(value, list):
469
+ return ", ".join(map(str, value))
470
+ elif isinstance(value, bool):
471
+ return f"{value}"
472
+ elif isinstance(value, datetime):
473
+ return value.strftime("%Y-%m-%d %H:%M:%S")
474
+ elif isinstance(value, timedelta):
475
+ return humanized_duration(int(value.total_seconds() * 1000))
476
+ else:
477
+ return str(value)
478
+
479
+ def format_row(key: str, value) -> dict:
480
+ result = {}
481
+ result[key] = value
482
+ if "status" in key.lower() or "state" in key.lower():
483
+ result["style"] = get_color_by_state(value)
484
+ if key == "query_size" and isinstance(value, int):
485
+ result[key] = humanized_bytes(value)
486
+ else:
487
+ result[key] = format_value(value)
488
+ return result
489
+
490
+ def show_dictionary_table(dict, format_fn:Callable|None=None):
491
+ table = Table(show_header=True, border_style="dim", header_style="bold", box=rich_box.SIMPLE_HEAD)
492
+ table.add_column("Field")
493
+ table.add_column("Value")
494
+ for key, value in dict.items():
495
+ if format_fn:
496
+ row = format_fn(key, value)
497
+ table.add_row(key, row.get(key), style=row.get("style"))
498
+ else:
499
+ table.add_row(key, value)
500
+ rich.print(table)
501
+
502
+ #--------------------------------------------------
503
+ # Custom help printer
504
+ #--------------------------------------------------
505
+
506
+
507
+ class RichGroup(click.Group):
508
+ def invoke(self, ctx: Context) -> Any:
509
+ """Invoke the CLI command, suppressing tracebacks for handled RAIExceptions.
510
+
511
+ Any `RAIException` is expected to already know how to render itself nicely via
512
+ `pprint()`. When such an exception bubbles up to the top-level Click runner,
513
+ Click will otherwise print a full Python traceback, which is noisy for users.
514
+ """
515
+ try:
516
+ return super().invoke(ctx)
517
+ except RAIException as exc:
518
+ # Respect config-based full-trace setting when available.
519
+ try:
520
+ show_full_traces = get_config().get("show_full_traces", SHOW_FULL_TRACES)
521
+ except Exception:
522
+ show_full_traces = SHOW_FULL_TRACES
523
+
524
+ if show_full_traces:
525
+ raise
526
+
527
+ exc.pprint()
528
+ raise click.exceptions.Exit(1) from None
529
+
530
+ def format_help(self, ctx: Context, formatter: HelpFormatter) -> None:
531
+ is_latest, current_ver, latest_ver = is_latest_cli_version()
532
+
533
+ global PROFILE
534
+ # @NOTE: I couldn't find a sane way to access the --profile option from here, so insane it is.
535
+ if "--profile" in sys.argv:
536
+ ix = sys.argv.index("--profile") + 1
537
+ if ix < len(sys.argv):
538
+ PROFILE = sys.argv[ix]
539
+
540
+ profile = get_config().profile
541
+ if profile == TOP_LEVEL_PROFILE_NAME:
542
+ profile = "[yellow bold]None[/yellow bold]" if not get_config().get("platform", "") else "[ROOT]"
543
+
544
+ sio = io.StringIO()
545
+ console = Console(file=sio, force_terminal=True)
546
+ divider(console)
547
+ console.print(f"[bold]Welcome to [green]RelationalAI[/bold] ({current_ver})!")
548
+ console.print()
549
+ if not is_latest:
550
+ console.print(f"[yellow]A new version of RelationalAI is available: {latest_ver}[/yellow] ")
551
+ console.print()
552
+ console.print("rai [magenta]\\[options][/magenta] [cyan]command[/cyan]")
553
+
554
+ console.print()
555
+ console.print(f"[magenta]--profile[/magenta][dim] - which config profile to use (current: [/dim][cyan]{profile}[/cyan][dim])")
556
+
557
+ unavailable_commands = []
558
+ groups = defaultdict(list)
559
+ for command in self.commands.keys():
560
+ if ":" in command:
561
+ group, _, _ = command.rpartition(":")
562
+ groups[group].append(command)
563
+ else:
564
+ groups[""].append(command)
565
+
566
+ console.print()
567
+ for command in groups[""]:
568
+ console.print(f"[cyan]{command}[/cyan][dim] - {self.commands[command].help}")
569
+
570
+ for group, commands in groups.items():
571
+ if not group:
572
+ continue
573
+
574
+ empty = True
575
+ for command in commands:
576
+ if command_available(self.commands[command]):
577
+ if empty:
578
+ empty = False
579
+ console.print()
580
+
581
+ console.print(f"[cyan]{command}[/cyan][dim] - {self.commands[command].help}")
582
+ else:
583
+ unavailable_commands.append(command)
584
+
585
+ if unavailable_commands:
586
+ platform = get_config().get("platform", "")
587
+ console.print()
588
+ console.print(f"[yellow]Not available on {platform}[/yellow]")
589
+ console.print()
590
+ for command in unavailable_commands:
591
+ console.print(f"[dim yellow]{command} - {self.commands[command].help}")
592
+
593
+ divider(console)
594
+ formatter.write(sio.getvalue())
595
+ sio.close()
596
+
597
+ def filter_profiles_by_platform(config:ConfigFile, platform:str):
598
+ filtered_config = {}
599
+ for profile, props in config.get_combined_profiles().items():
600
+ if profile == TOP_LEVEL_PROFILE_NAME:
601
+ continue
602
+ if props.get("platform") == platform or (
603
+ props.get("platform") is None
604
+ and platform == "azure"
605
+ ):
606
+ filtered_config[profile] = props
607
+ return filtered_config
608
+
609
+ #--------------------------------------------------
610
+ # Imports list
611
+ #--------------------------------------------------
612
+
613
+ def show_imports(imports, showId=False):
614
+ ensure_config()
615
+ if len(imports):
616
+ table = Table(show_header=True, border_style="dim", header_style="bold", box=rich_box.SIMPLE_HEAD)
617
+ cols = {"#": "index"}
618
+ if showId and len(imports) and "id" in imports[0]:
619
+ cols["ID"] = "id"
620
+ if len(imports) and "name" in imports[0]:
621
+ cols["Name"] = "name"
622
+ if len(imports) and "model" in imports[0]:
623
+ cols["Model"] = "model"
624
+ if len(imports) and "created" in imports[0]:
625
+ cols["Created"] = "created"
626
+ if len(imports) and "creator" in imports[0]:
627
+ cols["Creator"] = "creator"
628
+ if len(imports) and "batches" in imports[0]:
629
+ cols["Batches"] = "batches"
630
+ if len(imports) and "status" in imports[0]:
631
+ cols["Status"] = "status"
632
+ if len(imports) and "errors" in imports[0]:
633
+ cols["Errors"] = "errors"
634
+
635
+ for label in cols.keys():
636
+ table.add_column(label)
637
+
638
+ for index, imp in enumerate(imports):
639
+ imp["index"] = f"{index+1}"
640
+ style = get_color_by_state(imp["status"])
641
+ if imp["created"]:
642
+ imp["created"] = format_value(imp["created"])
643
+ table.add_row(*[imp.get(attr, None) for attr in cols.values()], style=style)
644
+ rich.print(table)
645
+ else:
646
+ rich.print("[yellow]No imports found")
647
+
648
+ #--------------------------------------------------
649
+ # Transactions
650
+ #--------------------------------------------------
651
+
652
+ def show_transactions(transactions, limit):
653
+ if len(transactions):
654
+ table = Table(show_header=True, border_style="dim", header_style="bold", box=rich_box.SIMPLE_HEAD)
655
+ table.add_column("#")
656
+ table.add_column("ID")
657
+ table.add_column("Schema")
658
+ table.add_column("Engine")
659
+ table.add_column("State")
660
+ table.add_column("Created")
661
+ table.add_column("Duration", justify="right")
662
+
663
+ added = 0
664
+ for i, txn in enumerate(transactions):
665
+ if added >= limit:
666
+ break
667
+
668
+ state = txn.get("state", "")
669
+ duration = txn.get("duration")
670
+ created_on = txn.get("created_on")
671
+
672
+ if isinstance(created_on, int):
673
+ created_on = datetime.fromtimestamp(created_on / 1000, tz=pytz.utc)
674
+ if duration is None:
675
+ duration = (datetime.now(created_on.tzinfo) - created_on).total_seconds() * 1000
676
+
677
+ table.add_row(
678
+ f"{i+1}",
679
+ txn.get("id"),
680
+ txn.get("database", ""),
681
+ txn.get("engine", ""),
682
+ state,
683
+ created_on.strftime("%Y-%m-%d %H:%M:%S"),
684
+ humanized_duration(int(duration)),
685
+ style=get_color_by_state(state)
686
+ )
687
+ added += 1
688
+ rich.print(table)
689
+ else:
690
+ rich.print("[yellow]No transactions found")
691
+
692
+ def show_engines(engines):
693
+ if len(engines):
694
+ table = Table(show_header=True, border_style="dim", header_style="bold", box=rich_box.SIMPLE_HEAD)
695
+ table.add_column("#")
696
+ table.add_column("Name")
697
+ # Show type column if present
698
+ table.add_column("Type")
699
+ table.add_column("Size")
700
+ table.add_column("State")
701
+ table.add_column("Created By")
702
+ table.add_column("Created On")
703
+ EngineType = _get_engine_type_api()
704
+ for index, engine in enumerate(engines):
705
+ engine_type = engine.get("type", "")
706
+ type_display = EngineType.get_label_with_value(engine_type) if engine_type and EngineType.is_valid(engine_type) else (engine_type or "")
707
+ created_on = format_value(engine.get("created_on"))
708
+ state_display = format_state_with_color(engine.get("state", ""))
709
+ table.add_row(
710
+ f"{index+1}",
711
+ engine.get("name"),
712
+ type_display,
713
+ engine.get("size"),
714
+ state_display,
715
+ engine.get("created_by", ""),
716
+ created_on,
717
+ )
718
+ rich.print(table)
719
+
720
+
721
+ def show_engine_details(engine: dict[str, Any]) -> None:
722
+ """Print a vertical table of engine details (one field per row)."""
723
+ from relationalai.clients.resources.snowflake import EngineType as _EngineType
724
+
725
+ table = Table(
726
+ show_header=True,
727
+ border_style="dim",
728
+ header_style="bold",
729
+ box=rich_box.SIMPLE_HEAD,
730
+ )
731
+ table.add_column("Field")
732
+ table.add_column("Value", overflow="fold")
733
+
734
+ engine_type_from_db = engine.get("type", "")
735
+ type_display = (
736
+ _EngineType.get_label_with_value(engine_type_from_db)
737
+ if engine_type_from_db and _EngineType.is_valid(engine_type_from_db)
738
+ else engine_type_from_db
739
+ )
740
+
741
+ rows: list[tuple[str, str]] = [
742
+ ("Name", str(engine.get("name", ""))),
743
+ ("Type", str(type_display)),
744
+ ("Size", str(engine.get("size", ""))),
745
+ ("State", str(format_state_with_color(engine.get("state", "")))),
746
+ ("Created By", str(engine.get("created_by", ""))),
747
+ ("Created On", str(format_value(engine.get("created_on")))),
748
+ ]
749
+
750
+ # Optional fields (may not exist on older backends).
751
+ for key, label, formatter in [
752
+ ("version", "Version", lambda v: "" if v is None else str(v)),
753
+ ("updated_on", "Updated On", format_value),
754
+ ("suspends_at", "Suspends At", format_value),
755
+ ]:
756
+ if key in engine:
757
+ try:
758
+ val = engine.get(key)
759
+ rows.append((label, str(formatter(val))))
760
+ except Exception:
761
+ rows.append((label, str(engine.get(key))))
762
+
763
+ # Auto-suspend minutes is represented differently across backends:
764
+ # - list_engines tends to return auto_suspend_mins
765
+ # - get_engine (Snowflake EngineServiceSQL) returns auto_suspend
766
+ if "auto_suspend_mins" in engine or "auto_suspend" in engine:
767
+ auto_suspend_val = engine.get("auto_suspend_mins", engine.get("auto_suspend"))
768
+ rows.append(("Auto Suspend (mins)", "" if auto_suspend_val is None else str(auto_suspend_val)))
769
+
770
+ settings = engine.get("settings")
771
+ if settings in (None, {}, ""):
772
+ settings_str = ""
773
+ elif isinstance(settings, dict):
774
+ settings_str = json.dumps(settings, indent=2, sort_keys=True)
775
+ else:
776
+ settings_str = str(settings)
777
+ rows.append(("Settings", settings_str))
778
+
779
+ for field, value in rows:
780
+ table.add_row(field, value)
781
+
782
+ rich.print(table)
783
+
784
+ def exit_with_error(message: str) -> NoReturn:
785
+ rich.print(message, file=sys.stderr)
786
+ exit_with_divider(1)
787
+
788
+ def exit_with_handled_exception(context: str, exc: Exception) -> NoReturn:
789
+ """Exit with a nicely formatted message for handled RAIExceptions.
790
+
791
+ - If `exc` is a RAIException (i.e. produced by an error handler), print its rich
792
+ formatted content via `exc.pprint()`.
793
+ - Otherwise, print a raw one-line error including the context and exception string.
794
+ """
795
+ if isinstance(exc, RAIException):
796
+ exc.pprint()
797
+ sys.exit(1)
798
+ exit_with_error(f"\n\n[yellow]{context}: {exc}")
799
+
800
+ def exit_with_divider(exit_code: int = 0) -> NoReturn:
801
+ divider()
802
+ sys.exit(exit_code)