relationalai 0.11.4__py3-none-any.whl → 0.12.1__py3-none-any.whl

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 (47) hide show
  1. relationalai/clients/config.py +7 -0
  2. relationalai/clients/direct_access_client.py +113 -0
  3. relationalai/clients/snowflake.py +263 -189
  4. relationalai/clients/types.py +4 -1
  5. relationalai/clients/use_index_poller.py +72 -48
  6. relationalai/clients/util.py +9 -0
  7. relationalai/dsl.py +1 -2
  8. relationalai/early_access/metamodel/rewrite/__init__.py +5 -3
  9. relationalai/early_access/rel/rewrite/__init__.py +1 -1
  10. relationalai/environments/snowbook.py +10 -1
  11. relationalai/errors.py +24 -3
  12. relationalai/semantics/internal/annotations.py +1 -0
  13. relationalai/semantics/internal/internal.py +22 -3
  14. relationalai/semantics/lqp/builtins.py +1 -0
  15. relationalai/semantics/lqp/executor.py +12 -4
  16. relationalai/semantics/lqp/model2lqp.py +1 -0
  17. relationalai/semantics/lqp/passes.py +3 -4
  18. relationalai/semantics/{rel → lqp}/rewrite/__init__.py +6 -0
  19. relationalai/semantics/metamodel/builtins.py +12 -1
  20. relationalai/semantics/metamodel/executor.py +2 -1
  21. relationalai/semantics/metamodel/rewrite/__init__.py +3 -9
  22. relationalai/semantics/metamodel/rewrite/flatten.py +8 -7
  23. relationalai/semantics/reasoners/graph/core.py +1356 -258
  24. relationalai/semantics/rel/builtins.py +5 -1
  25. relationalai/semantics/rel/compiler.py +3 -3
  26. relationalai/semantics/rel/executor.py +20 -11
  27. relationalai/semantics/sql/compiler.py +2 -3
  28. relationalai/semantics/sql/executor/duck_db.py +8 -4
  29. relationalai/semantics/sql/executor/snowflake.py +1 -1
  30. relationalai/tools/cli.py +17 -6
  31. relationalai/tools/cli_controls.py +334 -352
  32. relationalai/tools/constants.py +1 -0
  33. relationalai/tools/query_utils.py +27 -0
  34. relationalai/util/otel_configuration.py +1 -1
  35. {relationalai-0.11.4.dist-info → relationalai-0.12.1.dist-info}/METADATA +5 -4
  36. {relationalai-0.11.4.dist-info → relationalai-0.12.1.dist-info}/RECORD +45 -45
  37. relationalai/semantics/metamodel/rewrite/gc_nodes.py +0 -58
  38. relationalai/semantics/metamodel/rewrite/list_types.py +0 -109
  39. /relationalai/semantics/{rel → lqp}/rewrite/cdc.py +0 -0
  40. /relationalai/semantics/{rel → lqp}/rewrite/extract_common.py +0 -0
  41. /relationalai/semantics/{metamodel → lqp}/rewrite/extract_keys.py +0 -0
  42. /relationalai/semantics/{metamodel → lqp}/rewrite/fd_constraints.py +0 -0
  43. /relationalai/semantics/{rel → lqp}/rewrite/quantify_vars.py +0 -0
  44. /relationalai/semantics/{metamodel → lqp}/rewrite/splinter.py +0 -0
  45. {relationalai-0.11.4.dist-info → relationalai-0.12.1.dist-info}/WHEEL +0 -0
  46. {relationalai-0.11.4.dist-info → relationalai-0.12.1.dist-info}/entry_points.txt +0 -0
  47. {relationalai-0.11.4.dist-info → relationalai-0.12.1.dist-info}/licenses/LICENSE +0 -0
@@ -17,6 +17,7 @@ SHOW_DEBUG_LOGS = False
17
17
  RAI_APP_NAME = "RELATIONALAI"
18
18
  CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
19
19
  DEFAULT_QUERY_TIMEOUT_MINS = 24*60 # default query timeout of 24h
20
+ QUERY_ATTRIBUTES_HEADER = "X-Query-Attributes" # Header for query execution attributes
20
21
 
21
22
  class GlobalProfileSetting:
22
23
  def __init__(self):
@@ -0,0 +1,27 @@
1
+ import json
2
+ from typing import Any, Dict, Optional
3
+
4
+
5
+ def prepare_metadata_for_headers(meta: Optional[Dict[str, Any]]) -> str:
6
+ """Prepare metadata for HTTP header transmission.
7
+
8
+ Handles user input gracefully without throwing errors.
9
+ Note: json.dumps automatically escapes newlines (\n), carriage returns (\r),
10
+ and null characters (\0) as \\n, \\r, and \\u0000 respectively, making the
11
+ JSON string safe for HTTP headers.
12
+
13
+ Args:
14
+ meta: Raw metadata dictionary from user
15
+
16
+ Returns:
17
+ JSON string safe for HTTP headers
18
+ """
19
+ if not meta:
20
+ return ""
21
+
22
+ # Handle JSON serialization
23
+ try:
24
+ return json.dumps(meta)
25
+ except (TypeError, ValueError):
26
+ str_meta = {k: str(v) for k, v in meta.items()}
27
+ return json.dumps(str_meta)
@@ -22,4 +22,4 @@ def configure_otel(enable_otel_handler: bool, config: Config, resources: Resourc
22
22
  )
23
23
  else:
24
24
  from .otel_handler import disable_otel_handling
25
- disable_otel_handling()
25
+ disable_otel_handling()
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: relationalai
3
- Version: 0.11.4
3
+ Version: 0.12.1
4
4
  Summary: RelationalAI Library and CLI
5
5
  Author-email: RelationalAI <support@relational.ai>
6
6
  License-File: LICENSE
7
- Requires-Python: >=3.9
7
+ Requires-Python: >=3.10
8
8
  Requires-Dist: aiohttp
9
- Requires-Dist: click<=8.1.8
9
+ Requires-Dist: click==8.2.1
10
10
  Requires-Dist: colorama
11
11
  Requires-Dist: cryptography
12
12
  Requires-Dist: gravis
@@ -21,7 +21,6 @@ Requires-Dist: packaging
21
21
  Requires-Dist: pandas
22
22
  Requires-Dist: pyarrow
23
23
  Requires-Dist: pyjwt
24
- Requires-Dist: rai-sdk>=0.7.5
25
24
  Requires-Dist: requests
26
25
  Requires-Dist: rich
27
26
  Requires-Dist: snowflake-connector-python[secure-local-storage]
@@ -64,6 +63,8 @@ Requires-Dist: parameterized; extra == 'ea'
64
63
  Requires-Dist: pysmt; extra == 'ea'
65
64
  Requires-Dist: simple-ddl-parser; extra == 'ea'
66
65
  Requires-Dist: xmltodict; extra == 'ea'
66
+ Provides-Extra: legacy
67
+ Requires-Dist: rai-sdk>=0.7.5; extra == 'legacy'
67
68
  Description-Content-Type: text/markdown
68
69
 
69
70
  # The RelationalAI Python Library
@@ -3,8 +3,8 @@ relationalai/compiler.py,sha256=5LZY8AyqadkTLSe_xoJ3J9iXOmetz5YQn9EjJKk8XeQ,6411
3
3
  relationalai/debugging.py,sha256=dfT0gEDpL56GflVmtUrYVbYcVcZmQL26Vf_F8cI1QKY,11891
4
4
  relationalai/dependencies.py,sha256=tL113efcISkJUiDXYHmRdU_usdD7gmee-VRHA7N4EFA,16574
5
5
  relationalai/docutils.py,sha256=1gVv9mk0ytdMB2W7_NvslJefmSQtTOg8LHTCDcGCjyE,1554
6
- relationalai/dsl.py,sha256=pvwH12zLvyumn8jRpkb57KkBPLrLkp5vnDdN5kBO388,66099
7
- relationalai/errors.py,sha256=4v-J91SfsgowPaU7xssJC8t1VFs1TlJGuIN378itoLE,94019
6
+ relationalai/dsl.py,sha256=UJr93X8kwnnyUY-kjPzp_jhsp2pYBUnDfu8mhNXPNII,66116
7
+ relationalai/errors.py,sha256=ERyVg5SJd3O689QSnp-rtbBCLUB3Bbcp5VgkRX1HZzg,94948
8
8
  relationalai/metagen.py,sha256=o10PNvR_myr_61DC8g6lkB093bFo9qXGUkZKgKyfXiE,26821
9
9
  relationalai/metamodel.py,sha256=P1hliwHd1nYxbXON4LZeaYZD6T6pZm97HgmFBFrWyCk,32886
10
10
  relationalai/rel.py,sha256=ePmAXx4NxOdsPcHNHyGH3Jkp_cB3QzfKu5p_EQSHPh0,38293
@@ -22,15 +22,16 @@ relationalai/clients/__init__.py,sha256=0c_oqvpVN7pccc6q8fw11zSOVK-utlRTmd1ECjgM
22
22
  relationalai/clients/azure.py,sha256=6tYHxKVN2fHMIDV7J_EHZD9WntkYh2IreMRMqlq1Bhg,20634
23
23
  relationalai/clients/cache_store.py,sha256=A-qd11wcwN3TkIqvlN0_iFUU3aEjJal3T2pqFBwkkzQ,3966
24
24
  relationalai/clients/client.py,sha256=4SSunUwuFEcRFXOPYotpSLDPr0CKuwJ4335W0DesR90,35792
25
- relationalai/clients/config.py,sha256=aerlAhg6DWICa4AUwetgsYKXUWiyEyymnHTIWAN2sAE,24087
25
+ relationalai/clients/config.py,sha256=hERaKjc3l4kd-kf0l-NUOHrWunCn8gmFWpuE0j3ScJg,24457
26
+ relationalai/clients/direct_access_client.py,sha256=uDML4nFTctvvya4GFWoef2oirlWHiRugn5qBk9fxH9k,5961
26
27
  relationalai/clients/export_procedure.py.jinja,sha256=nhvVcs5hQyWExFDuROQbi1VyYzOCa_ZIRPR2KzZwDtI,10582
27
28
  relationalai/clients/hash_util.py,sha256=pZVR1FX3q4G_19p_r6wpIR2tIM8_WUlfAR7AVZJjIYM,1495
28
29
  relationalai/clients/profile_polling.py,sha256=pUH7WKH4nYDD0SlQtg3wsWdj0K7qt6nZqUw8jTthCBs,2565
29
30
  relationalai/clients/result_helpers.py,sha256=wDSD02Ngx6W-YQqBIGKnpXD4Ju3pA1e9Nz6ORRI6SRI,17808
30
- relationalai/clients/snowflake.py,sha256=lfMwypFnsw18ZG4ixOCuEqZwf0lvvthk4pPtj97pZNE,155717
31
- relationalai/clients/types.py,sha256=z33RlnXFml-aVAtZ1pJsbixrGnlPfhkAjZXM_ySZGuY,2776
32
- relationalai/clients/use_index_poller.py,sha256=rQaHmlNLYDQ4NJh3i6CVAS1XxUjazwzTv-OiacrldGI,44662
33
- relationalai/clients/util.py,sha256=3iLY5DgUkQcRAPXrvP4xdIYZtc3trrryy5jfX2QAFEA,12014
31
+ relationalai/clients/snowflake.py,sha256=Om3iVea8Ky_P0MMWBJf83xBpG1LMKXrqRRBCjTZ-OcY,158848
32
+ relationalai/clients/types.py,sha256=eNo6akcMTbnBFbBbHd5IgVeY-zuAgtXlOs8Bo1SWmVU,2890
33
+ relationalai/clients/use_index_poller.py,sha256=J8AUIJE1fFZbB5I6Yrk2pQK9l7yN5SGBn2JQ5TmyqfM,45766
34
+ relationalai/clients/util.py,sha256=NJC8fnrWHR01NydwESPSetIHRWf7jQJURYpaWJjmDyE,12311
34
35
  relationalai/early_access/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
36
  relationalai/early_access/builder/__init__.py,sha256=mrR-aGLPquUGc_e9-DOkVCCCo8QRE5A56GTTtgILNa4,993
36
37
  relationalai/early_access/builder/builder/__init__.py,sha256=QOVGGdEf-5OirBLjY75W4ANiqGKDknwAAl3YUFEzHVI,1462
@@ -178,7 +179,7 @@ relationalai/early_access/metamodel/dependency/__init__.py,sha256=bkrnbq8aRMwCPD
178
179
  relationalai/early_access/metamodel/factory/__init__.py,sha256=_boK2qJ4v_JVFn4OelJx3GTA3X48Yc5yCxq_DxG6fUs,946
179
180
  relationalai/early_access/metamodel/helpers/__init__.py,sha256=bkEbkPFhvcVhnwRAAJxEUMWlI5r3iYuyTIDINfY1frs,320
180
181
  relationalai/early_access/metamodel/ir/__init__.py,sha256=1oJzbPkQrRf5Cng51u1rZUa_sxIzSaSE4m6pvnHTUfE,571
181
- relationalai/early_access/metamodel/rewrite/__init__.py,sha256=57_5cY6vlCdwtGGWS9K-JrhOkwEsXfwYAVJrxsHc1Fc,371
182
+ relationalai/early_access/metamodel/rewrite/__init__.py,sha256=TH1FykUuhb34Gd06klxhGvAqfpIB4ZhuHBSXOMeOhsI,342
182
183
  relationalai/early_access/metamodel/typer/__init__.py,sha256=va6-xIBBh3B28O5JEUeXsu38FcZPTDTQuym4BDrshmw,123
183
184
  relationalai/early_access/metamodel/typer/typer/__init__.py,sha256=gUfw_Zkk_wq1iycTp7yrOxpZJs5GctvsLmatlmKlcFM,432
184
185
  relationalai/early_access/metamodel/types/__init__.py,sha256=M7KDNQyO7uA_p_U_IRT3jYaOzhVVDm5MBjgQdxZqWsY,741
@@ -202,7 +203,7 @@ relationalai/early_access/paths/utilities/iterators/__init__.py,sha256=HRO3elGRr
202
203
  relationalai/early_access/rel/__init__.py,sha256=1Uf_eHjZcUZvaFoQ1nmMIcth4icRLxM3WsvCf99_Fj0,290
203
204
  relationalai/early_access/rel/executor/__init__.py,sha256=viY7VTCVe3GVOpHlnVhrlXYDIAeIA01BcxtLtiaRaqI,285
204
205
  relationalai/early_access/rel/rel_utils/__init__.py,sha256=FS5qahNNxiqev6DG0f66MaCnPuneWEysFAOZTWHwvL8,298
205
- relationalai/early_access/rel/rewrite/__init__.py,sha256=pe8wuwhqACG427DWJm7ch10QChpkgZEIMemF3d6fqvA,147
206
+ relationalai/early_access/rel/rewrite/__init__.py,sha256=gA0aPFs1BYV8Pc_FJejjjAEIB3lA8JpCQGTWDz1mhd4,147
206
207
  relationalai/early_access/solvers/__init__.py,sha256=Ix9cRdW_glqtGkk3KyH5sJIR3X4yauVDSH_JlPrMYBQ,447
207
208
  relationalai/early_access/sql/__init__.py,sha256=B2L23yTW-kYMk52zPvCo_D2XD22vZFdJm1iBnuliEec,267
208
209
  relationalai/early_access/sql/executor/__init__.py,sha256=yyt8dxigsUvfRVOPV2rW2QrbHiUK750Dil1IIY3Y3B8,132
@@ -219,7 +220,7 @@ relationalai/environments/generic.py,sha256=tLLSB6sW6eone7QMbm6ilex5MWMUMPRKtR47
219
220
  relationalai/environments/hex.py,sha256=vnuGLiYK5dAVEVVDcGw0v52tZG-BGaOn20e6XU262OU,964
220
221
  relationalai/environments/ipython.py,sha256=YapHOQu-iSCWZWCgvjskcc3Ef8VaMso9Gr7tSD91TvM,2556
221
222
  relationalai/environments/jupyter.py,sha256=hmqqvue-KdsZkMgxwLBnvKyRaFc43x6p_yb2eeOWvjQ,374
222
- relationalai/environments/snowbook.py,sha256=g_nMNZvnYpzIMoIYGNOGgUgOkJqxVfm1RNJx9IwQDCw,6481
223
+ relationalai/environments/snowbook.py,sha256=EqNblYx0MHvp1gkvYq3fhtprPUrFod-gUXw018CW1bw,6875
223
224
  relationalai/environments/terminal.py,sha256=J29r4PURSnivYU27D7Zbfa2MgppoTDmMQLUPSxOyfQc,1073
224
225
  relationalai/experimental/SF.py,sha256=cLIPCgTa6yCkmAU4zw3o2OlSM_Sl8ah3JUpHVoHzrgA,1533
225
226
  relationalai/experimental/__init__.py,sha256=alaOJulJ9YHRl4WGyQ3Kzxhrpc2gP542oNheWXzs7NQ,74
@@ -254,53 +255,55 @@ relationalai/semantics/devtools/benchmark_lqp.py,sha256=btySKVtUUNBuPY-l6DrkbRNl
254
255
  relationalai/semantics/devtools/compilation_manager.py,sha256=XBqG_nYWtK3s_J6MeCmkLqy3qm7l778zDAhH7DEO91g,11169
255
256
  relationalai/semantics/devtools/extract_lqp.py,sha256=gxI3EvPUTPAkwgnkCKAkEm2vA6QkLfoM8AXXiVz0c34,3696
256
257
  relationalai/semantics/internal/__init__.py,sha256=JXrpFaL-fdZrvKpWTEn1UoLXITOoTGnAYwmgeiglhSk,774
257
- relationalai/semantics/internal/annotations.py,sha256=NuOcaca6H8osWqJAwe9nxezu10X2sPV7ti7iROAxiBM,267
258
- relationalai/semantics/internal/internal.py,sha256=5Wf0XitUqWo0j30aRTtkQ6KKsBDmD3mklLitpPSzB90,148333
258
+ relationalai/semantics/internal/annotations.py,sha256=P_nRpBm4wLmE_8L0VO3TDORL1p2flXaPOVDC0GG7KsQ,306
259
+ relationalai/semantics/internal/internal.py,sha256=yIrUgMqqjzDqB9abOkj7QVyF8SnJzf-tpd5UbjKlSlo,148938
259
260
  relationalai/semantics/internal/snowflake.py,sha256=DR6rgbPawen2ZOFegRuPkXt8aQUfciiCYzDI74u1Iwc,13036
260
261
  relationalai/semantics/lqp/__init__.py,sha256=XgcQZxK-zz_LqPDVtwREhsIvjTuUIt4BZhIedCeMY-s,48
261
- relationalai/semantics/lqp/builtins.py,sha256=N1hJwyvwgFvBbt2X7-4U-Pq1LVOYV-zAUeSqS39OZcQ,515
262
+ relationalai/semantics/lqp/builtins.py,sha256=bRmQ6fdceWU-4xf4l-W-YiuyDxJTPey1s6O4xlyW6iM,540
262
263
  relationalai/semantics/lqp/compiler.py,sha256=Nury1gPw_-Oi_mqT1-rhr13L4UmyIP2BGuotbuklQKA,949
263
264
  relationalai/semantics/lqp/constructors.py,sha256=8U4eUL8-m1wYRQnws_YWC1coGquTugVH5YC0Zek6VT8,2309
264
- relationalai/semantics/lqp/executor.py,sha256=At0IdBlNlOM0E533V0urRgeIkfbv-pPWuQ_sfRkKqPQ,18926
265
+ relationalai/semantics/lqp/executor.py,sha256=0CYFKUyEj4zL-8BhRt_ru9b5hNle0f4PeLMh8AeK-Nw,19430
265
266
  relationalai/semantics/lqp/intrinsics.py,sha256=Pb1mLIme7Q-5Y-CVacUOEvapfhKs076bgtRNi3f0ayY,833
266
267
  relationalai/semantics/lqp/ir.py,sha256=DUw0ltul0AS9CRjntNlmllWTwXpxMyYg4iJ9t7NFYMA,1791
267
- relationalai/semantics/lqp/model2lqp.py,sha256=L63A2ECLiLTbUoZB7wTB2dP0ahUAA-8WhxiddVO2znQ,31647
268
- relationalai/semantics/lqp/passes.py,sha256=TBsYmWYh4qZtKzlSiZcJJDt3-Bwl_wRv0c9L8P2H1fE,27683
268
+ relationalai/semantics/lqp/model2lqp.py,sha256=F_4lwWICy1hvU-UhMbxFwEwPxPOj8IOPfr809ssgdwY,31719
269
+ relationalai/semantics/lqp/passes.py,sha256=nLppoHvIQkGP6VuG56OAZ1oOrYhEqpR_0w91gfJ7t_s,27540
269
270
  relationalai/semantics/lqp/pragmas.py,sha256=FzzldrJEAZ1AIcEw6D-FfaVg3CoahRYgPCFo7xHfg1g,375
270
271
  relationalai/semantics/lqp/primitives.py,sha256=Gbh6cohoAArhqEJTN_TgIRc7wmtdxXt231NRW0beEj0,10898
271
272
  relationalai/semantics/lqp/result_helpers.py,sha256=oYpLoTBnzsiyOVIWA2rLMHlgs7P7BoEkqthQ2aMosnk,10123
272
273
  relationalai/semantics/lqp/types.py,sha256=3TZ61ybwNV8lDyUMujZIWNFz3Fgn4uifsJb8ExfoMDg,4508
273
274
  relationalai/semantics/lqp/utils.py,sha256=x8dcfVoyqzCznNFtI4qSNSL-vWcdxzC-QrnFJlAARXs,6121
274
275
  relationalai/semantics/lqp/validators.py,sha256=YO_ciSgEVNILWUbkxIagKpIxI4oqV0fRSTO2Ok0rPJk,1526
276
+ relationalai/semantics/lqp/rewrite/__init__.py,sha256=NQMkrZMUrLksScGXs0EiZTT-In5VltvswfeB4kCkeZM,337
277
+ relationalai/semantics/lqp/rewrite/cdc.py,sha256=I6DeMOZScx-3UAVoSCMn9cuOgLzwdvJVKNwsgFa6R_k,10390
278
+ relationalai/semantics/lqp/rewrite/extract_common.py,sha256=TY4wYhMy6bbKC9YZqrBeQgaZ41Sf4BCI3Zy26yavgAM,17301
279
+ relationalai/semantics/lqp/rewrite/extract_keys.py,sha256=dSr5SVkYmrhiR0XPY5eRAnWD66dcZYgXdilXcERv634,18682
280
+ relationalai/semantics/lqp/rewrite/fd_constraints.py,sha256=a4jetchlOfm2rb3QD0Nil0bvermpBx1up7p1uNgcJHg,3503
281
+ relationalai/semantics/lqp/rewrite/quantify_vars.py,sha256=wYMEXzCW_D_Y_1rSLvuAAqw9KN1oIOn_vIMxELzRVb4,11568
282
+ relationalai/semantics/lqp/rewrite/splinter.py,sha256=oeDjP_F2PVLVexAKFn8w7CLtO9oy-R-tS2IOmzw_Ujk,3199
275
283
  relationalai/semantics/metamodel/__init__.py,sha256=I-XqQAGycD0nKkKYvnF3G9d0QK_1LIM4xXICw8g8fBA,805
276
- relationalai/semantics/metamodel/builtins.py,sha256=0NIy94ay2-Yy0tvL750kRLoavyjnwARdmn07hn6LDFs,35310
284
+ relationalai/semantics/metamodel/builtins.py,sha256=EOOi3AjeF5uyYVjie0WhpVTVatEK3zWyBvggStH1aGo,35897
277
285
  relationalai/semantics/metamodel/compiler.py,sha256=XBsAnbFwgZ_TcRry6yXGWLyw_MaO2WJDp1EnC_ubhps,4525
278
286
  relationalai/semantics/metamodel/dataflow.py,sha256=wfj1tARrR4yEAaTwUTrAcxEcz81VkUal4U_AX1esovk,3929
279
287
  relationalai/semantics/metamodel/dependency.py,sha256=YU-nTm9Hq6ufkwoA5D1iPciGw7WW6Hk4Cyq0EQbkl2s,32845
280
- relationalai/semantics/metamodel/executor.py,sha256=k9IpWdCOa-Pl6DQFP8Wd0p4NFUnNeELTxNa-j9RyKVY,2572
288
+ relationalai/semantics/metamodel/executor.py,sha256=_pm--QNvAjd-GgiMKMrpkPZ2eE0H1IM5ZB0l1DGkRs0,2614
281
289
  relationalai/semantics/metamodel/factory.py,sha256=Vk3ASwWan08mfGehoOOwMixuU_mEbG2vNl8JLSCJ2OU,12581
282
290
  relationalai/semantics/metamodel/helpers.py,sha256=F70rZUzBtVf7VfQRC3XnwxJPvbz_tQP4fCdUeysZsUQ,15342
283
291
  relationalai/semantics/metamodel/ir.py,sha256=4Xl3oc92Q7_s33axtrZUXr-GL8VGJsKc7yaSNcO6jXY,33578
284
292
  relationalai/semantics/metamodel/types.py,sha256=m3NolF3B_fBSnkQKA9o1feEawaW7RhR-t6W9OSxSFfc,11492
285
293
  relationalai/semantics/metamodel/util.py,sha256=cmSmeww34JVMqcFudwVAY820IPM2ETSELJylwJ3GRJk,16654
286
294
  relationalai/semantics/metamodel/visitor.py,sha256=DFY0DACLhxlZ0e4p0vWqbK6ZJr_GWEvH66CU_HVuoTk,35527
287
- relationalai/semantics/metamodel/rewrite/__init__.py,sha256=iKg1YsWjWhY9UpmQt0nHJjSto_kMD9bN1vLdfblyP_c,577
295
+ relationalai/semantics/metamodel/rewrite/__init__.py,sha256=aPgZuRGpULwPVWtENUEHmGBSNAEsxz1i0t257IOCO-E,285
288
296
  relationalai/semantics/metamodel/rewrite/discharge_constraints.py,sha256=0v613BqCLlo4sgWuZjcLSxxakp3d34mYWbG4ldhzGno,1949
289
297
  relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py,sha256=dlyD868Pg424BLowY4A0gOmSziSy1U-dYGXZEE3SW8E,7956
290
- relationalai/semantics/metamodel/rewrite/extract_keys.py,sha256=dSr5SVkYmrhiR0XPY5eRAnWD66dcZYgXdilXcERv634,18682
291
298
  relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py,sha256=mzZLsu4pYWzRUScAgmWQ58WYVW30Sst7xMJteoSxm-4,3629
292
- relationalai/semantics/metamodel/rewrite/fd_constraints.py,sha256=a4jetchlOfm2rb3QD0Nil0bvermpBx1up7p1uNgcJHg,3503
293
- relationalai/semantics/metamodel/rewrite/flatten.py,sha256=B-LH9OApak7Cst7bcVWzKZcgI0fuTDTBprXJ0AL7q6w,28448
294
- relationalai/semantics/metamodel/rewrite/gc_nodes.py,sha256=5_hXEk-Gg2E2bmE56wATcaZ7nIHfp5BsqkVEyCU-r3I,2090
295
- relationalai/semantics/metamodel/rewrite/list_types.py,sha256=RBmi0iWMaADjbqptV0W7P9ncmZFqCSDMKmWxKuS9Mh0,4454
296
- relationalai/semantics/metamodel/rewrite/splinter.py,sha256=oeDjP_F2PVLVexAKFn8w7CLtO9oy-R-tS2IOmzw_Ujk,3199
299
+ relationalai/semantics/metamodel/rewrite/flatten.py,sha256=diBVspq0MLu6tP2lwMs5TcLImF_2AUDbzhMKRYfrPxg,28449
297
300
  relationalai/semantics/metamodel/typer/__init__.py,sha256=E3ydmhWRdm-cAqWsNR24_Qd3NcwiHx8ElO2tzNysAXc,143
298
301
  relationalai/semantics/metamodel/typer/checker.py,sha256=frY0gilDO6skbDiYFiIpDUOWyt9s9jAJsRBs848DcG0,19184
299
302
  relationalai/semantics/metamodel/typer/typer.py,sha256=jBo0CwY6G0qKBzqoAmQ09dPtcPDHvCiutolnwbV4gus,62294
300
303
  relationalai/semantics/reasoners/__init__.py,sha256=Tu4U26rrkBIzAk3a4tXRJaeD5mAtK9Z7JXh2c6VJ-J4,249
301
304
  relationalai/semantics/reasoners/graph/README.md,sha256=QgKEXTllp5PO-yK8oDfMx1PNTYF2uVoneMRKsWTY5GU,23953
302
305
  relationalai/semantics/reasoners/graph/__init__.py,sha256=jSXR6J05SQZdjxQ5Y-ovqFqGTAXCOWeQDcvpfoBYgDA,1282
303
- relationalai/semantics/reasoners/graph/core.py,sha256=pdjfEUlPtX3rbVObqG9RuhUckaFSkUym-cmZmmxrPpc,262065
306
+ relationalai/semantics/reasoners/graph/core.py,sha256=Hf2hahvQo2vaZcCR9DxbAkXxg1nn5wUH1LYCYOvmr7c,318134
304
307
  relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md,sha256=Givh0W6B6Hlow6TpmK-8adpEYd8b3O_WmdgMOQIyKs0,55749
305
308
  relationalai/semantics/reasoners/graph/paths/README.md,sha256=ydm6CzMN_vOOgq7a6_hBCiyGi3D6g5gxAbf4OXbQbDE,3433
306
309
  relationalai/semantics/reasoners/graph/paths/__init__.py,sha256=oCoDJVg4moGe0tNMNeRn7XQqa1AIEZGlxAiaD5bBahg,211
@@ -371,23 +374,19 @@ relationalai/semantics/reasoners/optimization/common.py,sha256=TVa9n9n97BwfMyYOT
371
374
  relationalai/semantics/reasoners/optimization/solvers_dev.py,sha256=BjFcEfmqmdxM6jnd34pt1AlkrdwHd_HapqpB2oIvNP4,24142
372
375
  relationalai/semantics/reasoners/optimization/solvers_pb.py,sha256=ryNARpyph3uvr1dhWb7pNU3uuxuL1FLZZiTqFcr3Xf8,22148
373
376
  relationalai/semantics/rel/__init__.py,sha256=pMlVTC_TbQ45mP1LpzwFBBgPxpKc0H3uJDvvDXEWzvs,55
374
- relationalai/semantics/rel/builtins.py,sha256=bLMX4pJ62J62qn-TX5WQWl3Nhhy6q9Zz827pY3ihaBc,1286
375
- relationalai/semantics/rel/compiler.py,sha256=9d0-75t08vkdS5n3wvyCN68qlxVywIZ8JD7sph4f5LM,42298
376
- relationalai/semantics/rel/executor.py,sha256=BcQUJht5G2so2Af9GszLBTK90LqFUmv3gshRGFeiG-s,14943
377
+ relationalai/semantics/rel/builtins.py,sha256=qu4yZvLovn4Vn2x44D4XugqGD6Qo5xLxj_RKA34cpF4,1527
378
+ relationalai/semantics/rel/compiler.py,sha256=hiLIaZzhVU5VMtU6rdo3tH2pmKMEtXvh6AHh94CvRAg,42203
379
+ relationalai/semantics/rel/executor.py,sha256=83PoUBAHmQ4i4XrH7cTOEMY279yAhK1fVEq8o807XZ4,15646
377
380
  relationalai/semantics/rel/rel.py,sha256=9I_V6dQ83QRaLzq04Tt-KjBWhmNxNO3tFzeornBK4zc,15738
378
381
  relationalai/semantics/rel/rel_utils.py,sha256=F14Ch8mn45J8SmM7HZnIHUNqDnb3WQLnkEGLme04iBk,9386
379
- relationalai/semantics/rel/rewrite/__init__.py,sha256=Ke85L9DMO_d6qQbjb17k_LoMqar8-vOHKmxHGynIh3s,170
380
- relationalai/semantics/rel/rewrite/cdc.py,sha256=I6DeMOZScx-3UAVoSCMn9cuOgLzwdvJVKNwsgFa6R_k,10390
381
- relationalai/semantics/rel/rewrite/extract_common.py,sha256=TY4wYhMy6bbKC9YZqrBeQgaZ41Sf4BCI3Zy26yavgAM,17301
382
- relationalai/semantics/rel/rewrite/quantify_vars.py,sha256=wYMEXzCW_D_Y_1rSLvuAAqw9KN1oIOn_vIMxELzRVb4,11568
383
382
  relationalai/semantics/snowflake/__init__.py,sha256=BW_zvPQBWGTAtY6cluG6tDDG-QmU_jRb-F7PeCpDhIU,134
384
383
  relationalai/semantics/sql/__init__.py,sha256=59uuKmQOFUzwlYwc7anSuwhQ45bJTYVmd9nOJXr9mQs,80
385
- relationalai/semantics/sql/compiler.py,sha256=4NeOp4YnMZz25IfLpPeEWL1iO46y8h2D0HW05d4RY4A,128816
384
+ relationalai/semantics/sql/compiler.py,sha256=BcvEIjcD9SVkTtTvDIw-yjeC3dE5dv01P3Ohd7HCNxo,128773
386
385
  relationalai/semantics/sql/sql.py,sha256=7nUnm0RbHlOGSGQbnFrgzPYdmnoppifQ5jylR5Wtgcc,17122
387
386
  relationalai/semantics/sql/executor/__init__.py,sha256=F3HqQPJVP9wgV3rkwI5jy1_QBCD_3qj2IGxbdT_pX9k,120
388
- relationalai/semantics/sql/executor/duck_db.py,sha256=pS_93nV5vKPnjkK62fc0YHHFdRyBEHlXe_Y4H2zB6lQ,1654
387
+ relationalai/semantics/sql/executor/duck_db.py,sha256=laI0jquMNNhj1pcFlaqxYAvvnCmSuvzzkibfjMz7liY,1909
389
388
  relationalai/semantics/sql/executor/result_helpers.py,sha256=kVfspHHuzyq4SNklrtvhYte1wqRFzct-dAKin_lOmR4,3215
390
- relationalai/semantics/sql/executor/snowflake.py,sha256=GMfeutObRWOUnH5UVflHZgFxn-soUtjTky37daBtBi4,5825
389
+ relationalai/semantics/sql/executor/snowflake.py,sha256=d6HAb-nxGXUAYFDec7E2YPkIGAqQWwoet0mtFFWeBMk,5861
391
390
  relationalai/semantics/sql/rewrite/__init__.py,sha256=AT1WR0rqQHQ7E06NLoVym0zrZpBVPqK85uRFNJUTDp4,254
392
391
  relationalai/semantics/sql/rewrite/denormalize.py,sha256=gPF0s1edthoHfuBIdS9-hnEaX5RFYBdtOlK5iAfB5CA,9040
393
392
  relationalai/semantics/sql/rewrite/double_negation.py,sha256=QXynhjwfPW52Hpdo78VWPNk2TXe_mMTWYN470in51z8,1710
@@ -419,16 +418,17 @@ relationalai/std/re.py,sha256=7B0dPaYyEdIlEgZfDzs7HJ_MTqccYTfIZieqst6MHbk,4457
419
418
  relationalai/std/strings.py,sha256=vHvex_W5GHhhsVws6Dfyl4w1EHdbDE3nPjT09DnpvSE,4260
420
419
  relationalai/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
421
420
  relationalai/tools/cleanup_snapshots.py,sha256=s1q1ophi1RmiTZ9QQolQ6q1K9ZwseCaOuDtI1Rm99MQ,3434
422
- relationalai/tools/cli.py,sha256=k7r1VG9YiY3o8ZqgEhWI2naYyMzKyJ2gR-KAL-vfzIs,76195
423
- relationalai/tools/cli_controls.py,sha256=6k2nu6km9IYGDwG7pSZGBXrEN64Ehw0tamKgcPotZoM,71822
421
+ relationalai/tools/cli.py,sha256=jaUyqq7PYdey7vx7jpAZtHxfixX4np3aMEUKNTFrlc4,76528
422
+ relationalai/tools/cli_controls.py,sha256=NdODpsrqr77N2cbAAJ_fUJqVZYiG4pCht4gQoEaErP0,69944
424
423
  relationalai/tools/cli_helpers.py,sha256=r-gJnWnb3d6yIn_ccyp3qx_Vpqh-FINCFMyPBVCA-Jg,14041
425
- relationalai/tools/constants.py,sha256=mDdWelpf-u9tb0tspFgq8V0fCxLSzbS0Hl9WGJMJa_4,4417
424
+ relationalai/tools/constants.py,sha256=A8Qz0CPs2cRUs5xaZ-Y7BCyvqmI6RLvipzwLDYZ3_PU,4505
426
425
  relationalai/tools/debugger.py,sha256=yb03qO8ENHG2rBOPOF-rPKHGrJmaNy6iWXijg6T0dUI,6881
427
426
  relationalai/tools/debugger_client.py,sha256=g9vBaeJLKVq6vW63W-KKSaPJ--g5Wuf4LcIuYRA_pk4,3729
428
427
  relationalai/tools/debugger_server.py,sha256=UXVMtbmvgp7IqN9TzVnUvPj-TVrb6GzJOJ2z15Al9YU,9880
429
428
  relationalai/tools/dev.py,sha256=ZFYbBj25Wf5iy6womAEkLF5RD6O0vZLAOUPQgPcKkS8,22931
430
429
  relationalai/tools/notes,sha256=5ufkUHNktVRvQayBVktn2rLgDBapAEKxKJxQ20tRjpA,263
431
430
  relationalai/tools/qb_debugger.py,sha256=EKGf_b8wdxxVLz_zo2PfHOPyvpTtPNwEx9ndKg-lq_w,16322
431
+ relationalai/tools/query_utils.py,sha256=SevPuWHZUjHc4A-RbyiJN0oWAVQGGo72UM3Saj29DwY,821
432
432
  relationalai/tools/snapshot_viewer.py,sha256=60DW41X4NpjxmPjf1B8mG3oIocHMLLNEbThIdJavi_o,28779
433
433
  relationalai/util/__init__.py,sha256=FcHFPzeyDcQwENQg2KA70lBsFx5TtN7xo0quy_cJDQI,208
434
434
  relationalai/util/clean_up_databases.py,sha256=f7L5CtJkQCSm5Tms98Q6JrhZShHJltlxMYkq_0xvzgY,3120
@@ -436,7 +436,7 @@ relationalai/util/constants.py,sha256=rq6c1Q5tLIewiG_M_lUtRAbmrKFUUL1jfl_nxU0989
436
436
  relationalai/util/format.py,sha256=fLRovumUa2cu0_2gy3O5vaEbpND4p9_IIgr-vDaIGDc,3754
437
437
  relationalai/util/graph.py,sha256=eT8s0yCiJIu6D1T1fjZsLSPCcuQb2Mzl6qnljtQ5TuA,1504
438
438
  relationalai/util/list_databases.py,sha256=xJZGHzE0VLaDItWo5XvQSx75OwV045h2rjCBBnhNB3o,152
439
- relationalai/util/otel_configuration.py,sha256=oWjsPJ6nn2q7KaGN4l-XaMVkZyxCEfcXmOepSmQlm8I,1065
439
+ relationalai/util/otel_configuration.py,sha256=SV1SFqdKm8q-OD1TsmiIB0x5VxtAFsBRyTwD8zNtnQc,1066
440
440
  relationalai/util/otel_handler.py,sha256=G1om5NxMvOjc6GDS4_Qf5aVGt1EVqRnkhfmZPcc6ZUg,17681
441
441
  relationalai/util/snowflake_handler.py,sha256=8HUo6eU5wPxa6m_EocYuEZD_XpVIh9EqBnGwaS06Usw,2942
442
442
  relationalai/util/span_format_test.py,sha256=1rU-M3RXhRt8vCX6rtuIJogEVkB164N3qiKcTmb-sl8,1345
@@ -453,8 +453,8 @@ frontend/debugger/dist/index.html,sha256=0wIQ1Pm7BclVV1wna6Mj8OmgU73B9rSEGPVX-Wo
453
453
  frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png,sha256=tPXOEhOrM4tJyZVJQVBO_yFgNAlgooY38ZsjyrFstgg,620
454
454
  frontend/debugger/dist/assets/index-Cssla-O7.js,sha256=MxgIGfdKQyBWgufck1xYggQNhW5nj6BPjCF6Wleo-f0,298886
455
455
  frontend/debugger/dist/assets/index-DlHsYx1V.css,sha256=21pZtAjKCcHLFjbjfBQTF6y7QmOic-4FYaKNmwdNZVE,60141
456
- relationalai-0.11.4.dist-info/METADATA,sha256=B3VzqLxv4_NTOySacfpH2EgQmwYc5yFOhojNgkKXego,2519
457
- relationalai-0.11.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
458
- relationalai-0.11.4.dist-info/entry_points.txt,sha256=fo_oLFJih3PUgYuHXsk7RnCjBm9cqRNR--ab6DgI6-0,88
459
- relationalai-0.11.4.dist-info/licenses/LICENSE,sha256=pPyTVXFYhirkEW9VsnHIgUjT0Vg8_xsE6olrF5SIgpc,11343
460
- relationalai-0.11.4.dist-info/RECORD,,
456
+ relationalai-0.12.1.dist-info/METADATA,sha256=f-pkqK_i3tihiwfuimhr3XbrxE0YlrjW_VOOr6WaGok,2562
457
+ relationalai-0.12.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
458
+ relationalai-0.12.1.dist-info/entry_points.txt,sha256=fo_oLFJih3PUgYuHXsk7RnCjBm9cqRNR--ab6DgI6-0,88
459
+ relationalai-0.12.1.dist-info/licenses/LICENSE,sha256=pPyTVXFYhirkEW9VsnHIgUjT0Vg8_xsE6olrF5SIgpc,11343
460
+ relationalai-0.12.1.dist-info/RECORD,,
@@ -1,58 +0,0 @@
1
- """
2
- Garbage collection pass that removes unused types and relations from the model.
3
- """
4
- from dataclasses import dataclass, field
5
-
6
- from relationalai.semantics.metamodel import ir, visitor, compiler
7
- from relationalai.semantics.metamodel.util import FrozenOrderedSet
8
-
9
- @dataclass
10
- class GarbageCollectNodes(compiler.Pass):
11
- """
12
- A pass that removes unused types and relations from the model.
13
- """
14
-
15
- # TODO: Since sometimes models don't initially have the correct set of relations,
16
- # we sometimes actually end up /adding/ relations to the model here.
17
-
18
- # Flags to determine which nodes to gargbage collect
19
- # By default, we only garbage collect types and relations
20
- types: bool = field(default=True)
21
- relations: bool = field(default=True)
22
-
23
- @staticmethod
24
- def used_relations(model, engines) -> FrozenOrderedSet[ir.Relation]:
25
- return visitor.collect_by_type(ir.Relation, *engines, model.root, *model.annotations).frozen()
26
-
27
- @staticmethod
28
- def used_types(model, engines, relations) -> FrozenOrderedSet[ir.Type]:
29
- return visitor.collect_by_type(ir.Type, *engines, *relations, model.root, *model.annotations).frozen()
30
-
31
- def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
32
- gc_types = self.types
33
- gc_relations = self.relations
34
-
35
- # No flags set, nothing to GC
36
- if not gc_relations and not gc_types:
37
- return model
38
-
39
- engines = model.engines
40
- relations = model.relations
41
- types = model.types
42
-
43
- # Note that engines and relations are mutually dependent. If we were to also GC engines,
44
- # then we would need to iterate until we reach a fixed point.
45
- if gc_relations:
46
- relations = self.used_relations(model, engines)
47
-
48
- # Types are independent of engines and relations, so we can just collect them last
49
- if gc_types:
50
- types = self.used_types(model, engines, relations)
51
-
52
- return ir.Model(
53
- engines,
54
- relations,
55
- types,
56
- model.root,
57
- model.annotations,
58
- )
@@ -1,109 +0,0 @@
1
- """
2
- Rewrite list types to tuple or scalar types depending on how they are used.
3
- """
4
- from dataclasses import dataclass, field
5
- from typing import List, cast
6
-
7
- from relationalai.semantics.metamodel import ir, visitor, compiler, builtins as bt
8
- from relationalai.semantics.metamodel.util import ordered_set
9
-
10
- @dataclass
11
- class RewriteListTypes(compiler.Pass):
12
- """
13
- Rewrite list types to tuple or scalar types depending on how they are used.
14
- """
15
- def rewrite(self, model: ir.Model, options:dict={}) -> ir.Model:
16
- v = RewriteListTypesVisitor()
17
- result = v.walk(model)
18
- return result
19
-
20
- @dataclass
21
- class RewriteListTypesVisitor(visitor.Rewriter):
22
- """
23
- A pass that fixes the types of nodes that use ListTypes.
24
- """
25
- new_relations: List[ir.Relation] = field(default_factory=list, init=False)
26
- new_types: List[ir.Type] = field(default_factory=list, init=False)
27
-
28
- def handle_model(self, model: ir.Model, parent: None):
29
- result = super().handle_model(model, parent)
30
- relations_without_list_type = ordered_set(*[
31
- r for r in result.relations if not any(isinstance(f.type, ir.ListType) for f in r.fields)
32
- ]).frozen()
33
- return model.reconstruct(
34
- result.engines,
35
- relations_without_list_type | self.new_relations,
36
- result.types | self.new_types,
37
- result.root,
38
- result.annotations,
39
- )
40
-
41
- def handle_lookup(self, node: ir.Lookup, parent: ir.Node):
42
- if any(isinstance(f.type, ir.ListType) for f in node.relation.fields):
43
- return self._rewrite_non_aggr_relation(node, node.relation)
44
- else:
45
- return node
46
-
47
- def handle_aggregate(self, node: ir.Aggregate, parent: ir.Node):
48
- new_aggr = self._rewrite_aggr_relation(node, node.aggregation)
49
- return ir.Aggregate(
50
- node.engine,
51
- new_aggr,
52
- node.projection,
53
- node.group,
54
- node.args,
55
- )
56
-
57
- def _rewrite_aggr_relation(self, node: ir.Aggregate, relation: ir.Relation) -> ir.Relation:
58
- assert len(relation.fields) >= 1
59
- changed = False
60
-
61
- if changed:
62
- overloads = ordered_set(*[
63
- self._rewrite_aggr_relation(node, overload)
64
- for overload in relation.overloads
65
- ]).frozen()
66
-
67
- new_relation = ir.Relation(
68
- relation.name,
69
- tuple(relation.fields),
70
- relation.requires,
71
- relation.annotations,
72
- overloads,
73
- )
74
- self.new_relations.append(new_relation)
75
- return new_relation
76
-
77
- return relation
78
-
79
- def _rewrite_non_aggr_relation(self, node: ir.Lookup, relation: ir.Relation):
80
- # Handle the simple varargs case: one list field and all the rest are scalar.
81
- # Currently this pattern is only used for `rel_primitive_hash_tuple`.
82
- # and `rel_primitive_solverlib_fo_appl`.
83
- list_field_indexes = [i for i in range(len(node.relation.fields)) if isinstance(node.relation.fields[i].type, ir.ListType)]
84
- if len(list_field_indexes) != 1:
85
- return node
86
-
87
- # There exactly one list field, rewrite it to a tuple type.
88
- i = list_field_indexes[0]
89
- assert isinstance(node.relation.fields[i].type, ir.ListType)
90
- scalar_field_count = len(node.relation.fields) - 1
91
- tuple_len = len(node.args) - scalar_field_count
92
- assert tuple_len >= 0, f"List field {i} has {tuple_len} elements, but there are only {scalar_field_count} scalar fields."
93
-
94
- # Flatten the list field into separate scalar fields.
95
- field = node.relation.fields[i]
96
- ft = cast(ir.ListType, field.type)
97
- new_fields = (
98
- list(node.relation.fields[0:i]) +
99
- [ir.Field(f"{field.name}@{j}", ft.element_type, field.input) for j in range(tuple_len)] +
100
- list(node.relation.fields[i+1:])
101
- )
102
-
103
- # Create new relation, adding external annotation to prevent renaming.
104
- # NOTE(coey): maybe this is a misuse of this annotation and there could be a nicer way to do it with overloads.
105
- annos = ordered_set(*node.relation.annotations, bt.external_annotation).frozen()
106
- new_relation = ir.Relation(node.relation.name, tuple(new_fields), node.relation.requires, annos)
107
- self.new_relations.append(new_relation)
108
-
109
- return ir.Lookup(node.engine, new_relation, node.args)
File without changes