pytrilogy 0.0.2.57__py3-none-any.whl → 0.0.3.0__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 (75) hide show
  1. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/METADATA +9 -2
  2. pytrilogy-0.0.3.0.dist-info/RECORD +99 -0
  3. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/WHEEL +1 -1
  4. trilogy/__init__.py +2 -2
  5. trilogy/core/enums.py +1 -7
  6. trilogy/core/env_processor.py +17 -5
  7. trilogy/core/environment_helpers.py +11 -25
  8. trilogy/core/exceptions.py +4 -0
  9. trilogy/core/functions.py +695 -261
  10. trilogy/core/graph_models.py +10 -10
  11. trilogy/core/internal.py +11 -2
  12. trilogy/core/models/__init__.py +0 -0
  13. trilogy/core/models/author.py +2110 -0
  14. trilogy/core/models/build.py +1845 -0
  15. trilogy/core/models/build_environment.py +151 -0
  16. trilogy/core/models/core.py +370 -0
  17. trilogy/core/models/datasource.py +297 -0
  18. trilogy/core/models/environment.py +696 -0
  19. trilogy/core/models/execute.py +931 -0
  20. trilogy/core/optimization.py +17 -22
  21. trilogy/core/optimizations/base_optimization.py +1 -1
  22. trilogy/core/optimizations/inline_constant.py +6 -6
  23. trilogy/core/optimizations/inline_datasource.py +17 -11
  24. trilogy/core/optimizations/predicate_pushdown.py +17 -16
  25. trilogy/core/processing/concept_strategies_v3.py +181 -146
  26. trilogy/core/processing/graph_utils.py +1 -1
  27. trilogy/core/processing/node_generators/basic_node.py +19 -18
  28. trilogy/core/processing/node_generators/common.py +51 -45
  29. trilogy/core/processing/node_generators/filter_node.py +26 -13
  30. trilogy/core/processing/node_generators/group_node.py +26 -21
  31. trilogy/core/processing/node_generators/group_to_node.py +13 -10
  32. trilogy/core/processing/node_generators/multiselect_node.py +60 -43
  33. trilogy/core/processing/node_generators/node_merge_node.py +76 -38
  34. trilogy/core/processing/node_generators/rowset_node.py +59 -36
  35. trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +27 -34
  36. trilogy/core/processing/node_generators/select_merge_node.py +161 -64
  37. trilogy/core/processing/node_generators/select_node.py +13 -13
  38. trilogy/core/processing/node_generators/union_node.py +12 -11
  39. trilogy/core/processing/node_generators/unnest_node.py +9 -7
  40. trilogy/core/processing/node_generators/window_node.py +19 -16
  41. trilogy/core/processing/nodes/__init__.py +21 -18
  42. trilogy/core/processing/nodes/base_node.py +92 -77
  43. trilogy/core/processing/nodes/filter_node.py +19 -13
  44. trilogy/core/processing/nodes/group_node.py +55 -40
  45. trilogy/core/processing/nodes/merge_node.py +47 -38
  46. trilogy/core/processing/nodes/select_node_v2.py +54 -40
  47. trilogy/core/processing/nodes/union_node.py +5 -7
  48. trilogy/core/processing/nodes/unnest_node.py +7 -11
  49. trilogy/core/processing/nodes/window_node.py +9 -4
  50. trilogy/core/processing/utility.py +108 -80
  51. trilogy/core/query_processor.py +67 -49
  52. trilogy/core/statements/__init__.py +0 -0
  53. trilogy/core/statements/author.py +413 -0
  54. trilogy/core/statements/build.py +0 -0
  55. trilogy/core/statements/common.py +30 -0
  56. trilogy/core/statements/execute.py +42 -0
  57. trilogy/dialect/base.py +152 -111
  58. trilogy/dialect/common.py +9 -10
  59. trilogy/dialect/duckdb.py +1 -1
  60. trilogy/dialect/enums.py +4 -2
  61. trilogy/dialect/presto.py +1 -1
  62. trilogy/dialect/sql_server.py +1 -1
  63. trilogy/executor.py +44 -32
  64. trilogy/hooks/base_hook.py +6 -4
  65. trilogy/hooks/query_debugger.py +110 -93
  66. trilogy/parser.py +1 -1
  67. trilogy/parsing/common.py +303 -64
  68. trilogy/parsing/parse_engine.py +263 -617
  69. trilogy/parsing/render.py +50 -26
  70. trilogy/scripts/trilogy.py +2 -1
  71. pytrilogy-0.0.2.57.dist-info/RECORD +0 -87
  72. trilogy/core/models.py +0 -4960
  73. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/LICENSE.md +0 -0
  74. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/entry_points.txt +0 -0
  75. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: pytrilogy
3
- Version: 0.0.2.57
3
+ Version: 0.0.3.0
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -27,6 +27,13 @@ Provides-Extra: bigquery
27
27
  Requires-Dist: sqlalchemy-bigquery; extra == "bigquery"
28
28
  Provides-Extra: snowflake
29
29
  Requires-Dist: snowflake-sqlalchemy; extra == "snowflake"
30
+ Dynamic: author-email
31
+ Dynamic: classifier
32
+ Dynamic: description
33
+ Dynamic: description-content-type
34
+ Dynamic: provides-extra
35
+ Dynamic: requires-dist
36
+ Dynamic: summary
30
37
 
31
38
  ## Trilogy
32
39
  [![Website](https://img.shields.io/badge/INTRO-WEB-orange?)](https://trilogydata.dev/)
@@ -0,0 +1,99 @@
1
+ trilogy/__init__.py,sha256=NutBQIuxEOak6wIOXS3HLb_AXutozJpl1V0dd6o3D-Y,302
2
+ trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ trilogy/constants.py,sha256=qZ1d0hoKPPV2HHCoFwPYTVB7b6bXjpWvXd3lE-zEhy8,1494
4
+ trilogy/engine.py,sha256=yOPnR7XCjWG82Gym_LLZBkYKKJdLCvqdCyt8zguNcnM,1103
5
+ trilogy/executor.py,sha256=nvi8F8ls7stAXvYUIRs6zh8X4q6O_plZcfazPnL-hKw,16745
6
+ trilogy/parser.py,sha256=o4cfk3j3yhUFoiDKq9ZX_GjBF3dKhDjXEwb63rcBkBM,293
7
+ trilogy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ trilogy/utility.py,sha256=euQccZLKoYBz0LNg5tzLlvv2YHvXh9HArnYp1V3uXsM,763
9
+ trilogy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ trilogy/core/constants.py,sha256=7XaCpZn5mQmjTobbeBn56SzPWq9eMNDfzfsRU-fP0VE,171
11
+ trilogy/core/enums.py,sha256=aTFXL6nckmG0hpNLdCxI2kAT26cIsZPahF-pHzLQ9uc,7085
12
+ trilogy/core/env_processor.py,sha256=pFsxnluKIusGKx1z7tTnfsd_xZcPy9pZDungkjkyvI0,3170
13
+ trilogy/core/environment_helpers.py,sha256=oOpewPwMp8xOtx2ayeeyuLNUwr-cli7UanHKot5ebNY,7627
14
+ trilogy/core/ergonomics.py,sha256=ASLDd0RqKWrZiG3XcKHo8nyTjaB_8xfE9t4NZ1UvGpc,1639
15
+ trilogy/core/exceptions.py,sha256=JPYyBcit3T_pRtlHdtKSeVJkIyWUTozW2aaut25A2xI,673
16
+ trilogy/core/functions.py,sha256=7Pq9jYSJd45L2pxT7AI-_rXVZmeLnmTPp8d1lA4z4Vk,24440
17
+ trilogy/core/graph_models.py,sha256=z17EoO8oky2QOuO6E2aMWoVNKEVJFhLdsQZOhC4fNLU,2079
18
+ trilogy/core/internal.py,sha256=iicDBlC6nM8d7e7jqzf_ZOmpUsW8yrr2AA8AqEiLx-s,1577
19
+ trilogy/core/optimization.py,sha256=xGO8piVsLrpqrx-Aid_Y56_5slSv4eZmlP64hCHRiEc,7957
20
+ trilogy/core/query_processor.py,sha256=qh-72MBOpnhIrmBQW4_lLCvJS-H3Hq_vuy--mWamw7U,19336
21
+ trilogy/core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ trilogy/core/models/author.py,sha256=Ai-AFBsr4sbm3T0WE3TxFwB73foGg7-uKUTyQtoBEXQ,67093
23
+ trilogy/core/models/build.py,sha256=uy9sJUHTnsY9sdpyzA8egPENnyTU9fryCKz3p8H0b4I,55562
24
+ trilogy/core/models/build_environment.py,sha256=8UggvlPU708GZWYPJMc_ou2r7M3TY2g69eqGvz03YX0,5528
25
+ trilogy/core/models/core.py,sha256=yie1uuq62uOQ5fjob9NMJbdvQPrCErXUT7JTCuYRyjI,9697
26
+ trilogy/core/models/datasource.py,sha256=c0tGxyH2WwTmAD047tr69U0a6GNVf-ug26H68yii7DA,9257
27
+ trilogy/core/models/environment.py,sha256=E7vdrhN0DR6_UKpxRP1KB3w9_GEcCfsKffQ4uv0_CzA,24779
28
+ trilogy/core/models/execute.py,sha256=ABylFQgtavjjCfFkEsFdUwfMB4UBQLHjdzQ9E67QlAE,33521
29
+ trilogy/core/optimizations/__init__.py,sha256=EBanqTXEzf1ZEYjAneIWoIcxtMDite5-n2dQ5xcfUtg,356
30
+ trilogy/core/optimizations/base_optimization.py,sha256=gzDOKImoFn36k7XBD3ysEYDnbnb6vdVIztUfFQZsGnM,513
31
+ trilogy/core/optimizations/inline_constant.py,sha256=lvNTIXaLNkw3HseJyXyDNk5R52doLU9sIg3pmU2_S08,1332
32
+ trilogy/core/optimizations/inline_datasource.py,sha256=AHuTGh2x0GQ8usOe0NiFncfTFQ_KogdgDl4uucmhIbI,4241
33
+ trilogy/core/optimizations/predicate_pushdown.py,sha256=g4AYE8Aw_iMlAh68TjNXGP754NTurrDduFECkUjoBnc,9399
34
+ trilogy/core/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ trilogy/core/processing/concept_strategies_v3.py,sha256=StDlgfoUIeuh2IoZlRlLgkJp5hA8polgdMmOzL_wLCo,39265
36
+ trilogy/core/processing/graph_utils.py,sha256=8QUVrkE9j-9C1AyrCb1nQEh8daCe0u1HuXl-Te85lag,1205
37
+ trilogy/core/processing/utility.py,sha256=Oc5tLGeDDpzhbfo2ZcF8ex1kez-NcJDMcG2Lm5BjS4c,20548
38
+ trilogy/core/processing/node_generators/__init__.py,sha256=s_YV1OYc336DuS9591259qjI_K_CtOCuhkf4t2aOgYs,733
39
+ trilogy/core/processing/node_generators/basic_node.py,sha256=UVsXMn6jTjm_ofVFt218jAS11s4RV4zD781vP4im-GI,3371
40
+ trilogy/core/processing/node_generators/common.py,sha256=ZsDzThjm_mAtdQpKAg8QIJiPVZ4KuUkKyilj4eOhSDs,9439
41
+ trilogy/core/processing/node_generators/filter_node.py,sha256=rlY7TbgjJlGhahYgdCIJpJbaSREAGVJEsyUIGaA38O0,8271
42
+ trilogy/core/processing/node_generators/group_node.py,sha256=94uoGZWvBKJ1eqjbDHCbZuRqMkux_lfpfkGZgAJTNCY,5876
43
+ trilogy/core/processing/node_generators/group_to_node.py,sha256=E5bEjovSx422d_MlAUCDFdY4P2WJVp61BmWwltkhzA8,3095
44
+ trilogy/core/processing/node_generators/multiselect_node.py,sha256=z9FQOxxUvxW31a0TckFfAvnuvU8vP1GyN224RTbXUAk,7114
45
+ trilogy/core/processing/node_generators/node_merge_node.py,sha256=sv55oynfqgpHEpo1OEtVDri-5fywzPhDlR85qaWikvY,16195
46
+ trilogy/core/processing/node_generators/rowset_node.py,sha256=x3rrdUkywAFiaYRk8lv-ra8KAdmBa8dLXj0FO55lz08,6213
47
+ trilogy/core/processing/node_generators/select_merge_node.py,sha256=VHCPMbnKfg7AOfoYa6PKxpNni-j5JEfliNUiltmZhds,19698
48
+ trilogy/core/processing/node_generators/select_node.py,sha256=Y-zO0AFkTrpi2LyebjpyHU7WWANr7nKZSS9rY7DH4Wo,1888
49
+ trilogy/core/processing/node_generators/union_node.py,sha256=zuMSmgF170vzlp2BBQEhKbqUMjVl2xQDqUB82Dhv-VU,2536
50
+ trilogy/core/processing/node_generators/unnest_node.py,sha256=cOEKnMRzXUW3bwmiOlgn3E1-B38osng0dh2pDykwITY,2410
51
+ trilogy/core/processing/node_generators/window_node.py,sha256=_W_bF-8nYi1fjeZ7rXg54Sf7SRDyjDOwk7S_RBoZCWM,3514
52
+ trilogy/core/processing/node_generators/select_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
+ trilogy/core/processing/node_generators/select_helpers/datasource_injection.py,sha256=GMW07bb6hXurhF0hZLYoMAKSIS65tat5hwBjvqqPeSA,6516
54
+ trilogy/core/processing/nodes/__init__.py,sha256=DqPG3Y8vl5-UTeox6hn1EE6iwPIJpsM-XeZALHSgLZQ,5058
55
+ trilogy/core/processing/nodes/base_node.py,sha256=FHrY8GsTKPuMJklOjILbhGqCt5s1nmlj62Z-molARDA,16835
56
+ trilogy/core/processing/nodes/filter_node.py,sha256=5VtRfKbCORx0dV-vQfgy3gOEkmmscL9f31ExvlODwvY,2461
57
+ trilogy/core/processing/nodes/group_node.py,sha256=qwX1CaCZJzH6oYFlGRKbi-Q7KXOjfYKplz8JDU8oy5c,7998
58
+ trilogy/core/processing/nodes/merge_node.py,sha256=bEz1QU2o-fl_O-VotE5dN1GmlZPClufMvUOvL2-2Uo8,15262
59
+ trilogy/core/processing/nodes/select_node_v2.py,sha256=Xyfq8lU7rP7JTAd8VV0ATDNal64n4xIBgWQsOuMe_Ak,8824
60
+ trilogy/core/processing/nodes/union_node.py,sha256=fDFzLAUh5876X6_NM7nkhoMvHEdGJ_LpvPokpZKOhx4,1425
61
+ trilogy/core/processing/nodes/unnest_node.py,sha256=oLKMMNMx6PLDPlt2V5neFMFrFWxET8r6XZElAhSNkO0,2181
62
+ trilogy/core/processing/nodes/window_node.py,sha256=STvwheVttxSWVHB-yUQUSo-Pyz7Uk8G1txFDAbWMp-s,1380
63
+ trilogy/core/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
+ trilogy/core/statements/author.py,sha256=p3gLiPzXAHNNWVh8Xm9xECmywfG-LKDHB9U-Z6GdWCM,14246
65
+ trilogy/core/statements/build.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
+ trilogy/core/statements/common.py,sha256=KxEmz2ySySyZ6CTPzn0fJl5NX2KOk1RPyuUSwWhnK1g,759
67
+ trilogy/core/statements/execute.py,sha256=cSlvpHFOqpiZ89pPZ5GDp9Hu6j6uj-5_h21FWm_L-KM,1248
68
+ trilogy/dialect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ trilogy/dialect/base.py,sha256=uvow18PxtFdabf59x0mAXbazV9bqGAfbBxcCAe8JaFs,40212
70
+ trilogy/dialect/bigquery.py,sha256=mKC3zoEU232h9RtIXJjqiZ72lWH8a6S28p6wAZKrAfg,2952
71
+ trilogy/dialect/common.py,sha256=cbTo_vamdp8pj9spSjGSH-bSZpy4FpNJ12k5vMvyT2Y,3942
72
+ trilogy/dialect/config.py,sha256=UiBY2tBbNk9owx-zxP_3lN9lErEUXhXIU_bcXA18AvU,2992
73
+ trilogy/dialect/duckdb.py,sha256=2tH_OetgLJoKf_f4bdeeB0ozGC8f0h_xQ271I8qD-Oo,3690
74
+ trilogy/dialect/enums.py,sha256=JICGp0KQhxNuVDSU36mve2XTZLbPpFRWUDkjvwni4eM,3979
75
+ trilogy/dialect/postgres.py,sha256=VH4EB4myjIeZTHeFU6vK00GxY9c53rCBjg2mLbdaCEE,3254
76
+ trilogy/dialect/presto.py,sha256=bAxaDcLL21fivPg7hmBd3HJmd0yYJdPdwNgNA5ga7DE,3391
77
+ trilogy/dialect/snowflake.py,sha256=wmao9p26jX5yIX5SC8sRAZTXkPGTvq6ixO693QTfhz8,2989
78
+ trilogy/dialect/sql_server.py,sha256=IN91uEM0MpsiVAlsYC89uMQkiVn0i86B8Tst6v9uFkU,3129
79
+ trilogy/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ trilogy/hooks/base_hook.py,sha256=I_l-NBMNC7hKTDx1JgHZPVOOCvLQ36m2oIGaR5EUMXY,1180
81
+ trilogy/hooks/graph_hook.py,sha256=c-vC-IXoJ_jDmKQjxQyIxyXPOuUcLIURB573gCsAfzQ,2940
82
+ trilogy/hooks/query_debugger.py,sha256=qds0xnW1cxH6Nv9U1L3gqSqD9OrE3TDQKEjyHyuzkFI,5558
83
+ trilogy/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ trilogy/parsing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ trilogy/parsing/common.py,sha256=ti_2s3EEMAz5NwmctchiB0DpVPVusTehc2l3bZQdMQI,20500
86
+ trilogy/parsing/config.py,sha256=Z-DaefdKhPDmSXLgg5V4pebhSB0h590vI0_VtHnlukI,111
87
+ trilogy/parsing/exceptions.py,sha256=92E5i2frv5hj9wxObJZsZqj5T6bglvPzvdvco_vW1Zk,38
88
+ trilogy/parsing/helpers.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
89
+ trilogy/parsing/parse_engine.py,sha256=7WU9jWH8tc6PSgBo_FcDA51QuhytzPTrZYFagCRw9Ec,53869
90
+ trilogy/parsing/render.py,sha256=o_XuQWhcwx1lD9eGVqkqZEwkmQK0HdmWWokGBtdeH4I,17837
91
+ trilogy/parsing/trilogy.lark,sha256=EazfEvYPuvkPkNjUnVzFi0uD9baavugbSI8CyfawShk,12573
92
+ trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ trilogy/scripts/trilogy.py,sha256=1L0XrH4mVHRt1C9T1HnaDv2_kYEfbWTb5_-cBBke79w,3774
94
+ pytrilogy-0.0.3.0.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
95
+ pytrilogy-0.0.3.0.dist-info/METADATA,sha256=z1DV_FX4ZThTyGzGCqQwyg78lSPcjDyOLO3NypXMJXk,8983
96
+ pytrilogy-0.0.3.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
97
+ pytrilogy-0.0.3.0.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
98
+ pytrilogy-0.0.3.0.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
99
+ pytrilogy-0.0.3.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
trilogy/__init__.py CHANGED
@@ -1,9 +1,9 @@
1
1
  from trilogy.constants import CONFIG
2
- from trilogy.core.models import Environment
2
+ from trilogy.core.models.environment import Environment
3
3
  from trilogy.dialect.enums import Dialects
4
4
  from trilogy.executor import Executor
5
5
  from trilogy.parser import parse
6
6
 
7
- __version__ = "0.0.2.57"
7
+ __version__ = "0.0.3.0"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/core/enums.py CHANGED
@@ -38,7 +38,7 @@ class Purpose(Enum):
38
38
  return super()._missing_(value)
39
39
 
40
40
 
41
- class PurposeLineage(Enum):
41
+ class Derivation(Enum):
42
42
  BASIC = "basic"
43
43
  WINDOW = "window"
44
44
  AGGREGATE = "aggregate"
@@ -323,12 +323,6 @@ class ShowCategory(Enum):
323
323
  CONCEPTS = "concepts"
324
324
 
325
325
 
326
- class SelectFiltering(Enum):
327
- NONE = "none"
328
- EXPLICIT = "explicit" # the filtering contains only selected values
329
- IMPLICIT = "implicit" # the filtering contains unselected values
330
-
331
-
332
326
  class IOType(Enum):
333
327
  CSV = "csv"
334
328
 
@@ -3,22 +3,29 @@ from trilogy.core.graph_models import (
3
3
  concept_to_node,
4
4
  datasource_to_node,
5
5
  )
6
- from trilogy.core.models import Concept, Datasource, Environment
6
+ from trilogy.core.models.build import BuildConcept, BuildDatasource
7
+ from trilogy.core.models.build_environment import BuildEnvironment
7
8
 
8
9
 
9
10
  def add_concept(
10
- concept: Concept, g: ReferenceGraph, concept_mapping: dict[str, Concept]
11
+ concept: BuildConcept, g: ReferenceGraph, concept_mapping: dict[str, BuildConcept]
11
12
  ):
12
13
  g.add_node(concept)
13
14
  # if we have sources, recursively add them
14
15
  node_name = concept_to_node(concept)
15
16
  if concept.concept_arguments:
16
17
  for source in concept.concept_arguments:
18
+ if not isinstance(source, BuildConcept):
19
+ raise ValueError(
20
+ f"Invalid non-build concept {source} passed into graph generation from {concept}"
21
+ )
17
22
  generic = source.with_default_grain()
18
23
  add_concept(generic, g, concept_mapping)
19
24
 
20
25
  g.add_edge(generic, node_name)
21
26
  for ps_address in concept.pseudonyms:
27
+ if ps_address not in concept_mapping:
28
+ raise SyntaxError(f"Concept {concept} has invalid pseudonym {ps_address}")
22
29
  pseudonym = concept_mapping[ps_address]
23
30
  pseudonym = pseudonym.with_default_grain()
24
31
  pseudonym_node = concept_to_node(pseudonym)
@@ -35,15 +42,19 @@ def add_concept(
35
42
 
36
43
 
37
44
  def generate_adhoc_graph(
38
- concepts: list[Concept],
39
- datasources: list[Datasource],
45
+ concepts: list[BuildConcept],
46
+ datasources: list[BuildDatasource],
40
47
  restrict_to_listed: bool = False,
41
48
  ) -> ReferenceGraph:
42
49
  g = ReferenceGraph()
43
50
  concept_mapping = {x.address: x for x in concepts}
51
+ for concept in concepts:
52
+ if not isinstance(concept, BuildConcept):
53
+ raise ValueError(f"Invalid non-build concept {concept}")
44
54
 
45
55
  # add all parsed concepts
46
56
  for concept in concepts:
57
+
47
58
  add_concept(concept, g, concept_mapping)
48
59
 
49
60
  for dataset in datasources:
@@ -66,8 +77,9 @@ def generate_adhoc_graph(
66
77
 
67
78
 
68
79
  def generate_graph(
69
- environment: Environment,
80
+ environment: BuildEnvironment,
70
81
  ) -> ReferenceGraph:
82
+
71
83
  return generate_adhoc_graph(
72
84
  list(environment.concepts.values())
73
85
  + list(environment.alias_origin_lookup.values()),
@@ -1,15 +1,10 @@
1
1
  from trilogy.constants import DEFAULT_NAMESPACE
2
2
  from trilogy.core.enums import ConceptSource, FunctionType, Purpose
3
3
  from trilogy.core.functions import AttrAccess
4
- from trilogy.core.models import (
5
- Concept,
6
- DataType,
7
- Environment,
8
- Function,
9
- Metadata,
10
- StructType,
11
- )
12
- from trilogy.parsing.common import Meta, arg_to_datatype, process_function_args
4
+ from trilogy.core.models.author import Concept, Function, Metadata
5
+ from trilogy.core.models.core import DataType, StructType, arg_to_datatype
6
+ from trilogy.core.models.environment import Environment
7
+ from trilogy.parsing.common import Meta, process_function_args
13
8
 
14
9
  FUNCTION_DESCRIPTION_MAPS = {
15
10
  FunctionType.DATE: "The date part of a timestamp/date. Integer, 0-31 depending on month.",
@@ -51,16 +46,13 @@ def generate_date_concepts(concept: Concept, environment: Environment):
51
46
  output_purpose=default_type,
52
47
  arguments=[concept],
53
48
  )
54
- namespace = (
55
- None if concept.namespace == DEFAULT_NAMESPACE else concept.namespace
56
- )
57
49
  new_concept = Concept(
58
50
  name=f"{concept.name}.{fname}",
59
51
  datatype=DataType.INTEGER,
60
52
  purpose=default_type,
61
53
  lineage=const_function,
62
- grain=const_function.output_grain,
63
- namespace=namespace,
54
+ grain=concept.grain,
55
+ namespace=concept.namespace,
64
56
  keys=set(
65
57
  concept.address,
66
58
  ),
@@ -102,16 +94,13 @@ def generate_datetime_concepts(concept: Concept, environment: Environment):
102
94
  output_purpose=default_type,
103
95
  arguments=[concept],
104
96
  )
105
- namespace = (
106
- None if concept.namespace == DEFAULT_NAMESPACE else concept.namespace
107
- )
108
97
  new_concept = Concept(
109
98
  name=f"{concept.name}.{fname}",
110
99
  datatype=DataType.INTEGER,
111
100
  purpose=default_type,
112
101
  lineage=const_function,
113
- grain=const_function.output_grain,
114
- namespace=namespace,
102
+ grain=concept.grain,
103
+ namespace=concept.namespace,
115
104
  keys=set(
116
105
  concept.address,
117
106
  ),
@@ -144,16 +133,13 @@ def generate_key_concepts(concept: Concept, environment: Environment):
144
133
  output_purpose=default_type,
145
134
  arguments=[concept],
146
135
  )
147
- namespace = (
148
- None if concept.namespace == DEFAULT_NAMESPACE else concept.namespace
149
- )
150
136
  new_concept = Concept(
151
137
  name=f"{concept.name}.{fname}",
152
138
  datatype=DataType.INTEGER,
153
139
  purpose=default_type,
154
140
  lineage=const_function,
155
- grain=const_function.output_grain,
156
- namespace=namespace,
141
+ grain=concept.grain,
142
+ namespace=concept.namespace,
157
143
  keys={
158
144
  concept.address,
159
145
  },
@@ -203,7 +189,7 @@ def generate_related_concepts(
203
189
  and environment.namespace != DEFAULT_NAMESPACE
204
190
  else concept.name
205
191
  ),
206
- lineage=AttrAccess(args),
192
+ lineage=AttrAccess(args, environment=environment),
207
193
  )
208
194
  environment.add_concept(auto, meta=meta)
209
195
  if isinstance(value, Concept):
@@ -8,6 +8,10 @@ class UndefinedConceptException(Exception):
8
8
  self.suggestions = suggestions
9
9
 
10
10
 
11
+ class UnresolvableQueryException(Exception):
12
+ pass
13
+
14
+
11
15
  class InvalidSyntaxException(Exception):
12
16
  pass
13
17