relationalai 0.13.3__tar.gz → 0.13.5__tar.gz

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 (483) hide show
  1. {relationalai-0.13.3 → relationalai-0.13.5}/PKG-INFO +2 -2
  2. {relationalai-0.13.3 → relationalai-0.13.5}/pyproject.toml +2 -2
  3. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/exec_txn_poller.py +51 -20
  4. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/local.py +15 -7
  5. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/__init__.py +2 -2
  6. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/direct_access_resources.py +8 -4
  7. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/snowflake.py +22 -10
  8. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/use_index_poller.py +1 -1
  9. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/solvers.py +8 -0
  10. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/snowflake.py +5 -1
  11. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/executor.py +31 -11
  12. relationalai-0.13.5/src/relationalai/semantics/lqp/export_rewriter.py +40 -0
  13. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/model2lqp.py +34 -25
  14. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/passes.py +6 -3
  15. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/result_helpers.py +76 -12
  16. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/__init__.py +2 -0
  17. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/annotate_constraints.py +22 -10
  18. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/extract_common.py +3 -1
  19. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/extract_keys.py +85 -20
  20. relationalai-0.13.5/src/relationalai/semantics/lqp/rewrite/flatten_script.py +301 -0
  21. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/functional_dependencies.py +43 -9
  22. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/quantify_vars.py +12 -3
  23. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/unify_definitions.py +9 -3
  24. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/dependency.py +9 -0
  25. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/executor.py +17 -10
  26. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/__init__.py +2 -1
  27. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/flatten.py +1 -2
  28. relationalai-0.13.5/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +256 -0
  29. relationalai-0.13.5/src/relationalai/semantics/metamodel/rewrite/handle_aggregations_and_ranks.py +237 -0
  30. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/typer.py +1 -1
  31. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/solvers_pb.py +101 -107
  32. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/compiler.py +7 -3
  33. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/executor.py +1 -1
  34. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/test_snapshot_abstract.py +2 -1
  35. relationalai-0.13.5/src/relationalai/tools/txn_progress.py +188 -0
  36. relationalai-0.13.3/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -171
  37. {relationalai-0.13.3 → relationalai-0.13.5}/.gitignore +0 -0
  38. {relationalai-0.13.3 → relationalai-0.13.5}/LICENSE +0 -0
  39. {relationalai-0.13.3 → relationalai-0.13.5}/docs/pypi/README.md +0 -0
  40. {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/.gitignore +0 -0
  41. {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  42. {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
  43. {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
  44. {relationalai-0.13.3 → relationalai-0.13.5}/frontend/debugger/dist/index.html +0 -0
  45. {relationalai-0.13.3 → relationalai-0.13.5}/src/__init__.py +0 -0
  46. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/__init__.py +0 -0
  47. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/events/__init__.py +0 -0
  48. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/procedures/__init__.py +0 -0
  49. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/procedures/procedure.py +0 -0
  50. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/rel/__init__.py +0 -0
  51. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/tables/__init__.py +0 -0
  52. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/tasks/__init__.py +0 -0
  53. {relationalai-0.13.3 → relationalai-0.13.5}/src/raitoolkit/tasks/task.py +0 -0
  54. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/__init__.py +0 -0
  55. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/analysis/__init__.py +0 -0
  56. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/analysis/mechanistic.py +0 -0
  57. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/analysis/whynot.py +0 -0
  58. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/__init__.py +0 -0
  59. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/jwt_generator.py +0 -0
  60. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/oauth_callback_server.py +0 -0
  61. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/token_handler.py +0 -0
  62. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/auth/util.py +0 -0
  63. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/__init__.py +0 -0
  64. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/client.py +0 -0
  65. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/config.py +0 -0
  66. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/direct_access_client.py +0 -0
  67. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/hash_util.py +0 -0
  68. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/profile_polling.py +0 -0
  69. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/__init__.py +0 -0
  70. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/azure/azure.py +0 -0
  71. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/cache_store.py +0 -0
  72. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/cli_resources.py +0 -0
  73. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/engine_service.py +0 -0
  74. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -0
  75. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/error_handlers.py +0 -0
  76. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -0
  77. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/resources_factory.py +0 -0
  78. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/use_index_resources.py +0 -0
  79. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/util.py +0 -0
  80. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/result_helpers.py +0 -0
  81. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/types.py +0 -0
  82. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/clients/util.py +0 -0
  83. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/compiler.py +0 -0
  84. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/debugging.py +0 -0
  85. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/dependencies.py +0 -0
  86. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/docutils.py +0 -0
  87. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/dsl.py +0 -0
  88. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/__init__.py +0 -0
  89. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/__init__.py +0 -0
  90. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/builder/__init__.py +0 -0
  91. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/snowflake/__init__.py +0 -0
  92. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/__init__.py +0 -0
  93. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/decimals/__init__.py +0 -0
  94. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/integers/__init__.py +0 -0
  95. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/math/__init__.py +0 -0
  96. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/strings/__init__.py +0 -0
  97. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/devtools/__init__.py +0 -0
  98. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -0
  99. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -0
  100. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/__init__.py +0 -0
  101. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
  102. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
  103. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -0
  104. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
  105. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/parser.py +0 -0
  106. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
  107. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
  108. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
  109. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
  110. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
  111. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/common.py +0 -0
  112. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/csv.py +0 -0
  113. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
  114. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
  115. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/snowflake.py +0 -0
  116. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
  117. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/binder.py +0 -0
  118. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
  119. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/helpers.py +0 -0
  120. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/relations.py +0 -0
  121. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/weaver.py +0 -0
  122. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/constants.py +0 -0
  123. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
  124. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
  125. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
  126. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
  127. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
  128. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  129. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
  130. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
  131. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
  132. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/context.py +0 -0
  133. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/cset.py +0 -0
  134. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
  135. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
  136. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
  137. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/instances.py +0 -0
  138. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
  139. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
  140. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
  141. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
  142. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
  143. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/relations.py +0 -0
  144. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/rules.py +0 -0
  145. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/stack.py +0 -0
  146. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
  147. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
  148. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
  149. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
  150. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
  151. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
  152. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
  153. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
  154. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
  155. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
  156. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
  157. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/utils.py +0 -0
  158. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
  159. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/compiler.py +0 -0
  160. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/executor.py +0 -0
  161. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
  162. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
  163. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/export.py +0 -0
  164. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/models.py +0 -0
  165. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/python_printer.py +0 -0
  166. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
  167. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
  168. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/relationships.py +0 -0
  169. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
  170. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/subtyping.py +0 -0
  171. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
  172. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
  173. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
  174. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -0
  175. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
  176. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -0
  177. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/measures.py +0 -0
  178. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -0
  179. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/models.py +0 -0
  180. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -0
  181. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/printer.py +0 -0
  182. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
  183. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/reasoners.py +0 -0
  184. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/relations.py +0 -0
  185. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/relationships.py +0 -0
  186. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/types.py +0 -0
  187. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
  188. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
  189. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
  190. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
  191. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/relations.py +0 -0
  192. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/rulesets.py +0 -0
  193. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
  194. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
  195. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
  196. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
  197. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
  198. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
  199. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
  200. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialization.py +0 -0
  201. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
  202. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
  203. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
  204. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
  205. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
  206. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/api.py +0 -0
  207. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/common.py +0 -0
  208. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
  209. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
  210. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
  211. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
  212. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
  213. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/entities.py +0 -0
  214. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/values.py +0 -0
  215. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/dsl/utils.py +0 -0
  216. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/graphs/__init__.py +0 -0
  217. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/__init__.py +0 -0
  218. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/compiler/__init__.py +0 -0
  219. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/constructors/__init__.py +0 -0
  220. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/executor/__init__.py +0 -0
  221. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/ir/__init__.py +0 -0
  222. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/passes/__init__.py +0 -0
  223. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/pragmas/__init__.py +0 -0
  224. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/primitives/__init__.py +0 -0
  225. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/types/__init__.py +0 -0
  226. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/utils/__init__.py +0 -0
  227. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/lqp/validators/__init__.py +0 -0
  228. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/__init__.py +0 -0
  229. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/builtins/__init__.py +0 -0
  230. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/compiler/__init__.py +0 -0
  231. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/dependency/__init__.py +0 -0
  232. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/factory/__init__.py +0 -0
  233. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/helpers/__init__.py +0 -0
  234. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/ir/__init__.py +0 -0
  235. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/rewrite/__init__.py +0 -0
  236. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/typer/__init__.py +0 -0
  237. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -0
  238. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/types/__init__.py +0 -0
  239. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/util/__init__.py +0 -0
  240. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/visitor/__init__.py +0 -0
  241. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/__init__.py +0 -0
  242. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/executor/__init__.py +0 -0
  243. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/rel_utils/__init__.py +0 -0
  244. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/rel/rewrite/__init__.py +0 -0
  245. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/solvers/__init__.py +0 -0
  246. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/sql/__init__.py +0 -0
  247. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
  248. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/sql/rewrite/__init__.py +0 -0
  249. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/__init__.py +0 -0
  250. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/logging/__init__.py +0 -0
  251. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -0
  252. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/early_access/tests/utils/__init__.py +0 -0
  253. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/__init__.py +0 -0
  254. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/base.py +0 -0
  255. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/ci.py +0 -0
  256. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/colab.py +0 -0
  257. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/generic.py +0 -0
  258. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/hex.py +0 -0
  259. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/ipython.py +0 -0
  260. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/jupyter.py +0 -0
  261. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/snowbook.py +0 -0
  262. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/environments/terminal.py +0 -0
  263. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/errors.py +0 -0
  264. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/SF.py +0 -0
  265. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/__init__.py +0 -0
  266. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/graphs.py +0 -0
  267. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/inspect.py +0 -0
  268. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
  269. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/api.py +0 -0
  270. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
  271. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
  272. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
  273. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
  274. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
  275. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/filter.py +0 -0
  276. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
  277. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/options.py +0 -0
  278. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
  279. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
  280. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/transition.py +0 -0
  281. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/utils.py +0 -0
  282. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/README.md +0 -0
  283. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/__init__.py +0 -0
  284. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/api.py +0 -0
  285. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/benchmarks/__init__.py +0 -0
  286. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -0
  287. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/code_organization.md +0 -0
  288. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/Movies.ipynb +0 -0
  289. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/basic_example.py +0 -0
  290. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -0
  291. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movie_example.py +0 -0
  292. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -0
  293. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/directed.csv +0 -0
  294. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/follows.csv +0 -0
  295. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/movies.csv +0 -0
  296. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/person.csv +0 -0
  297. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/produced.csv +0 -0
  298. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -0
  299. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -0
  300. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/paths_benchmark.py +0 -0
  301. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/paths_example.py +0 -0
  302. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -0
  303. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/find_paths_via_automaton.py +0 -0
  304. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/graph.py +0 -0
  305. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/__init__.py +0 -0
  306. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -0
  307. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -0
  308. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -0
  309. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/single.py +0 -0
  310. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -0
  311. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -0
  312. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -0
  313. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -0
  314. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp.py +0 -0
  315. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/product_graph.py +0 -0
  316. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/__init__.py +0 -0
  317. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/automaton.py +0 -0
  318. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/diagnostics.py +0 -0
  319. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/filter.py +0 -0
  320. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/glushkov.py +0 -0
  321. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/rpq.py +0 -0
  322. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/transition.py +0 -0
  323. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -0
  324. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -0
  325. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -0
  326. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -0
  327. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -0
  328. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -0
  329. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -0
  330. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -0
  331. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -0
  332. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_paths.py +0 -0
  333. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_walks.py +0 -0
  334. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -0
  335. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -0
  336. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -0
  337. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -0
  338. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -0
  339. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -0
  340. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -0
  341. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/tree_agg.py +0 -0
  342. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/__init__.py +0 -0
  343. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/iterators.py +0 -0
  344. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/prefix_sum.py +0 -0
  345. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/utilities.py +0 -0
  346. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/__init__.py +0 -0
  347. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/csv.py +0 -0
  348. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/loader.py +0 -0
  349. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/loaders/types.py +0 -0
  350. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/metagen.py +0 -0
  351. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/metamodel.py +0 -0
  352. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/rel.py +0 -0
  353. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/rel_emitter.py +0 -0
  354. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/rel_utils.py +0 -0
  355. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/__init__.py +0 -0
  356. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/designs/query_builder/identify_by.md +0 -0
  357. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/__init__.py +0 -0
  358. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/benchmark_lqp.py +0 -0
  359. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/compilation_manager.py +0 -0
  360. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/devtools/extract_lqp.py +0 -0
  361. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/__init__.py +0 -0
  362. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/annotations.py +0 -0
  363. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/internal/internal.py +0 -0
  364. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/README.md +0 -0
  365. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/__init__.py +0 -0
  366. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/algorithms.py +0 -0
  367. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/builtins.py +0 -0
  368. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/compiler.py +0 -0
  369. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/constructors.py +0 -0
  370. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/intrinsics.py +0 -0
  371. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/ir.py +0 -0
  372. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/pragmas.py +0 -0
  373. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/primitives.py +0 -0
  374. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/algorithm.py +0 -0
  375. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/cdc.py +0 -0
  376. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/constants_to_vars.py +0 -0
  377. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/deduplicate_vars.py +0 -0
  378. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/eliminate_data.py +0 -0
  379. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -0
  380. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/period_math.py +0 -0
  381. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/splinter.py +0 -0
  382. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/types.py +0 -0
  383. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/utils.py +0 -0
  384. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/lqp/validators.py +0 -0
  385. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/__init__.py +0 -0
  386. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/builtins.py +0 -0
  387. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/compiler.py +0 -0
  388. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/dataflow.py +0 -0
  389. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/factory.py +0 -0
  390. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/helpers.py +0 -0
  391. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/ir.py +0 -0
  392. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -0
  393. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -0
  394. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -0
  395. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/__init__.py +0 -0
  396. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/checker.py +0 -0
  397. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/types.py +0 -0
  398. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/util.py +0 -0
  399. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/visitor.py +0 -0
  400. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/__init__.py +0 -0
  401. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/experimental/__init__.py +0 -0
  402. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/README.md +0 -0
  403. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/__init__.py +0 -0
  404. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/core.py +0 -0
  405. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -0
  406. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/tests/README.md +0 -0
  407. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/__init__.py +0 -0
  408. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/common.py +0 -0
  409. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -0
  410. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/__init__.py +0 -0
  411. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/builtins.py +0 -0
  412. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/rel.py +0 -0
  413. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/rel/rel_utils.py +0 -0
  414. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/snowflake/__init__.py +0 -0
  415. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/__init__.py +0 -0
  416. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/compiler.py +0 -0
  417. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
  418. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/duck_db.py +0 -0
  419. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/result_helpers.py +0 -0
  420. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/snowflake.py +0 -0
  421. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
  422. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/denormalize.py +0 -0
  423. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/double_negation.py +0 -0
  424. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/recursive_union.py +0 -0
  425. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -0
  426. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/sql/sql.py +0 -0
  427. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/__init__.py +0 -0
  428. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/constraints.py +0 -0
  429. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/datetime.py +0 -0
  430. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/decimals.py +0 -0
  431. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/floats.py +0 -0
  432. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/integers.py +0 -0
  433. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/math.py +0 -0
  434. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/pragmas.py +0 -0
  435. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/re.py +0 -0
  436. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/std.py +0 -0
  437. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/std/strings.py +0 -0
  438. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/__init__.py +0 -0
  439. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/logging.py +0 -0
  440. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/lqp/__init__.py +0 -0
  441. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/lqp/algorithms.py +0 -0
  442. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/test_snapshot_base.py +0 -0
  443. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/semantics/tests/utils.py +0 -0
  444. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/__init__.py +0 -0
  445. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/aggregates.py +0 -0
  446. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/dates.py +0 -0
  447. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/graphs.py +0 -0
  448. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/inspect.py +0 -0
  449. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/math.py +0 -0
  450. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/re.py +0 -0
  451. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/std/strings.py +0 -0
  452. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/__init__.py +0 -0
  453. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cleanup_snapshots.py +0 -0
  454. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cli.py +0 -0
  455. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cli_controls.py +0 -0
  456. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/cli_helpers.py +0 -0
  457. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/constants.py +0 -0
  458. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/debugger.py +0 -0
  459. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/debugger_client.py +0 -0
  460. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/debugger_server.py +0 -0
  461. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/dev.py +0 -0
  462. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/notes +0 -0
  463. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/qb_debugger.py +0 -0
  464. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/query_utils.py +0 -0
  465. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/tools/snapshot_viewer.py +0 -0
  466. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/__init__.py +0 -0
  467. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/clean_up_databases.py +0 -0
  468. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/constants.py +0 -0
  469. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/format.py +0 -0
  470. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/graph.py +0 -0
  471. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/list_databases.py +0 -0
  472. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/otel_configuration.py +0 -0
  473. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/otel_handler.py +0 -0
  474. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/snowflake_handler.py +0 -0
  475. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/span_format_test.py +0 -0
  476. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/span_tracker.py +0 -0
  477. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/spans_file_handler.py +0 -0
  478. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/timeout.py +0 -0
  479. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai/util/tracing_handler.py +0 -0
  480. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/__init__.py +0 -0
  481. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/fixtures.py +0 -0
  482. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/snapshot.py +0 -0
  483. {relationalai-0.13.3 → relationalai-0.13.5}/src/relationalai_test_util/traceback.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: relationalai
3
- Version: 0.13.3
3
+ Version: 0.13.5
4
4
  Summary: RelationalAI Library and CLI
5
5
  Author-email: RelationalAI <support@relational.ai>
6
6
  License-File: LICENSE
@@ -11,7 +11,7 @@ Requires-Dist: colorama
11
11
  Requires-Dist: cryptography
12
12
  Requires-Dist: gravis
13
13
  Requires-Dist: inquirerpy
14
- Requires-Dist: lqp==0.2.1
14
+ Requires-Dist: lqp==0.2.3
15
15
  Requires-Dist: nicegui==2.16.1
16
16
  Requires-Dist: numpy<2
17
17
  Requires-Dist: opentelemetry-api
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = 'relationalai'
3
- version = '0.13.3'
3
+ version = '0.13.5'
4
4
  description = 'RelationalAI Library and CLI'
5
5
  readme="docs/pypi/README.md"
6
6
  authors = [
@@ -8,7 +8,7 @@ authors = [
8
8
  ]
9
9
  requires-python = ">= 3.10"
10
10
  dependencies = [
11
- "lqp==0.2.1",
11
+ "lqp==0.2.3",
12
12
  "snowflake-connector-python[secure-local-storage]",
13
13
  "snowflake-snowpark-python>=1.38.0",
14
14
  "typing-extensions",
@@ -5,11 +5,14 @@ from typing import Dict, Optional, TYPE_CHECKING
5
5
 
6
6
  from relationalai import debugging
7
7
  from relationalai.clients.util import poll_with_specified_overhead
8
+ from relationalai.clients.config import Config
8
9
  from relationalai.tools.cli_controls import create_progress
9
10
  from relationalai.util.format import format_duration
11
+ from relationalai.tools.txn_progress import format_execution_tree
10
12
 
11
13
  if TYPE_CHECKING:
12
14
  from relationalai.clients.resources.snowflake import Resources
15
+ from relationalai.clients.resources.snowflake.snowflake import TxnStatusResponse
13
16
 
14
17
  # Polling behavior constants
15
18
  POLL_OVERHEAD_RATE = 0.1 # Overhead rate for exponential backoff
@@ -19,6 +22,14 @@ GREEN_COLOR = '\033[92m'
19
22
  GRAY_COLOR = '\033[90m'
20
23
  ENDC = '\033[0m'
21
24
 
25
+ PRINT_TXN_PROGRESS_FLAG = "print_txn_progress"
26
+ PRINT_INTERNAL_TXN_PROGRESS_FLAG = "print_txn_progress_internal"
27
+
28
+ def should_print_txn_progress(config: Config) -> bool:
29
+ return bool(config.get(PRINT_TXN_PROGRESS_FLAG, False))
30
+
31
+ def should_print_internal_txn_progress(config) -> bool:
32
+ return bool(config.get(PRINT_INTERNAL_TXN_PROGRESS_FLAG, False))
22
33
 
23
34
  class ExecTxnPoller:
24
35
  """
@@ -27,17 +38,19 @@ class ExecTxnPoller:
27
38
 
28
39
  def __init__(
29
40
  self,
30
- print_txn_progress: bool,
31
- resource: "Resources",
41
+ config: Config,
42
+ resource: Optional["Resources"] = None,
32
43
  txn_id: Optional[str] = None,
33
44
  headers: Optional[Dict] = None,
34
- txn_start_time: Optional[float] = None,
45
+ txn_start_time: Optional[float] = None
35
46
  ):
36
- self.print_txn_progress = print_txn_progress
47
+ self.print_txn_progress = should_print_txn_progress(config)
37
48
  self.res = resource
38
49
  self.txn_id = txn_id
39
50
  self.headers = headers or {}
40
51
  self.txn_start_time = txn_start_time or time.time()
52
+ self.print_internal_txn_progress = should_print_internal_txn_progress(config)
53
+ self.last_status: Optional[TxnStatusResponse] = None
41
54
 
42
55
  def __enter__(self) -> ExecTxnPoller:
43
56
  if not self.print_txn_progress:
@@ -53,17 +66,23 @@ class ExecTxnPoller:
53
66
  return self
54
67
 
55
68
  def __exit__(self, exc_type, exc_value, traceback) -> None:
56
- if not self.print_txn_progress or self.txn_id is None:
69
+ if not self.print_txn_progress:
57
70
  return
58
71
  # Update to success message with duration
59
72
  total_duration = time.time() - self.txn_start_time
60
73
  txn_id = self.txn_id
61
74
  self.progress.update_main_status(
62
- query_complete_message(txn_id, total_duration)
75
+ query_complete_message(txn_id, total_duration, internal_txn_progress=self._get_internal_progress())
63
76
  )
64
77
  self.progress.__exit__(exc_type, exc_value, traceback)
65
78
  return
66
79
 
80
+ def _get_internal_progress(self) -> Optional[Dict]:
81
+ """Get internal transaction progress if enabled and available."""
82
+ if self.print_internal_txn_progress and self.last_status:
83
+ return self.last_status.progress
84
+ return None
85
+
67
86
  def poll(self) -> bool:
68
87
  """
69
88
  Poll for transaction completion with interactive progress display.
@@ -79,44 +98,56 @@ class ExecTxnPoller:
79
98
  if self.print_txn_progress:
80
99
  # Update the main status to include the new txn_id
81
100
  self.progress.update_main_status_fn(
82
- lambda: self.description_with_timing(txn_id),
101
+ lambda: self.description_with_timing(txn_id, self._get_internal_progress()),
83
102
  )
84
103
 
85
104
  # Don't show duration summary - we handle our own completion message
86
105
  def check_status() -> bool:
87
106
  """Check if transaction is complete."""
88
- finished = self.res._check_exec_async_status(txn_id, headers=self.headers)
89
- return finished
107
+ if self.res is None:
108
+ raise ValueError("Resource must be provided for polling.")
109
+ self.last_status = self.res._check_exec_async_status(txn_id, headers=self.headers)
110
+ return self.last_status.finished
90
111
 
91
- with debugging.span("wait", txn_id=self.txn_id):
112
+ with debugging.span("wait", txn_id=txn_id):
92
113
  poll_with_specified_overhead(check_status, overhead_rate=POLL_OVERHEAD_RATE)
93
114
 
94
-
95
115
  return True
96
116
 
97
- def description_with_timing(self, txn_id: str | None = None) -> str:
117
+ def description_with_timing(self, txn_id: str | None = None, internal_txn_progress: Dict | None = None) -> str:
98
118
  elapsed = time.time() - self.txn_start_time
99
119
  if txn_id is None:
100
120
  return query_progress_header(elapsed)
101
121
  else:
102
- return query_progress_message(txn_id, elapsed)
122
+ return query_progress_message(txn_id, elapsed, internal_txn_progress)
103
123
 
104
124
  def query_progress_header(duration: float) -> str:
105
125
  # Don't print sub-second decimals, because it updates too fast and is distracting.
106
126
  duration_str = format_duration(duration, seconds_decimals=False)
107
127
  return f"Evaluating Query... {duration_str:>15}\n"
108
128
 
109
- def query_progress_message(id: str, duration: float) -> str:
110
- return (
129
+ def query_progress_message(id: str, duration: float, internal_txn_progress: Dict | None = None) -> str:
130
+ result = (
111
131
  query_progress_header(duration) +
112
132
  # Print with whitespace to align with the end of the transaction ID
113
133
  f"{GRAY_COLOR}ID: {id}{ENDC}"
114
134
  )
135
+ if internal_txn_progress is not None:
136
+ result += format_execution_tree(internal_txn_progress)
137
+ return result
115
138
 
116
- def query_complete_message(id: str, duration: float, status_header: bool = False) -> str:
117
- return (
139
+ def query_complete_message(id: str | None, duration: float, status_header: bool = False, internal_txn_progress: Dict | None = None) -> str:
140
+ out = (
118
141
  (f"{GREEN_COLOR}✅ " if status_header else "") +
119
142
  # Print with whitespace to align with the end of the transaction ID
120
- f"Query Complete: {format_duration(duration):>21}\n" +
121
- f"{GRAY_COLOR}ID: {id}{ENDC}"
122
- )
143
+ f"Query Complete: {format_duration(duration):>21}"
144
+ )
145
+ if id is None:
146
+ out += ENDC
147
+ else:
148
+ out += f"\n{GRAY_COLOR}ID: {id}{ENDC}"
149
+
150
+ if internal_txn_progress is not None:
151
+ out += format_execution_tree(internal_txn_progress)
152
+
153
+ return out
@@ -4,6 +4,7 @@ import base64
4
4
  import json
5
5
  from urllib.parse import quote, urlencode
6
6
  import pyarrow as pa
7
+ import time
7
8
  import requests
8
9
  from email import message_from_bytes, policy
9
10
  from email.message import EmailMessage
@@ -18,6 +19,7 @@ from .config import Config
18
19
  from .types import TransactionAsyncResponse
19
20
  from .util import get_pyrel_version
20
21
  from ..errors import ResponseStatusException
22
+ from ..clients.exec_txn_poller import ExecTxnPoller
21
23
  from .. import debugging
22
24
 
23
25
  @dataclass
@@ -112,7 +114,7 @@ class LocalResources(ResourcesBase):
112
114
 
113
115
  def reset(self):
114
116
  raise NotImplementedError("reset not supported in local mode")
115
-
117
+
116
118
  #--------------------------------------------------
117
119
  # Check direct access is enabled (0 implemented)
118
120
  #--------------------------------------------------
@@ -332,7 +334,7 @@ class LocalResources(ResourcesBase):
332
334
  #--------------------------------------------------
333
335
  # Exec Async
334
336
  #--------------------------------------------------
335
-
337
+
336
338
  def _parse_multipart_response(self, response: requests.Response) -> Dict[str, Any]:
337
339
  response_map = {}
338
340
  response_map['results'] = {}
@@ -464,11 +466,17 @@ class LocalResources(ResourcesBase):
464
466
  "readonly": readonly,
465
467
  }
466
468
 
467
- parsed_response = self._create_transaction(
468
- target_endpoint="create_txn",
469
- payload=payload,
470
- headers=headers
471
- )
469
+ txn_start_time = time.time()
470
+ with ExecTxnPoller(
471
+ self.config,
472
+ txn_id=None,
473
+ txn_start_time=txn_start_time
474
+ ) as _poller: # unused, except for __enter__ and __exit__ display
475
+ parsed_response = self._create_transaction(
476
+ target_endpoint="create_txn",
477
+ payload=payload,
478
+ headers=headers
479
+ )
472
480
 
473
481
  state = parsed_response["state"]
474
482
  if state not in ["COMPLETED", "ABORTED"]:
@@ -2,7 +2,7 @@
2
2
  Snowflake resources module.
3
3
  """
4
4
  # Import order matters - Resources must be imported first since other classes depend on it
5
- from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext, PrimaryKey, PRINT_TXN_PROGRESS_FLAG
5
+ from .snowflake import Resources, Provider, Graph, SnowflakeClient, APP_NAME, PYREL_ROOT_DB, ExecContext, PrimaryKey
6
6
  from .engine_service import EngineType, INTERNAL_ENGINE_SIZES, ENGINE_SIZES_AWS, ENGINE_SIZES_AZURE
7
7
  # These imports depend on Resources, so they come after
8
8
  from .cli_resources import CLIResources
@@ -14,7 +14,7 @@ __all__ = [
14
14
  'Resources', 'DirectAccessResources', 'Provider', 'Graph', 'SnowflakeClient',
15
15
  'APP_NAME', 'PYREL_ROOT_DB', 'CLIResources', 'UseIndexResources', 'ExecContext', 'EngineType',
16
16
  'INTERNAL_ENGINE_SIZES', 'ENGINE_SIZES_AWS', 'ENGINE_SIZES_AZURE', 'PrimaryKey',
17
- 'PRINT_TXN_PROGRESS_FLAG', 'create_resources_instance',
17
+ 'create_resources_instance',
18
18
  ]
19
19
 
20
20
 
@@ -18,7 +18,7 @@ from snowflake.snowpark import Session
18
18
 
19
19
  # Import UseIndexResources to enable use_index functionality with direct access
20
20
  from .use_index_resources import UseIndexResources
21
- from .snowflake import TxnCreationResult
21
+ from .snowflake import TxnCreationResult, TxnStatusResponse
22
22
 
23
23
  # Import helper functions from util
24
24
  from .util import is_engine_issue as _is_engine_issue, is_database_issue as _is_database_issue, collect_error_messages
@@ -314,7 +314,7 @@ class DirectAccessResources(UseIndexResources):
314
314
 
315
315
  return response.json()
316
316
 
317
- def _check_exec_async_status(self, txn_id: str, headers: Dict[str, str] | None = None) -> bool:
317
+ def _check_exec_async_status(self, txn_id: str, headers: Dict[str, str] | None = None) -> TxnStatusResponse:
318
318
  """Check whether the given transaction has completed."""
319
319
 
320
320
  with debugging.span("check_status"):
@@ -349,8 +349,12 @@ class DirectAccessResources(UseIndexResources):
349
349
  elif reason == TXN_ABORT_REASON_GUARD_RAILS:
350
350
  raise GuardRailsException(response_content.get("progress", {}))
351
351
 
352
- # @TODO: Find some way to tunnel the ABORT_REASON out. Azure doesn't have this, but it's handy
353
- return status == "COMPLETED" or status == "ABORTED"
352
+ return TxnStatusResponse(
353
+ txn_id=txn_id,
354
+ finished=status in ["COMPLETED", "ABORTED"],
355
+ abort_reason=response_content.get("abort_reason", None),
356
+ progress=response_content.get("progress", None),
357
+ )
354
358
 
355
359
  def _list_exec_async_artifacts(self, txn_id: str, headers: Dict[str, str] | None = None) -> Dict[str, Dict]:
356
360
  """Grab the list of artifacts produced in the transaction and the URLs to retrieve their contents."""
@@ -15,7 +15,7 @@ import hashlib
15
15
  from dataclasses import dataclass
16
16
 
17
17
  from ....auth.token_handler import TokenHandler
18
- from relationalai.clients.exec_txn_poller import ExecTxnPoller
18
+ from ....clients.exec_txn_poller import ExecTxnPoller
19
19
  import snowflake.snowpark
20
20
 
21
21
  from ....rel_utils import sanitize_identifier, to_fqn_relation_name
@@ -104,14 +104,16 @@ TERMINAL_TXN_STATES = ["COMPLETED", "ABORTED"]
104
104
  TXN_ABORT_REASON_TIMEOUT = "transaction timeout"
105
105
  GUARDRAILS_ABORT_REASON = "guard rail violation"
106
106
 
107
- PRINT_TXN_PROGRESS_FLAG = "print_txn_progress"
107
+ ENABLE_GUARD_RAILS_FLAG = "enable_guard_rails"
108
+
109
+ ENABLE_GUARD_RAILS_HEADER = "X-RAI-Enable-Guard-Rails"
108
110
 
109
111
  #--------------------------------------------------
110
112
  # Helpers
111
113
  #--------------------------------------------------
112
114
 
113
- def should_print_txn_progress(config) -> bool:
114
- return bool(config.get(PRINT_TXN_PROGRESS_FLAG, False))
115
+ def should_enable_guard_rails(config) -> bool:
116
+ return bool(config.get(ENABLE_GUARD_RAILS_FLAG, False))
115
117
 
116
118
  #--------------------------------------------------
117
119
  # Resources
@@ -151,6 +153,14 @@ class TxnCreationResult:
151
153
  artifact_info: Dict[str, Dict] # Populated if fast-path (state is COMPLETED/ABORTED)
152
154
 
153
155
 
156
+ @dataclass
157
+ class TxnStatusResponse:
158
+ """Transaction progress response for transaction status checks."""
159
+ txn_id: str
160
+ finished: bool
161
+ abort_reason: str | None = None
162
+ progress: Dict | None = None
163
+
154
164
  class Resources(ResourcesBase):
155
165
  def __init__(
156
166
  self,
@@ -1403,7 +1413,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1403
1413
  # Exec Async
1404
1414
  #--------------------------------------------------
1405
1415
 
1406
- def _check_exec_async_status(self, txn_id: str, headers: Dict | None = None):
1416
+ def _check_exec_async_status(self, txn_id: str, headers: Dict | None = None) -> TxnStatusResponse:
1407
1417
  """Check whether the given transaction has completed."""
1408
1418
  if headers is None:
1409
1419
  headers = {}
@@ -1433,8 +1443,11 @@ Otherwise, remove it from your '{profile}' configuration profile.
1433
1443
  elif response_row.get("ABORT_REASON", "") == GUARDRAILS_ABORT_REASON:
1434
1444
  raise GuardRailsException()
1435
1445
 
1436
- # @TODO: Find some way to tunnel the ABORT_REASON out. Azure doesn't have this, but it's handy
1437
- return status == "COMPLETED" or status == "ABORTED"
1446
+ return TxnStatusResponse(
1447
+ txn_id=txn_id,
1448
+ finished=status in ["COMPLETED", "ABORTED"],
1449
+ abort_reason=response_row.get("ABORT_REASON", None),
1450
+ )
1438
1451
 
1439
1452
 
1440
1453
  def _list_exec_async_artifacts(self, txn_id: str, headers: Dict | None = None) -> Dict[str, Dict]:
@@ -1788,10 +1801,8 @@ Otherwise, remove it from your '{profile}' configuration profile.
1788
1801
 
1789
1802
  with debugging.span("transaction", **query_attrs_dict) as txn_span:
1790
1803
  txn_start_time = time.time()
1791
- print_txn_progress = should_print_txn_progress(self.config)
1792
-
1793
1804
  with ExecTxnPoller(
1794
- print_txn_progress=print_txn_progress,
1805
+ config=self.config,
1795
1806
  resource=self, txn_id=None, headers=request_headers,
1796
1807
  txn_start_time=txn_start_time
1797
1808
  ) as poller:
@@ -1800,6 +1811,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1800
1811
  request_headers['user-agent'] = get_pyrel_version(self.generation)
1801
1812
  request_headers['gi_setup_skipped'] = str(gi_setup_skipped)
1802
1813
  request_headers['pyrel_program_id'] = debugging.get_program_span_id() or ""
1814
+ request_headers[ENABLE_GUARD_RAILS_HEADER] = str(should_enable_guard_rails(self.config))
1803
1815
 
1804
1816
  # Create the transaction
1805
1817
  result = self._create_v2_txn(
@@ -66,7 +66,7 @@ ERP_CHECK_FREQUENCY = 15
66
66
 
67
67
  # Polling behavior constants
68
68
  POLL_OVERHEAD_RATE = 0.1 # Overhead rate for exponential backoff
69
- POLL_MAX_DELAY = 2.5 # Maximum delay between polls in seconds
69
+ POLL_MAX_DELAY = 0 # Maximum delay between polls in seconds
70
70
 
71
71
  # SQL query template for getting stream column hashes
72
72
  # This query calculates a hash of column metadata (name, type, precision, scale, nullable)
@@ -533,6 +533,14 @@ class Solver:
533
533
  self.engine_size = engine_size or settings.pop("engine_size", None)
534
534
  self.engine_auto_suspend_mins = auto_suspend_mins or settings.pop("auto_suspend_mins", None)
535
535
 
536
+ # Set default CSV store setting if not already configured
537
+ if "store" not in settings:
538
+ settings["store"] = {}
539
+ if "csv" not in settings["store"]:
540
+ settings["store"]["csv"] = {}
541
+ if "enabled" not in settings["store"]["csv"]:
542
+ settings["store"]["csv"]["enabled"] = True
543
+
536
544
  # The settings are used when creating a solver engine, they
537
545
  # may configure each individual solver.
538
546
  self.engine_settings = settings
@@ -214,6 +214,7 @@ class Table():
214
214
  self._col_names = cols
215
215
  self._iceberg_config = config
216
216
  self._is_iceberg = config is not None
217
+ self._skip_cdc = False
217
218
  info = self._schemas.get((self._database, self._schema))
218
219
  if not info:
219
220
  info = self._schemas[(self._database, self._schema)] = SchemaInfo(self._database, self._schema)
@@ -303,7 +304,10 @@ class Table():
303
304
 
304
305
  def _compile_lookup(self, compiler:b.Compiler, ctx:b.CompilerContext):
305
306
  self._lazy_init()
306
- Table._used_sources.add(self)
307
+ if not self._skip_cdc:
308
+ # Don't do CDC if the underlying data has been loaded
309
+ # directly via `api.load_data`.
310
+ Table._used_sources.add(self)
307
311
  compiler.lookup(self._rel, ctx)
308
312
  return compiler.lookup(b.RelationshipFieldRef(None, self._rel, 0), ctx)
309
313
 
@@ -10,8 +10,9 @@ from snowflake.snowpark import Session
10
10
 
11
11
  from relationalai import debugging
12
12
  from relationalai.errors import NonDefaultLQPSemanticsVersionWarning
13
- from relationalai.semantics.lqp import result_helpers
13
+ from relationalai.semantics.lqp import result_helpers, export_rewriter
14
14
  from relationalai.semantics.metamodel import ir, factory as f, executor as e
15
+ from relationalai.semantics.metamodel.visitor import collect_by_type
15
16
 
16
17
  if TYPE_CHECKING:
17
18
  from relationalai.semantics.internal.internal import Model as InternalModel
@@ -368,7 +369,7 @@ class LQPExecutor(e.Executor):
368
369
  meta=None,
369
370
  )
370
371
 
371
- def compile_lqp(self, model: ir.Model, task: ir.Task):
372
+ def compile_lqp(self, model: ir.Model, task: ir.Task, format: Optional[Literal["pandas", "snowpark", "csv"]] = "pandas"):
372
373
  configure = self._construct_configure()
373
374
  # Merge the epochs into a single transaction. Long term the query bits should all
374
375
  # go into a WhatIf action and the intrinsics could be fused with either of them. But
@@ -394,6 +395,21 @@ class LQPExecutor(e.Executor):
394
395
  result, final_model = self.compiler.compile_inner(query, options)
395
396
  export_info, query_epoch = result
396
397
 
398
+ if format == "csv":
399
+ # Extract original column names from Output
400
+ outputs = collect_by_type(ir.Output, task)
401
+ assert outputs, "No Output found in the task"
402
+ assert len(outputs) == 1, "Multiple Outputs found in the task"
403
+ output = outputs[0]
404
+ original_cols = []
405
+ for alias, _ in output.aliases:
406
+ if not alias:
407
+ continue
408
+ original_cols.append(alias)
409
+ # Use rewriter to filter data_columns
410
+ column_filter = export_rewriter.ExtraColumnsFilter(original_cols)
411
+ query_epoch = column_filter.filter_epoch(query_epoch)
412
+
397
413
  epochs.append(query_epoch)
398
414
  epochs.append(self._compile_undefine_query(query_epoch))
399
415
 
@@ -417,8 +433,7 @@ class LQPExecutor(e.Executor):
417
433
  ) -> DataFrame:
418
434
  self.prepare_data()
419
435
  previous_model = self._last_model
420
-
421
- final_model, export_info, txn_proto = self.compile_lqp(model, task)
436
+ final_model, export_info, txn_proto = self.compile_lqp(model, task, format=format)
422
437
 
423
438
  if self.dry_run:
424
439
  return DataFrame()
@@ -440,11 +455,13 @@ class LQPExecutor(e.Executor):
440
455
  nowait_durable=True,
441
456
  headers=headers,
442
457
  )
443
- assert isinstance(raw_results, TransactionAsyncResponse)
458
+ assert isinstance(raw_results, TransactionAsyncResponse), "Expected TransactionAsyncResponse from LQP execution"
459
+ assert raw_results.transaction is not None, "Transaction result is missing"
460
+ txid = raw_results.transaction['id']
444
461
 
445
462
  try:
446
- cols, extra_cols = self._compute_cols(task, final_model)
447
- df, errs = result_helpers.format_results(raw_results, cols)
463
+ cols, extra_cols, key_locs = self._compute_cols(task, final_model)
464
+ df, errs = result_helpers.format_results(raw_results, cols, key_locs)
448
465
  self.report_errors(errs)
449
466
 
450
467
  # Rename columns if wide outputs is enabled
@@ -453,7 +470,6 @@ class LQPExecutor(e.Executor):
453
470
 
454
471
  if export_to:
455
472
  assert cols, "No columns found in the output"
456
- assert raw_results.transaction, "Invalid transaction result"
457
473
  assert export_info, "Export info should be populated if we are exporting results"
458
474
  result_cols = export_to._col_names
459
475
  if result_cols is not None:
@@ -461,14 +477,18 @@ class LQPExecutor(e.Executor):
461
477
  else:
462
478
  result_cols = [col for col in cols if col not in extra_cols]
463
479
  assert result_cols
464
- self._export(raw_results.transaction['id'], export_info, export_to, cols, result_cols, update)
480
+ self._export(txid, export_info, export_to, cols, result_cols, update)
465
481
 
466
482
  if format == "csv":
467
483
  if export_info is not None and isinstance(export_info, tuple) and isinstance(export_info[0], str):
468
- return DataFrame([export_info[0]], columns=["path"])
484
+ # The full CSV path has two parts. The first part is chosen by the frontend, while
485
+ # the second part is chosen by the backend to avoid collisions. We need to ensure
486
+ # the second part is synchronized with the future changes in the backend.
487
+ full_path = export_info[0] + f"/data_{txid}.gz"
488
+ return DataFrame([full_path], columns=["path"])
469
489
  else:
470
490
  raise ValueError("The CSV export was not successful!")
471
-
491
+
472
492
  return self._postprocess_df(self.config, df, extra_cols)
473
493
 
474
494
  except Exception as e:
@@ -0,0 +1,40 @@
1
+ #----------------------------------------------------------------------------------------------
2
+ # This is a custom LQP rewriter that filters extra columns from CSV export. It is used in the
3
+ # LQP executor, when the format="csv", to ensure only intended columns are being exported.
4
+ #----------------------------------------------------------------------------------------------
5
+
6
+ from dataclasses import replace
7
+ from lqp import ir as lqp_ir
8
+
9
+ class ExtraColumnsFilter:
10
+
11
+ def __init__(self, original_cols: list[str]):
12
+ self.original_cols = set(original_cols)
13
+
14
+ def filter_epoch(self, query_epoch: lqp_ir.Epoch) -> lqp_ir.Epoch:
15
+
16
+ # Only process epochs with a single read which is dedicated to Export
17
+ if not (query_epoch.reads and len(query_epoch.reads) == 1):
18
+ return query_epoch
19
+
20
+ old_read = query_epoch.reads[0]
21
+ if not isinstance(old_read.read_type, lqp_ir.Export):
22
+ return query_epoch
23
+
24
+ config = old_read.read_type.config
25
+ assert isinstance(config, lqp_ir.ExportCSVConfig) and config.data_columns is not None, \
26
+ "Expected ExportCSVConfig with data_columns in the read type"
27
+
28
+ data_columns = config.data_columns
29
+
30
+ # Filter data_columns to only include columns in original_cols
31
+ new_data_columns = [col for col in data_columns if col.column_name in self.original_cols]
32
+
33
+ # Reconstruct the nested structure with filtered data_columns
34
+ new_config = replace(old_read.read_type.config, data_columns=new_data_columns)
35
+ new_read_type = replace(old_read.read_type, config=new_config)
36
+ new_read = replace(old_read, read_type=new_read_type)
37
+
38
+ # Return new epoch with updated read
39
+ remaining_reads = list(query_epoch.reads[1:])
40
+ return replace(query_epoch, reads=[new_read] + remaining_reads)
@@ -126,34 +126,43 @@ def _translate_to_decls(ctx: TranslationCtx, rule: ir.Logical) -> list[lqp.Decla
126
126
  def _translate_to_constraint_decls(ctx: TranslationCtx, rule: ir.Logical) -> list[lqp.Declaration]:
127
127
  constraint_decls: list[lqp.Declaration] = []
128
128
  for task in rule.body:
129
- assert isinstance(task, ir.Require)
130
- fd = normalized_fd(task)
131
- assert fd is not None
132
-
133
- # check for unresolved types
134
- if any(types.is_any(var.type) for var in fd.keys + fd.values):
135
- warn(f"Ignoring FD with unresolved type: {fd}")
129
+ if isinstance(task, ir.Logical):
130
+ constraint_decls.extend(_translate_to_constraint_decls(ctx, task))
136
131
  continue
137
-
138
- lqp_typed_keys = [_translate_term(ctx, key) for key in fd.keys]
139
- lqp_typed_values = [_translate_term(ctx, value) for value in fd.values]
140
- lqp_typed_vars:list[Tuple[lqp.Var, lqp.Type]] = lqp_typed_keys + lqp_typed_values # type: ignore
141
- lqp_guard_atoms = [_translate_to_atom(ctx, atom) for atom in fd.guard]
142
- lqp_guard = mk_abstraction(lqp_typed_vars, mk_and(lqp_guard_atoms))
143
- lqp_keys:list[lqp.Var] = [var for (var, _) in lqp_typed_keys] # type: ignore
144
- lqp_values:list[lqp.Var] = [var for (var, _) in lqp_typed_values] # type: ignore
145
-
146
- fd_decl = lqp.FunctionalDependency(
147
- guard=lqp_guard,
148
- keys=lqp_keys,
149
- values=lqp_values,
150
- meta=None
151
- )
152
-
153
- constraint_decls.append(fd_decl)
154
-
132
+ else:
133
+ assert isinstance(task, ir.Require)
134
+ decl = _translate_to_constraint_decl(ctx, task)
135
+ if decl is not None:
136
+ constraint_decls.append(decl)
155
137
  return constraint_decls
156
138
 
139
+ def _translate_to_constraint_decl(ctx: TranslationCtx, rule: ir.Require) -> Optional[lqp.Declaration]:
140
+ fd = normalized_fd(rule)
141
+ assert fd is not None
142
+
143
+ # check for unresolved types
144
+ if any(types.is_any(var.type) for var in fd.keys + fd.values):
145
+ warn(f"Ignoring FD with unresolved type: {fd}")
146
+ return None
147
+
148
+ lqp_typed_keys = [_translate_term(ctx, key) for key in fd.keys]
149
+ lqp_typed_values = [_translate_term(ctx, value) for value in fd.values]
150
+ lqp_typed_vars:list[Tuple[lqp.Var, lqp.Type]] = lqp_typed_keys + lqp_typed_values # type: ignore
151
+ lqp_guard_atoms = [_translate_to_atom(ctx, atom) for atom in fd.guard]
152
+ lqp_guard = mk_abstraction(lqp_typed_vars, mk_and(lqp_guard_atoms))
153
+ lqp_keys:list[lqp.Var] = [var for (var, _) in lqp_typed_keys] # type: ignore
154
+ lqp_values:list[lqp.Var] = [var for (var, _) in lqp_typed_values] # type: ignore
155
+ lqp_id = utils.lqp_hash(fd.canonical_str)
156
+ lqp_name:lqp.RelationId = lqp.RelationId(id=lqp_id, meta=None)
157
+
158
+ return lqp.FunctionalDependency(
159
+ name=lqp_name,
160
+ guard=lqp_guard,
161
+ keys=lqp_keys,
162
+ values=lqp_values,
163
+ meta=None
164
+ )
165
+
157
166
  def _translate_algorithms(ctx: TranslationCtx, task: ir.Logical) -> list[lqp.Declaration]:
158
167
  assert is_algorithm_logical(task)
159
168
  decls: list[lqp.Declaration] = []