relationalai 0.11.1__tar.gz → 0.11.3__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 (469) hide show
  1. {relationalai-0.11.1 → relationalai-0.11.3}/.gitignore +1 -0
  2. {relationalai-0.11.1 → relationalai-0.11.3}/PKG-INFO +1 -1
  3. {relationalai-0.11.1 → relationalai-0.11.3}/pyproject.toml +1 -1
  4. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/azure.py +7 -4
  5. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/client.py +15 -14
  6. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/config.py +4 -0
  7. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/snowflake.py +108 -28
  8. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/types.py +1 -0
  9. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/use_index_poller.py +165 -58
  10. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/dsl.py +2 -2
  11. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/std/__init__.py +1 -1
  12. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/bindings/csv.py +2 -2
  13. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/codegen/weaver.py +1 -2
  14. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/errors.py +37 -0
  15. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/solvers.py +44 -14
  16. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/devtools/extract_lqp.py +4 -1
  17. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/internal/internal.py +209 -26
  18. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/internal/snowflake.py +7 -5
  19. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/executor.py +25 -4
  20. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/model2lqp.py +56 -10
  21. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/passes.py +1 -1
  22. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/primitives.py +43 -14
  23. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/result_helpers.py +1 -1
  24. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/builtins.py +275 -12
  25. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/executor.py +2 -2
  26. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/helpers.py +78 -2
  27. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/extract_keys.py +16 -5
  28. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/typer/typer.py +23 -16
  29. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/__init__.py +0 -4
  30. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/core.py +853 -74
  31. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/executor.py +15 -6
  32. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/rel_utils.py +46 -1
  33. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/rewrite/cdc.py +6 -0
  34. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/compiler.py +568 -290
  35. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/executor/duck_db.py +4 -2
  36. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/executor/result_helpers.py +7 -0
  37. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/executor/snowflake.py +16 -5
  38. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/sql.py +106 -49
  39. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/__init__.py +13 -7
  40. relationalai-0.11.3/src/relationalai/semantics/std/datetime.py +359 -0
  41. relationalai-0.11.3/src/relationalai/semantics/std/math.py +141 -0
  42. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/strings.py +12 -1
  43. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/cli_controls.py +9 -3
  44. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/constants.py +1 -0
  45. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/qb_debugger.py +22 -9
  46. relationalai-0.11.3/src/relationalai/util/timeout.py +24 -0
  47. relationalai-0.11.1/src/relationalai/semantics/std/dates.py +0 -189
  48. relationalai-0.11.1/src/relationalai/semantics/std/math.py +0 -31
  49. {relationalai-0.11.1 → relationalai-0.11.3}/LICENSE +0 -0
  50. {relationalai-0.11.1 → relationalai-0.11.3}/docs/pypi/README.md +0 -0
  51. {relationalai-0.11.1 → relationalai-0.11.3}/frontend/debugger/dist/.gitignore +0 -0
  52. {relationalai-0.11.1 → relationalai-0.11.3}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  53. {relationalai-0.11.1 → relationalai-0.11.3}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
  54. {relationalai-0.11.1 → relationalai-0.11.3}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
  55. {relationalai-0.11.1 → relationalai-0.11.3}/frontend/debugger/dist/index.html +0 -0
  56. {relationalai-0.11.1 → relationalai-0.11.3}/src/__init__.py +0 -0
  57. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/__init__.py +0 -0
  58. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/events/__init__.py +0 -0
  59. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/procedures/__init__.py +0 -0
  60. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/procedures/procedure.py +0 -0
  61. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/rel/__init__.py +0 -0
  62. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/tables/__init__.py +0 -0
  63. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/tasks/__init__.py +0 -0
  64. {relationalai-0.11.1 → relationalai-0.11.3}/src/raitoolkit/tasks/task.py +0 -0
  65. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/__init__.py +0 -0
  66. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/analysis/__init__.py +0 -0
  67. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/analysis/mechanistic.py +0 -0
  68. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/analysis/whynot.py +0 -0
  69. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/auth/__init__.py +0 -0
  70. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/auth/jwt_generator.py +0 -0
  71. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/auth/oauth_callback_server.py +0 -0
  72. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/auth/token_handler.py +0 -0
  73. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/auth/util.py +0 -0
  74. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/__init__.py +0 -0
  75. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/cache_store.py +0 -0
  76. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/export_procedure.py.jinja +0 -0
  77. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/hash_util.py +0 -0
  78. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/profile_polling.py +0 -0
  79. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/result_helpers.py +0 -0
  80. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/clients/util.py +0 -0
  81. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/compiler.py +0 -0
  82. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/debugging.py +0 -0
  83. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/dependencies.py +0 -0
  84. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/docutils.py +0 -0
  85. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/__init__.py +0 -0
  86. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/__init__.py +0 -0
  87. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/builder/__init__.py +0 -0
  88. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/snowflake/__init__.py +0 -0
  89. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/std/decimals/__init__.py +0 -0
  90. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/std/integers/__init__.py +0 -0
  91. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/std/math/__init__.py +0 -0
  92. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/builder/std/strings/__init__.py +0 -0
  93. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/devtools/__init__.py +0 -0
  94. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -0
  95. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -0
  96. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/__init__.py +0 -0
  97. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
  98. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
  99. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -0
  100. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
  101. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/orm/parser.py +0 -0
  102. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
  103. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
  104. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
  105. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
  106. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
  107. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/bindings/common.py +0 -0
  108. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
  109. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
  110. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/bindings/snowflake.py +0 -0
  111. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
  112. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/codegen/binder.py +0 -0
  113. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
  114. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/codegen/helpers.py +0 -0
  115. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/codegen/relations.py +0 -0
  116. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/constants.py +0 -0
  117. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
  118. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
  119. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
  120. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
  121. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
  122. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  123. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
  124. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
  125. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
  126. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/context.py +0 -0
  127. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/cset.py +0 -0
  128. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
  129. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
  130. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
  131. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/instances.py +0 -0
  132. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
  133. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
  134. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
  135. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
  136. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
  137. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/relations.py +0 -0
  138. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/rules.py +0 -0
  139. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/stack.py +0 -0
  140. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
  141. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
  142. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
  143. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
  144. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
  145. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
  146. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
  147. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
  148. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
  149. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
  150. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
  151. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/core/utils.py +0 -0
  152. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
  153. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ir/compiler.py +0 -0
  154. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ir/executor.py +0 -0
  155. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
  156. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
  157. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/export.py +0 -0
  158. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/models.py +0 -0
  159. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/python_printer.py +0 -0
  160. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
  161. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
  162. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/relationships.py +0 -0
  163. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
  164. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/ontologies/subtyping.py +0 -0
  165. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
  166. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
  167. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
  168. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -0
  169. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
  170. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -0
  171. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/measures/measures.py +0 -0
  172. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -0
  173. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/models.py +0 -0
  174. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -0
  175. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/printer.py +0 -0
  176. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
  177. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/reasoners.py +0 -0
  178. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/relations.py +0 -0
  179. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/relationships.py +0 -0
  180. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/types.py +0 -0
  181. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
  182. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
  183. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
  184. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
  185. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/relations.py +0 -0
  186. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/rulesets.py +0 -0
  187. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
  188. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
  189. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
  190. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
  191. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
  192. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
  193. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
  194. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/serialization.py +0 -0
  195. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
  196. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
  197. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
  198. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
  199. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
  200. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/snow/api.py +0 -0
  201. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/snow/common.py +0 -0
  202. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
  203. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
  204. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
  205. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
  206. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
  207. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/types/entities.py +0 -0
  208. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/types/values.py +0 -0
  209. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/dsl/utils.py +0 -0
  210. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/graphs/__init__.py +0 -0
  211. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/__init__.py +0 -0
  212. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/compiler/__init__.py +0 -0
  213. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/constructors/__init__.py +0 -0
  214. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/executor/__init__.py +0 -0
  215. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/ir/__init__.py +0 -0
  216. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/passes/__init__.py +0 -0
  217. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/pragmas/__init__.py +0 -0
  218. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/primitives/__init__.py +0 -0
  219. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/types/__init__.py +0 -0
  220. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/utils/__init__.py +0 -0
  221. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/lqp/validators/__init__.py +0 -0
  222. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/__init__.py +0 -0
  223. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/builtins/__init__.py +0 -0
  224. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/compiler/__init__.py +0 -0
  225. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/dependency/__init__.py +0 -0
  226. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/factory/__init__.py +0 -0
  227. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/helpers/__init__.py +0 -0
  228. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/ir/__init__.py +0 -0
  229. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/rewrite/__init__.py +0 -0
  230. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/typer/__init__.py +0 -0
  231. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -0
  232. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/types/__init__.py +0 -0
  233. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/util/__init__.py +0 -0
  234. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/metamodel/visitor/__init__.py +0 -0
  235. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/__init__.py +0 -0
  236. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/api/__init__.py +0 -0
  237. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/benchmarks/__init__.py +0 -0
  238. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/graph/__init__.py +0 -0
  239. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/__init__.py +0 -0
  240. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/find_paths/__init__.py +0 -0
  241. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/one_sided_ball_repetition/__init__.py +0 -0
  242. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/one_sided_ball_upto/__init__.py +0 -0
  243. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/single/__init__.py +0 -0
  244. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/two_sided_balls_repetition/__init__.py +0 -0
  245. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/two_sided_balls_upto/__init__.py +0 -0
  246. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/path_algorithms/usp/__init__.py +0 -0
  247. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/rpq/__init__.py +0 -0
  248. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/utilities/__init__.py +0 -0
  249. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/paths/utilities/iterators/__init__.py +0 -0
  250. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/rel/__init__.py +0 -0
  251. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/rel/executor/__init__.py +0 -0
  252. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/rel/rel_utils/__init__.py +0 -0
  253. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/rel/rewrite/__init__.py +0 -0
  254. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/solvers/__init__.py +0 -0
  255. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/sql/__init__.py +0 -0
  256. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
  257. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/sql/rewrite/__init__.py +0 -0
  258. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/tests/__init__.py +0 -0
  259. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/tests/logging/__init__.py +0 -0
  260. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -0
  261. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/early_access/tests/utils/__init__.py +0 -0
  262. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/__init__.py +0 -0
  263. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/base.py +0 -0
  264. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/ci.py +0 -0
  265. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/colab.py +0 -0
  266. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/generic.py +0 -0
  267. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/hex.py +0 -0
  268. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/ipython.py +0 -0
  269. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/jupyter.py +0 -0
  270. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/snowbook.py +0 -0
  271. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/environments/terminal.py +0 -0
  272. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/SF.py +0 -0
  273. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/__init__.py +0 -0
  274. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/graphs.py +0 -0
  275. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/inspect.py +0 -0
  276. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
  277. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/api.py +0 -0
  278. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
  279. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
  280. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
  281. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
  282. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
  283. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/filter.py +0 -0
  284. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
  285. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/options.py +0 -0
  286. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
  287. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
  288. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/transition.py +0 -0
  289. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/pathfinder/utils.py +0 -0
  290. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/paths/__init__.py +0 -0
  291. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/paths/pathfinder.rel +0 -0
  292. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/experimental/paths/tree_agg.py +0 -0
  293. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/loaders/__init__.py +0 -0
  294. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/loaders/csv.py +0 -0
  295. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/loaders/loader.py +0 -0
  296. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/loaders/types.py +0 -0
  297. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/metagen.py +0 -0
  298. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/metamodel.py +0 -0
  299. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/rel.py +0 -0
  300. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/rel_emitter.py +0 -0
  301. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/rel_utils.py +0 -0
  302. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/__init__.py +0 -0
  303. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/designs/query_builder/identify_by.md +0 -0
  304. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/devtools/__init__.py +0 -0
  305. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/devtools/benchmark_lqp.py +0 -0
  306. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/devtools/compilation_manager.py +0 -0
  307. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/internal/__init__.py +0 -0
  308. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/internal/annotations.py +0 -0
  309. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/__init__.py +0 -0
  310. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/builtins.py +0 -0
  311. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/compiler.py +0 -0
  312. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/constructors.py +0 -0
  313. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/ir.py +0 -0
  314. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/pragmas.py +0 -0
  315. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/types.py +0 -0
  316. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/utils.py +0 -0
  317. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/lqp/validators.py +0 -0
  318. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/__init__.py +0 -0
  319. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/compiler.py +0 -0
  320. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/dataflow.py +0 -0
  321. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/dependency.py +0 -0
  322. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/factory.py +0 -0
  323. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/ir.py +0 -0
  324. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/__init__.py +0 -0
  325. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -0
  326. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -0
  327. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -0
  328. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/fd_constraints.py +0 -0
  329. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/flatten.py +0 -0
  330. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/gc_nodes.py +0 -0
  331. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/list_types.py +0 -0
  332. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/rewrite/splinter.py +0 -0
  333. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/typer/__init__.py +0 -0
  334. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/typer/checker.py +0 -0
  335. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/types.py +0 -0
  336. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/util.py +0 -0
  337. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/metamodel/visitor.py +0 -0
  338. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/README.md +0 -0
  339. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/__init__.py +0 -0
  340. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -0
  341. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/README.md +0 -0
  342. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/__init__.py +0 -0
  343. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/api.py +0 -0
  344. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/benchmarks/__init__.py +0 -0
  345. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/benchmarks/grid_graph.py +0 -0
  346. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/code_organization.md +0 -0
  347. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/Movies.ipynb +0 -0
  348. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/basic_example.py +0 -0
  349. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/minimal_engine_warmup.py +0 -0
  350. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movie_example.py +0 -0
  351. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/actedin.csv +0 -0
  352. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/directed.csv +0 -0
  353. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/follows.csv +0 -0
  354. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/movies.csv +0 -0
  355. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/person.csv +0 -0
  356. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/produced.csv +0 -0
  357. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/ratings.csv +0 -0
  358. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/wrote.csv +0 -0
  359. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/paths_benchmark.py +0 -0
  360. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/paths_example.py +0 -0
  361. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/examples/pattern_to_automaton.py +0 -0
  362. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/find_paths_via_automaton.py +0 -0
  363. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/graph.py +0 -0
  364. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/__init__.py +0 -0
  365. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/find_paths.py +0 -0
  366. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/one_sided_ball_repetition.py +0 -0
  367. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/one_sided_ball_upto.py +0 -0
  368. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/single.py +0 -0
  369. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/two_sided_balls_repetition.py +0 -0
  370. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/two_sided_balls_upto.py +0 -0
  371. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/usp-old.py +0 -0
  372. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/usp-tuple.py +0 -0
  373. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/usp.py +0 -0
  374. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/product_graph.py +0 -0
  375. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/__init__.py +0 -0
  376. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/automaton.py +0 -0
  377. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/diagnostics.py +0 -0
  378. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/filter.py +0 -0
  379. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/glushkov.py +0 -0
  380. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/rpq.py +0 -0
  381. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/rpq/transition.py +0 -0
  382. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_sp_max_length.py +0 -0
  383. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_sp_multiple.py +0 -0
  384. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_sp_single.py +0 -0
  385. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_walks_multiple.py +0 -0
  386. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_walks_single.py +0 -0
  387. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -0
  388. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_repetition_single.py +0 -0
  389. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -0
  390. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_upto_single.py +0 -0
  391. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_single_paths.py +0 -0
  392. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_single_walks.py +0 -0
  393. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_single_walks_undirected.py +0 -0
  394. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -0
  395. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_repetition_single.py +0 -0
  396. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -0
  397. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_upto_single.py +0 -0
  398. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_usp_nsp_multiple.py +0 -0
  399. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_usp_nsp_single.py +0 -0
  400. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/utilities/__init__.py +0 -0
  401. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/utilities/iterators.py +0 -0
  402. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/utilities/prefix_sum.py +0 -0
  403. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/paths/utilities/utilities.py +0 -0
  404. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/graph/tests/README.md +0 -0
  405. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/optimization/__init__.py +0 -0
  406. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/optimization/common.py +0 -0
  407. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -0
  408. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -0
  409. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/__init__.py +0 -0
  410. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/builtins.py +0 -0
  411. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/compiler.py +0 -0
  412. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/rel.py +0 -0
  413. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/rewrite/__init__.py +0 -0
  414. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/rewrite/extract_common.py +0 -0
  415. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/rel/rewrite/quantify_vars.py +0 -0
  416. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/snowflake/__init__.py +0 -0
  417. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/__init__.py +0 -0
  418. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
  419. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
  420. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/rewrite/denormalize.py +0 -0
  421. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/rewrite/double_negation.py +0 -0
  422. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/rewrite/recursive_union.py +0 -0
  423. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -0
  424. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/constraints.py +0 -0
  425. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/decimals.py +0 -0
  426. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/floats.py +0 -0
  427. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/integers.py +0 -0
  428. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/pragmas.py +0 -0
  429. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/std/std.py +0 -0
  430. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/tests/__init__.py +0 -0
  431. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/tests/logging.py +0 -0
  432. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/tests/test_snapshot_abstract.py +0 -0
  433. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/tests/test_snapshot_base.py +0 -0
  434. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/semantics/tests/utils.py +0 -0
  435. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/__init__.py +0 -0
  436. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/aggregates.py +0 -0
  437. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/dates.py +0 -0
  438. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/graphs.py +0 -0
  439. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/inspect.py +0 -0
  440. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/math.py +0 -0
  441. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/re.py +0 -0
  442. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/std/strings.py +0 -0
  443. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/__init__.py +0 -0
  444. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/cleanup_snapshots.py +0 -0
  445. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/cli.py +0 -0
  446. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/cli_helpers.py +0 -0
  447. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/debugger.py +0 -0
  448. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/debugger_client.py +0 -0
  449. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/debugger_server.py +0 -0
  450. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/dev.py +0 -0
  451. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/notes +0 -0
  452. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/tools/snapshot_viewer.py +0 -0
  453. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/__init__.py +0 -0
  454. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/clean_up_databases.py +0 -0
  455. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/constants.py +0 -0
  456. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/format.py +0 -0
  457. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/graph.py +0 -0
  458. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/list_databases.py +0 -0
  459. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/otel_configuration.py +0 -0
  460. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/otel_handler.py +0 -0
  461. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/snowflake_handler.py +0 -0
  462. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/span_format_test.py +0 -0
  463. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/span_tracker.py +0 -0
  464. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/spans_file_handler.py +0 -0
  465. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai/util/tracing_handler.py +0 -0
  466. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai_test_util/__init__.py +0 -0
  467. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai_test_util/fixtures.py +0 -0
  468. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai_test_util/snapshot.py +0 -0
  469. {relationalai-0.11.1 → relationalai-0.11.3}/src/relationalai_test_util/traceback.py +0 -0
@@ -37,3 +37,4 @@ relationalai*.zip
37
37
  logs/
38
38
  .envrc
39
39
  metadata.json
40
+ dev-notes/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: relationalai
3
- Version: 0.11.1
3
+ Version: 0.11.3
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.11.1'
3
+ version = '0.11.3'
4
4
  description = 'RelationalAI Library and CLI'
5
5
  readme="docs/pypi/README.md"
6
6
  authors = [
@@ -12,7 +12,7 @@ from pandas import DataFrame
12
12
  from relationalai import debugging
13
13
  from relationalai.clients.util import poll_with_specified_overhead
14
14
 
15
- from ..errors import EngineNotFoundException, RAIException
15
+ from ..errors import EngineNotFoundException, RAIException, AzureUnsupportedQueryTimeoutException
16
16
  from ..rel_utils import assert_no_problems
17
17
  from ..loaders.loader import emit_delete_import, import_file, list_available_resources
18
18
  from .config import Config
@@ -227,10 +227,13 @@ class Resources(ResourcesBase):
227
227
  def _exec(self, code:str, params:List[Any]|Any|None = None, raw=False, help=True):
228
228
  raise Exception("Azure doesn't support _exec")
229
229
 
230
- def exec_lqp(self, database: str, engine: str | None, raw_code: bytes, readonly=True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, bypass_index=False):
230
+ def exec_lqp(self, database: str, engine: str | None, raw_code: bytes, readonly=True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, bypass_index=False, query_timeout_mins: int | None = None):
231
231
  raise Exception("Azure doesn't support exec_lqp")
232
232
 
233
- def exec_raw(self, database:str, engine:str|None, raw_code:str, readonly=True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, raw_results=True):
233
+ def exec_raw(self, database:str, engine:str|None, raw_code:str, readonly=True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, raw_results=True, query_timeout_mins: int | None = None):
234
+ if query_timeout_mins is not None or self.config.get("query_timeout_mins", None) is not None:
235
+ config_file_path = getattr(self.config, 'file_path', None)
236
+ raise AzureUnsupportedQueryTimeoutException(config_file_path=config_file_path)
234
237
  if engine is None:
235
238
  engine = self.get_default_engine_name()
236
239
  try:
@@ -289,7 +292,7 @@ class Resources(ResourcesBase):
289
292
  # Exec format
290
293
  #--------------------------------------------------
291
294
 
292
- def exec_format(self, database: str, engine: str, raw_code: str, task:m.Task, format:str, inputs: Dict | None = None, readonly: bool = True, nowait_durable=False, skip_invalid_data=False, headers: Dict | None = None) -> Any: # @FIXME: Better type annotation
295
+ def exec_format(self, database: str, engine: str, raw_code: str, cols:List[str], format:str, inputs: Dict | None = None, readonly: bool = True, nowait_durable=False, skip_invalid_data=False, headers: Dict | None = None, query_timeout_mins: int | None = None) -> Any: # @FIXME: Better type annotation
293
296
  raise Exception("Azure doesn't support alternative formats yet")
294
297
 
295
298
  def to_model_type(self, model:dsl.Graph, name: str, source:str):
@@ -3,7 +3,7 @@ import atexit
3
3
  from datetime import datetime, timedelta, timezone
4
4
  import re
5
5
  from collections import defaultdict
6
- from typing import Dict, List, Any, Tuple, cast, Callable
6
+ from typing import Dict, List, Any, Optional, Tuple, cast, Callable
7
7
 
8
8
  from abc import ABC, abstractmethod
9
9
  from dataclasses import dataclass
@@ -401,15 +401,15 @@ class ResourcesBase(ABC):
401
401
  pass
402
402
 
403
403
  @abstractmethod
404
- def exec_lqp(self, database: str, engine: str | None, raw_code: bytes, readonly: bool = True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None) -> Any: # @FIXME: Better type annotation
404
+ def exec_lqp(self, database: str, engine: str | None, raw_code: bytes, readonly: bool = True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, query_timeout_mins: int | None = None) -> Any: # @FIXME: Better type annotation
405
405
  pass
406
406
 
407
407
  @abstractmethod
408
- def exec_raw(self, database: str, engine: str | None, raw_code: str, readonly: bool = True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None) -> Any: # @FIXME: Better type annotation
408
+ def exec_raw(self, database: str, engine: str | None, raw_code: str, readonly: bool = True, *, inputs: Dict | None = None, nowait_durable=False, headers: Dict | None = None, query_timeout_mins: Optional[int]=None) -> Any: # @FIXME: Better type annotation
409
409
  pass
410
410
 
411
411
  @abstractmethod
412
- def exec_format(self, database: str, engine: str, raw_code: str, task:m.Task, format:str, inputs: Dict | None = None, readonly: bool = True, nowait_durable=False, skip_invalid_data=False, headers: Dict | None = None) -> Any: # @FIXME: Better type annotation
412
+ def exec_format(self, database: str, engine: str, raw_code: str, cols:List[str], format:str, inputs: Dict | None = None, readonly: bool = True, nowait_durable=False, skip_invalid_data=False, headers: Dict | None = None, query_timeout_mins: Optional[int]=None) -> Any: # @FIXME: Better type annotation
413
413
  pass
414
414
 
415
415
  @abstractmethod
@@ -695,10 +695,10 @@ class Client():
695
695
  code = self.compiler.compile(dsl.build.raw_task(content))
696
696
  self._install_batch.set(path, code)
697
697
 
698
- def exec_raw(self, code:str, readonly=True, raw_results=True, inputs: Dict | None = None, internal=False, nowait_durable=None, abort_on_error=True, headers: Dict | None = None) -> DataFrame|Any:
698
+ def exec_raw(self, code:str, readonly=True, raw_results=True, inputs: Dict | None = None, internal=False, nowait_durable=None, abort_on_error=True, headers: Dict | None = None, query_timeout_mins: Optional[int]=None) -> DataFrame|Any:
699
699
  task = dsl.build.raw_task(code)
700
700
  debugging.set_source(task)
701
- return self.query(task, read_only=readonly, raw_results=raw_results, inputs=inputs, internal=internal, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error)
701
+ return self.query(task, read_only=readonly, raw_results=raw_results, inputs=inputs, internal=internal, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error, query_timeout_mins=query_timeout_mins)
702
702
 
703
703
  def exec_control(self, code:str, cb:Callable[[DataFrame]]|None=None):
704
704
  self._install_batch.control_items.append((code, cb))
@@ -719,12 +719,12 @@ class Client():
719
719
  # Query
720
720
  #--------------------------------------------------
721
721
 
722
- def _query(self, code:str, task:m.Task|None, end_span, readonly=False, inputs: Dict | None = None, nowait_durable=None, headers: Dict | None = None, abort_on_error=True):
722
+ def _query(self, code:str, task:m.Task|None, end_span, readonly=False, inputs: Dict | None = None, nowait_durable=None, headers: Dict | None = None, abort_on_error=True, query_timeout_mins: Optional[int]=None):
723
723
  if nowait_durable is None:
724
724
  nowait_durable = self.isolated
725
725
 
726
726
  try:
727
- results = self.resources.exec_raw(self._database, self.get_engine_name(), code, readonly=readonly, inputs=inputs, nowait_durable=nowait_durable, headers=headers)
727
+ results = self.resources.exec_raw(self._database, self.get_engine_name(), code, readonly=readonly, inputs=inputs, nowait_durable=nowait_durable, headers=headers, query_timeout_mins=query_timeout_mins)
728
728
  dataframe, errors = self.resources.format_results(results, task)
729
729
  end_span["results"] = dataframe
730
730
  end_span["errors"] = errors
@@ -736,13 +736,14 @@ class Client():
736
736
  engine_name = self.get_engine_name()
737
737
  self.resources.resume_engine(engine_name, headers=headers)
738
738
  # invoke _query again to retry the query
739
- return self._query(code, task, end_span, readonly=readonly, inputs=inputs, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error)
739
+ return self._query(code, task, end_span, readonly=readonly, inputs=inputs, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error, query_timeout_mins=query_timeout_mins)
740
740
  else:
741
741
  raise e
742
742
 
743
743
 
744
- def _query_format(self, code:str, task:m.Task, end_span, format, readonly=False, skip_invalid_data=False, inputs: Dict | None = None):
745
- results, raw = self.resources.exec_format(self._database, self.get_engine_name(), code, task, readonly=readonly, inputs=inputs, format=format, skip_invalid_data=skip_invalid_data)
744
+ def _query_format(self, code:str, task:m.Task, end_span, format, readonly=False, skip_invalid_data=False, inputs: Dict | None = None, query_timeout_mins: Optional[int]=None):
745
+ cols = task.return_cols(allow_dups=False)
746
+ results, raw = self.resources.exec_format(self._database, self.get_engine_name(), code, cols, readonly=readonly, inputs=inputs, format=format, skip_invalid_data=skip_invalid_data, query_timeout_mins=query_timeout_mins)
746
747
  errors = []
747
748
  if raw:
748
749
  dataframe, errors = self.resources.format_results(raw, task)
@@ -752,7 +753,7 @@ class Client():
752
753
  # return results if raw_results else dataframe
753
754
  return results, raw
754
755
 
755
- def query(self, task:m.Task, rentrant=False, read_only=False, raw_results=False, inputs: Dict | None = None, format="pandas", tag=None, nowait_durable=None, headers: Dict | None = None, internal=False, abort_on_error=True, skip_invalid_data = False) -> DataFrame|Any:
756
+ def query(self, task:m.Task, rentrant=False, read_only=False, raw_results=False, inputs: Dict | None = None, format="pandas", tag=None, nowait_durable=None, headers: Dict | None = None, internal=False, abort_on_error=True, skip_invalid_data = False, query_timeout_mins: Optional[int]=None) -> DataFrame|Any:
756
757
  if not self.dry_run and self.use_graph_index:
757
758
  self.create_database(isolated=self.isolated, headers=headers)
758
759
 
@@ -793,10 +794,10 @@ class Client():
793
794
 
794
795
  start = time.perf_counter()
795
796
  if format == "pandas":
796
- results, raw = self._query(code, task, end_span, readonly=read_only, inputs=inputs, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error)
797
+ results, raw = self._query(code, task, end_span, readonly=read_only, inputs=inputs, nowait_durable=nowait_durable, headers=headers, abort_on_error=abort_on_error, query_timeout_mins=query_timeout_mins)
797
798
  debugging.time("query", time.perf_counter() - start, DataFrame() if raw_results else results, internal=internal, source_map=source_map)
798
799
  else:
799
- results, raw = self._query_format(code, task, end_span, readonly=read_only, inputs=inputs, format=format, skip_invalid_data=skip_invalid_data)
800
+ results, raw = self._query_format(code, task, end_span, readonly=read_only, inputs=inputs, format=format, skip_invalid_data=skip_invalid_data, query_timeout_mins=query_timeout_mins)
800
801
  debugging.time("query", time.perf_counter() - start, DataFrame(), source_map=source_map, alt_format_results=results)
801
802
 
802
803
  self._install_batch.clear_dirty()
@@ -28,6 +28,10 @@ PUBLIC_CONFIG_KEYS = [
28
28
  "ensure_change_tracking",
29
29
  "download_url_type",
30
30
  "use_direct_access",
31
+ # query_timeout_mins allows to specify a timeout in minutes applied to all queries. When
32
+ # a query execution time exceeds this timeout, the query will be aborted. This is useful
33
+ # to avoid long-running queries that can incur high costs.
34
+ "query_timeout_mins",
31
35
  ]
32
36
 
33
37
  #--------------------------------------------------
@@ -21,7 +21,7 @@ from relationalai.clients.use_index_poller import DirectUseIndexPoller, UseIndex
21
21
  import snowflake.snowpark
22
22
 
23
23
  from relationalai.rel_utils import sanitize_identifier, to_fqn_relation_name
24
- from relationalai.tools.constants import FIELD_PLACEHOLDER, RAI_APP_NAME, SNOWFLAKE_AUTHS, USE_GRAPH_INDEX, USE_DIRECT_ACCESS, WAIT_FOR_STREAM_SYNC, Generation
24
+ from relationalai.tools.constants import FIELD_PLACEHOLDER, RAI_APP_NAME, SNOWFLAKE_AUTHS, USE_GRAPH_INDEX, USE_DIRECT_ACCESS, DEFAULT_QUERY_TIMEOUT_MINS, WAIT_FOR_STREAM_SYNC, Generation
25
25
  from .. import std
26
26
  from collections import defaultdict
27
27
  import requests
@@ -1516,8 +1516,11 @@ Otherwise, remove it from your '{profile}' configuration profile.
1516
1516
  request_headers: Dict | None = None,
1517
1517
  bypass_index=False,
1518
1518
  language: str = "rel",
1519
+ query_timeout_mins: int | None = None,
1519
1520
  ):
1520
1521
  assert language == "rel" or language == "lqp", "Only 'rel' and 'lqp' languages are supported"
1522
+ if query_timeout_mins is None and (timeout_value := self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS)) is not None:
1523
+ query_timeout_mins = int(timeout_value)
1521
1524
  # Depending on the shape of the input, the behavior of exec_async_v2 changes.
1522
1525
  # When using the new format (with an object), the function retrieves the
1523
1526
  # 'rai' database by hashing the model and username. In contrast, the
@@ -1526,9 +1529,23 @@ Otherwise, remove it from your '{profile}' configuration profile.
1526
1529
  # graph index to ensure the correct database is utilized.
1527
1530
  use_graph_index = self.config.get("use_graph_index", USE_GRAPH_INDEX)
1528
1531
  if use_graph_index and not bypass_index:
1529
- sql_string = f"CALL {APP_NAME}.api.exec_async_v2(?, {{'database': '{database}', 'engine': '{engine}', 'inputs': {inputs}, 'readonly': {readonly}, 'nowait_durable': {nowait_durable}, 'language': '{language}', 'headers': {request_headers}}});"
1532
+ payload = {
1533
+ 'database': database,
1534
+ 'engine': engine,
1535
+ 'inputs': inputs,
1536
+ 'readonly': readonly,
1537
+ 'nowait_durable': nowait_durable,
1538
+ 'language': language,
1539
+ 'headers': request_headers
1540
+ }
1541
+ if query_timeout_mins is not None:
1542
+ payload["timeout_mins"] = query_timeout_mins
1543
+ sql_string = f"CALL {APP_NAME}.api.exec_async_v2(?, {payload});"
1530
1544
  else:
1531
- sql_string = f"CALL {APP_NAME}.api.exec_async_v2('{database}','{engine}', ?, {inputs}, {readonly}, {nowait_durable}, '{language}', {request_headers});"
1545
+ if query_timeout_mins is not None:
1546
+ sql_string = f"CALL {APP_NAME}.api.exec_async_v2('{database}','{engine}', ?, {inputs}, {readonly}, {nowait_durable}, '{language}', {query_timeout_mins}, {request_headers});"
1547
+ else:
1548
+ sql_string = f"CALL {APP_NAME}.api.exec_async_v2('{database}','{engine}', ?, {inputs}, {readonly}, {nowait_durable}, '{language}', {request_headers});"
1532
1549
  response = self._exec(
1533
1550
  sql_string,
1534
1551
  raw_code,
@@ -1548,6 +1565,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1548
1565
  headers: Dict | None = None,
1549
1566
  bypass_index=False,
1550
1567
  language: str = "rel",
1568
+ query_timeout_mins: int | None = None,
1551
1569
  ):
1552
1570
  if inputs is None:
1553
1571
  inputs = {}
@@ -1567,6 +1585,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1567
1585
  request_headers=request_headers,
1568
1586
  bypass_index=bypass_index,
1569
1587
  language=language,
1588
+ query_timeout_mins=query_timeout_mins,
1570
1589
  )
1571
1590
 
1572
1591
  artifact_info = {}
@@ -1825,14 +1844,16 @@ Otherwise, remove it from your '{profile}' configuration profile.
1825
1844
  inputs: Dict | None = None,
1826
1845
  nowait_durable=False,
1827
1846
  headers: Dict | None = None,
1828
- bypass_index=False
1847
+ bypass_index=False,
1848
+ query_timeout_mins: int | None = None,
1829
1849
  ):
1830
1850
  raw_code_b64 = base64.b64encode(raw_code).decode("utf-8")
1831
1851
 
1832
1852
  try:
1833
1853
  return self._exec_async_v2(
1834
1854
  database, engine, raw_code_b64, inputs, readonly, nowait_durable,
1835
- headers=headers, bypass_index=bypass_index, language='lqp'
1855
+ headers=headers, bypass_index=bypass_index, language='lqp',
1856
+ query_timeout_mins=query_timeout_mins,
1836
1857
  )
1837
1858
  except Exception as e:
1838
1859
  err_message = str(e).lower()
@@ -1840,7 +1861,8 @@ Otherwise, remove it from your '{profile}' configuration profile.
1840
1861
  self.auto_create_engine(engine)
1841
1862
  self._exec_async_v2(
1842
1863
  database, engine, raw_code_b64, inputs, readonly, nowait_durable,
1843
- headers=headers, bypass_index=bypass_index, language='lqp'
1864
+ headers=headers, bypass_index=bypass_index, language='lqp',
1865
+ query_timeout_mins=query_timeout_mins,
1844
1866
  )
1845
1867
  else:
1846
1868
  raise e
@@ -1856,19 +1878,38 @@ Otherwise, remove it from your '{profile}' configuration profile.
1856
1878
  inputs: Dict | None = None,
1857
1879
  nowait_durable=False,
1858
1880
  headers: Dict | None = None,
1859
- bypass_index=False
1881
+ bypass_index=False,
1882
+ query_timeout_mins: int | None = None,
1860
1883
  ):
1861
1884
  raw_code = raw_code.replace("'", "\\'")
1862
1885
 
1863
1886
  try:
1864
1887
  return self._exec_async_v2(
1865
- database, engine, raw_code, inputs, readonly, nowait_durable, headers=headers, bypass_index=bypass_index
1888
+ database,
1889
+ engine,
1890
+ raw_code,
1891
+ inputs,
1892
+ readonly,
1893
+ nowait_durable,
1894
+ headers=headers,
1895
+ bypass_index=bypass_index,
1896
+ query_timeout_mins=query_timeout_mins,
1866
1897
  )
1867
1898
  except Exception as e:
1868
1899
  err_message = str(e).lower()
1869
1900
  if _is_engine_issue(err_message):
1870
1901
  self.auto_create_engine(engine)
1871
- return self._exec_async_v2(database, engine, raw_code, inputs, readonly, nowait_durable, headers=headers, bypass_index=bypass_index)
1902
+ return self._exec_async_v2(
1903
+ database,
1904
+ engine,
1905
+ raw_code,
1906
+ inputs,
1907
+ readonly,
1908
+ nowait_durable,
1909
+ headers=headers,
1910
+ bypass_index=bypass_index,
1911
+ query_timeout_mins=query_timeout_mins,
1912
+ )
1872
1913
  else:
1873
1914
  raise e
1874
1915
 
@@ -1885,13 +1926,14 @@ Otherwise, remove it from your '{profile}' configuration profile.
1885
1926
  database: str,
1886
1927
  engine: str,
1887
1928
  raw_code: str,
1888
- task: m.Task,
1929
+ cols: List[str],
1889
1930
  format: str,
1890
1931
  inputs: Dict | None = None,
1891
1932
  readonly=True,
1892
1933
  nowait_durable=False,
1893
1934
  skip_invalid_data=False,
1894
1935
  headers: Dict | None = None,
1936
+ query_timeout_mins: int | None = None,
1895
1937
  ):
1896
1938
  if inputs is None:
1897
1939
  inputs = {}
@@ -1899,6 +1941,8 @@ Otherwise, remove it from your '{profile}' configuration profile.
1899
1941
  headers = {}
1900
1942
  if 'user-agent' not in headers:
1901
1943
  headers['user-agent'] = get_pyrel_version(self.generation)
1944
+ if query_timeout_mins is None and (timeout_value := self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS)) is not None:
1945
+ query_timeout_mins = int(timeout_value)
1902
1946
  # TODO: add headers
1903
1947
  start = time.perf_counter()
1904
1948
  output_table = "out" + str(uuid.uuid4()).replace("-", "_")
@@ -1909,18 +1953,25 @@ Otherwise, remove it from your '{profile}' configuration profile.
1909
1953
  col_names_map = None
1910
1954
  artifacts = None
1911
1955
  assert self._session
1912
- temp = self._session.createDataFrame([], StructType([StructField(name, StringType()) for name in task.return_cols(allow_dups=False)]))
1956
+ temp = self._session.createDataFrame([], StructType([StructField(name, StringType()) for name in cols]))
1913
1957
  with debugging.span("transaction") as txn_span:
1914
1958
  try:
1915
1959
  # In the graph index case we need to use the new exec_into_table proc as it obfuscates the db name
1916
1960
  with debugging.span("exec_format"):
1917
1961
  if use_graph_index:
1918
- res = self._exec(f"call {APP_NAME}.api.exec_into_table(?, ?, ?, ?, ?, ?, ?);", [database, engine, raw_code, output_table, readonly, nowait_durable, skip_invalid_data])
1962
+ # we do not provide a default value for query_timeout_mins so that we can control the default on app level
1963
+ if query_timeout_mins is not None:
1964
+ res = self._exec(f"call {APP_NAME}.api.exec_into_table(?, ?, ?, ?, ?, ?, ?, ?);", [database, engine, raw_code, output_table, readonly, nowait_durable, skip_invalid_data, query_timeout_mins])
1965
+ else:
1966
+ res = self._exec(f"call {APP_NAME}.api.exec_into_table(?, ?, ?, ?, ?, ?, ?);", [database, engine, raw_code, output_table, readonly, nowait_durable, skip_invalid_data])
1919
1967
  txn_id = json.loads(res[0]["EXEC_INTO_TABLE"])["rai_transaction_id"]
1920
1968
  rejected_rows = json.loads(res[0]["EXEC_INTO_TABLE"]).get("rejected_rows", [])
1921
1969
  rejected_rows_count = json.loads(res[0]["EXEC_INTO_TABLE"]).get("rejected_rows_count", 0)
1922
1970
  else:
1923
- res = self._exec(f"call {APP_NAME}.api.exec_into(?, ?, ?, ?, ?, {inputs}, ?, {headers}, ?);", [database, engine, raw_code, output_table, readonly, nowait_durable, skip_invalid_data])
1971
+ if query_timeout_mins is not None:
1972
+ res = self._exec(f"call {APP_NAME}.api.exec_into(?, ?, ?, ?, ?, {inputs}, ?, {headers}, ?, ?);", [database, engine, raw_code, output_table, readonly, nowait_durable, skip_invalid_data, query_timeout_mins])
1973
+ else:
1974
+ res = self._exec(f"call {APP_NAME}.api.exec_into(?, ?, ?, ?, ?, {inputs}, ?, {headers}, ?);", [database, engine, raw_code, output_table, readonly, nowait_durable, skip_invalid_data])
1924
1975
  txn_id = json.loads(res[0]["EXEC_INTO"])["rai_transaction_id"]
1925
1976
  rejected_rows = json.loads(res[0]["EXEC_INTO"]).get("rejected_rows", [])
1926
1977
  rejected_rows_count = json.loads(res[0]["EXEC_INTO"]).get("rejected_rows_count", 0)
@@ -1932,7 +1983,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1932
1983
  if out_sample:
1933
1984
  keys = set([k.lower() for k in out_sample[0].as_dict().keys()])
1934
1985
  col_names_map = {}
1935
- for ix, name in enumerate(task.return_cols(allow_dups=False)):
1986
+ for ix, name in enumerate(cols):
1936
1987
  col_key = f"col{ix:03}"
1937
1988
  if col_key in keys:
1938
1989
  col_names_map[col_key] = IdentityParser(name).identity
@@ -1997,7 +2048,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1997
2048
  assert len(parsed) == 4, f"Invalid source: {source}"
1998
2049
  db, schema, entity, identity = parsed
1999
2050
  assert db and schema and entity and identity, f"Invalid source: {source}"
2000
- source_types[identity] = cast(SourceInfo, {"type": None, "state": ""})
2051
+ source_types[identity] = cast(SourceInfo, {"type": None, "state": "", "columns_hash": None})
2001
2052
  partitioned_sources[db][schema].append(entity)
2002
2053
 
2003
2054
  # TODO: Move to NA layer
@@ -2006,6 +2057,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
2006
2057
  f"""SELECT
2007
2058
  inf.FQN,
2008
2059
  inf.KIND,
2060
+ inf.COLUMNS_HASH,
2009
2061
  IFF(DATEDIFF(second, ds.created_at::TIMESTAMP, inf.LAST_DDL::TIMESTAMP) > 0, 'STALE', 'CURRENT') AS STATE
2010
2062
  FROM (
2011
2063
  SELECT (SELECT {app_name}.api.normalize_fq_ids(ARRAY_CONSTRUCT(FQ_OBJECT_NAME))[0]:identifier::string) as FQ_OBJECT_NAME,
@@ -2017,26 +2069,45 @@ Otherwise, remove it from your '{profile}' configuration profile.
2017
2069
  (SELECT {app_name}.api.normalize_fq_ids(
2018
2070
  ARRAY_CONSTRUCT(
2019
2071
  CASE
2020
- WHEN TABLE_CATALOG = UPPER(TABLE_CATALOG) THEN TABLE_CATALOG
2021
- ELSE '"' || TABLE_CATALOG || '"'
2072
+ WHEN t.TABLE_CATALOG = UPPER(t.TABLE_CATALOG) THEN t.TABLE_CATALOG
2073
+ ELSE '"' || t.TABLE_CATALOG || '"'
2022
2074
  END || '.' ||
2023
2075
  CASE
2024
- WHEN TABLE_SCHEMA = UPPER(TABLE_SCHEMA) THEN TABLE_SCHEMA
2025
- ELSE '"' || TABLE_SCHEMA || '"'
2076
+ WHEN t.TABLE_SCHEMA = UPPER(t.TABLE_SCHEMA) THEN t.TABLE_SCHEMA
2077
+ ELSE '"' || t.TABLE_SCHEMA || '"'
2026
2078
  END || '.' ||
2027
2079
  CASE
2028
- WHEN TABLE_NAME = UPPER(TABLE_NAME) THEN TABLE_NAME
2029
- ELSE '"' || TABLE_NAME || '"'
2080
+ WHEN t.TABLE_NAME = UPPER(t.TABLE_NAME) THEN t.TABLE_NAME
2081
+ ELSE '"' || t.TABLE_NAME || '"'
2030
2082
  END
2031
2083
  )
2032
2084
  )[0]:identifier::string) as FQN,
2033
2085
  CONVERT_TIMEZONE('UTC', LAST_DDL) AS LAST_DDL,
2034
- TABLE_TYPE as KIND
2035
- FROM {db}.INFORMATION_SCHEMA.TABLES
2036
- WHERE TABLE_CATALOG = {IdentityParser.to_sql_value(db)} AND ({" OR ".join(
2037
- f"(TABLE_SCHEMA = {IdentityParser.to_sql_value(schema)} AND TABLE_NAME IN ({','.join(f'{IdentityParser.to_sql_value(table)}' for table in tables)}))"
2086
+ TABLE_TYPE as KIND,
2087
+ SHA2(LISTAGG(
2088
+ COLUMN_NAME ||
2089
+ CASE
2090
+ WHEN c.NUMERIC_PRECISION IS NOT NULL AND c.NUMERIC_SCALE IS NOT NULL
2091
+ THEN c.DATA_TYPE || '(' || c.NUMERIC_PRECISION || ',' || c.NUMERIC_SCALE || ')'
2092
+ WHEN c.DATETIME_PRECISION IS NOT NULL
2093
+ THEN c.DATA_TYPE || '(0,' || c.DATETIME_PRECISION || ')'
2094
+ WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT NULL
2095
+ THEN c.DATA_TYPE || '(' || c.CHARACTER_MAXIMUM_LENGTH || ')'
2096
+ ELSE c.DATA_TYPE
2097
+ END ||
2098
+ IS_NULLABLE,
2099
+ ','
2100
+ ) WITHIN GROUP (ORDER BY COLUMN_NAME), 256) as COLUMNS_HASH
2101
+ FROM {db}.INFORMATION_SCHEMA.TABLES t
2102
+ JOIN {db}.INFORMATION_SCHEMA.COLUMNS c
2103
+ ON t.TABLE_CATALOG = c.TABLE_CATALOG
2104
+ AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
2105
+ AND t.TABLE_NAME = c.TABLE_NAME
2106
+ WHERE t.TABLE_CATALOG = {IdentityParser.to_sql_value(db)} AND ({" OR ".join(
2107
+ f"(t.TABLE_SCHEMA = {IdentityParser.to_sql_value(schema)} AND t.TABLE_NAME IN ({','.join(f'{IdentityParser.to_sql_value(table)}' for table in tables)}))"
2038
2108
  for schema, tables in schemas.items()
2039
2109
  )})
2110
+ GROUP BY t.TABLE_CATALOG, t.TABLE_SCHEMA, t.TABLE_NAME, t.LAST_DDL, t.TABLE_TYPE
2040
2111
  ) inf on inf.FQN = ds.FQ_OBJECT_NAME
2041
2112
  """
2042
2113
  for db, schemas in partitioned_sources.items()
@@ -2051,6 +2122,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
2051
2122
  assert fqn, f"Error parsing returned FQN: {row_fqn}"
2052
2123
 
2053
2124
  source_types[fqn]["type"] = "TABLE" if row["KIND"] == "BASE TABLE" else row["KIND"]
2125
+ source_types[fqn]["columns_hash"] = row["COLUMNS_HASH"]
2054
2126
  source_types[fqn]["state"] = row["STATE"]
2055
2127
 
2056
2128
  return source_types
@@ -3007,10 +3079,13 @@ class DirectAccessResources(Resources):
3007
3079
  return self._retrieve_service_endpoint()
3008
3080
 
3009
3081
  def _retrieve_service_endpoint(self, enforce_update=False) -> str:
3082
+ account = self.config.get("account")
3083
+ app_name = self.config.get("rai_app_name")
3084
+ service_endpoint_key = f"{account}.{app_name}.service_endpoint"
3010
3085
  if self._service_endpoint and not enforce_update:
3011
3086
  return self._service_endpoint
3012
- if self._endpoint_info.get("service_endpoint", "") and not enforce_update:
3013
- self._service_endpoint = str(self._endpoint_info.get("service_endpoint", ""))
3087
+ if self._endpoint_info.get(service_endpoint_key, "") and not enforce_update:
3088
+ self._service_endpoint = str(self._endpoint_info.get(service_endpoint_key, ""))
3014
3089
  return self._service_endpoint
3015
3090
 
3016
3091
  is_snowflake_notebook = isinstance(runtime_env, SnowbookEnvironment)
@@ -3022,7 +3097,7 @@ class DirectAccessResources(Resources):
3022
3097
  else:
3023
3098
  self._service_endpoint = f"https://{result[0]['SERVICE_ENDPOINT']}"
3024
3099
 
3025
- self._endpoint_info.set("service_endpoint", self._service_endpoint)
3100
+ self._endpoint_info.set(service_endpoint_key, self._service_endpoint)
3026
3101
  # save the endpoint to `ENDPOINT_FILE` to avoid calling the endpoint with every
3027
3102
  # pyrel execution
3028
3103
  try:
@@ -3095,6 +3170,7 @@ class DirectAccessResources(Resources):
3095
3170
  headers: Dict[str, str] | None = None,
3096
3171
  bypass_index=False,
3097
3172
  language: str = "rel",
3173
+ query_timeout_mins: int | None = None,
3098
3174
  ):
3099
3175
 
3100
3176
  with debugging.span("transaction") as txn_span:
@@ -3111,6 +3187,10 @@ class DirectAccessResources(Resources):
3111
3187
  "readonly": readonly,
3112
3188
  "language": language,
3113
3189
  }
3190
+ if query_timeout_mins is None and (timeout_value := self.config.get("query_timeout_mins", DEFAULT_QUERY_TIMEOUT_MINS)) is not None:
3191
+ query_timeout_mins = int(timeout_value)
3192
+ if query_timeout_mins is not None:
3193
+ payload["timeout_mins"] = query_timeout_mins
3114
3194
  query_params={"use_graph_index": str(use_graph_index and not bypass_index)}
3115
3195
 
3116
3196
  response = self.request(
@@ -41,6 +41,7 @@ class EngineState(TypedDict):
41
41
  class SourceInfo(TypedDict):
42
42
  type: str|None
43
43
  state: str
44
+ columns_hash: str|None
44
45
  source: str
45
46
 
46
47