relationalai 0.9.16__tar.gz → 0.9.17__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 (459) hide show
  1. {relationalai-0.9.16 → relationalai-0.9.17}/PKG-INFO +1 -1
  2. {relationalai-0.9.16 → relationalai-0.9.17}/pyproject.toml +1 -1
  3. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/auth/token_handler.py +97 -27
  4. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/auth/util.py +7 -0
  5. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/snowflake.py +9 -9
  6. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/use_index_poller.py +6 -2
  7. relationalai-0.9.17/src/relationalai/early_access/builder/__init__.py +30 -0
  8. relationalai-0.9.17/src/relationalai/early_access/builder/builder/__init__.py +35 -0
  9. relationalai-0.9.17/src/relationalai/early_access/builder/snowflake/__init__.py +12 -0
  10. relationalai-0.9.17/src/relationalai/early_access/builder/std/__init__.py +25 -0
  11. relationalai-0.9.17/src/relationalai/early_access/builder/std/decimals/__init__.py +12 -0
  12. relationalai-0.9.17/src/relationalai/early_access/builder/std/integers/__init__.py +12 -0
  13. relationalai-0.9.17/src/relationalai/early_access/builder/std/math/__init__.py +12 -0
  14. relationalai-0.9.17/src/relationalai/early_access/builder/std/strings/__init__.py +14 -0
  15. relationalai-0.9.17/src/relationalai/early_access/devtools/__init__.py +12 -0
  16. relationalai-0.9.17/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
  17. relationalai-0.9.17/src/relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
  18. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +2 -2
  19. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/orm/parser.py +1 -1
  20. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/bindings/common.py +4 -3
  21. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/bindings/csv.py +3 -2
  22. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/bindings/snowflake.py +4 -3
  23. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/codegen/binder.py +2 -2
  24. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/codegen/helpers.py +1 -1
  25. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/codegen/relations.py +4 -4
  26. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/codegen/weaver.py +3 -3
  27. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ir/compiler.py +3 -3
  28. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ir/executor.py +3 -3
  29. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/export.py +1 -1
  30. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/models.py +1 -1
  31. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/python_printer.py +1 -1
  32. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/relationships.py +1 -1
  33. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/subtyping.py +1 -1
  34. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +2 -2
  35. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +2 -2
  36. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/measures/measures.py +2 -2
  37. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +1 -1
  38. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/models.py +3 -3
  39. relationalai-0.9.17/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
  40. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/printer.py +6 -14
  41. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/reasoners.py +35 -6
  42. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/relations.py +2 -2
  43. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/relationships.py +2 -2
  44. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/types.py +2 -2
  45. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/serialization.py +35 -13
  46. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/snow/common.py +2 -3
  47. relationalai-0.9.17/src/relationalai/early_access/graphs/__init__.py +13 -0
  48. relationalai-0.9.17/src/relationalai/early_access/lqp/__init__.py +12 -0
  49. relationalai-0.9.17/src/relationalai/early_access/lqp/compiler/__init__.py +12 -0
  50. relationalai-0.9.17/src/relationalai/early_access/lqp/constructors/__init__.py +18 -0
  51. relationalai-0.9.17/src/relationalai/early_access/lqp/executor/__init__.py +12 -0
  52. relationalai-0.9.17/src/relationalai/early_access/lqp/ir/__init__.py +12 -0
  53. relationalai-0.9.17/src/relationalai/early_access/lqp/passes/__init__.py +12 -0
  54. relationalai-0.9.17/src/relationalai/early_access/lqp/pragmas/__init__.py +12 -0
  55. relationalai-0.9.17/src/relationalai/early_access/lqp/primitives/__init__.py +12 -0
  56. relationalai-0.9.17/src/relationalai/early_access/lqp/types/__init__.py +12 -0
  57. relationalai-0.9.17/src/relationalai/early_access/lqp/utils/__init__.py +12 -0
  58. relationalai-0.9.17/src/relationalai/early_access/lqp/validators/__init__.py +12 -0
  59. relationalai-0.9.17/src/relationalai/early_access/metamodel/__init__.py +58 -0
  60. relationalai-0.9.17/src/relationalai/early_access/metamodel/builtins/__init__.py +12 -0
  61. relationalai-0.9.17/src/relationalai/early_access/metamodel/compiler/__init__.py +12 -0
  62. relationalai-0.9.17/src/relationalai/early_access/metamodel/dependency/__init__.py +12 -0
  63. relationalai-0.9.17/src/relationalai/early_access/metamodel/factory/__init__.py +17 -0
  64. relationalai-0.9.17/src/relationalai/early_access/metamodel/helpers/__init__.py +12 -0
  65. relationalai-0.9.17/src/relationalai/early_access/metamodel/ir/__init__.py +14 -0
  66. relationalai-0.9.17/src/relationalai/early_access/metamodel/rewrite/__init__.py +5 -0
  67. relationalai-0.9.17/src/relationalai/early_access/metamodel/typer/__init__.py +3 -0
  68. relationalai-0.9.17/src/relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
  69. relationalai-0.9.17/src/relationalai/early_access/metamodel/types/__init__.py +15 -0
  70. relationalai-0.9.17/src/relationalai/early_access/metamodel/util/__init__.py +15 -0
  71. relationalai-0.9.17/src/relationalai/early_access/metamodel/visitor/__init__.py +12 -0
  72. relationalai-0.9.17/src/relationalai/early_access/paths/__init__.py +22 -0
  73. relationalai-0.9.17/src/relationalai/early_access/paths/api/__init__.py +12 -0
  74. relationalai-0.9.17/src/relationalai/early_access/paths/benchmarks/__init__.py +13 -0
  75. relationalai-0.9.17/src/relationalai/early_access/paths/graph/__init__.py +12 -0
  76. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/find_paths/__init__.py +12 -0
  77. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/one_sided_ball_repetition/__init__.py +12 -0
  78. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/one_sided_ball_upto/__init__.py +12 -0
  79. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/single/__init__.py +12 -0
  80. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/two_sided_balls_repetition/__init__.py +12 -0
  81. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/two_sided_balls_upto/__init__.py +12 -0
  82. relationalai-0.9.17/src/relationalai/early_access/paths/path_algorithms/usp/__init__.py +12 -0
  83. relationalai-0.9.17/src/relationalai/early_access/paths/rpq/__init__.py +13 -0
  84. relationalai-0.9.17/src/relationalai/early_access/paths/utilities/iterators/__init__.py +12 -0
  85. relationalai-0.9.17/src/relationalai/early_access/rel/__init__.py +12 -0
  86. relationalai-0.9.17/src/relationalai/early_access/rel/executor/__init__.py +12 -0
  87. relationalai-0.9.17/src/relationalai/early_access/rel/rel_utils/__init__.py +12 -0
  88. relationalai-0.9.17/src/relationalai/early_access/rel/rewrite/__init__.py +7 -0
  89. relationalai-0.9.17/src/relationalai/early_access/solvers/__init__.py +19 -0
  90. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/sql/__init__.py +1 -2
  91. relationalai-0.9.17/src/relationalai/early_access/sql/rewrite/__init__.py +3 -0
  92. relationalai-0.9.17/src/relationalai/early_access/tests/__init__.py +8 -0
  93. relationalai-0.9.17/src/relationalai/early_access/tests/logging/__init__.py +12 -0
  94. relationalai-0.9.17/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
  95. relationalai-0.9.17/src/relationalai/early_access/tests/utils/__init__.py +12 -0
  96. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/errors.py +21 -28
  97. relationalai-0.9.17/src/relationalai/semantics/__init__.py +21 -0
  98. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/devtools/__init__.py +0 -1
  99. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/devtools/benchmark_lqp.py +3 -3
  100. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/devtools/compilation_manager.py +7 -7
  101. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/devtools/extract_lqp.py +2 -2
  102. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics/internal}/__init__.py +6 -6
  103. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics/internal}/annotations.py +1 -1
  104. relationalai-0.9.16/src/relationalai/early_access/builder/builder.py → relationalai-0.9.17/src/relationalai/semantics/internal/internal.py +46 -12
  105. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics/internal}/snowflake.py +15 -9
  106. relationalai-0.9.17/src/relationalai/semantics/lqp/__init__.py +3 -0
  107. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/compiler.py +3 -3
  108. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/constructors.py +2 -2
  109. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/executor.py +45 -43
  110. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/model2lqp.py +19 -14
  111. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/passes.py +71 -30
  112. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/primitives.py +5 -7
  113. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/types.py +4 -4
  114. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/utils.py +9 -3
  115. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/validators.py +1 -1
  116. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/__init__.py +1 -1
  117. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/compiler.py +2 -2
  118. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/dependency.py +2 -2
  119. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/executor.py +4 -3
  120. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/factory.py +3 -3
  121. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/helpers.py +5 -2
  122. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/__init__.py +2 -1
  123. relationalai-0.9.17/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
  124. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/extract_keys.py +101 -100
  125. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/extract_nested_logicals.py +5 -5
  126. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/fd_constraints.py +2 -2
  127. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/flatten.py +13 -8
  128. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/gc_nodes.py +2 -2
  129. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/list_types.py +2 -2
  130. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/rewrite/splinter.py +2 -2
  131. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/typer/checker.py +3 -3
  132. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/typer/typer.py +2 -2
  133. {relationalai-0.9.16/src/relationalai/early_access/graphs → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/README.md +22 -22
  134. {relationalai-0.9.16/src/relationalai/early_access/graphs → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/core.py +154 -135
  135. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/README.md +4 -4
  136. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/api.py +1 -1
  137. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/benchmarks/grid_graph.py +1 -4
  138. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/Movies.ipynb +10 -12
  139. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/basic_example.py +3 -4
  140. relationalai-0.9.17/src/relationalai/semantics/reasoners/graph/paths/examples/minimal_engine_warmup.py +3 -0
  141. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movie_example.py +1 -1
  142. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/paths_benchmark.py +3 -6
  143. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/paths_example.py +3 -6
  144. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/pattern_to_automaton.py +2 -2
  145. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/find_paths_via_automaton.py +1 -1
  146. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/graph.py +1 -3
  147. relationalai-0.9.17/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/__init__.py +3 -0
  148. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/find_paths.py +2 -4
  149. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/one_sided_ball_repetition.py +2 -4
  150. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/one_sided_ball_upto.py +1 -3
  151. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/single.py +4 -6
  152. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/two_sided_balls_repetition.py +2 -4
  153. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/two_sided_balls_upto.py +3 -5
  154. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/usp-old.py +4 -6
  155. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/usp-tuple.py +4 -7
  156. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/path_algorithms/usp.py +4 -6
  157. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/product_graph.py +1 -1
  158. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/filter.py +0 -1
  159. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/rpq.py +1 -1
  160. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_limit_sp_max_length.py +3 -6
  161. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_limit_sp_multiple.py +3 -6
  162. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_limit_sp_single.py +3 -6
  163. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_limit_walks_multiple.py +3 -6
  164. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_limit_walks_single.py +3 -6
  165. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_one_sided_ball_repetition_multiple.py +3 -6
  166. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_one_sided_ball_repetition_single.py +3 -6
  167. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_one_sided_ball_upto_multiple.py +3 -6
  168. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_one_sided_ball_upto_single.py +3 -6
  169. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_single_paths.py +3 -6
  170. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_single_walks.py +3 -6
  171. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_single_walks_undirected.py +3 -6
  172. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_two_sided_balls_repetition_multiple.py +3 -6
  173. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_two_sided_balls_repetition_single.py +3 -6
  174. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_two_sided_balls_upto_multiple.py +3 -6
  175. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_two_sided_balls_upto_single.py +3 -6
  176. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_usp_nsp_multiple.py +3 -6
  177. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/tests/tests_usp_nsp_single.py +3 -6
  178. relationalai-0.9.17/src/relationalai/semantics/reasoners/graph/paths/utilities/__init__.py +3 -0
  179. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/utilities/iterators.py +1 -2
  180. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/utilities/prefix_sum.py +1 -2
  181. {relationalai-0.9.16/src/relationalai/early_access/graphs → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/tests/README.md +1 -1
  182. {relationalai-0.9.16/src/relationalai/early_access/solvers → relationalai-0.9.17/src/relationalai/semantics/reasoners/optimization}/common.py +6 -5
  183. {relationalai-0.9.16/src/relationalai/early_access/solvers → relationalai-0.9.17/src/relationalai/semantics/reasoners/optimization}/solvers_dev.py +5 -4
  184. {relationalai-0.9.16/src/relationalai/early_access/solvers → relationalai-0.9.17/src/relationalai/semantics/reasoners/optimization}/solvers_pb.py +3 -3
  185. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/builtins.py +2 -2
  186. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/compiler.py +9 -7
  187. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/executor.py +3 -3
  188. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/rel.py +3 -3
  189. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/rel_utils.py +1 -1
  190. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/rewrite/cdc.py +4 -4
  191. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/rewrite/extract_common.py +5 -5
  192. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/rewrite/quantify_vars.py +4 -4
  193. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/compiler.py +33 -13
  194. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/executor/duck_db.py +1 -1
  195. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/executor/result_helpers.py +2 -2
  196. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/executor/snowflake.py +4 -4
  197. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/rewrite/denormalize.py +2 -2
  198. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/rewrite/double_negation.py +1 -1
  199. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/rewrite/recursive_union.py +3 -3
  200. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +4 -4
  201. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/sql.py +17 -1
  202. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/__init__.py +12 -9
  203. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/constraints.py +1 -1
  204. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/dates.py +1 -1
  205. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/decimals.py +8 -10
  206. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/integers.py +1 -1
  207. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/math.py +1 -1
  208. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/pragmas.py +1 -1
  209. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/std.py +1 -1
  210. {relationalai-0.9.16/src/relationalai/early_access/builder → relationalai-0.9.17/src/relationalai/semantics}/std/strings.py +1 -1
  211. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/tests/test_snapshot_base.py +4 -4
  212. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/tests/utils.py +11 -11
  213. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/qb_debugger.py +1 -1
  214. relationalai-0.9.16/src/relationalai/early_access/paths/examples/minimal_engine_warmup.py +0 -3
  215. relationalai-0.9.16/src/relationalai/early_access/sql/rewrite/__init__.py +0 -6
  216. {relationalai-0.9.16 → relationalai-0.9.17}/.gitignore +0 -0
  217. {relationalai-0.9.16 → relationalai-0.9.17}/LICENSE +0 -0
  218. {relationalai-0.9.16 → relationalai-0.9.17}/docs/pypi/README.md +0 -0
  219. {relationalai-0.9.16 → relationalai-0.9.17}/frontend/debugger/dist/.gitignore +0 -0
  220. {relationalai-0.9.16 → relationalai-0.9.17}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  221. {relationalai-0.9.16 → relationalai-0.9.17}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
  222. {relationalai-0.9.16 → relationalai-0.9.17}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
  223. {relationalai-0.9.16 → relationalai-0.9.17}/frontend/debugger/dist/index.html +0 -0
  224. {relationalai-0.9.16 → relationalai-0.9.17}/src/__init__.py +0 -0
  225. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/__init__.py +0 -0
  226. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/events/__init__.py +0 -0
  227. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/procedures/__init__.py +0 -0
  228. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/procedures/procedure.py +0 -0
  229. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/rel/__init__.py +0 -0
  230. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/tables/__init__.py +0 -0
  231. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/tasks/__init__.py +0 -0
  232. {relationalai-0.9.16 → relationalai-0.9.17}/src/raitoolkit/tasks/task.py +0 -0
  233. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/__init__.py +0 -0
  234. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/analysis/__init__.py +0 -0
  235. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/analysis/mechanistic.py +0 -0
  236. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/analysis/whynot.py +0 -0
  237. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/auth/__init__.py +0 -0
  238. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/auth/jwt_generator.py +0 -0
  239. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/auth/oauth_callback_server.py +0 -0
  240. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/__init__.py +0 -0
  241. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/azure.py +0 -0
  242. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/cache_store.py +0 -0
  243. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/client.py +0 -0
  244. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/config.py +0 -0
  245. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/export_procedure.py.jinja +0 -0
  246. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/hash_util.py +0 -0
  247. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/profile_polling.py +0 -0
  248. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/result_helpers.py +0 -0
  249. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/types.py +0 -0
  250. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/clients/util.py +0 -0
  251. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/compiler.py +0 -0
  252. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/debugging.py +0 -0
  253. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/dependencies.py +0 -0
  254. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/dsl.py +0 -0
  255. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/__init__.py +0 -0
  256. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/__init__.py +0 -0
  257. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
  258. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
  259. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
  260. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
  261. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
  262. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
  263. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
  264. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
  265. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
  266. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
  267. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
  268. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
  269. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/constants.py +0 -0
  270. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
  271. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
  272. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
  273. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
  274. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
  275. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  276. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
  277. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
  278. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
  279. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/context.py +0 -0
  280. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/cset.py +0 -0
  281. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
  282. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
  283. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
  284. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/instances.py +0 -0
  285. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
  286. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
  287. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
  288. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
  289. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
  290. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/relations.py +0 -0
  291. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/rules.py +0 -0
  292. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/stack.py +0 -0
  293. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
  294. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
  295. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
  296. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
  297. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
  298. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
  299. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
  300. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
  301. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
  302. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
  303. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
  304. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/core/utils.py +0 -0
  305. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
  306. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
  307. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
  308. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
  309. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
  310. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
  311. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
  312. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
  313. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
  314. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
  315. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
  316. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
  317. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
  318. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
  319. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
  320. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/relations.py +0 -0
  321. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/rulesets.py +0 -0
  322. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
  323. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
  324. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
  325. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
  326. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
  327. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
  328. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
  329. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
  330. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
  331. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
  332. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
  333. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
  334. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/snow/api.py +0 -0
  335. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
  336. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
  337. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
  338. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
  339. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
  340. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/types/entities.py +0 -0
  341. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/types/values.py +0 -0
  342. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/dsl/utils.py +0 -0
  343. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/paths/path_algorithms/__init__.py +0 -0
  344. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/paths/utilities/__init__.py +0 -0
  345. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
  346. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/__init__.py +0 -0
  347. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/base.py +0 -0
  348. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/ci.py +0 -0
  349. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/colab.py +0 -0
  350. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/generic.py +0 -0
  351. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/hex.py +0 -0
  352. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/ipython.py +0 -0
  353. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/jupyter.py +0 -0
  354. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/snowbook.py +0 -0
  355. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/environments/terminal.py +0 -0
  356. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/SF.py +0 -0
  357. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/__init__.py +0 -0
  358. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/graphs.py +0 -0
  359. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/inspect.py +0 -0
  360. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
  361. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/api.py +0 -0
  362. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
  363. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
  364. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
  365. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
  366. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
  367. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/filter.py +0 -0
  368. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
  369. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/options.py +0 -0
  370. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
  371. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
  372. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/transition.py +0 -0
  373. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/pathfinder/utils.py +0 -0
  374. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/paths/__init__.py +0 -0
  375. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/paths/pathfinder.rel +0 -0
  376. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/paths/tree_agg.py +0 -0
  377. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/experimental/solvers.py +0 -0
  378. {relationalai-0.9.16/src/relationalai/early_access/lqp → relationalai-0.9.17/src/relationalai/loaders}/__init__.py +0 -0
  379. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/loaders/csv.py +0 -0
  380. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/loaders/loader.py +0 -0
  381. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/loaders/types.py +0 -0
  382. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/metagen.py +0 -0
  383. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/metamodel.py +0 -0
  384. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/rel.py +0 -0
  385. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/rel_emitter.py +0 -0
  386. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/rel_utils.py +0 -0
  387. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/designs/query_builder/identify_by.md +0 -0
  388. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/ir.py +0 -0
  389. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/pragmas.py +0 -0
  390. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/lqp/result_helpers.py +0 -0
  391. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/builtins.py +0 -0
  392. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/dataflow.py +0 -0
  393. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/ir.py +0 -0
  394. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/typer/__init__.py +0 -0
  395. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/types.py +0 -0
  396. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/util.py +0 -0
  397. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/metamodel/visitor.py +0 -0
  398. {relationalai-0.9.16/src/relationalai/early_access/tests → relationalai-0.9.17/src/relationalai/semantics/reasoners}/__init__.py +0 -0
  399. {relationalai-0.9.16/src/relationalai/early_access/graphs → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/__init__.py +0 -0
  400. {relationalai-0.9.16/src/relationalai/early_access/graphs → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/design/beyond_demand_transform.md +0 -0
  401. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/__init__.py +0 -0
  402. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/benchmarks/__init__.py +0 -0
  403. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/code_organization.md +0 -0
  404. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/actedin.csv +0 -0
  405. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/directed.csv +0 -0
  406. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/follows.csv +0 -0
  407. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/movies.csv +0 -0
  408. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/person.csv +0 -0
  409. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/produced.csv +0 -0
  410. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/ratings.csv +0 -0
  411. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/examples/movies_data/wrote.csv +0 -0
  412. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/__init__.py +0 -0
  413. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/automaton.py +0 -0
  414. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/diagnostics.py +0 -0
  415. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/glushkov.py +0 -0
  416. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/rpq/transition.py +0 -0
  417. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics/reasoners/graph}/paths/utilities/utilities.py +0 -0
  418. {relationalai-0.9.16/src/relationalai/early_access/solvers → relationalai-0.9.17/src/relationalai/semantics/reasoners/optimization}/__init__.py +0 -0
  419. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/__init__.py +0 -0
  420. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/rel/rewrite/__init__.py +0 -0
  421. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/__init__.py +0 -0
  422. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
  423. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
  424. {relationalai-0.9.16/src/relationalai/loaders → relationalai-0.9.17/src/relationalai/semantics/tests}/__init__.py +0 -0
  425. {relationalai-0.9.16/src/relationalai/early_access → relationalai-0.9.17/src/relationalai/semantics}/tests/logging.py +0 -0
  426. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/__init__.py +0 -0
  427. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/aggregates.py +0 -0
  428. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/dates.py +0 -0
  429. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/graphs.py +0 -0
  430. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/inspect.py +0 -0
  431. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/math.py +0 -0
  432. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/re.py +0 -0
  433. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/std/strings.py +0 -0
  434. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/__init__.py +0 -0
  435. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/cleanup_snapshots.py +0 -0
  436. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/cli.py +0 -0
  437. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/cli_controls.py +0 -0
  438. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/cli_helpers.py +0 -0
  439. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/constants.py +0 -0
  440. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/debugger.py +0 -0
  441. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/debugger_client.py +0 -0
  442. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/debugger_server.py +0 -0
  443. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/dev.py +0 -0
  444. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/notes +0 -0
  445. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/tools/snapshot_viewer.py +0 -0
  446. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/__init__.py +0 -0
  447. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/constants.py +0 -0
  448. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/format.py +0 -0
  449. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/graph.py +0 -0
  450. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/otel_handler.py +0 -0
  451. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/snowflake_handler.py +0 -0
  452. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/span_format_test.py +0 -0
  453. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/span_tracker.py +0 -0
  454. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/spans_file_handler.py +0 -0
  455. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai/util/tracing_handler.py +0 -0
  456. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai_test_util/__init__.py +0 -0
  457. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai_test_util/fixtures.py +0 -0
  458. {relationalai-0.9.16 → relationalai-0.9.17}/src/relationalai_test_util/snapshot.py +0 -0
  459. {relationalai-0.9.16 → relationalai-0.9.17}/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.9.16
3
+ Version: 0.9.17
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.9.16'
3
+ version = '0.9.17'
4
4
  description = 'RelationalAI Library and CLI'
5
5
  readme="docs/pypi/README.md"
6
6
  authors = [
@@ -1,6 +1,7 @@
1
1
  import base64
2
2
  import hashlib
3
3
  import json
4
+ import jwt
4
5
  import requests
5
6
  import secrets
6
7
  import threading
@@ -13,9 +14,9 @@ from typing import Dict, Tuple
13
14
 
14
15
  from .jwt_generator import JWTGenerator
15
16
  from .oauth_callback_server import OAuthCallbackServer
16
- from .util import is_keyring_secure, is_localhost, extract_port
17
+ from .util import is_keyring_secure, is_localhost, extract_port, remove_url_scheme
17
18
  from ..debugging import warn
18
- from ..errors import RAIException, DirectAccessInvalidAuthException, InsecureKeychainWarning, KeychainFailureWarning, OAuthSSLMismatchException
19
+ from ..errors import RAIException, DirectAccessInvalidAuthException, InsecureKeychainWarning, KeychainFailureWarning
19
20
  from ..tools.constants import SNOWFLAKE_DIRECT_ACCESS_AUTHS
20
21
  from ..clients.config import Config
21
22
 
@@ -33,7 +34,8 @@ class TokenHandler(ABC):
33
34
  self._config = config
34
35
  self.role: str = str(self._config.get("role", ""))
35
36
  self.user: str = str(self._config.get("user", ""))
36
- self.account: str = str(self._config.get("account", ""))
37
+ self.account: str = self._prepare_account_name(str(config.get("account", "")))
38
+ self._renewal_buffer_time = timedelta(minutes=2)
37
39
 
38
40
  @staticmethod
39
41
  def from_config(config: Config) -> "TokenHandler":
@@ -48,9 +50,38 @@ class TokenHandler(ABC):
48
50
  raise DirectAccessInvalidAuthException(authenticator, SNOWFLAKE_DIRECT_ACCESS_AUTHS.keys())
49
51
 
50
52
  @abstractmethod
51
- def get_token(self) -> str:
53
+ # returns a token which can be used to create a snowflake session object
54
+ def get_session_login_token(self) -> str:
55
+ pass
56
+
57
+ @abstractmethod
58
+ # returns a token which can be used to access a specific endpoint in multiple cases this
59
+ # can be the same token as for session login but is dependent on the authentication
60
+ # method
61
+ def get_ingress_token(self, endpoint) -> str:
52
62
  pass
53
63
 
64
+ @staticmethod
65
+ # this helper method is needed to prepare the account name to a format accepted to form
66
+ # the snowflake URLs. Without the replacement of '_' with '-' the requests to snowflake
67
+ # auth endpoints will lead to SSL mismatch errors.
68
+ def _prepare_account_name(account: str) -> str:
69
+ return account.replace("_", "-").upper()
70
+
71
+ # helper method to retrieve a token from a cache and check if it is expired
72
+ # assumes the key consisting of the (account, user, role) tuple
73
+ def _get_token_from_cache(self, cache) -> Tuple:
74
+ key = (self.account, self.user, self.role)
75
+ if key in cache:
76
+ token, expiration_timestamp = cache[key]
77
+ current_timestamp = datetime.now(timezone.utc).timestamp()
78
+ # only use cached token if not expired and not close to expiring
79
+ if expiration_timestamp - self._renewal_buffer_time.total_seconds() > current_timestamp:
80
+ return token, False
81
+ else:
82
+ return "", True
83
+ return "", False
84
+
54
85
  class SnowflakeOAuthTokenHandler(TokenHandler):
55
86
 
56
87
  # Global cache to re-use the tokens over multiple threads and resource objects
@@ -85,10 +116,14 @@ class SnowflakeOAuthTokenHandler(TokenHandler):
85
116
  self.redirect_port: int = extract_port(self.redirect_uri)
86
117
  self.account_url: str = f"https://{self.account}.snowflakecomputing.com"
87
118
  self._callback_server = None
88
- self._renewal_buffer_time = timedelta(minutes=2)
89
119
  self._load_refresh_token_cache()
90
120
 
91
- def get_token(self) -> str:
121
+ # performing token retrieval in a thread safe manner. This is needed as multiple
122
+ # resources are oftentimes created in parallel, leading to multiple token handlers
123
+ # hitting the Snowflake auth endpoint at the same time and trying to start local
124
+ # callback servers. Instead we re-suse the retrieved token until the end of its
125
+ # lifetime over all threads.
126
+ def get_session_login_token(self) -> str:
92
127
  token, expired = self._get_access_token_from_cache()
93
128
  if token and not expired:
94
129
  return token
@@ -103,6 +138,9 @@ class SnowflakeOAuthTokenHandler(TokenHandler):
103
138
 
104
139
  auth_code, code_verifier = self._authenticate()
105
140
  return self._exchange_code_for_token(auth_code, code_verifier)
141
+
142
+ def get_ingress_token(self, endpoint) -> str:
143
+ return self.get_session_login_token()
106
144
 
107
145
  def _get_access_token_from_cache(self) -> Tuple[str, bool]:
108
146
  return self._get_token_from_cache(SnowflakeOAuthTokenHandler._token_cache)
@@ -110,18 +148,6 @@ class SnowflakeOAuthTokenHandler(TokenHandler):
110
148
  def _get_refresh_token_from_cache(self) -> Tuple[str, bool]:
111
149
  return self._get_token_from_cache(SnowflakeOAuthTokenHandler._refresh_token_cache)
112
150
 
113
- def _get_token_from_cache(self, cache) -> Tuple:
114
- key = (self.account, self.user, self.role)
115
- if key in cache:
116
- token, expiration_timestamp = cache[key]
117
- current_timestamp = datetime.now(timezone.utc).timestamp()
118
- # only use cached token if not expired and not close to expiring
119
- if expiration_timestamp - self._renewal_buffer_time.total_seconds() > current_timestamp:
120
- return token, False
121
- else:
122
- return "", True
123
- return "", False
124
-
125
151
  def _get_auth_token_from_cache(self) -> Tuple[str, str, bool]:
126
152
  key = (self.account, self.user, self.role)
127
153
  if key in SnowflakeOAuthTokenHandler._auth_token_cache:
@@ -266,13 +292,10 @@ class SnowflakeOAuthTokenHandler(TokenHandler):
266
292
 
267
293
  try:
268
294
  response = requests.post(token_url, data=data, headers=headers, auth=auth)
269
- except requests.exceptions.SSLError:
270
- e = OAuthSSLMismatchException(self.account)
271
- raise e
272
295
  except Exception as e:
273
296
  raise RAIException(f"Error during token exchange: {e}")
274
297
  if response.status_code != 200:
275
- raise Exception(f"Token exchange failed: {response.status_code} - {response.text}")
298
+ raise RAIException(f"Token exchange failed: {response.status_code} - {response.text}")
276
299
 
277
300
  return self._handle_token_response(response, issue_time)
278
301
 
@@ -297,12 +320,10 @@ class SnowflakeOAuthTokenHandler(TokenHandler):
297
320
 
298
321
  try:
299
322
  response = requests.post(token_url, data=data, headers=headers, auth=auth)
300
- except requests.exceptions.SSLError:
301
- raise OAuthSSLMismatchException(self.account)
302
323
  except Exception as e:
303
324
  raise RAIException(f"Error during token exchange: {e}")
304
325
  if response.status_code != 200:
305
- raise Exception(f"Token refresh failed: {response.status_code} - {response.text}")
326
+ raise RAIException(f"Token refresh failed: {response.status_code} - {response.text}")
306
327
 
307
328
  return self._handle_token_response(response, issue_time, is_refresh=True)
308
329
 
@@ -348,10 +369,21 @@ class SnowflakePATHandler(TokenHandler):
348
369
  except Exception as e:
349
370
  raise RAIException(f"Failed to read personal access token file: {e}")
350
371
 
351
- def get_token(self) -> str:
372
+ def get_session_login_token(self) -> str:
373
+ return self.token
374
+
375
+ def get_ingress_token(self, endpoint) -> str:
352
376
  return self.token
353
377
 
354
378
  class SnowflakeKeyFileHandler(TokenHandler):
379
+ # Global cache to re-use the tokens over multiple threads and resource objects
380
+ # Maps (account, user, role) to (token, expiration_timestamp)
381
+ _token_cache: Dict[Tuple[str, str, str], Tuple[str, float]] = dict()
382
+
383
+ # To avoid authenticating for multiple threads, we use this lock to let the first thread
384
+ # authenticate and the others wait for the result retrieved from the global cache
385
+ _authenticate_lock = threading.Lock()
386
+
355
387
  def __init__(self, config: Config):
356
388
  super().__init__(config)
357
389
  self.key_file_path = self._config.get("private_key_file")
@@ -360,5 +392,43 @@ class SnowflakeKeyFileHandler(TokenHandler):
360
392
  self.key_file_pwd = self._config.get("private_key_file_pwd", "")
361
393
  self._jwt_generator = JWTGenerator(self.account, self.user, self.key_file_path, self.key_file_pwd)
362
394
 
363
- def get_token(self) -> str:
395
+ def get_session_login_token(self) -> str:
364
396
  return self._jwt_generator.get_or_generate_token()
397
+
398
+ # performing token retrieval in a thread safe manner. This is needed as multiple
399
+ # resources are oftentimes created in parallel, leading to multiple token handlers
400
+ # hitting the Snowflake auth endpoint at the same time. Instead we re-suse the retrieved
401
+ # token until the end of its lifetime over all threads.
402
+ def get_ingress_token(self, endpoint) -> str:
403
+ with SnowflakeKeyFileHandler._authenticate_lock:
404
+ token, expired = self._get_token_from_cache(SnowflakeKeyFileHandler._token_cache)
405
+ if token and not expired:
406
+ return token
407
+
408
+ generated_jwt_token = self.get_session_login_token()
409
+ token = self._exchange_token(generated_jwt_token, endpoint)
410
+ return token
411
+
412
+ def _exchange_token(self, token, endpoint):
413
+ endpoint = remove_url_scheme(endpoint)
414
+ scope_role = f'session:role:{self.role}' if self.role is not None else None
415
+ scope = f'{scope_role} {endpoint}' if scope_role is not None else endpoint
416
+ data = {
417
+ 'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
418
+ 'scope': scope,
419
+ 'assertion': token,
420
+ }
421
+ url = f'https://{self.account}.snowflakecomputing.com/oauth/token'
422
+ try:
423
+ response = requests.post(url, data=data)
424
+ except Exception as e:
425
+ raise RAIException(f"Error during token exchange: {e}")
426
+ if response.status_code != 200:
427
+ raise RAIException(f"Token exchange failed: {response.status_code} - {response.text}")
428
+ token = response.text
429
+ try:
430
+ expire_timestamp = jwt.decode(token, options={"verify_signature": False})['exp']
431
+ except Exception as e:
432
+ raise RAIException(f"Failed to decode exchanged token: {e}")
433
+ SnowflakeKeyFileHandler._token_cache[(self.account, self.user, self.role)] = (token, expire_timestamp)
434
+ return token
@@ -23,6 +23,13 @@ def extract_port(url: str) -> int:
23
23
  else:
24
24
  port = 80
25
25
  return port
26
+
27
+ def remove_url_scheme(url: str) -> str:
28
+ parsed = urlparse(url)
29
+ # If there's a scheme, reconstruct without it
30
+ if parsed.scheme:
31
+ return parsed.netloc + parsed.path
32
+ return url
26
33
 
27
34
  def is_keyring_secure() -> bool:
28
35
  if not KEYRING_AVAILABLE or keyring is None:
@@ -47,7 +47,7 @@ from ..clients.client import Client, ExportParams, ProviderBase, ResourcesBase
47
47
  from ..clients.util import IdentityParser, escape_for_f_string, get_pyrel_version, get_with_retries, poll_with_specified_overhead, safe_json_loads, sanitize_module_name, scrub_exception, wrap_with_request_id, ms_to_timestamp
48
48
  from ..environments import runtime_env, HexEnvironment, SnowbookEnvironment
49
49
  from .. import dsl, rel, metamodel as m
50
- from ..errors import DuoSecurityFailed, EngineAutoCreateFailed, EngineNameValidationException, EngineNotFoundException, EnginePending, EngineSizeMismatchWarning, EngineResumeFailed, Errors, InvalidAliasError, InvalidEngineSizeError, InvalidSourceTypeWarning, RAIAbortedTransactionError, RAIException, HexSessionException, SnowflakeAppMissingException, SnowflakeChangeTrackingNotEnabledException, SnowflakeDatabaseException, SnowflakeImportMissingException, SnowflakeInvalidSource, SnowflakeMissingConfigValuesException, SnowflakeProxyAPIDeprecationWarning, SnowflakeProxySourceError, SnowflakeRaiAppNotStarted, ModelNotFoundException, UnknownSourceWarning, ResponseStatusException, RowsDroppedFromTargetTableWarning
50
+ from ..errors import DuoSecurityFailed, EngineProvisioningFailed, EngineNameValidationException, EngineNotFoundException, EnginePending, EngineSizeMismatchWarning, EngineResumeFailed, Errors, InvalidAliasError, InvalidEngineSizeError, InvalidSourceTypeWarning, RAIAbortedTransactionError, RAIException, HexSessionException, SnowflakeAppMissingException, SnowflakeChangeTrackingNotEnabledException, SnowflakeDatabaseException, SnowflakeImportMissingException, SnowflakeInvalidSource, SnowflakeMissingConfigValuesException, SnowflakeProxyAPIDeprecationWarning, SnowflakeProxySourceError, SnowflakeRaiAppNotStarted, ModelNotFoundException, UnknownSourceWarning, ResponseStatusException, RowsDroppedFromTargetTableWarning
51
51
  from concurrent.futures import ThreadPoolExecutor
52
52
  from datetime import datetime, date, timedelta
53
53
  from snowflake.snowpark.types import StringType, StructField, StructType
@@ -413,7 +413,7 @@ class Resources(ResourcesBase):
413
413
  if "authenticator" in connection_parameters and connection_parameters["authenticator"] == "OAUTH_AUTHORIZATION_CODE":
414
414
  # we are replicating OAUTH_AUTHORIZATION_CODE by first retrieving the token
415
415
  # and then authenticating with the token via the OAUTH authenticator
416
- connection_parameters["token"] = self.token_handler.get_token()
416
+ connection_parameters["token"] = self.token_handler.get_session_login_token()
417
417
  connection_parameters["authenticator"] = "OAUTH"
418
418
  return Session.builder.configs(connection_parameters).create()
419
419
  except snowflake.connector.errors.Error as e:
@@ -468,7 +468,7 @@ class Resources(ResourcesBase):
468
468
  except EngineNameValidationException as e:
469
469
  raise EngineNameValidationException(engine) from e
470
470
  except Exception as e:
471
- raise EngineAutoCreateFailed(engine) from e
471
+ raise EngineProvisioningFailed(engine, e) from e
472
472
  elif re.search(r"javascript execution error", orig_message):
473
473
  match = re.search(r"\"message\":\"(.*)\"", orig_message)
474
474
  if match:
@@ -693,7 +693,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
693
693
  else:
694
694
  self._exec(f"call {APP_NAME}.api.{api}('{name}', '{size}', PARSE_JSON('{{\"auto_suspend_mins\": {auto_suspend_mins}}}'), {headers});")
695
695
  except Exception as e:
696
- raise Exception(f"Failed to create engine {name} with size {size}: {e}") from e
696
+ raise EngineProvisioningFailed(name, e) from e
697
697
 
698
698
  def create_engine(self, name:str, size:str|None=None, auto_suspend_mins:int|None=None, headers: Dict | None = None):
699
699
  self._create_engine(name, size, auto_suspend_mins, headers=headers)
@@ -1703,7 +1703,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1703
1703
  engine = None
1704
1704
  pass
1705
1705
  else:
1706
- raise EngineAutoCreateFailed(engine_name) from e
1706
+ raise EngineProvisioningFailed(engine_name, e) from e
1707
1707
 
1708
1708
  if not engine:
1709
1709
  with Spinner(
@@ -1716,7 +1716,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1716
1716
  print(e)
1717
1717
  if DUO_TEXT in str(e).lower():
1718
1718
  raise DuoSecurityFailed(e)
1719
- raise EngineAutoCreateFailed(engine_name) from e
1719
+ raise EngineProvisioningFailed(engine_name, e) from e
1720
1720
  return engine_name
1721
1721
 
1722
1722
  def auto_create_engine_async(self, name: str | None = None):
@@ -1792,7 +1792,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1792
1792
  pass
1793
1793
  else:
1794
1794
  print(e)
1795
- EngineAutoCreateFailed(engine_name)
1795
+ raise EngineProvisioningFailed(engine_name, e) from e
1796
1796
 
1797
1797
  if not engine:
1798
1798
  self.create_engine_async(engine_name, size=self.config.get("engine_size", None))
@@ -1815,7 +1815,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1815
1815
  if isinstance(e, RAIException):
1816
1816
  raise e
1817
1817
  print(e)
1818
- raise EngineAutoCreateFailed(engine_name) from e
1818
+ raise EngineProvisioningFailed(engine_name, e) from e
1819
1819
 
1820
1820
  def validate_engine_size(self, size: str) -> Tuple[bool, List[str]]:
1821
1821
  if size is not None:
@@ -2986,7 +2986,7 @@ class DirectAccessClient:
2986
2986
  request_headers.update(headers)
2987
2987
  # Authorization tokens are not needed in a snowflake notebook environment
2988
2988
  if not self._is_snowflake_notebook:
2989
- request_headers["Authorization"] = f'Snowflake Token="{self._token_handler.get_token()}"'
2989
+ request_headers["Authorization"] = f'Snowflake Token="{self._token_handler.get_ingress_token(self.service_endpoint)}"'
2990
2990
  # needed for oauth, does no harm for other authentication methods
2991
2991
  request_headers["X-SF-SPCS-Authentication-Method"] = 'OAUTH'
2992
2992
  request_headers["Content-Type"] = 'application/x-www-form-urlencoded'
@@ -7,7 +7,7 @@ from relationalai.clients.cache_store import GraphIndexCache
7
7
  from relationalai.clients.util import get_pyrel_version, poll_with_specified_overhead
8
8
  from relationalai.errors import (
9
9
  ERPNotRunningError,
10
- EngineAutoCreateFailed,
10
+ EngineProvisioningFailed,
11
11
  SnowflakeChangeTrackingNotEnabledException,
12
12
  SnowflakeTableObjectsException,
13
13
  SnowflakeTableObject,
@@ -261,7 +261,11 @@ class UseIndexPoller:
261
261
  if self.engine_errors:
262
262
  spinner.update_messages({ "message": "Errors found. See below for details." })
263
263
  # if there is an engine error, probably auto create engine failed
264
- raise EngineAutoCreateFailed(self.engine_name)
264
+ # Create a synthetic exception from the first engine error
265
+ first_error = self.engine_errors[0]
266
+ error_message = first_error.get("message", "Unknown engine error")
267
+ synthetic_exception = Exception(f"Engine error: {error_message}")
268
+ raise EngineProvisioningFailed(self.engine_name, synthetic_exception)
265
269
 
266
270
  if num_tables_altered > 0:
267
271
  s = "s" if num_tables_altered > 1 else ""
@@ -0,0 +1,30 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.internal import (
4
+ Model, Concept, Relationship, RelationshipReading, Expression, Fragment, Error,
5
+ String, Integer, Int64, Int128, Float, Decimal, Bool,
6
+ Date, DateTime,
7
+ RawSource, Hash,
8
+ select, where, require, define, distinct, union, data,
9
+ rank, asc, desc,
10
+ count, sum, min, max, avg, per,
11
+ not_, internal as builder, annotations
12
+ )
13
+
14
+ __all__ = [
15
+ "Model", "Concept", "Relationship", "RelationshipReading", "Expression", "Fragment", "Error",
16
+ "String", "Integer", "Int64", "Int128", "Float", "Decimal", "Bool",
17
+ "Date", "DateTime",
18
+ "RawSource", "Hash",
19
+ "select", "where", "require", "define", "distinct", "union", "data",
20
+ "rank", "asc", "desc",
21
+ "count", "sum", "min", "max", "avg", "per",
22
+ "not_", "builder", "annotations"
23
+ ]
24
+
25
+ warnings.warn(
26
+ "relationalai.early_access.builder.* is deprecated. "
27
+ "Please migrate to relationalai.semantics.*",
28
+ DeprecationWarning,
29
+ stacklevel=2,
30
+ )
@@ -0,0 +1,35 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.internal.internal import (field_to_type, Compiler, RelationshipRef, ConceptNew,
4
+ RelationshipFieldRef, Ref, Aggregate, decimal_concept_by_name,
5
+ _global_id)
6
+ from relationalai.semantics.internal import (
7
+ Model, Concept, Relationship, RelationshipReading, Expression, Fragment, Error, Field,
8
+ String, Integer, Int64, Int128, Float, Decimal, Bool,
9
+ Date, DateTime,
10
+ RawSource, Hash,
11
+ select, where, require, define, distinct, union, data,
12
+ rank, asc, desc,
13
+ count, sum, min, max, avg, per,
14
+ not_, internal as builder
15
+ )
16
+
17
+ __all__ = [
18
+ "Model", "Concept", "Relationship", "RelationshipReading", "Expression", "Fragment", "Error", "Field",
19
+ "String", "Integer", "Int64", "Int128", "Float", "Decimal", "Bool",
20
+ "Date", "DateTime",
21
+ "RawSource", "Hash",
22
+ "select", "where", "require", "define", "distinct", "union", "data",
23
+ "rank", "asc", "desc",
24
+ "count", "sum", "min", "max", "avg", "per",
25
+ "not_", "builder",
26
+ "field_to_type", "Compiler", "RelationshipRef", "ConceptNew", "RelationshipFieldRef", "Ref", "Aggregate",
27
+ "decimal_concept_by_name", "_global_id"
28
+ ]
29
+
30
+ warnings.warn(
31
+ "relationalai.early_access.builder.builder is deprecated, "
32
+ "Please migrate to relationalai.semantics.internal",
33
+ DeprecationWarning,
34
+ stacklevel=2,
35
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.internal.snowflake import Table, is_direct_access_enabled
4
+
5
+ __all__ = ["Table", "is_direct_access_enabled"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.builder.snowflake is deprecated, "
9
+ "Please migrate to relationalai.semantics.internal.snowflake",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -0,0 +1,25 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.std import range, hash, cast, dates, math, strings, decimals, integers, pragmas, \
4
+ constraints, uuid_to_string
5
+
6
+ __all__ = [
7
+ "range",
8
+ "hash",
9
+ "cast",
10
+ "dates",
11
+ "math",
12
+ "strings",
13
+ "decimals",
14
+ "integers",
15
+ "pragmas",
16
+ "constraints",
17
+ "uuid_to_string"
18
+ ]
19
+
20
+ warnings.warn(
21
+ "relationalai.early_access.builder.std.* is deprecated. "
22
+ "Please migrate to relationalai.semantics.std.*",
23
+ DeprecationWarning,
24
+ stacklevel=2,
25
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.std.decimals import decimal, parse_decimal
4
+
5
+ __all__ = ["decimal", "parse_decimal"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.builder.std.decimals is deprecated, "
9
+ "Please migrate to relationalai.semantics.std.decimals",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.std.integers import int64, int128, parse, parse_int64, parse_int128
4
+
5
+ __all__ = ["int64", "int128", "parse", "parse_int64", "parse_int128"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.builder.std.integers is deprecated, "
9
+ "Please migrate to relationalai.semantics.std.integers",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.std.math import abs, isnan, isinf, maximum, natural_log, sqrt, minimum, ceil, floor
4
+
5
+ __all__ = ["abs", "isnan", "isinf", "maximum", "natural_log", "sqrt", "minimum", "ceil", "floor"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.builder.std.math is deprecated, "
9
+ "Please migrate to relationalai.semantics.std.math",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -0,0 +1,14 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.std.strings import (string, len, contains, substring, like, lower, upper, strip, startswith,
4
+ endswith, levenshtein, concat)
5
+
6
+ __all__ = ["string", "len", "contains", "substring", "like", "lower", "upper", "strip", "startswith", "endswith",
7
+ "levenshtein", "concat"]
8
+
9
+ warnings.warn(
10
+ "relationalai.early_access.builder.std.strings is deprecated, "
11
+ "Please migrate to relationalai.semantics.std.strings",
12
+ DeprecationWarning,
13
+ stacklevel=2,
14
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.devtools import CompilationManager
4
+
5
+ __all__ = ["CompilationManager"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.devtools.* is deprecated. "
9
+ "Please migrate to relationalai.semantics.devtools.*",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.devtools.benchmark_lqp import benchmark_lqp
4
+
5
+ __all__ = ["benchmark_lqp"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.devtools.benchmark_lqp is deprecated, "
9
+ "Please migrate to relationalai.semantics.devtools.benchmark_lqp",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -0,0 +1,12 @@
1
+ import warnings
2
+
3
+ from relationalai.semantics.devtools.extract_lqp import extract_rai_calls
4
+
5
+ __all__ = ["extract_rai_calls"]
6
+
7
+ warnings.warn(
8
+ "relationalai.early_access.devtools.extract_lqp is deprecated. "
9
+ "Please migrate to relationalai.semantics.devtools.extract_lqp",
10
+ DeprecationWarning,
11
+ stacklevel=2,
12
+ )
@@ -7,8 +7,8 @@ from relationalai.early_access.dsl.adapters.orm.parser import ORMParser
7
7
  from relationalai.early_access.dsl.core.utils import to_pascal_case
8
8
  from relationalai.early_access.dsl.orm.constraints import RingType, ValueComparisonType, Range
9
9
  from relationalai.early_access.dsl.orm.models import Model
10
- from relationalai.early_access.builder import Concept, Integer, String, DateTime, Decimal, Date, Float
11
- from relationalai.early_access.metamodel.util import NameCache
10
+ from relationalai.semantics import Concept, Integer, String, DateTime, Decimal, Date, Float
11
+ from relationalai.semantics.metamodel.util import NameCache
12
12
  from datetime import date, datetime
13
13
  from decimal import Decimal as PyDecimal
14
14
 
@@ -11,7 +11,7 @@ from relationalai.early_access.dsl.adapters.orm.model import ORMEntityType, ORMV
11
11
  ORMRoleSubsetConstraint, ORMInclusiveRoleConstraint, ORMExclusiveRoleConstraint, ORMEqualityConstraint, \
12
12
  ORMFrequencyConstraint, ORMCardinalityConstraint, ORMRange, ORMRoleCardinalityConstraint, \
13
13
  ORMValueTypeValueConstraint
14
- from relationalai.early_access.metamodel.util import ordered_set
14
+ from relationalai.semantics.metamodel.util import ordered_set
15
15
  from relationalai.util.graph import topological_sort
16
16
 
17
17
 
@@ -5,9 +5,10 @@ from enum import Enum
5
5
  from typing import Optional, TypeVar, Generic, Tuple, Callable, Sequence
6
6
  from typing import Union
7
7
 
8
- import relationalai.early_access.builder as qb
9
- from relationalai.early_access.builder import std, builder as b
10
- from relationalai.early_access.builder.builder import Not
8
+ import relationalai.semantics as qb
9
+ from relationalai.semantics import std
10
+ from relationalai.semantics.internal import internal as b
11
+ from relationalai.semantics.internal.internal import Not
11
12
  from relationalai.early_access.dsl.orm.relationships import Relationship, Role
12
13
  from relationalai.early_access.dsl.orm.types import Concept
13
14
  from relationalai.early_access.dsl.snow.common import ColumnRef, ForeignKey
@@ -4,8 +4,9 @@ from typing import Optional
4
4
  import numpy as np
5
5
  import pandas as pd
6
6
 
7
- from relationalai.early_access.builder import define, where, builder as b
8
- from relationalai.early_access.builder.std import decimals
7
+ from relationalai.semantics import define, where
8
+ from relationalai.semantics.std import decimals
9
+ from relationalai.semantics.internal import internal as b
9
10
  from relationalai.early_access.dsl.bindings.common import BindableColumn, AbstractBindableTable
10
11
  from relationalai.early_access.dsl.snow.common import CsvColumnMetadata
11
12
  from relationalai.early_access.dsl.utils import normalize
@@ -1,4 +1,5 @@
1
- from relationalai.early_access.builder import builder as b, snowflake as sf
1
+ from __future__ import annotations
2
+ from relationalai.semantics.internal import snowflake as sf, internal as b
2
3
  from relationalai.early_access.dsl.bindings.common import BindableColumn, AbstractBindableTable
3
4
 
4
5
 
@@ -26,8 +27,8 @@ class BindableSnowflakeColumn(BindableColumn, sf.Column):
26
27
 
27
28
  class SnowflakeTable(AbstractBindableTable[BindableSnowflakeColumn], sf.Table):
28
29
 
29
- def __init__(self, fqn: str, model):
30
- sf.Table.__init__(self, fqn)
30
+ def __init__(self, fqn: str, model, schema:dict[str, str|b.Concept]|None=None):
31
+ sf.Table.__init__(self, fqn, schema=schema)
31
32
  AbstractBindableTable.__init__(self, fqn, model, set())
32
33
  self._initialize(model)
33
34
 
@@ -4,9 +4,9 @@ from relationalai.early_access.dsl.bindings.common import Binding, IdentifierCon
4
4
  SubtypeConceptBinding, BindableTable, BindableAttribute, ReferentConceptBinding
5
5
  from relationalai.early_access.dsl.codegen.common import BoundIdentifierConstraint, BoundRelationship
6
6
  from relationalai.early_access.dsl.orm.relationships import Role, Relationship
7
- from relationalai.early_access.metamodel.util import OrderedSet
7
+ from relationalai.semantics.metamodel.util import OrderedSet
8
8
 
9
- import relationalai.early_access.builder as qb
9
+ import relationalai.semantics as qb
10
10
 
11
11
  class Binder:
12
12
  def __init__(self, model):
@@ -1,4 +1,4 @@
1
- import relationalai.early_access.builder as qb
1
+ import relationalai.semantics as qb
2
2
 
3
3
 
4
4
  def reference_entity(concept: qb.Concept, *args, check_population: bool=True):