relationalai 0.9.17__tar.gz → 0.9.18__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.17 → relationalai-0.9.18}/PKG-INFO +1 -1
  2. {relationalai-0.9.17 → relationalai-0.9.18}/pyproject.toml +1 -1
  3. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/snowflake.py +5 -18
  4. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/use_index_poller.py +4 -1
  5. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/debugging.py +10 -1
  6. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/builder/__init__.py +2 -2
  7. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/models.py +3 -14
  8. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/internal/internal.py +73 -40
  9. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/internal/snowflake.py +3 -1
  10. relationalai-0.9.18/src/relationalai/semantics/lqp/builtins.py +14 -0
  11. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/constructors.py +3 -0
  12. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/model2lqp.py +34 -13
  13. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/passes.py +1 -1
  14. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/builtins.py +3 -0
  15. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/dependency.py +2 -2
  16. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/helpers.py +1 -1
  17. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/extract_keys.py +77 -60
  18. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/flatten.py +4 -1
  19. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/typer/typer.py +2 -2
  20. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/types.py +1 -1
  21. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/optimization/common.py +5 -5
  22. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/optimization/solvers_dev.py +2 -1
  23. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/optimization/solvers_pb.py +2 -1
  24. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/compiler.py +4 -3
  25. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/compiler.py +1 -1
  26. relationalai-0.9.17/src/relationalai/semantics/tests/test_snapshot_base.py → relationalai-0.9.18/src/relationalai/semantics/tests/test_snapshot_abstract.py +43 -37
  27. relationalai-0.9.18/src/relationalai/semantics/tests/test_snapshot_base.py +9 -0
  28. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/tests/utils.py +11 -1
  29. {relationalai-0.9.17 → relationalai-0.9.18}/.gitignore +0 -0
  30. {relationalai-0.9.17 → relationalai-0.9.18}/LICENSE +0 -0
  31. {relationalai-0.9.17 → relationalai-0.9.18}/docs/pypi/README.md +0 -0
  32. {relationalai-0.9.17 → relationalai-0.9.18}/frontend/debugger/dist/.gitignore +0 -0
  33. {relationalai-0.9.17 → relationalai-0.9.18}/frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  34. {relationalai-0.9.17 → relationalai-0.9.18}/frontend/debugger/dist/assets/index-Cssla-O7.js +0 -0
  35. {relationalai-0.9.17 → relationalai-0.9.18}/frontend/debugger/dist/assets/index-DlHsYx1V.css +0 -0
  36. {relationalai-0.9.17 → relationalai-0.9.18}/frontend/debugger/dist/index.html +0 -0
  37. {relationalai-0.9.17 → relationalai-0.9.18}/src/__init__.py +0 -0
  38. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/__init__.py +0 -0
  39. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/events/__init__.py +0 -0
  40. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/procedures/__init__.py +0 -0
  41. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/procedures/procedure.py +0 -0
  42. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/rel/__init__.py +0 -0
  43. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/tables/__init__.py +0 -0
  44. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/tasks/__init__.py +0 -0
  45. {relationalai-0.9.17 → relationalai-0.9.18}/src/raitoolkit/tasks/task.py +0 -0
  46. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/__init__.py +0 -0
  47. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/analysis/__init__.py +0 -0
  48. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/analysis/mechanistic.py +0 -0
  49. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/analysis/whynot.py +0 -0
  50. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/auth/__init__.py +0 -0
  51. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/auth/jwt_generator.py +0 -0
  52. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/auth/oauth_callback_server.py +0 -0
  53. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/auth/token_handler.py +0 -0
  54. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/auth/util.py +0 -0
  55. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/__init__.py +0 -0
  56. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/azure.py +0 -0
  57. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/cache_store.py +0 -0
  58. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/client.py +0 -0
  59. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/config.py +0 -0
  60. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/export_procedure.py.jinja +0 -0
  61. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/hash_util.py +0 -0
  62. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/profile_polling.py +0 -0
  63. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/result_helpers.py +0 -0
  64. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/types.py +0 -0
  65. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/clients/util.py +0 -0
  66. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/compiler.py +0 -0
  67. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/dependencies.py +0 -0
  68. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/dsl.py +0 -0
  69. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/__init__.py +0 -0
  70. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/__init__.py +0 -0
  71. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/snowflake/__init__.py +0 -0
  72. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/std/__init__.py +0 -0
  73. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/std/decimals/__init__.py +0 -0
  74. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/std/integers/__init__.py +0 -0
  75. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/std/math/__init__.py +0 -0
  76. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/builder/std/strings/__init__.py +0 -0
  77. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/devtools/__init__.py +0 -0
  78. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -0
  79. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -0
  80. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/__init__.py +0 -0
  81. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/__init__.py +0 -0
  82. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/orm/__init__.py +0 -0
  83. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -0
  84. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/orm/model.py +0 -0
  85. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/orm/parser.py +0 -0
  86. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/owl/__init__.py +0 -0
  87. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -0
  88. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/owl/model.py +0 -0
  89. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/adapters/owl/parser.py +0 -0
  90. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/bindings/__init__.py +0 -0
  91. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/bindings/common.py +0 -0
  92. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/bindings/csv.py +0 -0
  93. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/bindings/legacy/__init__.py +0 -0
  94. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -0
  95. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/bindings/snowflake.py +0 -0
  96. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/codegen/__init__.py +0 -0
  97. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/codegen/binder.py +0 -0
  98. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/codegen/common.py +0 -0
  99. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/codegen/helpers.py +0 -0
  100. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/codegen/relations.py +0 -0
  101. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/codegen/weaver.py +0 -0
  102. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/constants.py +0 -0
  103. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/__init__.py +0 -0
  104. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/builders/__init__.py +0 -0
  105. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/builders/logic.py +0 -0
  106. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -0
  107. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/constraints/__init__.py +0 -0
  108. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  109. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -0
  110. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -0
  111. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/constraints/scalar.py +0 -0
  112. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/context.py +0 -0
  113. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/cset.py +0 -0
  114. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/exprs/__init__.py +0 -0
  115. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/exprs/relational.py +0 -0
  116. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/exprs/scalar.py +0 -0
  117. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/instances.py +0 -0
  118. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/logic/__init__.py +0 -0
  119. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/logic/aggregation.py +0 -0
  120. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/logic/exists.py +0 -0
  121. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/logic/helper.py +0 -0
  122. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/namespaces.py +0 -0
  123. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/relations.py +0 -0
  124. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/rules.py +0 -0
  125. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/stack.py +0 -0
  126. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/std/__init__.py +0 -0
  127. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/temporal/__init__.py +0 -0
  128. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/temporal/recall.py +0 -0
  129. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/__init__.py +0 -0
  130. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/concepts.py +0 -0
  131. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -0
  132. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -0
  133. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -0
  134. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/standard.py +0 -0
  135. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/unconstrained.py +0 -0
  136. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/types/variables.py +0 -0
  137. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/core/utils.py +0 -0
  138. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ir/__init__.py +0 -0
  139. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ir/compiler.py +0 -0
  140. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ir/executor.py +0 -0
  141. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/__init__.py +0 -0
  142. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/constraints.py +0 -0
  143. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/export.py +0 -0
  144. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/models.py +0 -0
  145. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/python_printer.py +0 -0
  146. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/raw_source.py +0 -0
  147. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/readings.py +0 -0
  148. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/relationships.py +0 -0
  149. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/roles.py +0 -0
  150. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/ontologies/subtyping.py +0 -0
  151. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/__init__.py +0 -0
  152. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/constraints.py +0 -0
  153. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/measures/__init__.py +0 -0
  154. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -0
  155. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/measures/initializer.py +0 -0
  156. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -0
  157. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/measures/measures.py +0 -0
  158. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -0
  159. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -0
  160. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/printer.py +0 -0
  161. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/reasoner_errors.py +0 -0
  162. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/reasoners.py +0 -0
  163. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/relations.py +0 -0
  164. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/relationships.py +0 -0
  165. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/types.py +0 -0
  166. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/utils.py +0 -0
  167. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/orm/verb.py +0 -0
  168. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/physical_metadata/__init__.py +0 -0
  169. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/physical_metadata/tables.py +0 -0
  170. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/relations.py +0 -0
  171. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/rulesets.py +0 -0
  172. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/__init__.py +0 -0
  173. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/builder.py +0 -0
  174. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/comp_names.py +0 -0
  175. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/components.py +0 -0
  176. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/contexts.py +0 -0
  177. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/exprs.py +0 -0
  178. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/schemas/fragments.py +0 -0
  179. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/serialization.py +0 -0
  180. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/serialize/__init__.py +0 -0
  181. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/serialize/binding_model.py +0 -0
  182. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/serialize/exporter.py +0 -0
  183. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/serialize/model.py +0 -0
  184. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/snow/__init__.py +0 -0
  185. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/snow/api.py +0 -0
  186. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/snow/common.py +0 -0
  187. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -0
  188. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -0
  189. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -0
  190. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/types/__init__.py +0 -0
  191. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/types/concepts.py +0 -0
  192. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/types/entities.py +0 -0
  193. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/types/values.py +0 -0
  194. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/dsl/utils.py +0 -0
  195. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/graphs/__init__.py +0 -0
  196. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/__init__.py +0 -0
  197. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/compiler/__init__.py +0 -0
  198. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/constructors/__init__.py +0 -0
  199. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/executor/__init__.py +0 -0
  200. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/ir/__init__.py +0 -0
  201. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/passes/__init__.py +0 -0
  202. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/pragmas/__init__.py +0 -0
  203. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/primitives/__init__.py +0 -0
  204. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/types/__init__.py +0 -0
  205. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/utils/__init__.py +0 -0
  206. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/lqp/validators/__init__.py +0 -0
  207. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/__init__.py +0 -0
  208. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/builtins/__init__.py +0 -0
  209. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/compiler/__init__.py +0 -0
  210. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/dependency/__init__.py +0 -0
  211. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/factory/__init__.py +0 -0
  212. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/helpers/__init__.py +0 -0
  213. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/ir/__init__.py +0 -0
  214. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/rewrite/__init__.py +0 -0
  215. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/typer/__init__.py +0 -0
  216. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -0
  217. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/types/__init__.py +0 -0
  218. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/util/__init__.py +0 -0
  219. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/metamodel/visitor/__init__.py +0 -0
  220. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/__init__.py +0 -0
  221. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/api/__init__.py +0 -0
  222. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/benchmarks/__init__.py +0 -0
  223. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/graph/__init__.py +0 -0
  224. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/__init__.py +0 -0
  225. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/find_paths/__init__.py +0 -0
  226. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/one_sided_ball_repetition/__init__.py +0 -0
  227. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/one_sided_ball_upto/__init__.py +0 -0
  228. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/single/__init__.py +0 -0
  229. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/two_sided_balls_repetition/__init__.py +0 -0
  230. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/two_sided_balls_upto/__init__.py +0 -0
  231. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/path_algorithms/usp/__init__.py +0 -0
  232. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/rpq/__init__.py +0 -0
  233. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/utilities/__init__.py +0 -0
  234. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/paths/utilities/iterators/__init__.py +0 -0
  235. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/rel/__init__.py +0 -0
  236. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/rel/executor/__init__.py +0 -0
  237. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/rel/rel_utils/__init__.py +0 -0
  238. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/rel/rewrite/__init__.py +0 -0
  239. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/solvers/__init__.py +0 -0
  240. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/sql/__init__.py +0 -0
  241. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/sql/executor/__init__.py +0 -0
  242. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/sql/rewrite/__init__.py +0 -0
  243. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/tests/__init__.py +0 -0
  244. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/tests/logging/__init__.py +0 -0
  245. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -0
  246. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/early_access/tests/utils/__init__.py +0 -0
  247. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/__init__.py +0 -0
  248. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/base.py +0 -0
  249. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/ci.py +0 -0
  250. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/colab.py +0 -0
  251. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/generic.py +0 -0
  252. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/hex.py +0 -0
  253. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/ipython.py +0 -0
  254. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/jupyter.py +0 -0
  255. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/snowbook.py +0 -0
  256. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/environments/terminal.py +0 -0
  257. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/errors.py +0 -0
  258. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/SF.py +0 -0
  259. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/__init__.py +0 -0
  260. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/graphs.py +0 -0
  261. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/inspect.py +0 -0
  262. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/__init__.py +0 -0
  263. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/api.py +0 -0
  264. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/automaton.py +0 -0
  265. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/bridge.py +0 -0
  266. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/compiler.py +0 -0
  267. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/datalog.py +0 -0
  268. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/diagnostics.py +0 -0
  269. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/filter.py +0 -0
  270. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/glushkov.py +0 -0
  271. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/options.py +0 -0
  272. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +0 -0
  273. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/rpq.py +0 -0
  274. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/transition.py +0 -0
  275. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/pathfinder/utils.py +0 -0
  276. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/paths/__init__.py +0 -0
  277. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/paths/pathfinder.rel +0 -0
  278. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/paths/tree_agg.py +0 -0
  279. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/experimental/solvers.py +0 -0
  280. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/loaders/__init__.py +0 -0
  281. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/loaders/csv.py +0 -0
  282. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/loaders/loader.py +0 -0
  283. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/loaders/types.py +0 -0
  284. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/metagen.py +0 -0
  285. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/metamodel.py +0 -0
  286. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/rel.py +0 -0
  287. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/rel_emitter.py +0 -0
  288. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/rel_utils.py +0 -0
  289. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/__init__.py +0 -0
  290. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/designs/query_builder/identify_by.md +0 -0
  291. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/devtools/__init__.py +0 -0
  292. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/devtools/benchmark_lqp.py +0 -0
  293. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/devtools/compilation_manager.py +0 -0
  294. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/devtools/extract_lqp.py +0 -0
  295. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/internal/__init__.py +0 -0
  296. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/internal/annotations.py +0 -0
  297. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/__init__.py +0 -0
  298. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/compiler.py +0 -0
  299. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/executor.py +0 -0
  300. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/ir.py +0 -0
  301. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/pragmas.py +0 -0
  302. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/primitives.py +0 -0
  303. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/result_helpers.py +0 -0
  304. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/types.py +0 -0
  305. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/utils.py +0 -0
  306. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/lqp/validators.py +0 -0
  307. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/__init__.py +0 -0
  308. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/compiler.py +0 -0
  309. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/dataflow.py +0 -0
  310. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/executor.py +0 -0
  311. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/factory.py +0 -0
  312. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/ir.py +0 -0
  313. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/__init__.py +0 -0
  314. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -0
  315. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -0
  316. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/fd_constraints.py +0 -0
  317. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/gc_nodes.py +0 -0
  318. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/list_types.py +0 -0
  319. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/rewrite/splinter.py +0 -0
  320. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/typer/__init__.py +0 -0
  321. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/typer/checker.py +0 -0
  322. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/util.py +0 -0
  323. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/metamodel/visitor.py +0 -0
  324. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/__init__.py +0 -0
  325. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/README.md +0 -0
  326. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/__init__.py +0 -0
  327. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/core.py +0 -0
  328. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +0 -0
  329. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/README.md +0 -0
  330. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/__init__.py +0 -0
  331. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/api.py +0 -0
  332. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/benchmarks/__init__.py +0 -0
  333. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/benchmarks/grid_graph.py +0 -0
  334. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/code_organization.md +0 -0
  335. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/Movies.ipynb +0 -0
  336. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/basic_example.py +0 -0
  337. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/minimal_engine_warmup.py +0 -0
  338. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movie_example.py +0 -0
  339. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/actedin.csv +0 -0
  340. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/directed.csv +0 -0
  341. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/follows.csv +0 -0
  342. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/movies.csv +0 -0
  343. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/person.csv +0 -0
  344. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/produced.csv +0 -0
  345. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/ratings.csv +0 -0
  346. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/movies_data/wrote.csv +0 -0
  347. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/paths_benchmark.py +0 -0
  348. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/paths_example.py +0 -0
  349. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/examples/pattern_to_automaton.py +0 -0
  350. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/find_paths_via_automaton.py +0 -0
  351. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/graph.py +0 -0
  352. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/__init__.py +0 -0
  353. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/find_paths.py +0 -0
  354. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/one_sided_ball_repetition.py +0 -0
  355. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/one_sided_ball_upto.py +0 -0
  356. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/single.py +0 -0
  357. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/two_sided_balls_repetition.py +0 -0
  358. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/two_sided_balls_upto.py +0 -0
  359. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/usp-old.py +0 -0
  360. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/usp-tuple.py +0 -0
  361. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/path_algorithms/usp.py +0 -0
  362. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/product_graph.py +0 -0
  363. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/__init__.py +0 -0
  364. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/automaton.py +0 -0
  365. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/diagnostics.py +0 -0
  366. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/filter.py +0 -0
  367. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/glushkov.py +0 -0
  368. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/rpq.py +0 -0
  369. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/rpq/transition.py +0 -0
  370. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_sp_max_length.py +0 -0
  371. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_sp_multiple.py +0 -0
  372. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_sp_single.py +0 -0
  373. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_walks_multiple.py +0 -0
  374. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_limit_walks_single.py +0 -0
  375. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -0
  376. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_repetition_single.py +0 -0
  377. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -0
  378. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_one_sided_ball_upto_single.py +0 -0
  379. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_single_paths.py +0 -0
  380. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_single_walks.py +0 -0
  381. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_single_walks_undirected.py +0 -0
  382. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -0
  383. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_repetition_single.py +0 -0
  384. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -0
  385. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_two_sided_balls_upto_single.py +0 -0
  386. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_usp_nsp_multiple.py +0 -0
  387. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/tests/tests_usp_nsp_single.py +0 -0
  388. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/utilities/__init__.py +0 -0
  389. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/utilities/iterators.py +0 -0
  390. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/utilities/prefix_sum.py +0 -0
  391. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/paths/utilities/utilities.py +0 -0
  392. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/graph/tests/README.md +0 -0
  393. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/reasoners/optimization/__init__.py +0 -0
  394. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/__init__.py +0 -0
  395. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/builtins.py +0 -0
  396. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/executor.py +0 -0
  397. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/rel.py +0 -0
  398. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/rel_utils.py +0 -0
  399. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/rewrite/__init__.py +0 -0
  400. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/rewrite/cdc.py +0 -0
  401. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/rewrite/extract_common.py +0 -0
  402. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/rel/rewrite/quantify_vars.py +0 -0
  403. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/__init__.py +0 -0
  404. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/executor/__init__.py +0 -0
  405. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/executor/duck_db.py +0 -0
  406. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/executor/result_helpers.py +0 -0
  407. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/executor/snowflake.py +0 -0
  408. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/rewrite/__init__.py +0 -0
  409. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/rewrite/denormalize.py +0 -0
  410. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/rewrite/double_negation.py +0 -0
  411. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/rewrite/recursive_union.py +0 -0
  412. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -0
  413. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/sql/sql.py +0 -0
  414. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/__init__.py +0 -0
  415. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/constraints.py +0 -0
  416. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/dates.py +0 -0
  417. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/decimals.py +0 -0
  418. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/integers.py +0 -0
  419. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/math.py +0 -0
  420. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/pragmas.py +0 -0
  421. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/std.py +0 -0
  422. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/std/strings.py +0 -0
  423. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/tests/__init__.py +0 -0
  424. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/semantics/tests/logging.py +0 -0
  425. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/__init__.py +0 -0
  426. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/aggregates.py +0 -0
  427. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/dates.py +0 -0
  428. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/graphs.py +0 -0
  429. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/inspect.py +0 -0
  430. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/math.py +0 -0
  431. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/re.py +0 -0
  432. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/std/strings.py +0 -0
  433. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/__init__.py +0 -0
  434. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/cleanup_snapshots.py +0 -0
  435. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/cli.py +0 -0
  436. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/cli_controls.py +0 -0
  437. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/cli_helpers.py +0 -0
  438. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/constants.py +0 -0
  439. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/debugger.py +0 -0
  440. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/debugger_client.py +0 -0
  441. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/debugger_server.py +0 -0
  442. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/dev.py +0 -0
  443. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/notes +0 -0
  444. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/qb_debugger.py +0 -0
  445. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/tools/snapshot_viewer.py +0 -0
  446. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/__init__.py +0 -0
  447. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/constants.py +0 -0
  448. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/format.py +0 -0
  449. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/graph.py +0 -0
  450. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/otel_handler.py +0 -0
  451. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/snowflake_handler.py +0 -0
  452. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/span_format_test.py +0 -0
  453. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/span_tracker.py +0 -0
  454. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/spans_file_handler.py +0 -0
  455. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai/util/tracing_handler.py +0 -0
  456. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai_test_util/__init__.py +0 -0
  457. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai_test_util/fixtures.py +0 -0
  458. {relationalai-0.9.17 → relationalai-0.9.18}/src/relationalai_test_util/snapshot.py +0 -0
  459. {relationalai-0.9.17 → relationalai-0.9.18}/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.17
3
+ Version: 0.9.18
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.17'
3
+ version = '0.9.18'
4
4
  description = 'RelationalAI Library and CLI'
5
5
  readme="docs/pypi/README.md"
6
6
  authors = [
@@ -702,22 +702,14 @@ Otherwise, remove it from your '{profile}' configuration profile.
702
702
  self._create_engine(name, size, auto_suspend_mins, True)
703
703
 
704
704
  def delete_engine(self, name:str, force:bool = False, headers: Dict | None = None):
705
- request_headers = {}
706
- prop_headers = debugging.gen_current_propagation_headers()
707
- if headers:
708
- request_headers.update(headers)
709
- request_headers.update(prop_headers)
705
+ request_headers = debugging.add_current_propagation_headers(headers)
710
706
  self._exec(f"call {APP_NAME}.api.delete_engine('{name}', {force},{request_headers});")
711
707
 
712
708
  def suspend_engine(self, name:str):
713
709
  self._exec(f"call {APP_NAME}.api.suspend_engine('{name}');")
714
710
 
715
711
  def resume_engine(self, name:str, headers: Dict | None = None) -> Dict:
716
- request_headers = {}
717
- prop_headers = debugging.gen_current_propagation_headers()
718
- if headers:
719
- request_headers.update(headers)
720
- request_headers.update(prop_headers)
712
+ request_headers = debugging.add_current_propagation_headers(headers)
721
713
  self._exec(f"call {APP_NAME}.api.resume_engine('{name}',{request_headers});")
722
714
  # returning empty dict to match the expected return type
723
715
  return {}
@@ -1559,12 +1551,7 @@ Otherwise, remove it from your '{profile}' configuration profile.
1559
1551
  ):
1560
1552
  if inputs is None:
1561
1553
  inputs = {}
1562
- prop_headers = debugging.generate_propagation_headers(debugging.get_current_span())
1563
- request_headers = {}
1564
- if headers:
1565
- request_headers.update(headers)
1566
- request_headers.update(prop_headers)
1567
-
1554
+ request_headers = debugging.add_current_propagation_headers(headers)
1568
1555
  query_attrs_dict = json.loads(request_headers.get("X-Query-Attributes", "{}"))
1569
1556
 
1570
1557
  with debugging.span("transaction", **query_attrs_dict) as txn_span:
@@ -2980,7 +2967,6 @@ class DirectAccessClient:
2980
2967
  return url, ep.method
2981
2968
 
2982
2969
  def _prepare_headers(self, headers: Dict[str, str] | None) -> Dict[str, str]:
2983
-
2984
2970
  request_headers = {}
2985
2971
  if headers:
2986
2972
  request_headers.update(headers)
@@ -2994,7 +2980,8 @@ class DirectAccessClient:
2994
2980
 
2995
2981
  request_headers["user-agent"] = get_pyrel_version(self.generation)
2996
2982
  request_headers["pyrel_program_id"] = debugging.get_program_span_id() or ""
2997
- return request_headers
2983
+
2984
+ return debugging.add_current_propagation_headers(request_headers)
2998
2985
 
2999
2986
  class DirectAccessResources(Resources):
3000
2987
  """
@@ -142,7 +142,10 @@ class UseIndexPoller:
142
142
  "should_check_cdc": self.should_check_cdc,
143
143
  "init_engine_async": self.init_engine_async,
144
144
  })
145
- sql_string = f"CALL {self.app_name}.api.use_index([{sources_object_references_str}], PARSE_JSON(?), {self.headers});"
145
+
146
+ request_headers = debugging.add_current_propagation_headers(self.headers)
147
+
148
+ sql_string = f"CALL {self.app_name}.api.use_index([{sources_object_references_str}], PARSE_JSON(?), {request_headers});"
146
149
 
147
150
  with debugging.span("wait", counter=self.counter, use_index_id=use_index_id) as span:
148
151
  results = self.res._exec(sql_string, [params])
@@ -4,7 +4,7 @@ import contextlib
4
4
  import datetime
5
5
  import json
6
6
  import os
7
- from typing import Dict, Generator
7
+ from typing import Dict, Generator, Optional
8
8
  import logging
9
9
  import uuid
10
10
  import warnings
@@ -212,6 +212,15 @@ class Span:
212
212
  "attrs": self.attrs,
213
213
  }
214
214
 
215
+
216
+ def add_current_propagation_headers(headers: Optional[Dict]) -> Dict:
217
+ prop_headers = gen_current_propagation_headers()
218
+
219
+ if headers:
220
+ prop_headers.update(headers)
221
+
222
+ return prop_headers
223
+
215
224
  def gen_current_propagation_headers():
216
225
  return generate_propagation_headers(get_current_span())
217
226
 
@@ -2,7 +2,7 @@ import warnings
2
2
 
3
3
  from relationalai.semantics.internal.internal import (field_to_type, Compiler, RelationshipRef, ConceptNew,
4
4
  RelationshipFieldRef, Ref, Aggregate, decimal_concept_by_name,
5
- _global_id)
5
+ _global_id, TupleArg)
6
6
  from relationalai.semantics.internal import (
7
7
  Model, Concept, Relationship, RelationshipReading, Expression, Fragment, Error, Field,
8
8
  String, Integer, Int64, Int128, Float, Decimal, Bool,
@@ -24,7 +24,7 @@ __all__ = [
24
24
  "count", "sum", "min", "max", "avg", "per",
25
25
  "not_", "builder",
26
26
  "field_to_type", "Compiler", "RelationshipRef", "ConceptNew", "RelationshipFieldRef", "Ref", "Aggregate",
27
- "decimal_concept_by_name", "_global_id"
27
+ "decimal_concept_by_name", "_global_id", "TupleArg"
28
28
  ]
29
29
 
30
30
  warnings.warn(
@@ -3,7 +3,8 @@ from __future__ import annotations
3
3
  from collections import OrderedDict
4
4
  from typing import Optional, Any, Sequence, Union, TypeVar
5
5
 
6
- import relationalai.early_access.builder as qb
6
+ import relationalai.semantics as qb
7
+ from relationalai.semantics.std import constraints as c
7
8
  from relationalai import Config
8
9
  from relationalai.early_access.dsl.bindings.common import Binding
9
10
  from relationalai.early_access.dsl.bindings.csv import CsvTable
@@ -75,6 +76,7 @@ class Model:
75
76
  def unique(self, *roles):
76
77
  uc = Unique(*roles)
77
78
  self.constraint(uc)
79
+ c.unique(*roles)
78
80
  first_part_of = roles[0]._part_of()
79
81
  if isinstance(first_part_of, RelationshipReading):
80
82
  relationship = first_part_of._alt_of
@@ -82,20 +84,7 @@ class Model:
82
84
  relationship = first_part_of
83
85
  # check if UC is internal
84
86
  if all(role._part_of()._id == first_part_of._id for role in roles):
85
- field_refs = set(r._field_ref for r in roles)
86
87
  internal_ucs = self._relationship_iuc.get(relationship, [])
87
- # create sets of ref fields declared for the relationship
88
- iuc_ref_sets = [set(r._field_ref for r in uc.roles()) for uc in internal_ucs]
89
- for reading in relationship._readings:
90
- refs_except_last = set(reading._field_refs[:-1])
91
- # when internal UC declared for all the roles except the last one in the RelationshipReading mark RelationshipReading as `is_many=False`
92
- if field_refs == refs_except_last:
93
- reading._is_many = False
94
- elif not reading._is_many:
95
- # check that a reading already has an internal uc with the roles except the last one
96
- # if not then mark reading as `is_many=True`
97
- if all(refs != refs_except_last for refs in iuc_ref_sets):
98
- reading._is_many = True
99
88
  internal_ucs.append(uc)
100
89
  self._relationship_iuc[relationship] = internal_ucs # todo: this logic should be part of reactive reasoner
101
90
 
@@ -20,7 +20,7 @@ from relationalai.clients.config import Config
20
20
  from relationalai.clients.result_helpers import Int128Dtype
21
21
  from relationalai.semantics.metamodel import factory as f, helpers, ir, builtins, types
22
22
  from relationalai.semantics.metamodel.typer import typer
23
- from relationalai.semantics.metamodel.util import NameCache, OrderedSet, ordered_set
23
+ from relationalai.semantics.metamodel.util import NameCache, OrderedSet, ordered_set, FrozenOrderedSet
24
24
  from relationalai.semantics.rel.executor import RelExecutor
25
25
  from relationalai.semantics.lqp.executor import LQPExecutor
26
26
  from relationalai.semantics.sql.executor import SnowflakeExecutor
@@ -507,10 +507,16 @@ class Producer:
507
507
  def _get_relationship(self, name:str) -> Relationship|RelationshipRef|RelationshipFieldRef:
508
508
  root_type:Concept = to_type(self) or Concept.builtins["Any"]
509
509
  namer = NameCache()
510
- r = Relationship(
510
+ cls = Relationship if root_type is Error else Property
511
+ r = cls(
511
512
  f"{{{root_type}}} has {{{name}:Any}}",
512
- parent=self, short_name=name, model=self._model,
513
- field_refs=cast(list[Ref], [root_type.ref(namer.get_name(1, root_type._name.lower())), Concept.builtins["Any"].ref(namer.get_name(2, name))])
513
+ parent=self,
514
+ short_name=name,
515
+ model=self._model,
516
+ field_refs=cast(list[Ref], [
517
+ root_type.ref(namer.get_name(1, root_type._name.lower())),
518
+ Concept.builtins["Any"].ref(namer.get_name(2, name)),
519
+ ]),
514
520
  )
515
521
  # if we don't know the root type, then this relationship is unresolved and we're
516
522
  # really just handing an anonymous relationship back that we expect to be resolved
@@ -839,9 +845,9 @@ class Concept(Producer):
839
845
  if python_types_to_concepts.get(v):
840
846
  v = python_types_to_concepts[v]
841
847
  if isinstance(v, Concept):
842
- setattr(self, k, Relationship(f"{{{self._name}}} has {{{k}:{v._name}}}", short_name=k, model=self._model))
848
+ setattr(self, k, Property(f"{{{self._name}}} has {{{k}:{v._name}}}", short_name=k, model=self._model))
843
849
  elif isinstance(v, type) and issubclass(v, self._model.Enum): #type: ignore
844
- setattr(self, k, Relationship(f"{{{self._name}}} has {{{k}:{v._concept._name}}}", short_name=k, model=self._model))
850
+ setattr(self, k, Property(f"{{{self._name}}} has {{{k}:{v._concept._name}}}", short_name=k, model=self._model))
845
851
  elif isinstance(v, Relationship):
846
852
  self._validate_identifier_relationship(v)
847
853
  setattr(self, k, v)
@@ -865,7 +871,7 @@ class Concept(Producer):
865
871
  self._check_ref_scheme(kwargs, shallow=True)
866
872
  return ConceptConstruct(self, args, kwargs)
867
873
 
868
- def annotate(self, *annos:Expression|Relationship) -> Concept:
874
+ def annotate(self, *annos:Expression|Relationship|ir.Annotation) -> Concept:
869
875
  self._annotations.extend(annos)
870
876
  return self
871
877
 
@@ -1175,7 +1181,7 @@ class Field():
1175
1181
  class Relationship(Producer):
1176
1182
  builtins = {}
1177
1183
 
1178
- def __init__(self, madlib:str, parent:Producer|None=None, short_name:str="", model:Model|None=None, fields:list[Field]|None=None, field_refs:list[Ref]|None=None, is_many:bool|None=None, ir_relation:ir.Relation|None=None):
1184
+ def __init__(self, madlib:str, parent:Producer|None=None, short_name:str="", model:Model|None=None, fields:list[Field]|None=None, field_refs:list[Ref]|None=None, ir_relation:ir.Relation|None=None):
1179
1185
  found_model = model or find_model(parent) or find_model(args)
1180
1186
  super().__init__(found_model)
1181
1187
  self._parent = parent
@@ -1185,7 +1191,7 @@ class Relationship(Producer):
1185
1191
  if fields is not None:
1186
1192
  self._fields:list[Field] = fields
1187
1193
  else:
1188
- self._fields, is_many = self._parse_schema_format(madlib)
1194
+ self._fields = self._parse_schema_format(madlib)
1189
1195
  if not self._fields and not ir_relation:
1190
1196
  raise ValueError(f"No fields found in relationship {self}")
1191
1197
  self._ir_relation = ir_relation
@@ -1196,8 +1202,9 @@ class Relationship(Producer):
1196
1202
  self._field_refs = [cast(Ref, field_to_type(found_model, field).ref(field.name)) for field in self._fields]
1197
1203
  for field in self._field_refs:
1198
1204
  field._no_lookup = True
1205
+ self._internal_constraints:set[FieldsConstraint] = set()
1199
1206
  self._field_names = [field.name for field in self._fields]
1200
- self._readings = [RelationshipReading(madlib, alt_of=self, short_name=short_name, fields=self._fields, is_many=is_many, model=found_model, parent=parent)]
1207
+ self._readings = [RelationshipReading(madlib, alt_of=self, short_name=short_name, fields=self._fields, model=found_model, parent=parent)]
1201
1208
  self._annotations = []
1202
1209
  # now that the Relationship is validated, register into the model
1203
1210
  if found_model is not None:
@@ -1212,33 +1219,30 @@ class Relationship(Producer):
1212
1219
  return self._passed_short_name or _short_name_from_madlib(self._madlib)
1213
1220
 
1214
1221
  def is_many(self):
1215
- return self._readings[0].is_many()
1222
+ if self._arity() == 1:
1223
+ return False
1224
+ uc = Unique.to_identity(*(self[i] for i in range(self._arity() - 1)))
1225
+ return uc not in self._internal_constraints
1216
1226
 
1217
1227
  def _is_filter(self) -> bool:
1218
1228
  return self._short_name in [">", "<", "=", "!=", ">=", "<="]
1219
1229
 
1220
1230
  def _parse_schema_format(self, format_string:str):
1221
- # Pattern to extract fields like {Type*} or {name:Type*}, where Type can have precision and scale, like Decimal(38,14)
1222
- pattern = r'\{([a-zA-Z0-9_.]+(?:\([0-9]+,[0-9]+\))?)(\*?)(?::([a-zA-Z0-9_.]+(?:\([0-9]+,[0-9]+\))?)(\*?))?\}'
1231
+ # Pattern to extract fields like {Type} or {name:Type}, where Type can have precision and scale, like Decimal(38,14)
1232
+ pattern = r'\{([a-zA-Z0-9_.]+(?:\([0-9]+,[0-9]+\))?)(?::([a-zA-Z0-9_.]+(?:\([0-9]+,[0-9]+\))?))?\}'
1223
1233
  matches = re.findall(pattern, format_string)
1224
1234
 
1225
1235
  namer = NameCache()
1226
1236
  fields = []
1227
- is_many = False
1228
1237
  match_index = 0
1229
1238
  ix = 0
1230
- for field_name, field_name_is_many, field_type, field_type_is_many in matches:
1239
+ for field_name, field_type in matches:
1231
1240
  # If no type is specified, use the field name as the type
1232
1241
  if not field_type:
1233
1242
  field_type = field_name
1234
1243
  # in this case, the field_name is based on the type name, so sanitize to avoid
1235
1244
  # ()s in decimal names, for example
1236
1245
  field_name = helpers.sanitize(field_name.lower())
1237
- field_type_is_many = field_name_is_many
1238
-
1239
- is_many = bool(field_type_is_many)
1240
- if is_many and match_index != len(matches) - 1:
1241
- raise ValueError(f"Only the last role of a relationship reading can be 1-to-many: {format_string}")
1242
1246
 
1243
1247
  ix += 1
1244
1248
  field_name = namer.get_name(ix, field_name)
@@ -1246,7 +1250,7 @@ class Relationship(Producer):
1246
1250
  fields.append(Field(field_name, field_type))
1247
1251
  match_index +=1
1248
1252
 
1249
- return fields, is_many
1253
+ return fields
1250
1254
 
1251
1255
  def _dir_extras_from_get_relationship(self) -> Any:
1252
1256
  return self._field_refs[-1]._dir_extras_from_getattr()
@@ -1270,7 +1274,7 @@ class Relationship(Producer):
1270
1274
  return RelationshipFieldRef(self._parent, self, self._field_names.index(name))
1271
1275
  return super().__getattr__(name)
1272
1276
 
1273
- def annotate(self, *annos:Expression|Relationship) -> Relationship:
1277
+ def annotate(self, *annos:Expression|Relationship|ir.Annotation) -> Relationship:
1274
1278
  self._annotations.extend(annos)
1275
1279
  return self
1276
1280
 
@@ -1318,18 +1322,16 @@ class Relationship(Producer):
1318
1322
 
1319
1323
  class Property(Relationship):
1320
1324
 
1321
- def __init__(self, madlib:str, parent:Producer|None=None, short_name:str="", model:Model|None=None, fields:list[Field]|None=None, field_refs:list[Ref]|None=None, is_many:bool|None=None, ir_relation:ir.Relation|None=None):
1322
- super().__init__(madlib, parent, short_name, model, fields, field_refs, is_many, ir_relation)
1325
+ def __init__(self, madlib:str, parent:Producer|None=None, short_name:str="", model:Model|None=None, fields:list[Field]|None=None, field_refs:list[Ref]|None=None, ir_relation:ir.Relation|None=None):
1326
+ super().__init__(madlib, parent, short_name, model, fields, field_refs, ir_relation)
1323
1327
  # for property should be an implicit unique constraint on the first n-1 fields
1324
1328
  uc = Unique(*(self[i] for i in range(self._arity() - 1)), model=self._model)
1325
1329
  require(uc.to_expressions())
1326
1330
 
1327
1331
 
1328
1332
  class RelationshipReading(Producer):
1329
- # if true, the last role has 1-many semantics
1330
- _is_many:bool = False
1331
1333
 
1332
- def __init__(self, madlib:str, alt_of:Relationship, short_name:str, fields:list[Field]|None=None, is_many:bool|None=None, model:Model|None=None, parent:Producer|None=None,):
1334
+ def __init__(self, madlib:str, alt_of:Relationship, short_name:str, fields:list[Field]|None=None, model:Model|None=None, parent:Producer|None=None,):
1333
1335
  found_model = model or find_model(parent)
1334
1336
  super().__init__(found_model)
1335
1337
  self._parent = parent
@@ -1338,9 +1340,8 @@ class RelationshipReading(Producer):
1338
1340
  self._passed_short_name = short_name
1339
1341
  if fields is not None:
1340
1342
  self._fields:list[Field] = fields
1341
- self._is_many = is_many or False
1342
1343
  else:
1343
- self._fields, self._is_many = alt_of._parse_schema_format(madlib)
1344
+ self._fields = alt_of._parse_schema_format(madlib)
1344
1345
  if Counter(self._fields) != Counter(alt_of._fields):
1345
1346
  raise ValueError(
1346
1347
  f"Invalid alternative relationship. The alternative group of used fields ({', '.join(str(f) for f in self._fields)}) does not match with the original ({', '.join(str(f) for f in alt_of._fields)})")
@@ -1350,12 +1351,15 @@ class RelationshipReading(Producer):
1350
1351
  self._annotations = []
1351
1352
 
1352
1353
  def is_many(self):
1353
- return self._is_many
1354
+ if self._arity() == 1:
1355
+ return False
1356
+ uc = Unique.to_identity(*(self[i] for i in range(self._arity() - 1)))
1357
+ return uc not in self._alt_of._internal_constraints
1354
1358
 
1355
1359
  def _arity(self):
1356
1360
  return len(self._fields)
1357
1361
 
1358
- def annotate(self, *annos:Expression|Relationship) -> RelationshipReading:
1362
+ def annotate(self, *annos:Expression|Relationship|ir.Annotation) -> RelationshipReading:
1359
1363
  self._annotations.extend(annos)
1360
1364
  return self
1361
1365
 
@@ -1553,7 +1557,9 @@ class ConceptExpression(Expression):
1553
1557
  args[rel] = kwargs[rel._short_name]
1554
1558
  else:
1555
1559
  for k, v in kwargs.items():
1556
- args[getattr(self._op, k)] = v
1560
+ atr = getattr(self._op, k)
1561
+ if atr:
1562
+ args[atr] = v
1557
1563
  if ident:
1558
1564
  args[self._op] = ident
1559
1565
  return args
@@ -2021,14 +2027,17 @@ class FieldsConstraint:
2021
2027
  def fields(self) -> tuple[RelationshipFieldRef, ...]:
2022
2028
  return self._fields
2023
2029
 
2024
- def __init__(self, *fields: RelationshipFieldRef, model:Model|None=None):
2025
- self._fields = fields
2030
+ def __init__(self, *fields: RelationshipFieldRef, model:Model|None=None) -> None:
2031
+ self._init_constraint(*fields)
2026
2032
  self._model = model or find_model(fields)
2033
+ if self._model:
2034
+ self._model.constraints.add(self)
2035
+
2036
+ def _init_constraint(self, *fields: RelationshipFieldRef) -> None:
2037
+ self._fields = fields
2027
2038
  ids = [field._field_ref._id for field in fields]
2028
2039
  ids.sort() # ensures order doesn't matter
2029
2040
  self._id = f'{type(self).__name__}:{ids}'
2030
- if self._model:
2031
- self._model.constraints.add(self)
2032
2041
 
2033
2042
  def __eq__(self, other):
2034
2043
  if isinstance(other, FieldsConstraint):
@@ -2038,11 +2047,21 @@ class FieldsConstraint:
2038
2047
  def __hash__(self):
2039
2048
  return hash(self._id)
2040
2049
 
2050
+ @classmethod
2051
+ def to_identity(cls, *fields: RelationshipFieldRef):
2052
+ obj = cls.__new__(cls)
2053
+ obj._init_constraint(*fields)
2054
+ return obj
2055
+
2041
2056
  class Unique(FieldsConstraint):
2042
2057
 
2043
- def __init__(self, *fields: RelationshipFieldRef, model:Model|None=None):
2044
- self._internal = all(fields[0]._relationship._is_same_relationship(f._relationship) for f in fields[1:])
2058
+ def __init__(self, *fields: RelationshipFieldRef, model:Model|None=None) -> None:
2059
+ first_field_rel = fields[0]._relationship
2060
+ self._internal = all(first_field_rel._is_same_relationship(f._relationship) for f in fields[1:])
2045
2061
  super().__init__(*fields, model=model)
2062
+ if self._internal:
2063
+ relationship = first_field_rel._alt_of if isinstance(first_field_rel, RelationshipReading) else first_field_rel
2064
+ relationship._internal_constraints.add(self)
2046
2065
 
2047
2066
  def internal(self) -> bool:
2048
2067
  return self._internal
@@ -2146,7 +2165,7 @@ class Fragment():
2146
2165
  self._meta.update(kwargs)
2147
2166
  return self
2148
2167
 
2149
- def annotate(self, *annos:Expression|Relationship) -> Fragment:
2168
+ def annotate(self, *annos:Expression|Relationship|ir.Annotation) -> Fragment:
2150
2169
  self._annotations.extend(annos)
2151
2170
  return self
2152
2171
 
@@ -2771,6 +2790,20 @@ class Compiler():
2771
2790
  else:
2772
2791
  final_keys.update(keys)
2773
2792
 
2793
+ # If we are exporting into a table, we need to add a key to the output
2794
+ # We hash all the values to create a key
2795
+ if not final_keys and fragment._is_export:
2796
+ tmp_var = ctx.to_value(self)
2797
+ assert isinstance(tmp_var, ir.Var)
2798
+ key_var = f.var(tmp_var.name, types.Hash)
2799
+ assert isinstance(key_var, ir.Var)
2800
+ final_keys.add(key_var)
2801
+ values = [ir.Literal(types.String, "NO_KEYS")]
2802
+ for fld in fields:
2803
+ values.append(fld[1])
2804
+ con = ir.Construct(None, tuple(values), key_var, FrozenOrderedSet([]))
2805
+ ctx.add(con)
2806
+
2774
2807
  ctx.add(f.output(fields, keys=list(final_keys), annos=annos))
2775
2808
 
2776
2809
  def require(self, fragment:Fragment, items:PySequence[Expression], ctx:CompilerContext):
@@ -3261,7 +3294,7 @@ class Compiler():
3261
3294
 
3262
3295
  ctx.add(f.derive(relation, [out]))
3263
3296
  # derive the membership and all the relationships
3264
- rels = self.relation_dict({getattr(item._op, k): v for k, v in kwargs.items()}, ctx)
3297
+ rels = self.relation_dict({attr: v for k, v in kwargs.items() if (attr := getattr(item._op, k, None)) is not None}, ctx)
3265
3298
  for k, v in rels.items():
3266
3299
  assert not isinstance(v, list)
3267
3300
  ctx.add(f.derive(k, [out, v]))
@@ -262,10 +262,12 @@ class Table():
262
262
  else:
263
263
  me = self._rel._field_refs[0]
264
264
  b.where(self).define(concept(me))
265
+ # if there are no keys all the fields must be properties
266
+ rel_func = b.Relationship if keys else b.Property
265
267
  for field in self._rel._fields[1:]:
266
268
  field_name = sanitize_identifier(field.name.lower())
267
269
  if field_name not in key_dict:
268
- r = b.Relationship(
270
+ r = rel_func(
269
271
  f"{{{concept}}} has {{{field_name}:{field.type_str}}}",
270
272
  parent=concept,
271
273
  short_name=field_name,
@@ -0,0 +1,14 @@
1
+ from relationalai.semantics.metamodel import factory as f
2
+ from relationalai.semantics.metamodel.util import FrozenOrderedSet
3
+ from relationalai.semantics.metamodel import builtins
4
+
5
+ # Indicates a relation is short-lived, thus, backends should not optimize for incremental
6
+ # maintenance.
7
+ adhoc = f.relation("adhoc", [])
8
+ adhoc_annotation = f.annotation(adhoc, [])
9
+
10
+ # We only want to emit attributes for a known set of annotations.
11
+ annotations_to_emit = FrozenOrderedSet([
12
+ adhoc.name,
13
+ builtins.function.name,
14
+ ])
@@ -61,3 +61,6 @@ def mk_primitive(name: str, terms: list[lqp.RelTerm]) -> lqp.Primitive:
61
61
 
62
62
  def mk_pragma(name: str, terms: list[lqp.Var]) -> lqp.Pragma:
63
63
  return lqp.Pragma(name=name, terms=terms, meta=None)
64
+
65
+ def mk_attribute(name: str, args: list[lqp.Value]) -> lqp.Attribute:
66
+ return lqp.Attribute(name=name, args=args, meta=None)
@@ -1,12 +1,13 @@
1
- from relationalai.semantics.metamodel import ir, builtins as rel_builtins, helpers, types
1
+ from relationalai.semantics.metamodel import ir, builtins, helpers, types
2
2
  from relationalai.semantics.metamodel.visitor import collect_by_type
3
- from relationalai.semantics.lqp import ir as lqp, utils, types as lqp_types
3
+ from relationalai.semantics.metamodel.util import FrozenOrderedSet
4
+ from relationalai.semantics.lqp import ir as lqp, utils, types as lqp_types, builtins as lqp_builtins
4
5
  from relationalai.semantics.lqp.primitives import lqp_avg_op, lqp_operator, build_primitive
5
6
  from relationalai.semantics.lqp.pragmas import pragma_to_lqp_name
6
7
  from relationalai.semantics.lqp.types import meta_type_to_lqp
7
8
  from relationalai.semantics.lqp.constructors import (
8
9
  mk_abstraction, mk_and, mk_exists, mk_or, mk_pragma, mk_primitive,
9
- mk_specialized_value, mk_type, mk_value, mk_var
10
+ mk_specialized_value, mk_type, mk_value, mk_var, mk_attribute
10
11
  )
11
12
  from relationalai.semantics.lqp.utils import TranslationCtx, gen_unique_var
12
13
  from relationalai.semantics.lqp.validators import assert_valid_input
@@ -14,6 +15,7 @@ from relationalai.semantics.lqp.validators import assert_valid_input
14
15
  from decimal import Decimal as PyDecimal
15
16
  from datetime import datetime, date
16
17
  from typing import Tuple, cast, Union, Optional
18
+ from warnings import warn
17
19
  import re
18
20
  import uuid
19
21
 
@@ -134,6 +136,23 @@ def _translate_to_decls(ctx: TranslationCtx, rule: ir.Logical) -> list[lqp.Decla
134
136
 
135
137
  return [_translate_effect(ctx, effect, mk_and(conjuncts)) for effect in effects]
136
138
 
139
+ def _translate_annotations(annotations: FrozenOrderedSet[ir.Annotation]) -> list[lqp.Attribute]:
140
+ attributes = []
141
+ for annotation in annotations:
142
+
143
+ if annotation.relation.name in lqp_builtins.annotations_to_emit:
144
+ if any(not isinstance(a, ir.Literal) for a in annotation.args):
145
+ warn("LQP currently ignores annotation parameters with non-literal values")
146
+ continue
147
+
148
+ # Convert literal arguments to LQP values
149
+ args = []
150
+ for a in annotation.args:
151
+ assert isinstance(a, ir.Literal)
152
+ args.append(mk_value(a.value))
153
+ attributes.append(mk_attribute(annotation.relation.name, args))
154
+ return attributes
155
+
137
156
  # Translates an effect (export, output, or update) into the corresponding def. Note that
138
157
  # this method only generates the def and not the LQP read operation, which is added later by
139
158
  # `_get_output_reads` and `_get_export_reads`.
@@ -141,7 +160,7 @@ def _translate_effect(ctx: TranslationCtx, effect: Union[ir.Output, ir.Update],
141
160
  bindings = _effect_bindings(effect)
142
161
 
143
162
  def _is_export(e):
144
- return isinstance(e, ir.Output) and rel_builtins.export_annotation in e.annotations
163
+ return isinstance(e, ir.Output) and builtins.export_annotation in e.annotations
145
164
 
146
165
  if isinstance(effect, ir.Output):
147
166
  projection, eqs, suffix = _translate_output_bindings(ctx, bindings)
@@ -179,7 +198,9 @@ def _translate_effect(ctx: TranslationCtx, effect: Union[ir.Output, ir.Update],
179
198
  return lqp.Def(
180
199
  name = rel_id,
181
200
  body = mk_abstraction(projection, new_body),
182
- attrs = [],
201
+ # TODO this only covers the annotations on the effect itself. Annotations on the
202
+ # relation are not included yet.
203
+ attrs = _translate_annotations(effect.annotations),
183
204
  meta = None,
184
205
  )
185
206
 
@@ -457,10 +478,7 @@ def _translate_to_formula(ctx: TranslationCtx, task: ir.Task) -> lqp.Formula:
457
478
  return mk_exists(lqp_vars, mk_and(conjuncts))
458
479
  elif isinstance(task, ir.Construct):
459
480
  assert len(task.values) >= 1, "Construct should have at least one value"
460
- assert isinstance(task.values[0], ir.ScalarType), "Construct should start with a named ScalarType"
461
- name = task.values[0].name
462
- terms = [_translate_term(ctx, ir.Literal(types.String, name))]
463
- terms.extend([_translate_term(ctx, arg) for arg in task.values[1:]])
481
+ terms = [_translate_term(ctx, arg) for arg in task.values]
464
482
  result_term = _translate_term(ctx, task.id_var)
465
483
  terms.append(result_term)
466
484
  assert result_term[1].type_name == lqp.TypeName.UINT128, \
@@ -494,7 +512,10 @@ def _translate_relterm(ctx: TranslationCtx, term: ir.Value) -> Tuple[lqp.RelTerm
494
512
  return _translate_term(ctx, term)
495
513
 
496
514
  def _translate_term(ctx: TranslationCtx, term: ir.Value) -> Tuple[lqp.Term, lqp.Type]:
497
- if isinstance(term, ir.Var):
515
+ if isinstance(term, ir.ScalarType):
516
+ # TODO: ScalarType is not like other terms, should be handled separately.
517
+ return to_lqp_value(term.name, types.String), meta_type_to_lqp(types.String)
518
+ elif isinstance(term, ir.Var):
498
519
  name = ctx.var_names.get_name_by_id(term.id, term.name)
499
520
  t = meta_type_to_lqp(term.type)
500
521
  return mk_var(name), t
@@ -504,7 +525,7 @@ def _translate_term(ctx: TranslationCtx, term: ir.Value) -> Tuple[lqp.Term, lqp.
504
525
  return v, meta_type_to_lqp(term.type)
505
526
 
506
527
  def _translate_to_atom(ctx: TranslationCtx, task: ir.Lookup) -> lqp.Formula:
507
- if task.relation == rel_builtins.cast:
528
+ if task.relation == builtins.cast:
508
529
  assert len(task.args) == 3, f"expected three terms for {task.relation.name}, got {len(task.args)}"
509
530
 
510
531
  terms = []
@@ -529,11 +550,11 @@ def _translate_to_atom(ctx: TranslationCtx, task: ir.Lookup) -> lqp.Formula:
529
550
  terms.append(term)
530
551
  term_types.append(ty)
531
552
 
532
- if rel_builtins.is_pragma(task.relation):
553
+ if builtins.is_pragma(task.relation):
533
554
  lqp_name = pragma_to_lqp_name(task.relation.name)
534
555
  return mk_pragma(lqp_name, terms)
535
556
 
536
- if rel_builtins.is_builtin(task.relation):
557
+ if builtins.is_builtin(task.relation):
537
558
  return build_primitive(task.relation.name, terms, term_types)
538
559
 
539
560
  if helpers.is_external(task.relation):
@@ -19,9 +19,9 @@ def lqp_passes() -> list[Pass]:
19
19
  return [
20
20
  FDConstraints(),
21
21
  Checker(),
22
+ CDC(), # specialize to physical relations before extracting nested and typing
22
23
  ExtractNestedLogicals(), # before InferTypes to avoid extracting casts
23
24
  InferTypes(),
24
- CDC(),
25
25
  DNFUnionSplitter(),
26
26
  ExtractKeys(),
27
27
  # Broken
@@ -27,6 +27,9 @@ lte = _comparator("<=")
27
27
  neq = _comparator("!=")
28
28
  eq = _comparator("=", False)
29
29
 
30
+ def is_eq(other: ir.Relation) -> bool:
31
+ return other == eq or other in eq.overloads
32
+
30
33
  # Arithmetic operators
31
34
  def _binary_op(name: str, with_string=False, result_type: Optional[ir.Type]=None):
32
35
  overload_types = [types.Int64, types.Int128, types.Float, types.GenericDecimal]
@@ -622,7 +622,7 @@ class BindingAnalysis(visitor.Visitor):
622
622
  if isinstance(child, ir.Lookup):
623
623
  # special case eq because it can be input or output
624
624
  # TODO: this is similar to what's done below in visit_lookup, modularize
625
- if child.relation == builtins.eq:
625
+ if builtins.is_eq(child.relation):
626
626
  x, y = child.args[0], child.args[1]
627
627
  if isinstance(x, ir.Var) and not isinstance(y, ir.Var):
628
628
  grounds.add(x)
@@ -748,7 +748,7 @@ class BindingAnalysis(visitor.Visitor):
748
748
  else:
749
749
  self.output(node, arg)
750
750
 
751
- if node.relation == builtins.eq:
751
+ if builtins.is_eq(node.relation):
752
752
  # special case eq because it can be input or output
753
753
  x, y = node.args[0], node.args[1]
754
754
  if isinstance(x, ir.Var) and not isinstance(y, ir.Var):
@@ -82,7 +82,7 @@ def get_outputs(lookup: ir.Lookup):
82
82
  Return an array with the arguments of this lookup that are referring to output fields
83
83
  on the relation being looked up.
84
84
  """
85
- if lookup.relation == builtins.eq:
85
+ if builtins.is_eq(lookup.relation):
86
86
  # special case eq because it can be input or output
87
87
  x, y = lookup.args[0], lookup.args[1]
88
88
  if isinstance(x, ir.Var) and not isinstance(y, ir.Var):