relationalai 0.13.4__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.4 → relationalai-0.13.5}/PKG-INFO +1 -1
  2. {relationalai-0.13.4 → relationalai-0.13.5}/pyproject.toml +1 -1
  3. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/exec_txn_poller.py +51 -20
  4. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/local.py +15 -7
  5. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/__init__.py +2 -2
  6. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/direct_access_resources.py +8 -4
  7. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/snowflake.py +16 -11
  8. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/solvers.py +8 -0
  9. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/executor.py +3 -3
  10. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/model2lqp.py +34 -28
  11. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/passes.py +6 -3
  12. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/result_helpers.py +76 -12
  13. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/__init__.py +2 -0
  14. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/extract_common.py +3 -1
  15. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/extract_keys.py +85 -20
  16. relationalai-0.13.5/src/relationalai/semantics/lqp/rewrite/flatten_script.py +301 -0
  17. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/functional_dependencies.py +12 -7
  18. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/quantify_vars.py +12 -3
  19. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/unify_definitions.py +9 -3
  20. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/dependency.py +9 -0
  21. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/executor.py +17 -10
  22. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/__init__.py +2 -1
  23. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/flatten.py +1 -2
  24. relationalai-0.13.5/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +256 -0
  25. relationalai-0.13.5/src/relationalai/semantics/metamodel/rewrite/handle_aggregations_and_ranks.py +237 -0
  26. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/typer.py +1 -1
  27. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/solvers_pb.py +101 -107
  28. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/rel/compiler.py +7 -3
  29. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/rel/executor.py +1 -1
  30. relationalai-0.13.5/src/relationalai/tools/txn_progress.py +188 -0
  31. relationalai-0.13.4/src/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -171
  32. {relationalai-0.13.4 → relationalai-0.13.5}/.gitignore +0 -0
  33. {relationalai-0.13.4 → relationalai-0.13.5}/LICENSE +0 -0
  34. {relationalai-0.13.4 → relationalai-0.13.5}/docs/pypi/README.md +0 -0
  35. {relationalai-0.13.4 → relationalai-0.13.5}/frontend/debugger/dist/.gitignore +0 -0
  36. {relationalai-0.13.4 → relationalai-0.13.5}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  37. {relationalai-0.13.4 → relationalai-0.13.5}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
  38. {relationalai-0.13.4 → relationalai-0.13.5}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
  39. {relationalai-0.13.4 → relationalai-0.13.5}/frontend/debugger/dist/index.html +0 -0
  40. {relationalai-0.13.4 → relationalai-0.13.5}/src/__init__.py +0 -0
  41. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/__init__.py +0 -0
  42. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/events/__init__.py +0 -0
  43. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/procedures/__init__.py +0 -0
  44. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/procedures/procedure.py +0 -0
  45. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/rel/__init__.py +0 -0
  46. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/tables/__init__.py +0 -0
  47. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/tasks/__init__.py +0 -0
  48. {relationalai-0.13.4 → relationalai-0.13.5}/src/raitoolkit/tasks/task.py +0 -0
  49. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/__init__.py +0 -0
  50. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/analysis/__init__.py +0 -0
  51. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/analysis/mechanistic.py +0 -0
  52. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/analysis/whynot.py +0 -0
  53. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/auth/__init__.py +0 -0
  54. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/auth/jwt_generator.py +0 -0
  55. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/auth/oauth_callback_server.py +0 -0
  56. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/auth/token_handler.py +0 -0
  57. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/auth/util.py +0 -0
  58. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/__init__.py +0 -0
  59. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/client.py +0 -0
  60. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/config.py +0 -0
  61. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/direct_access_client.py +0 -0
  62. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/hash_util.py +0 -0
  63. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/profile_polling.py +0 -0
  64. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/__init__.py +0 -0
  65. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/azure/azure.py +0 -0
  66. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/cache_store.py +0 -0
  67. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/cli_resources.py +0 -0
  68. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/engine_service.py +0 -0
  69. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/engine_state_handlers.py +0 -0
  70. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/error_handlers.py +0 -0
  71. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/export_procedure.py.jinja +0 -0
  72. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/resources_factory.py +0 -0
  73. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/use_index_poller.py +0 -0
  74. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/use_index_resources.py +0 -0
  75. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/resources/snowflake/util.py +0 -0
  76. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/result_helpers.py +0 -0
  77. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/types.py +0 -0
  78. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/clients/util.py +0 -0
  79. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/compiler.py +0 -0
  80. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/debugging.py +0 -0
  81. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/dependencies.py +0 -0
  82. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/docutils.py +0 -0
  83. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/dsl.py +0 -0
  84. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/__init__.py +0 -0
  85. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/__init__.py +0 -0
  86. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/builder/__init__.py +0 -0
  87. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/snowflake/__init__.py +0 -0
  88. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/__init__.py +0 -0
  89. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/decimals/__init__.py +0 -0
  90. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/integers/__init__.py +0 -0
  91. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/math/__init__.py +0 -0
  92. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/builder/std/strings/__init__.py +0 -0
  93. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/devtools/__init__.py +0 -0
  94. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -0
  95. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -0
  96. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/__init__.py +0 -0
  97. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
  98. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
  99. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -0
  100. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
  101. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/orm/parser.py +0 -0
  102. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
  103. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
  104. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
  105. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
  106. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
  107. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/common.py +0 -0
  108. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/csv.py +0 -0
  109. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
  110. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
  111. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/bindings/snowflake.py +0 -0
  112. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
  113. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/binder.py +0 -0
  114. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
  115. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/helpers.py +0 -0
  116. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/relations.py +0 -0
  117. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/codegen/weaver.py +0 -0
  118. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/constants.py +0 -0
  119. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
  120. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
  121. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
  122. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
  123. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
  124. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  125. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
  126. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
  127. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
  128. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/context.py +0 -0
  129. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/cset.py +0 -0
  130. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
  131. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
  132. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
  133. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/instances.py +0 -0
  134. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
  135. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
  136. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
  137. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
  138. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
  139. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/relations.py +0 -0
  140. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/rules.py +0 -0
  141. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/stack.py +0 -0
  142. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
  143. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
  144. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
  145. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
  146. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
  147. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
  148. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
  149. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
  150. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
  151. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
  152. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
  153. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/core/utils.py +0 -0
  154. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
  155. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/compiler.py +0 -0
  156. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ir/executor.py +0 -0
  157. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
  158. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
  159. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/export.py +0 -0
  160. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/models.py +0 -0
  161. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/python_printer.py +0 -0
  162. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
  163. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
  164. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/relationships.py +0 -0
  165. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
  166. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/ontologies/subtyping.py +0 -0
  167. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
  168. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
  169. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
  170. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -0
  171. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
  172. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -0
  173. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/measures.py +0 -0
  174. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -0
  175. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/models.py +0 -0
  176. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -0
  177. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/printer.py +0 -0
  178. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
  179. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/reasoners.py +0 -0
  180. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/relations.py +0 -0
  181. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/relationships.py +0 -0
  182. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/types.py +0 -0
  183. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
  184. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
  185. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
  186. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
  187. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/relations.py +0 -0
  188. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/rulesets.py +0 -0
  189. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
  190. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
  191. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
  192. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
  193. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
  194. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
  195. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
  196. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialization.py +0 -0
  197. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
  198. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
  199. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
  200. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
  201. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
  202. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/api.py +0 -0
  203. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/snow/common.py +0 -0
  204. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
  205. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
  206. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
  207. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
  208. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
  209. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/entities.py +0 -0
  210. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/types/values.py +0 -0
  211. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/dsl/utils.py +0 -0
  212. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/graphs/__init__.py +0 -0
  213. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/__init__.py +0 -0
  214. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/compiler/__init__.py +0 -0
  215. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/constructors/__init__.py +0 -0
  216. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/executor/__init__.py +0 -0
  217. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/ir/__init__.py +0 -0
  218. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/passes/__init__.py +0 -0
  219. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/pragmas/__init__.py +0 -0
  220. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/primitives/__init__.py +0 -0
  221. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/types/__init__.py +0 -0
  222. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/utils/__init__.py +0 -0
  223. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/lqp/validators/__init__.py +0 -0
  224. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/__init__.py +0 -0
  225. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/builtins/__init__.py +0 -0
  226. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/compiler/__init__.py +0 -0
  227. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/dependency/__init__.py +0 -0
  228. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/factory/__init__.py +0 -0
  229. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/helpers/__init__.py +0 -0
  230. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/ir/__init__.py +0 -0
  231. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/rewrite/__init__.py +0 -0
  232. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/typer/__init__.py +0 -0
  233. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -0
  234. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/types/__init__.py +0 -0
  235. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/util/__init__.py +0 -0
  236. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/metamodel/visitor/__init__.py +0 -0
  237. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/rel/__init__.py +0 -0
  238. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/rel/executor/__init__.py +0 -0
  239. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/rel/rel_utils/__init__.py +0 -0
  240. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/rel/rewrite/__init__.py +0 -0
  241. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/solvers/__init__.py +0 -0
  242. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/sql/__init__.py +0 -0
  243. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
  244. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/sql/rewrite/__init__.py +0 -0
  245. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/tests/__init__.py +0 -0
  246. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/tests/logging/__init__.py +0 -0
  247. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -0
  248. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/early_access/tests/utils/__init__.py +0 -0
  249. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/__init__.py +0 -0
  250. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/base.py +0 -0
  251. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/ci.py +0 -0
  252. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/colab.py +0 -0
  253. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/generic.py +0 -0
  254. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/hex.py +0 -0
  255. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/ipython.py +0 -0
  256. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/jupyter.py +0 -0
  257. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/snowbook.py +0 -0
  258. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/environments/terminal.py +0 -0
  259. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/errors.py +0 -0
  260. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/SF.py +0 -0
  261. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/__init__.py +0 -0
  262. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/graphs.py +0 -0
  263. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/inspect.py +0 -0
  264. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
  265. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/api.py +0 -0
  266. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
  267. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
  268. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
  269. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
  270. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
  271. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/filter.py +0 -0
  272. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
  273. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/options.py +0 -0
  274. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
  275. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
  276. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/transition.py +0 -0
  277. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/pathfinder/utils.py +0 -0
  278. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/README.md +0 -0
  279. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/__init__.py +0 -0
  280. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/api.py +0 -0
  281. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/benchmarks/__init__.py +0 -0
  282. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -0
  283. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/code_organization.md +0 -0
  284. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/Movies.ipynb +0 -0
  285. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/basic_example.py +0 -0
  286. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -0
  287. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movie_example.py +0 -0
  288. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/actedin.csv +0 -0
  289. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/directed.csv +0 -0
  290. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/follows.csv +0 -0
  291. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/movies.csv +0 -0
  292. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/person.csv +0 -0
  293. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/produced.csv +0 -0
  294. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/ratings.csv +0 -0
  295. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/movies_data/wrote.csv +0 -0
  296. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/paths_benchmark.py +0 -0
  297. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/paths_example.py +0 -0
  298. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -0
  299. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/find_paths_via_automaton.py +0 -0
  300. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/graph.py +0 -0
  301. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/__init__.py +0 -0
  302. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -0
  303. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -0
  304. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -0
  305. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/single.py +0 -0
  306. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -0
  307. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -0
  308. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -0
  309. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -0
  310. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/path_algorithms/usp.py +0 -0
  311. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/product_graph.py +0 -0
  312. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/__init__.py +0 -0
  313. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/automaton.py +0 -0
  314. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/diagnostics.py +0 -0
  315. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/filter.py +0 -0
  316. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/glushkov.py +0 -0
  317. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/rpq.py +0 -0
  318. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/rpq/transition.py +0 -0
  319. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -0
  320. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -0
  321. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -0
  322. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -0
  323. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -0
  324. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -0
  325. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -0
  326. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -0
  327. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -0
  328. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_paths.py +0 -0
  329. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_walks.py +0 -0
  330. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -0
  331. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -0
  332. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -0
  333. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -0
  334. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -0
  335. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -0
  336. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -0
  337. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/tree_agg.py +0 -0
  338. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/__init__.py +0 -0
  339. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/iterators.py +0 -0
  340. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/prefix_sum.py +0 -0
  341. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/experimental/paths/utilities/utilities.py +0 -0
  342. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/loaders/__init__.py +0 -0
  343. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/loaders/csv.py +0 -0
  344. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/loaders/loader.py +0 -0
  345. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/loaders/types.py +0 -0
  346. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/metagen.py +0 -0
  347. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/metamodel.py +0 -0
  348. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/rel.py +0 -0
  349. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/rel_emitter.py +0 -0
  350. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/rel_utils.py +0 -0
  351. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/__init__.py +0 -0
  352. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/designs/query_builder/identify_by.md +0 -0
  353. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/devtools/__init__.py +0 -0
  354. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/devtools/benchmark_lqp.py +0 -0
  355. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/devtools/compilation_manager.py +0 -0
  356. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/devtools/extract_lqp.py +0 -0
  357. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/internal/__init__.py +0 -0
  358. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/internal/annotations.py +0 -0
  359. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/internal/internal.py +0 -0
  360. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/internal/snowflake.py +0 -0
  361. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/README.md +0 -0
  362. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/__init__.py +0 -0
  363. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/algorithms.py +0 -0
  364. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/builtins.py +0 -0
  365. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/compiler.py +0 -0
  366. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/constructors.py +0 -0
  367. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/export_rewriter.py +0 -0
  368. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/intrinsics.py +0 -0
  369. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/ir.py +0 -0
  370. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/pragmas.py +0 -0
  371. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/primitives.py +0 -0
  372. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/algorithm.py +0 -0
  373. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -0
  374. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/cdc.py +0 -0
  375. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/constants_to_vars.py +0 -0
  376. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/deduplicate_vars.py +0 -0
  377. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/eliminate_data.py +0 -0
  378. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -0
  379. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/period_math.py +0 -0
  380. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/rewrite/splinter.py +0 -0
  381. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/types.py +0 -0
  382. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/utils.py +0 -0
  383. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/lqp/validators.py +0 -0
  384. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/__init__.py +0 -0
  385. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/builtins.py +0 -0
  386. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/compiler.py +0 -0
  387. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/dataflow.py +0 -0
  388. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/factory.py +0 -0
  389. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/helpers.py +0 -0
  390. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/ir.py +0 -0
  391. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -0
  392. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -0
  393. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -0
  394. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/__init__.py +0 -0
  395. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/typer/checker.py +0 -0
  396. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/types.py +0 -0
  397. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/util.py +0 -0
  398. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/metamodel/visitor.py +0 -0
  399. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/__init__.py +0 -0
  400. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/experimental/__init__.py +0 -0
  401. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/README.md +0 -0
  402. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/__init__.py +0 -0
  403. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/core.py +0 -0
  404. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -0
  405. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/graph/tests/README.md +0 -0
  406. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/__init__.py +0 -0
  407. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/common.py +0 -0
  408. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -0
  409. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/rel/__init__.py +0 -0
  410. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/rel/builtins.py +0 -0
  411. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/rel/rel.py +0 -0
  412. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/rel/rel_utils.py +0 -0
  413. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/snowflake/__init__.py +0 -0
  414. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/__init__.py +0 -0
  415. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/compiler.py +0 -0
  416. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
  417. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/duck_db.py +0 -0
  418. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/result_helpers.py +0 -0
  419. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/executor/snowflake.py +0 -0
  420. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
  421. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/denormalize.py +0 -0
  422. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/double_negation.py +0 -0
  423. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/recursive_union.py +0 -0
  424. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -0
  425. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/sql/sql.py +0 -0
  426. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/__init__.py +0 -0
  427. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/constraints.py +0 -0
  428. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/datetime.py +0 -0
  429. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/decimals.py +0 -0
  430. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/floats.py +0 -0
  431. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/integers.py +0 -0
  432. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/math.py +0 -0
  433. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/pragmas.py +0 -0
  434. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/re.py +0 -0
  435. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/std.py +0 -0
  436. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/std/strings.py +0 -0
  437. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/__init__.py +0 -0
  438. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/logging.py +0 -0
  439. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/lqp/__init__.py +0 -0
  440. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/lqp/algorithms.py +0 -0
  441. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/test_snapshot_abstract.py +0 -0
  442. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/test_snapshot_base.py +0 -0
  443. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/semantics/tests/utils.py +0 -0
  444. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/__init__.py +0 -0
  445. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/aggregates.py +0 -0
  446. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/dates.py +0 -0
  447. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/graphs.py +0 -0
  448. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/inspect.py +0 -0
  449. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/math.py +0 -0
  450. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/re.py +0 -0
  451. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/std/strings.py +0 -0
  452. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/__init__.py +0 -0
  453. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/cleanup_snapshots.py +0 -0
  454. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/cli.py +0 -0
  455. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/cli_controls.py +0 -0
  456. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/cli_helpers.py +0 -0
  457. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/constants.py +0 -0
  458. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/debugger.py +0 -0
  459. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/debugger_client.py +0 -0
  460. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/debugger_server.py +0 -0
  461. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/dev.py +0 -0
  462. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/notes +0 -0
  463. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/qb_debugger.py +0 -0
  464. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/query_utils.py +0 -0
  465. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/tools/snapshot_viewer.py +0 -0
  466. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/__init__.py +0 -0
  467. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/clean_up_databases.py +0 -0
  468. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/constants.py +0 -0
  469. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/format.py +0 -0
  470. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/graph.py +0 -0
  471. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/list_databases.py +0 -0
  472. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/otel_configuration.py +0 -0
  473. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/otel_handler.py +0 -0
  474. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/snowflake_handler.py +0 -0
  475. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/span_format_test.py +0 -0
  476. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/span_tracker.py +0 -0
  477. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/spans_file_handler.py +0 -0
  478. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/timeout.py +0 -0
  479. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai/util/tracing_handler.py +0 -0
  480. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai_test_util/__init__.py +0 -0
  481. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai_test_util/fixtures.py +0 -0
  482. {relationalai-0.13.4 → relationalai-0.13.5}/src/relationalai_test_util/snapshot.py +0 -0
  483. {relationalai-0.13.4 → 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.4
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = 'relationalai'
3
- version = '0.13.4'
3
+ version = '0.13.5'
4
4
  description = 'RelationalAI Library and CLI'
5
5
  readme="docs/pypi/README.md"
6
6
  authors = [
@@ -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,7 +104,6 @@ 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"
108
107
  ENABLE_GUARD_RAILS_FLAG = "enable_guard_rails"
109
108
 
110
109
  ENABLE_GUARD_RAILS_HEADER = "X-RAI-Enable-Guard-Rails"
@@ -113,9 +112,6 @@ ENABLE_GUARD_RAILS_HEADER = "X-RAI-Enable-Guard-Rails"
113
112
  # Helpers
114
113
  #--------------------------------------------------
115
114
 
116
- def should_print_txn_progress(config) -> bool:
117
- return bool(config.get(PRINT_TXN_PROGRESS_FLAG, False))
118
-
119
115
  def should_enable_guard_rails(config) -> bool:
120
116
  return bool(config.get(ENABLE_GUARD_RAILS_FLAG, False))
121
117
 
@@ -157,6 +153,14 @@ class TxnCreationResult:
157
153
  artifact_info: Dict[str, Dict] # Populated if fast-path (state is COMPLETED/ABORTED)
158
154
 
159
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
+
160
164
  class Resources(ResourcesBase):
161
165
  def __init__(
162
166
  self,
@@ -1409,7 +1413,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1409
1413
  # Exec Async
1410
1414
  #--------------------------------------------------
1411
1415
 
1412
- 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:
1413
1417
  """Check whether the given transaction has completed."""
1414
1418
  if headers is None:
1415
1419
  headers = {}
@@ -1439,8 +1443,11 @@ Otherwise, remove it from your '{profile}' configuration profile.
1439
1443
  elif response_row.get("ABORT_REASON", "") == GUARDRAILS_ABORT_REASON:
1440
1444
  raise GuardRailsException()
1441
1445
 
1442
- # @TODO: Find some way to tunnel the ABORT_REASON out. Azure doesn't have this, but it's handy
1443
- 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
+ )
1444
1451
 
1445
1452
 
1446
1453
  def _list_exec_async_artifacts(self, txn_id: str, headers: Dict | None = None) -> Dict[str, Dict]:
@@ -1794,10 +1801,8 @@ Otherwise, remove it from your '{profile}' configuration profile.
1794
1801
 
1795
1802
  with debugging.span("transaction", **query_attrs_dict) as txn_span:
1796
1803
  txn_start_time = time.time()
1797
- print_txn_progress = should_print_txn_progress(self.config)
1798
-
1799
1804
  with ExecTxnPoller(
1800
- print_txn_progress=print_txn_progress,
1805
+ config=self.config,
1801
1806
  resource=self, txn_id=None, headers=request_headers,
1802
1807
  txn_start_time=txn_start_time
1803
1808
  ) as poller:
@@ -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
@@ -460,8 +460,8 @@ class LQPExecutor(e.Executor):
460
460
  txid = raw_results.transaction['id']
461
461
 
462
462
  try:
463
- cols, extra_cols = self._compute_cols(task, final_model)
464
- 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)
465
465
  self.report_errors(errs)
466
466
 
467
467
  # Rename columns if wide outputs is enabled
@@ -488,7 +488,7 @@ class LQPExecutor(e.Executor):
488
488
  return DataFrame([full_path], columns=["path"])
489
489
  else:
490
490
  raise ValueError("The CSV export was not successful!")
491
-
491
+
492
492
  return self._postprocess_df(self.config, df, extra_cols)
493
493
 
494
494
  except Exception as e:
@@ -126,37 +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
- lqp_id = utils.lqp_hash(fd.canonical_str)
146
- lqp_name:lqp.RelationId = lqp.RelationId(id=lqp_id, meta=None)
147
-
148
- fd_decl = lqp.FunctionalDependency(
149
- name=lqp_name,
150
- guard=lqp_guard,
151
- keys=lqp_keys,
152
- values=lqp_values,
153
- meta=None
154
- )
155
-
156
- constraint_decls.append(fd_decl)
157
-
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)
158
137
  return constraint_decls
159
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
+
160
166
  def _translate_algorithms(ctx: TranslationCtx, task: ir.Logical) -> list[lqp.Declaration]:
161
167
  assert is_algorithm_logical(task)
162
168
  decls: list[lqp.Declaration] = []
@@ -2,11 +2,12 @@ from relationalai.semantics.metamodel.compiler import Pass
2
2
  from relationalai.semantics.metamodel.typer import Checker, InferTypes
3
3
 
4
4
  from ..metamodel.rewrite import (
5
- DNFUnionSplitter, ExtractNestedLogicals, Flatten, FormatOutputs
5
+ DNFUnionSplitter, Flatten, FormatOutputs, ExtractNestedLogicals,
6
+ # HandleAggregationsAndRanks
6
7
  )
7
8
  from .rewrite import (
8
9
  AlgorithmPass, AnnotateConstraints, CDC, ConstantsToVars, DeduplicateVars,
9
- ExtractCommon, EliminateData, ExtractKeys, FunctionAnnotations, PeriodMath,
10
+ ExtractCommon, EliminateData, ExtractKeys, FlattenScript, FunctionAnnotations, PeriodMath,
10
11
  QuantifyVars, Splinter, SplitMultiCheckRequires, UnifyDefinitions,
11
12
  )
12
13
 
@@ -17,13 +18,15 @@ def lqp_passes() -> list[Pass]:
17
18
  AnnotateConstraints(),
18
19
  Checker(),
19
20
  CDC(), # specialize to physical relations before extracting nested and typing
20
- ExtractNestedLogicals(), # before InferTypes to avoid extracting casts
21
+ ExtractNestedLogicals(),
21
22
  InferTypes(),
22
23
  DNFUnionSplitter(), # Handle unions that require DNF decomposition
23
24
  ExtractKeys(), # Create a logical for each valid combinations of keys
24
25
  FormatOutputs(),
25
26
  ExtractCommon(), # Extracts tasks that will become common after Flatten into their own definition
26
27
  Flatten(), # Move nested tasks to the top level, and various related things touched along the way
28
+ FlattenScript(), # Additional flattening specific to scripts
29
+ # HandleAggregationsAndRanks(), # Handle aggregation and rank dependencies
27
30
  Splinter(), # Splits multi-headed rules into multiple rules
28
31
  QuantifyVars(), # Adds missing existentials
29
32
  EliminateData(), # Turns Data nodes into ordinary relations.
@@ -13,8 +13,12 @@ from relationalai.clients.result_helpers import format_columns, format_value, me
13
13
  sort_data_frame_result
14
14
  from relationalai.tools.constants import Generation
15
15
 
16
-
17
- def format_results(results, result_cols:List[str]|None = None) -> Tuple[DataFrame, List[Any]]:
16
+ # Convert LQP results into the expected single wide table dataframe for the end user
17
+ # - Requires identifying and unrolling all GNF relations and populating any resulting nulls
18
+ # - Relies on expected ordering of results, as we do not have IDs or names associated with columns here.
19
+ # - At the end, col names are rewritten with the expected output names blindly; we trust the stitching
20
+ # has been done correctly for the names to line up with the correct columns
21
+ def format_results(results, result_cols:List[str]|None = None, key_locations:List[int]|None = None) -> Tuple[DataFrame, List[Any]]:
18
22
  with debugging.span("format_results"):
19
23
  data_frame = DataFrame()
20
24
  problems = defaultdict(
@@ -37,8 +41,15 @@ def format_results(results, result_cols:List[str]|None = None) -> Tuple[DataFra
37
41
 
38
42
  # Check if there are any results to process
39
43
  if len(results.results):
40
- ret_cols = result_cols or []
41
- has_cols:List[DataFrame] = [DataFrame() for _ in range(0, len(ret_cols))]
44
+ ret_cols = result_cols or [] # output column names
45
+ key_locations = key_locations or [] # where output keys are located in outputs
46
+ out_keys_n = len(key_locations) # number of keys in output
47
+ assert out_keys_n <= len(ret_cols)
48
+ out_vals_n = len(ret_cols) - out_keys_n # number of values in output
49
+
50
+ # only create cols for values, we handle keys separately as they are not GNF
51
+ has_cols:List[DataFrame] = [DataFrame() for _ in range(0, out_vals_n)]
52
+ keys_data_frame = DataFrame()
42
53
  key_len = 0
43
54
 
44
55
  for result in results.results:
@@ -46,7 +57,7 @@ def format_results(results, result_cols:List[str]|None = None) -> Tuple[DataFra
46
57
  result_frame = result["table"].to_pandas()
47
58
  types = [
48
59
  t
49
- for t in result["relationId"].split("/")
60
+ for t in relation_id.split("/")
50
61
  if t != "" and not t.startswith(":")
51
62
  ]
52
63
 
@@ -168,13 +179,15 @@ def format_results(results, result_cols:List[str]|None = None) -> Tuple[DataFra
168
179
  else:
169
180
  result_frame = format_columns(result_frame, types, Generation.QB)
170
181
  result["table"] = result_frame
171
- if "/:output" in result["relationId"] \
172
- and "_cols_col" in result["relationId"]:
182
+ if "/:output" in relation_id \
183
+ and "_cols_col" in relation_id:
173
184
  # Match rows with an id like "/:output.*_cols_col[0-9]+"
174
- matched = re.search(r"_cols_col([0-9]+)", result["relationId"])
175
- assert matched, f"Column id not found for: {result['relationId']}"
185
+ # These should be all of the GNF value outputs
186
+ matched = re.search(r"_cols_col([0-9]+)", relation_id)
187
+ assert matched, f"Column id not found for: {relation_id}"
176
188
  col_ix = int(matched.group(1))
177
189
 
190
+ # Generate col names and write them into the df (idn for keys, vn for cols)
178
191
  key_cols = [f"id{i}" for i in range(0, len(result_frame.columns) - 1)]
179
192
  key_len = len(key_cols)
180
193
  result_frame.columns = [*key_cols, f"v{col_ix}"]
@@ -183,20 +196,71 @@ def format_results(results, result_cols:List[str]|None = None) -> Tuple[DataFra
183
196
  has_cols[col_ix] = result_frame
184
197
  else:
185
198
  has_cols[col_ix] = pd.concat([has_cols[col_ix], result_frame], ignore_index=True)
186
- elif ":output" in result["relationId"]:
199
+ elif ":output" in relation_id \
200
+ and "_keys" in relation_id:
201
+ # data for all keys (wide), to merge in later
202
+ keys_data_frame = result_frame
203
+
204
+ # Rename wide key col names to match key cols in df_wide_reset
205
+ keys_data_frame.columns = pd.RangeIndex(len(keys_data_frame.columns))
206
+ keys_data_frame = keys_data_frame.rename(columns=lambda c: f"id{c}")
207
+
208
+ elif ":output" in relation_id: # wide outputs case
187
209
  data_frame = pd.concat(
188
210
  [data_frame, result_frame], ignore_index=True
189
211
  )
190
212
 
213
+ # GNF values case: stitch together output vals and keys into one wide dataframe
191
214
  if any(not col.empty for col in has_cols):
215
+ # Merge value cols together by their key cols
192
216
  key_cols = [f"id{i}" for i in range(0, key_len)]
193
217
  df_wide_reset = reduce(lambda left, right: merge_columns(left, right, key_cols), has_cols)
194
- data_frame = df_wide_reset.drop(columns=key_cols)
218
+
219
+ # Join wide keys with wide vals (keys all at the front; still needs reordering)
220
+ data_frame = pd.merge(keys_data_frame, df_wide_reset, on=key_cols, how='outer')
221
+
222
+ # Reorder outputs
223
+ if key_locations:
224
+ data_frame = _shift_keys(data_frame, keys_data_frame, out_keys_n, key_locations)
225
+
226
+ else: # if no keys in output, just drop all of the key cols
227
+ data_frame = data_frame.drop(columns=key_cols)
228
+
229
+ # Empty values case: reorder/drop keys as needed
230
+ elif not keys_data_frame.empty:
231
+ if key_locations: # Reorder outputs
232
+ data_frame = _shift_keys(keys_data_frame, keys_data_frame, out_keys_n, key_locations)
233
+ else: # if there are no keys to output, we may still need to populate nulls for output values
234
+ # Take into account the cols that could contain values (even though they're empty)
235
+ key_cols = [f"id{i}" for i in range(0, len(keys_data_frame.columns))]
236
+ has_cols.append(keys_data_frame) # include the keys so we know how many nulls to generate
237
+ df_wide_reset = reduce(lambda left, right: merge_columns(left, right, key_cols), has_cols)
238
+ data_frame = df_wide_reset.drop(columns=key_cols)
195
239
 
196
240
  data_frame = sort_data_frame_result(data_frame)
197
241
 
198
- if len(ret_cols) and len(data_frame.columns) == len(ret_cols):
242
+ # Overwrite column names with user-defined names
243
+ # The assumption is that the extra keys have been chopped off the front, and the
244
+ # remaining columns are in the correct order and require renaming
245
+ if len(ret_cols) and len(data_frame.columns) <= len(ret_cols):
199
246
  if result_cols is not None:
200
247
  data_frame.columns = result_cols[: len(data_frame.columns)]
201
248
 
202
249
  return (data_frame, list(problems.values()))
250
+
251
+ # Reorder `res` df to match user-specified output order and drop non-output key cols
252
+ # E.g., Current df looks like:
253
+ # [out_key_pos1, out_key_pos4, hidden_key_1, value_pos2, value_pos3, value_pos5]
254
+ # Target df looks like:
255
+ # [out_key_pos1, value_pos2, value_pos3, out_key_pos4, value_pos5]
256
+ def _shift_keys(res:DataFrame, keys_data_frame:DataFrame, out_keys_n:int, key_locations:List[int]):
257
+ offset = len(keys_data_frame.columns) # index of first value in data frame
258
+ assert out_keys_n <= offset
259
+ extra_keys_n = offset - out_keys_n # number of keys to drop (those not in output)
260
+
261
+ # Shift output keys into the correct spots and drop the rest
262
+ for i in key_locations:
263
+ res = res[res.columns[1:].insert(i + offset - 1, res.columns[0])]
264
+ offset -= 1
265
+ res = res.drop(columns=res.columns[:extra_keys_n])
266
+ return res
@@ -7,6 +7,7 @@ from .eliminate_data import EliminateData
7
7
  from .extract_common import ExtractCommon
8
8
  from .extract_keys import ExtractKeys
9
9
  from .function_annotations import FunctionAnnotations, SplitMultiCheckRequires
10
+ from .flatten_script import FlattenScript
10
11
  from .period_math import PeriodMath
11
12
  from .quantify_vars import QuantifyVars
12
13
  from .splinter import Splinter
@@ -22,6 +23,7 @@ __all__ = [
22
23
  "ExtractCommon",
23
24
  "ExtractKeys",
24
25
  "FunctionAnnotations",
26
+ "FlattenScript",
25
27
  "PeriodMath",
26
28
  "QuantifyVars",
27
29
  "Splinter",
@@ -315,8 +315,10 @@ def _compute_local_dependencies(ctx: ExtractCommon.Context, binders: OrderedSet[
315
315
  return local_body
316
316
 
317
317
  def _is_binder(task: ir.Task):
318
+ binder_types = (ir.Lookup, ir.Construct, ir.Exists, ir.Data, ir.Not)
319
+
318
320
  # If the task itself is a binder
319
- if any(isinstance(task, binder) for binder in (ir.Lookup, ir.Construct, ir.Exists, ir.Data, ir.Not)):
321
+ if isinstance(task, binder_types):
320
322
  return True
321
323
 
322
324
  # If the task is a Logical containing only binders