pytrilogy 0.3.142__cp312-cp312-win_amd64.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 (200) hide show
  1. LICENSE.md +19 -0
  2. _preql_import_resolver/__init__.py +5 -0
  3. _preql_import_resolver/_preql_import_resolver.cp312-win_amd64.pyd +0 -0
  4. pytrilogy-0.3.142.dist-info/METADATA +555 -0
  5. pytrilogy-0.3.142.dist-info/RECORD +200 -0
  6. pytrilogy-0.3.142.dist-info/WHEEL +4 -0
  7. pytrilogy-0.3.142.dist-info/entry_points.txt +2 -0
  8. pytrilogy-0.3.142.dist-info/licenses/LICENSE.md +19 -0
  9. trilogy/__init__.py +16 -0
  10. trilogy/ai/README.md +10 -0
  11. trilogy/ai/__init__.py +19 -0
  12. trilogy/ai/constants.py +92 -0
  13. trilogy/ai/conversation.py +107 -0
  14. trilogy/ai/enums.py +7 -0
  15. trilogy/ai/execute.py +50 -0
  16. trilogy/ai/models.py +34 -0
  17. trilogy/ai/prompts.py +100 -0
  18. trilogy/ai/providers/__init__.py +0 -0
  19. trilogy/ai/providers/anthropic.py +106 -0
  20. trilogy/ai/providers/base.py +24 -0
  21. trilogy/ai/providers/google.py +146 -0
  22. trilogy/ai/providers/openai.py +89 -0
  23. trilogy/ai/providers/utils.py +68 -0
  24. trilogy/authoring/README.md +3 -0
  25. trilogy/authoring/__init__.py +148 -0
  26. trilogy/constants.py +113 -0
  27. trilogy/core/README.md +52 -0
  28. trilogy/core/__init__.py +0 -0
  29. trilogy/core/constants.py +6 -0
  30. trilogy/core/enums.py +443 -0
  31. trilogy/core/env_processor.py +120 -0
  32. trilogy/core/environment_helpers.py +320 -0
  33. trilogy/core/ergonomics.py +193 -0
  34. trilogy/core/exceptions.py +123 -0
  35. trilogy/core/functions.py +1227 -0
  36. trilogy/core/graph_models.py +139 -0
  37. trilogy/core/internal.py +85 -0
  38. trilogy/core/models/__init__.py +0 -0
  39. trilogy/core/models/author.py +2669 -0
  40. trilogy/core/models/build.py +2521 -0
  41. trilogy/core/models/build_environment.py +180 -0
  42. trilogy/core/models/core.py +501 -0
  43. trilogy/core/models/datasource.py +322 -0
  44. trilogy/core/models/environment.py +751 -0
  45. trilogy/core/models/execute.py +1177 -0
  46. trilogy/core/optimization.py +251 -0
  47. trilogy/core/optimizations/__init__.py +12 -0
  48. trilogy/core/optimizations/base_optimization.py +17 -0
  49. trilogy/core/optimizations/hide_unused_concept.py +47 -0
  50. trilogy/core/optimizations/inline_datasource.py +102 -0
  51. trilogy/core/optimizations/predicate_pushdown.py +245 -0
  52. trilogy/core/processing/README.md +94 -0
  53. trilogy/core/processing/READMEv2.md +121 -0
  54. trilogy/core/processing/VIRTUAL_UNNEST.md +30 -0
  55. trilogy/core/processing/__init__.py +0 -0
  56. trilogy/core/processing/concept_strategies_v3.py +508 -0
  57. trilogy/core/processing/constants.py +15 -0
  58. trilogy/core/processing/discovery_node_factory.py +451 -0
  59. trilogy/core/processing/discovery_utility.py +548 -0
  60. trilogy/core/processing/discovery_validation.py +167 -0
  61. trilogy/core/processing/graph_utils.py +43 -0
  62. trilogy/core/processing/node_generators/README.md +9 -0
  63. trilogy/core/processing/node_generators/__init__.py +31 -0
  64. trilogy/core/processing/node_generators/basic_node.py +160 -0
  65. trilogy/core/processing/node_generators/common.py +268 -0
  66. trilogy/core/processing/node_generators/constant_node.py +38 -0
  67. trilogy/core/processing/node_generators/filter_node.py +315 -0
  68. trilogy/core/processing/node_generators/group_node.py +213 -0
  69. trilogy/core/processing/node_generators/group_to_node.py +117 -0
  70. trilogy/core/processing/node_generators/multiselect_node.py +205 -0
  71. trilogy/core/processing/node_generators/node_merge_node.py +653 -0
  72. trilogy/core/processing/node_generators/recursive_node.py +88 -0
  73. trilogy/core/processing/node_generators/rowset_node.py +165 -0
  74. trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  75. trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +261 -0
  76. trilogy/core/processing/node_generators/select_merge_node.py +748 -0
  77. trilogy/core/processing/node_generators/select_node.py +95 -0
  78. trilogy/core/processing/node_generators/synonym_node.py +98 -0
  79. trilogy/core/processing/node_generators/union_node.py +91 -0
  80. trilogy/core/processing/node_generators/unnest_node.py +182 -0
  81. trilogy/core/processing/node_generators/window_node.py +201 -0
  82. trilogy/core/processing/nodes/README.md +28 -0
  83. trilogy/core/processing/nodes/__init__.py +179 -0
  84. trilogy/core/processing/nodes/base_node.py +519 -0
  85. trilogy/core/processing/nodes/filter_node.py +75 -0
  86. trilogy/core/processing/nodes/group_node.py +194 -0
  87. trilogy/core/processing/nodes/merge_node.py +420 -0
  88. trilogy/core/processing/nodes/recursive_node.py +46 -0
  89. trilogy/core/processing/nodes/select_node_v2.py +242 -0
  90. trilogy/core/processing/nodes/union_node.py +53 -0
  91. trilogy/core/processing/nodes/unnest_node.py +62 -0
  92. trilogy/core/processing/nodes/window_node.py +56 -0
  93. trilogy/core/processing/utility.py +823 -0
  94. trilogy/core/query_processor.py +596 -0
  95. trilogy/core/statements/README.md +35 -0
  96. trilogy/core/statements/__init__.py +0 -0
  97. trilogy/core/statements/author.py +536 -0
  98. trilogy/core/statements/build.py +0 -0
  99. trilogy/core/statements/common.py +20 -0
  100. trilogy/core/statements/execute.py +155 -0
  101. trilogy/core/table_processor.py +66 -0
  102. trilogy/core/utility.py +8 -0
  103. trilogy/core/validation/README.md +46 -0
  104. trilogy/core/validation/__init__.py +0 -0
  105. trilogy/core/validation/common.py +161 -0
  106. trilogy/core/validation/concept.py +146 -0
  107. trilogy/core/validation/datasource.py +227 -0
  108. trilogy/core/validation/environment.py +73 -0
  109. trilogy/core/validation/fix.py +256 -0
  110. trilogy/dialect/__init__.py +32 -0
  111. trilogy/dialect/base.py +1392 -0
  112. trilogy/dialect/bigquery.py +308 -0
  113. trilogy/dialect/common.py +147 -0
  114. trilogy/dialect/config.py +144 -0
  115. trilogy/dialect/dataframe.py +50 -0
  116. trilogy/dialect/duckdb.py +231 -0
  117. trilogy/dialect/enums.py +147 -0
  118. trilogy/dialect/metadata.py +173 -0
  119. trilogy/dialect/mock.py +190 -0
  120. trilogy/dialect/postgres.py +117 -0
  121. trilogy/dialect/presto.py +110 -0
  122. trilogy/dialect/results.py +89 -0
  123. trilogy/dialect/snowflake.py +129 -0
  124. trilogy/dialect/sql_server.py +137 -0
  125. trilogy/engine.py +48 -0
  126. trilogy/execution/config.py +75 -0
  127. trilogy/executor.py +568 -0
  128. trilogy/hooks/__init__.py +4 -0
  129. trilogy/hooks/base_hook.py +40 -0
  130. trilogy/hooks/graph_hook.py +139 -0
  131. trilogy/hooks/query_debugger.py +166 -0
  132. trilogy/metadata/__init__.py +0 -0
  133. trilogy/parser.py +10 -0
  134. trilogy/parsing/README.md +21 -0
  135. trilogy/parsing/__init__.py +0 -0
  136. trilogy/parsing/common.py +1069 -0
  137. trilogy/parsing/config.py +5 -0
  138. trilogy/parsing/exceptions.py +8 -0
  139. trilogy/parsing/helpers.py +1 -0
  140. trilogy/parsing/parse_engine.py +2813 -0
  141. trilogy/parsing/render.py +769 -0
  142. trilogy/parsing/trilogy.lark +540 -0
  143. trilogy/py.typed +0 -0
  144. trilogy/render.py +42 -0
  145. trilogy/scripts/README.md +9 -0
  146. trilogy/scripts/__init__.py +0 -0
  147. trilogy/scripts/agent.py +41 -0
  148. trilogy/scripts/agent_info.py +303 -0
  149. trilogy/scripts/common.py +355 -0
  150. trilogy/scripts/dependency/Cargo.lock +617 -0
  151. trilogy/scripts/dependency/Cargo.toml +39 -0
  152. trilogy/scripts/dependency/README.md +131 -0
  153. trilogy/scripts/dependency/build.sh +25 -0
  154. trilogy/scripts/dependency/src/directory_resolver.rs +177 -0
  155. trilogy/scripts/dependency/src/lib.rs +16 -0
  156. trilogy/scripts/dependency/src/main.rs +770 -0
  157. trilogy/scripts/dependency/src/parser.rs +435 -0
  158. trilogy/scripts/dependency/src/preql.pest +208 -0
  159. trilogy/scripts/dependency/src/python_bindings.rs +303 -0
  160. trilogy/scripts/dependency/src/resolver.rs +716 -0
  161. trilogy/scripts/dependency/tests/base.preql +3 -0
  162. trilogy/scripts/dependency/tests/cli_integration.rs +377 -0
  163. trilogy/scripts/dependency/tests/customer.preql +6 -0
  164. trilogy/scripts/dependency/tests/main.preql +9 -0
  165. trilogy/scripts/dependency/tests/orders.preql +7 -0
  166. trilogy/scripts/dependency/tests/test_data/base.preql +9 -0
  167. trilogy/scripts/dependency/tests/test_data/consumer.preql +1 -0
  168. trilogy/scripts/dependency.py +323 -0
  169. trilogy/scripts/display.py +512 -0
  170. trilogy/scripts/environment.py +46 -0
  171. trilogy/scripts/fmt.py +32 -0
  172. trilogy/scripts/ingest.py +471 -0
  173. trilogy/scripts/ingest_helpers/__init__.py +1 -0
  174. trilogy/scripts/ingest_helpers/foreign_keys.py +123 -0
  175. trilogy/scripts/ingest_helpers/formatting.py +93 -0
  176. trilogy/scripts/ingest_helpers/typing.py +161 -0
  177. trilogy/scripts/init.py +105 -0
  178. trilogy/scripts/parallel_execution.py +713 -0
  179. trilogy/scripts/plan.py +189 -0
  180. trilogy/scripts/run.py +63 -0
  181. trilogy/scripts/serve.py +140 -0
  182. trilogy/scripts/serve_helpers/__init__.py +41 -0
  183. trilogy/scripts/serve_helpers/file_discovery.py +142 -0
  184. trilogy/scripts/serve_helpers/index_generation.py +206 -0
  185. trilogy/scripts/serve_helpers/models.py +38 -0
  186. trilogy/scripts/single_execution.py +131 -0
  187. trilogy/scripts/testing.py +119 -0
  188. trilogy/scripts/trilogy.py +68 -0
  189. trilogy/std/__init__.py +0 -0
  190. trilogy/std/color.preql +3 -0
  191. trilogy/std/date.preql +13 -0
  192. trilogy/std/display.preql +18 -0
  193. trilogy/std/geography.preql +22 -0
  194. trilogy/std/metric.preql +15 -0
  195. trilogy/std/money.preql +67 -0
  196. trilogy/std/net.preql +14 -0
  197. trilogy/std/ranking.preql +7 -0
  198. trilogy/std/report.preql +5 -0
  199. trilogy/std/semantic.preql +6 -0
  200. trilogy/utility.py +34 -0
@@ -0,0 +1,200 @@
1
+ LICENSE.md,sha256=yDfbCcuP86VC238FACRVoW4Y88ikZwYeuRzlMhLAycM,1060
2
+ _preql_import_resolver/__init__.py,sha256=u8p6v_wq7kr8H8ZqwxeGaN1E5LW7rNe6fMjshXjpBcY,171
3
+ _preql_import_resolver/_preql_import_resolver.cp312-win_amd64.pyd,sha256=zyp0-nZFSQWqnM4zZKNpiWrFmb94xJnro51j5wC5W9o,643584
4
+ pytrilogy-0.3.142.dist-info/METADATA,sha256=ANYU8c3YPnrdnhmCjsxuSEPmyeX8pLE13nvMHJjqKeo,14120
5
+ pytrilogy-0.3.142.dist-info/WHEEL,sha256=MicGETHZ2NSvTN4l4NAAzDXbOHnrlOKS0CnBsnFTiLs,97
6
+ pytrilogy-0.3.142.dist-info/entry_points.txt,sha256=yuRY2xq7kdrpz-vxW0f1NJHKSOkxB-gXoBQVyTWftas,54
7
+ pytrilogy-0.3.142.dist-info/licenses/LICENSE.md,sha256=yDfbCcuP86VC238FACRVoW4Y88ikZwYeuRzlMhLAycM,1060
8
+ trilogy/__init__.py,sha256=uGLsGvky1og7Yl3M7sHacCEwG7E03PFq6dpKF6TcLz0,385
9
+ trilogy/ai/README.md,sha256=N84wajEuuLL8l_KJMnCs_INHxaMVNzJWIBhPTpyl3Fw,531
10
+ trilogy/ai/__init__.py,sha256=FIPY7uBNxOxJAjU2eUOFDeW1H8Yx2tM5PKaFdOlC6YA,600
11
+ trilogy/ai/constants.py,sha256=F6yOzajQPegYasRDUJYt7wHmUkUyfiThdVUhqKRtd9g,5156
12
+ trilogy/ai/conversation.py,sha256=H_yyKCuTK0xZU87A955qVGq1_oAvijcCZJHSv9YWdlM,4055
13
+ trilogy/ai/enums.py,sha256=P1TuSLixYEUMiABjP4TVR5Xcn7ex5_zhNVNhf2YR594,125
14
+ trilogy/ai/execute.py,sha256=rklYqm6JPe5YvF05yJY6H-TPrzIY61WsqdgF1J9ZTck,1385
15
+ trilogy/ai/models.py,sha256=0pIAoJ8unM0OskPlaqvHcrKZfGRWx2GdK0ysCYROG90,717
16
+ trilogy/ai/prompts.py,sha256=vxzPD8YBKFH5QmUSWLVPnFjv89MOMID6BeiXPGcChLU,4239
17
+ trilogy/ai/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ trilogy/ai/providers/anthropic.py,sha256=QsCUKMKGXtEzC39SDoXzXq53GI-VJkEv9zgY4B0wC1A,4205
19
+ trilogy/ai/providers/base.py,sha256=fVZbF5RMjPPZLVSdfo99PBwKI7BAwvGawnVsXfZ1W40,762
20
+ trilogy/ai/providers/google.py,sha256=YBwWGoYlVkSB33NbEtttrvpuNd8WEi---D71Vx6lqpM,5547
21
+ trilogy/ai/providers/openai.py,sha256=OZ2RDLV_B5qxRRnT7Jvb58WAjCzFTvjFL21wVpmnJgc,3382
22
+ trilogy/ai/providers/utils.py,sha256=Aal7DS2_auLNnnsrEy32tgNfV0E4ymPNxCHezGvViMU,2114
23
+ trilogy/authoring/README.md,sha256=M2-tTTw7yqG4RC_gM5kS-Aj0MzvWcakAqNw_KHHlKp8,149
24
+ trilogy/authoring/__init__.py,sha256=_zUadXAax6dtilEd7k2pvTwo1GnDxw4E5pr6iIOJrK0,3386
25
+ trilogy/constants.py,sha256=HmEv_0pl2Cue4IfDQUqWeJYzEzsHxkaWR1S6osYn4t4,2793
26
+ trilogy/core/README.md,sha256=d24HfHPs8nVuhoMYShs9jQgs5WVtykixxSCtuHaqFvw,964
27
+ trilogy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ trilogy/core/constants.py,sha256=yl7RCnv4ymSZacjk_6Rdw94LVdpOyQBxNTXGjurky8A,250
29
+ trilogy/core/enums.py,sha256=zt6Z74EnUfMBuiIQ_iiha7CNaUVLm7jTmJeoA5j8iN4,10275
30
+ trilogy/core/env_processor.py,sha256=Dm3ols3-Gm_7in2HOnKE67Gl2QobzmD63-5cWOrHPfg,4641
31
+ trilogy/core/environment_helpers.py,sha256=iwU2IJhfZog37Mu6OK56t8M_AM0WUfXI1Lv3jhC5B5E,13063
32
+ trilogy/core/ergonomics.py,sha256=CGw-3DYlBh57PrUEzxhI07M8OJJ2z5SjzCktc6qm5RU,1824
33
+ trilogy/core/exceptions.py,sha256=wxvc93vRbLL0mOBTvvx1aNiFGgNHyXpsuXKYQ3oTbrM,3320
34
+ trilogy/core/functions.py,sha256=MvCHBLplz09LSX_CAPHKEeI_6PmZKUN248KWntCer7k,38396
35
+ trilogy/core/graph_models.py,sha256=xrsmQhUwLH0QFLGLNgXCDoGyzibJ1Efdh-Z6XoeiIpI,4636
36
+ trilogy/core/internal.py,sha256=HzYozH7-Q_9SYL37Z1Dep6YntWjZ53XqtpEljNXk8zo,2766
37
+ trilogy/core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ trilogy/core/models/author.py,sha256=ADSCLM0Fwbs698DNYlP5luQEtRhB9r1vhvXgtT-BAMc,88847
39
+ trilogy/core/models/build.py,sha256=D4j777Il44P2ZkH619kwa38x1fd-fQVS7pEt5EVPqa8,82375
40
+ trilogy/core/models/build_environment.py,sha256=jcxI0IPklIWFyVY9TeM8J_M25XhFA9IOEXZXBXpxN6w,7122
41
+ trilogy/core/models/core.py,sha256=TZmNtDxjMdH3k7LctaEmUTGtBk-VETtPQ9wfBI4_gpw,14203
42
+ trilogy/core/models/datasource.py,sha256=B5IvRQzm3YJ-6rMBXsZgk-4PDvMYav6XPLdO5zxZmT8,10600
43
+ trilogy/core/models/environment.py,sha256=vPVvz1tNRpG0_wOPhYI8XjKDq0rWyJfM6ZKxMR6uQZ0,26391
44
+ trilogy/core/models/execute.py,sha256=YVxWCgtJ3X2vy7ccj7Ui42bf8q9zhGBZSR9qXOUsM3w,43792
45
+ trilogy/core/optimization.py,sha256=uoYwZM3iXaDjXF20-kWhmYUypdPS0vDnZtlTNApuRQc,9513
46
+ trilogy/core/optimizations/__init__.py,sha256=BqXZX4fvoQMn5qFH2bGyfBtVEr_8QJvvscr5sn9T6YU,380
47
+ trilogy/core/optimizations/base_optimization.py,sha256=2gwAFfaknZAF9ksfvSI9zfjypBEV7qLfTt9fvepFY4E,530
48
+ trilogy/core/optimizations/hide_unused_concept.py,sha256=3QLbAFwFqzzC_gFr8LYnfBMTZAnUoEYviLeOyJnHBnQ,1922
49
+ trilogy/core/optimizations/inline_datasource.py,sha256=oNSQZY3ELWtnJW2LSdNUkSTHSS_Gz1zysRkpVawfFnA,4431
50
+ trilogy/core/optimizations/predicate_pushdown.py,sha256=ttcCoicQc4sUznJA2TA6hpORqulTsuXZJE_FmoFZ2zU,10031
51
+ trilogy/core/processing/README.md,sha256=9n-ZGFJkqOv82XnCss4YxhIcBXnI8eDSSnTrnVWfLjI,3007
52
+ trilogy/core/processing/READMEv2.md,sha256=nMAKOdadXIRDYl39bBnsWK4P0vqjvNReDh_cQLkoPQI,3074
53
+ trilogy/core/processing/VIRTUAL_UNNEST.md,sha256=5UlEU0om8wYnFas-UV83NJx1K4nge-fgEkN-eO2aZ0k,745
54
+ trilogy/core/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ trilogy/core/processing/concept_strategies_v3.py,sha256=EUl5EmmQa0ItDSNKhtGEHqZxS5a9D-sGm60brY3fkkU,19506
56
+ trilogy/core/processing/constants.py,sha256=Z4l70U-_X3aTg_m0ZGMzTq9dWP93YfwNCzn0V98N40A,419
57
+ trilogy/core/processing/discovery_node_factory.py,sha256=Gl-4XpBU_FoSmaYtTuWJWm5Kty2YToOGQUkvC8o_9os,14439
58
+ trilogy/core/processing/discovery_utility.py,sha256=NrUmSylvecXoCnN6qm-s1gzE_WjEc7hcvSFinNOQ8do,21069
59
+ trilogy/core/processing/discovery_validation.py,sha256=nmW5wTlc-PldzEeVvTeOnbrnXYrJzufOCMyXX8p38ic,5531
60
+ trilogy/core/processing/graph_utils.py,sha256=xDfPROOh0st_7279aCtxi5Ym2DWG93b8NERea1O7e1c,1248
61
+ trilogy/core/processing/node_generators/README.md,sha256=DQmwI-sv4RC2G9oswbrYeJzWIH-_oYI9HCQI5st1GLc,340
62
+ trilogy/core/processing/node_generators/__init__.py,sha256=Qrjt5oMPi1YQloOkDwFoCNsdjPo_qVnTR6GN0l8Ta2I,974
63
+ trilogy/core/processing/node_generators/basic_node.py,sha256=jmHkbYUoIPQeF-QokCDwLXjcWq2pNtbUyQzg0e8nHkM,6181
64
+ trilogy/core/processing/node_generators/common.py,sha256=L6R_qqr4BStj4f64ATUF8fbD3VfSdjzqRRFHfGM2sHk,9784
65
+ trilogy/core/processing/node_generators/constant_node.py,sha256=T7aHCggpw53xQ3KfSOvUYWPgQFKAX-yxU7Q_4Famo7o,1184
66
+ trilogy/core/processing/node_generators/filter_node.py,sha256=BcE2HklWNqFj1WSj7Qw0Yvl2xPKPcKdcYTGXmA0tkos,11574
67
+ trilogy/core/processing/node_generators/group_node.py,sha256=SOHwYsDQs9sYFwpwSkk-B-Jsp_LvDYRAvcce3wBJOuw,8773
68
+ trilogy/core/processing/node_generators/group_to_node.py,sha256=Vy3hAjHnrqPPhdZmpBpPP77vb1FYEClw4EAvytYZ8UQ,3949
69
+ trilogy/core/processing/node_generators/multiselect_node.py,sha256=_YFVOFY7St3dr7w0sE3lZ3289cSWn3jnb3RJJdzOMjE,7340
70
+ trilogy/core/processing/node_generators/node_merge_node.py,sha256=PRZMGlbQ6G1Yb6-okTJxIIwLSXI9QJkO37DDakiJd9w,24622
71
+ trilogy/core/processing/node_generators/recursive_node.py,sha256=2NmZYuKjpNkJqYuzdNwAdgTQvPxuDhyYCBhJt2RBTOA,2601
72
+ trilogy/core/processing/node_generators/rowset_node.py,sha256=AMsKRb5uPrpkz33wlSkqqvMn8NDo6vW5MfzxpXi78JA,6108
73
+ trilogy/core/processing/node_generators/select_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ trilogy/core/processing/node_generators/select_helpers/datasource_injection.py,sha256=A5yjTZQSkYGVyUYtcBBU0UAGQklgTseqsXC9zJfta3w,8485
75
+ trilogy/core/processing/node_generators/select_merge_node.py,sha256=RewiW3zuK1YDEOiA76KBr0x-iUOmDl-dNHO48hPqmMw,27311
76
+ trilogy/core/processing/node_generators/select_node.py,sha256=CYDQCj8FQX1NlqBr7131wFs2sa3pyznI439UZJC423A,3769
77
+ trilogy/core/processing/node_generators/synonym_node.py,sha256=vXR28_32kGaPfQUfANMDE8YiRnitSz1B0pXN1uWvsyY,3864
78
+ trilogy/core/processing/node_generators/union_node.py,sha256=Z1C2wXsJPSJbo7tJ46E27k4B1mx62V3WbSkPoEpQ5xk,2909
79
+ trilogy/core/processing/node_generators/unnest_node.py,sha256=vUj5_v2GwezyTWibB6ccZOKbjKKhEikOUewvHA_a-xw,6411
80
+ trilogy/core/processing/node_generators/window_node.py,sha256=p39RzZshm4732_PCDtVPfd4E-fdUAEUOOylvXer9C0A,6968
81
+ trilogy/core/processing/nodes/README.md,sha256=Sw3zjT1jreBVl8uX2IenjlmGcQm3aQXsqjfla44QHI8,627
82
+ trilogy/core/processing/nodes/__init__.py,sha256=mBxogZe5tHY2tMoCalItHvL18eGO0KHJE3BerZIjJ6E,5666
83
+ trilogy/core/processing/nodes/base_node.py,sha256=qvl_-0Bx9DjJiBYBx1D7LVO7zQnQ6gDrC7OTvanbdBg,19241
84
+ trilogy/core/processing/nodes/filter_node.py,sha256=7HoBXneqh_BgqHa2T1JkhxT7ch2cEePr8rZ55Us_wPw,2536
85
+ trilogy/core/processing/nodes/group_node.py,sha256=y32i245Iov1gWEkTejehnxcwVtb4VU7_ZqHazT8_BZg,7643
86
+ trilogy/core/processing/nodes/merge_node.py,sha256=r0RyrS1owjEWSQ0Hd78Jkgs8mdz9XNW5e0rIjJYXF8g,16987
87
+ trilogy/core/processing/nodes/recursive_node.py,sha256=EKoHPvo8g7dMq3V0qxwmDEb1HEtP3cC8PZCCN-cSVUg,1572
88
+ trilogy/core/processing/nodes/select_node_v2.py,sha256=LsNGEzwXVQRu-PmbPf-4WGECYeijoPMnLwWi4Hq0dWg,9104
89
+ trilogy/core/processing/nodes/union_node.py,sha256=lw3oF1Z85TU8ytMzjtdLHjzr3PojgBKtJGNj6XI-JYA,1923
90
+ trilogy/core/processing/nodes/unnest_node.py,sha256=neVxqVJrzezS_N73aT1wv9y1zjY2CvO6WoeqcgTBsJk,2243
91
+ trilogy/core/processing/nodes/window_node.py,sha256=RZj-HILTtBpJK33bdxBdPI2FAagWxmdG5QiFgXZ19-I,1766
92
+ trilogy/core/processing/utility.py,sha256=WdipHbACLcfplfSw5F4cFxWaobyAPXb5ryPPXTdikY8,28182
93
+ trilogy/core/query_processor.py,sha256=y4x3FOY75DwK-t3BjPNMxVv2n2Ssc3ZspHHozhIrASA,21930
94
+ trilogy/core/statements/README.md,sha256=3vDd1cw5t90LJFHIy5hX_ycUWV56rs_SOuTNEQuTn9U,485
95
+ trilogy/core/statements/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
+ trilogy/core/statements/author.py,sha256=StfuYwKQIt3gGYLGes-fWIeePy_fw6wjlByh6hSjf_Q,18237
97
+ trilogy/core/statements/build.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ trilogy/core/statements/common.py,sha256=nI6Ls3zq3NbeOEHFJRvhgSF7YcKFiGRQKqAnuvqwqK0,555
99
+ trilogy/core/statements/execute.py,sha256=laHeT7fj2p7IjFcuRdTeegjGn0ljTEfbibrrQI2AkWA,3513
100
+ trilogy/core/table_processor.py,sha256=xHsGiUfuDma3u9I2yia-5v2v_y_wG05v2N7tkzWEs0U,2246
101
+ trilogy/core/utility.py,sha256=V64ndAoi6_c8YntcxVjlxUDE5ZY2hs-QoAJJ_7x-CPM,418
102
+ trilogy/core/validation/README.md,sha256=bNjczLIrjD0-fcTdO6UFXRGiCvMtXyGu9LU_U8fXCyg,1663
103
+ trilogy/core/validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
+ trilogy/core/validation/common.py,sha256=3cRsDmCIin0y1JzcihUAVnZJKstdMx9ZvzEZNceUHUc,4937
105
+ trilogy/core/validation/concept.py,sha256=7-PE2XtiodbVlq2LVbOFT6d_B4WvmFrsCz0Tx6RdyOI,5388
106
+ trilogy/core/validation/datasource.py,sha256=REF21tjrB3qZQBJhZsYOaR09fZqrehxN7yKwGUi2mj4,8056
107
+ trilogy/core/validation/environment.py,sha256=7hxrCA1fdh6L80fNBRGERM4sFdjm_1oj9mivdTetU8M,2908
108
+ trilogy/core/validation/fix.py,sha256=UsRCT3hIj1Np5urHRqX6mVaSAy_9IGa9MAoK-yk08Rc,8752
109
+ trilogy/dialect/__init__.py,sha256=NVPgw9tzVihKaumTI-N4xK308rAaR0ZevpEs0MrEfmk,741
110
+ trilogy/dialect/base.py,sha256=7oQMQNbZ7Ic5u3QTf1apj_oQjpppHLlubHYQv157M9c,60803
111
+ trilogy/dialect/bigquery.py,sha256=LPQhst5PimKj9tCpBsy2tam_gckFmKpVp1eUDogzk3s,11340
112
+ trilogy/dialect/common.py,sha256=0-P-00vKBP-a-KrYWk_x0EOl4sAc1zBclZnpy4UvSWQ,5855
113
+ trilogy/dialect/config.py,sha256=buP1u00C0RzZpvkAUjY6w9KGo67xko6abmXZOpJB2N0,4528
114
+ trilogy/dialect/dataframe.py,sha256=0hwn-SxCKw7PyzxlFcBexrzE8ymaRkFPmlquX6fMNKo,1646
115
+ trilogy/dialect/duckdb.py,sha256=3jMbdUKH9TzOGJ--KM_Sg-6x1FHnTSBY109Vf41QLOo,8528
116
+ trilogy/dialect/enums.py,sha256=bhP09jQvMAUvLFWFwQwEQHM7jVAmVpgV9daGGgi-3iw,5341
117
+ trilogy/dialect/metadata.py,sha256=n6RJP9kJxwfE4xAcRh4QLRpdONxz6d1Pjw1f1dpi7XA,5899
118
+ trilogy/dialect/mock.py,sha256=f0iS1PBWbpZOYrqWZyUAUrk4SnhYljq7zrnWk_-G8nk,7350
119
+ trilogy/dialect/postgres.py,sha256=HB-u5PPqyUj0eTdKJUGH9jCYGOOqTFUuiXPqqGjzl5s,4552
120
+ trilogy/dialect/presto.py,sha256=JaFDbOMGbyryWgIP6Y-x3G_xua5EWhuE76yv9_Abflg,4307
121
+ trilogy/dialect/results.py,sha256=tHMhBf28awgd8c_MHN87ZFiXppxTalnFCCKBUxaM8Bs,2404
122
+ trilogy/dialect/snowflake.py,sha256=M4dyAWPS3p1t-7f_rydVwv4A2jyktH1xHWwWB0VaXAQ,5028
123
+ trilogy/dialect/sql_server.py,sha256=R2K6NjxZzdMcQPnQ4PS7qvPF9di9nnIDXncr4SVfBZ8,4826
124
+ trilogy/engine.py,sha256=Zr-nP9P_cPRbjjlU_a9zPBpHXmrInZaJckhdD2oTFn0,1031
125
+ trilogy/execution/config.py,sha256=rKejkZjve_IpXJGyLtQIrI9KtZECixE_kw4lcpPjctQ,2493
126
+ trilogy/executor.py,sha256=kPxeZjKYKfLwo3IO4WMw909tnG4osrbqjJ6YClAASn0,20497
127
+ trilogy/hooks/__init__.py,sha256=JCKfS48OeyP6Br5HkeY9NI3WNSHo5fLNrvaiXGeNwOo,148
128
+ trilogy/hooks/base_hook.py,sha256=g66G3pXR246Lv6s60dYBYuW8_fRPNym95Kh99UR9QEU,1220
129
+ trilogy/hooks/graph_hook.py,sha256=68uvOOv3E6doKvgu8J9o_vVkNHx-guDRMwwXEQheX34,4895
130
+ trilogy/hooks/query_debugger.py,sha256=QYowXu0dS5Zxa7k59CTcUCjxdrm-OdbMbI11nGoe3XU,5749
131
+ trilogy/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
+ trilogy/parser.py,sha256=chyn5TKf-Z_AROFLVsWx4q7jmTbZo-_Ta9b_LTq8BCg,303
133
+ trilogy/parsing/README.md,sha256=MHc0C1_YbQu_9wDipP5VjBsN0qNi7MIThWZ7WVXKt9k,454
134
+ trilogy/parsing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
+ trilogy/parsing/common.py,sha256=10QkXc9-H_rHhU-ZMns-uGJl0_dEmvKAgCkTcAlSHdw,36603
136
+ trilogy/parsing/config.py,sha256=f_AX8l7cDvlLiMY4nh0a_mQH4gqfhtsRc8fpl9FUWVk,116
137
+ trilogy/parsing/exceptions.py,sha256=zrmselJ9FQ2_6fmHGQWy6gswnc_u0oyCv_EWkPhVau4,162
138
+ trilogy/parsing/helpers.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
139
+ trilogy/parsing/parse_engine.py,sha256=XJip-X0N_YZ_xolK8G5salRx9KbAlD5GTcDrU7ar5Gs,101824
140
+ trilogy/parsing/render.py,sha256=afM5Z1JFKEKGqPRzmfNrVW9LuELsvyKF8ks9pvFdCng,26447
141
+ trilogy/parsing/trilogy.lark,sha256=Q_WdTegFNrJLBm1x1ul0-CHhe3wnirGb6mVRHu7jDzQ,19566
142
+ trilogy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
+ trilogy/render.py,sha256=RxVWNpXQPiQstyKh5L1Z2dJ1sTxAGTolTW6PP6OoZ7Y,1554
144
+ trilogy/scripts/README.md,sha256=YVRBszdGx3JnauJn9Ejy0S9z4gFEPT0XHFltycbem58,206
145
+ trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
+ trilogy/scripts/agent.py,sha256=f-l2JobnTx3iZUVREFP66mXTeDLbEDdus-n7DuwSycE,1554
147
+ trilogy/scripts/agent_info.py,sha256=-7kCv_iP_6cIhFiL0G6kqe3Enm_52rgxBmMPxaczhIg,7966
148
+ trilogy/scripts/common.py,sha256=9b_94671R6QZ39SSFowJ9rmOZTUIn72q8nLY8p89QdY,11726
149
+ trilogy/scripts/dependency.py,sha256=Ln036XPbMr5CTOp1xQA5YcOliz2yPQVcBCcjJOFyZP8,11102
150
+ trilogy/scripts/dependency/Cargo.lock,sha256=93Q-CRtEHLWFxTZiUL0Tcx_x6oHpb_zENi0t8R63enA,15910
151
+ trilogy/scripts/dependency/Cargo.toml,sha256=qEb53ldUlI1ENWPxoDCXd3DepkbLD8ao6vv7Y3DMOQU,841
152
+ trilogy/scripts/dependency/README.md,sha256=PWvM_GO58U___b6eLic1KUYjvCABcnR0Iam8EoavcS0,3729
153
+ trilogy/scripts/dependency/build.sh,sha256=QuAqEeriMV76uj7vuNqMfXAQGKYF6zHinXzEC6mKb4Y,562
154
+ trilogy/scripts/dependency/src/directory_resolver.rs,sha256=bx-6ct9oWxkyA6OtdbG64UmoBZWuTpBGd9BO3PKWsmM,6069
155
+ trilogy/scripts/dependency/src/lib.rs,sha256=gq4jstm_nuGQhEpDq8uf_dkw3-Ga7aNT-zk02S323T0,498
156
+ trilogy/scripts/dependency/src/main.rs,sha256=fxgllbhKn-yrPNhgaDjbr_As46cOfo3dIQSfq3C0EMk,26085
157
+ trilogy/scripts/dependency/src/parser.rs,sha256=ostUjLVjeVRU10XlTfUHQu_5tKoEHcr6POqgoqiwBnQ,13917
158
+ trilogy/scripts/dependency/src/preql.pest,sha256=ap9e6DaG2vZuT9XZLVSsLk-CZkYDTy7UoQ3_brfhHck,6895
159
+ trilogy/scripts/dependency/src/python_bindings.rs,sha256=45b0Q82ukcBxeZ80bcs1Jgjqd6wnIH7tY-aC3k0J-p0,11896
160
+ trilogy/scripts/dependency/src/resolver.rs,sha256=nypZoyN7U8hRT1DjuwBoPVN5V9MlRWSmYk9UQk9am0A,25255
161
+ trilogy/scripts/dependency/tests/base.preql,sha256=KYex4yu6m2EO2KOTGafaa0KQvqCpKODli96Z3tBfl3M,98
162
+ trilogy/scripts/dependency/tests/cli_integration.rs,sha256=ldpFwGFKX_dBiZdaM8dkoKKb1gq2VEEkzasoIZxiMEk,10966
163
+ trilogy/scripts/dependency/tests/customer.preql,sha256=mErua1N4KNxtVXYWXl2VgnwfrRxpv95U_3xjHbgDkaw,155
164
+ trilogy/scripts/dependency/tests/main.preql,sha256=76Y_sB_kR5s3qMp9JRKMhe-vsDyhZu8IImbfSAR3TbY,145
165
+ trilogy/scripts/dependency/tests/orders.preql,sha256=qTMTol7sPRPWQPNhBFbtthoeA49Yqgr_7Fnf4mI7F8g,184
166
+ trilogy/scripts/dependency/tests/test_data/base.preql,sha256=Hg9QWoHd7O3bIZ1T9deBxsMgsIfDu46NJozj6g1SaEc,143
167
+ trilogy/scripts/dependency/tests/test_data/consumer.preql,sha256=fNz2bAcIzSD35ZNHZI8QgOsPwozQcLjMcLThSYt-XZQ,14
168
+ trilogy/scripts/display.py,sha256=2c-vUGhy6Zr5oo4jIxOBq5yXL2D-AtsDwCqUrbUu0Gg,17433
169
+ trilogy/scripts/environment.py,sha256=iQzJQNkV2cuL2JHD7pw2-ZcfAqiiGh-huygPf9cyMWM,1302
170
+ trilogy/scripts/fmt.py,sha256=AESMIPohLJNZ1Vm7OuXDAoJYxQIkOAtqWGfD2esaDyM,1096
171
+ trilogy/scripts/ingest.py,sha256=rtdRg86VcrZm0TEcWjjMug6nzH6nGN7ZF-IxQWEAnIw,15997
172
+ trilogy/scripts/ingest_helpers/__init__.py,sha256=3fGxk-YWVJNOKROicRAK7jSF55Ate_qo-FsXlP2ry9g,46
173
+ trilogy/scripts/ingest_helpers/foreign_keys.py,sha256=KIA8-Uu0jd8hKTrqZopPHK5i8zaCjPiZPHZKSFsF_II,4152
174
+ trilogy/scripts/ingest_helpers/formatting.py,sha256=LCGEn022mOSbnb4oNZ7DHskbJdoGSLUNnYiHu30uFH8,2911
175
+ trilogy/scripts/ingest_helpers/typing.py,sha256=nYkuXziPMuoMMdYeFQoRULH0aTaqESa5-ouHO9BZET0,5465
176
+ trilogy/scripts/init.py,sha256=hXioCROmfyUy8XqKAWQWi9QLOcAypdsmYK2uAjfBl_8,2933
177
+ trilogy/scripts/parallel_execution.py,sha256=JIxBlqNzQJ9XPBHhWHYwLnfRoGfQJvul2iSTrTqA5cY,23622
178
+ trilogy/scripts/plan.py,sha256=hffPq-ACruhNDM4W4HEQu8ZGM5jMmxMVU_QjKlPJ844,6572
179
+ trilogy/scripts/run.py,sha256=qeazQyO-Xnuu5TIdBnGwN70AOLcO9Xfp8c4OwIQSARU,2047
180
+ trilogy/scripts/serve.py,sha256=cCNhVOedvPsb391lLli1fREvzDhvnmK50UFFXkUGiAs,4934
181
+ trilogy/scripts/serve_helpers/__init__.py,sha256=oGUDH6hxXawz7_KVcWNZPtTBCdZznaIY3hNqxBFOAFI,1005
182
+ trilogy/scripts/serve_helpers/file_discovery.py,sha256=I5PqHmY4CD3Bq4iVeiHKpdKWyTBwHQrimuOEvbtvino,4066
183
+ trilogy/scripts/serve_helpers/index_generation.py,sha256=7Z18tFXgRhrInJTSowjP3Oq1j5A04R4FCOODY5P95Xs,7181
184
+ trilogy/scripts/serve_helpers/models.py,sha256=bDaqo1jPt3EoHyY-Kn4NQ-JoYkummnqPPodBZn9sUFo,767
185
+ trilogy/scripts/single_execution.py,sha256=2AcmNryUrJ8wtatifEVkQ7u-UvuBDWQSV74h3bMM6yI,4295
186
+ trilogy/scripts/testing.py,sha256=mL3Ko9SJQGf__XqE0zJgtla8eX6cnATJoPfhIs-bK8o,3660
187
+ trilogy/scripts/trilogy.py,sha256=19k2nv-jL_s3fmG1mznf0KFU-r2gfIKs0nXiJoB-UKE,1843
188
+ trilogy/std/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
+ trilogy/std/color.preql,sha256=-T-o4sOJCGnx9b-3j04NSZnq4xR5g2Y1BLBK3j5LUew,52
190
+ trilogy/std/date.preql,sha256=mzry6cedB7y_HT1NiUBjrMOzwtfUJ_gzvLHLRyjFx2E,201
191
+ trilogy/std/display.preql,sha256=3M_1X676hINpGR_NcbePGxJYG8-BTSnMpfacCbF7kBg,443
192
+ trilogy/std/geography.preql,sha256=bsovBeHYzXllAHPxA4eXHDdPGtkGx9TeOikJSSMm9y8,696
193
+ trilogy/std/metric.preql,sha256=qhV9h0xlHHEJU_pshe-9fooelE8RwQ1udGO-gtGDgBY,435
194
+ trilogy/std/money.preql,sha256=B6p9cKcTeLXii2Oo7QnzHdtRqCHT4LR4iBGUpObFAKI,2148
195
+ trilogy/std/net.preql,sha256=LSSV_wAT3oJ1xY73JzVFHth0DQdBjtWf6nZRqlNbKZ0,429
196
+ trilogy/std/ranking.preql,sha256=RSdtQa7StF67iSw7imqLkSusi5KcRuObpvDUEtH6UIE,114
197
+ trilogy/std/report.preql,sha256=TWLeEImTPBrbeOYyN551_ycBqqP2keKurGcV7hFkNsc,207
198
+ trilogy/std/semantic.preql,sha256=_o6K07rtklKtEdpbF6iiLHI52ZcznY59x8va87hYVgI,100
199
+ trilogy/utility.py,sha256=l1_oenJlv_4Ehyi7p_a3h7qnfCHfcVdrrZOYjWuAW1Y,797
200
+ pytrilogy-0.3.142.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: maturin (1.10.2)
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-cp312-win_amd64
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ trilogy=trilogy.scripts.trilogy:cli
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2023
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
trilogy/__init__.py ADDED
@@ -0,0 +1,16 @@
1
+ from trilogy.constants import CONFIG
2
+ from trilogy.core.models.environment import Environment, EnvironmentConfig
3
+ from trilogy.dialect.enums import Dialects
4
+ from trilogy.executor import Executor
5
+ from trilogy.parser import parse
6
+
7
+ __version__ = "0.3.142"
8
+
9
+ __all__ = [
10
+ "parse",
11
+ "Executor",
12
+ "Dialects",
13
+ "Environment",
14
+ "EnvironmentConfig",
15
+ "CONFIG",
16
+ ]
trilogy/ai/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # AI Interaction Design
2
+
3
+ ## Overview
4
+
5
+ Core primitive is a conversation. Conversations are made up of messages. Messages have roles (user, assistant, system) and content.
6
+
7
+ A provider is used to get an additional response from the AI model. Providers can be swapped out to use different AI services (e.g., OpenAI, Anthropic, etc.).
8
+
9
+ To get out a structured output, like a query, we use a dedicated conversation method to append a message with a parser. This method will handle the validation
10
+ loop and responses to the AI.
trilogy/ai/__init__.py ADDED
@@ -0,0 +1,19 @@
1
+ from trilogy.ai.conversation import Conversation
2
+ from trilogy.ai.enums import Provider
3
+ from trilogy.ai.execute import text_to_query
4
+ from trilogy.ai.models import LLMMessage
5
+ from trilogy.ai.prompts import create_query_prompt
6
+ from trilogy.ai.providers.anthropic import AnthropicProvider
7
+ from trilogy.ai.providers.google import GoogleProvider
8
+ from trilogy.ai.providers.openai import OpenAIProvider
9
+
10
+ __all__ = [
11
+ "Conversation",
12
+ "LLMMessage",
13
+ "OpenAIProvider",
14
+ "GoogleProvider",
15
+ "AnthropicProvider",
16
+ "create_query_prompt",
17
+ "text_to_query",
18
+ "Provider",
19
+ ]
@@ -0,0 +1,92 @@
1
+ from trilogy.core.enums import FunctionClass, FunctionType
2
+ from trilogy.core.functions import FUNCTION_REGISTRY
3
+
4
+ RULE_PROMPT = """Trilogy statements define a semantic model or query. If a user is asking for data, they want a SELECT.
5
+ Semantic model statements:
6
+ - import <> imports a model to reuse. The output of imports will be visible in fields available to use.
7
+ - key|property|auto|metric defines fields locally. The output will also be visible in fields available to use, so you generally don't need to edit these unless requested.
8
+ - datasource statements define a datasource, which is a mapping of fields to a SQL database table. The left side is the SQL column name, the right side is the field name.
9
+
10
+ SELECT RULES:
11
+ - No FROM, JOIN, GROUP BY, SUB SELECTS, DISTINCT, UNION, or SELECT *.
12
+ - All fields exist in a global namespace; field paths look like `order.product.id`. Always use the full path. NEVER include a from clause.
13
+ - If a field has a grain defined, and that grain is not in the query output, aggregate it to get desired result.
14
+ - If a field has a 'alias_for' defined, it is shorthand for that calculation. Use the field name instead of the calculation in your query to be concise.
15
+ - Newly created fields at the output of the select must be aliased with as (e.g. `sum(births) as all_births`).
16
+ - Aliases cannot happen inside calculations or in the where/having/order clause. Never alias fields with existing names. 'sum(revenue) as total_revenue' is valid, but '(sum(births) as total_revenue) +1 as revenue_plus_one' is not.
17
+ - Implicit grouping: NEVER include a group by clause. Grouping is by non-aggregated fields in the SELECT clause.
18
+ - You can dynamically group inline to get groups at different grains - ex: `sum(metric) by dim1, dim2 as sum_by_dim1_dm2` for alternate grouping. If you are grouping a defined aggregate
19
+ - Count must specify a field (no `count(*)`) Counts are automatically deduplicated. Do not ever use DISTINCT.
20
+ - Since there are no underlying tables, sum/count of a constant should always specify a grain field (e.g. `sum(1) by x as count`).
21
+ - Aggregates in SELECT must be filtered via HAVING. Use WHERE for pre-aggregation filters.
22
+ - Use `field ? condition` for inline filters (e.g. `sum(x ? x > 0)`).
23
+ - Always use a reasonable `LIMIT` for final queries unless the request is for a time series or line chart.
24
+ - Window functions: `rank entity [optional over group] by field desc` (e.g. `rank name over state by sum(births) desc as top_name`) Do not use parentheses for over.
25
+ - Functions. All function names have parenthese (e.g. `sum(births)`, `date_part('year', dep_time)`). For no arguments, use empty parentheses (e.g. `current_date()`).
26
+ - For lag/lead, offset is first: lag/lead offset field order by expr asc/desc.
27
+ - For lag/lead with a window clause: lag/lead offset field by window_clause order by expr asc/desc.
28
+ - Use `::type` casting, e.g., `"2020-01-01"::date`.
29
+ - Date_parts have no quotes; use `date_part(order_date, year)` instead of `date_part(order_date, 'year')`.
30
+ - Comments use `#` only, per line.
31
+ - Two example queries: "where year between 1940 and 1950
32
+ select
33
+ name,
34
+ state,
35
+ sum(births) AS all_births,
36
+ sum(births ? state = 'VT') AS vermont_births,
37
+ rank name over state by all_births desc AS state_rank,
38
+ rank name by sum(births) by name desc AS all_rank
39
+ having
40
+ all_rank<11
41
+ and state = 'ID'
42
+ order by
43
+ all_rank asc
44
+ limit 5;", "where dep_time between '2002-01-01'::datetime and '2010-01-31'::datetime
45
+ select
46
+ carrier.name,
47
+ count(id2) AS total_flights,
48
+ total_flights / date_diff(min(dep_time.date), max(dep_time.date), DAY) AS average_daily_flights
49
+ order by
50
+ total_flights desc;"""
51
+
52
+
53
+ def render_function(function_type: FunctionType, example: str | None = None):
54
+ info = FUNCTION_REGISTRY[function_type]
55
+
56
+ if info.arg_count == -1:
57
+ # Infinite/variable number of arguments
58
+ base = f"{function_type.value}(<arg1>, <arg2>, ..., <argN>)"
59
+ elif info.arg_count == 0:
60
+ # No arguments
61
+ base = f"{function_type.value}()"
62
+ else:
63
+ # Fixed number of arguments
64
+ base = f"{function_type.value}({', '.join([f'<arg{p}>' for p in range(1, info.arg_count + 1)])})"
65
+
66
+ if example:
67
+ base += f" e.g. {example}"
68
+ return base
69
+
70
+
71
+ FUNCTION_EXAMPLES = {
72
+ FunctionType.DATE_ADD: "date_add('2020-01-01'::date, month, 1)",
73
+ FunctionType.DATE_DIFF: "date_diff('2020-01-01'::date, '2020-01-02'::date, day)",
74
+ FunctionType.DATE_PART: "date_part('2020-01-01'::date, year)",
75
+ FunctionType.DATE_SUB: "date_sub('2020-01-01'::date, day, 1)",
76
+ FunctionType.DATE_TRUNCATE: "date_trunc('2020-01-01'::date, month)",
77
+ FunctionType.CURRENT_TIMESTAMP: "now()",
78
+ }
79
+
80
+ FUNCTIONS = "\n".join(
81
+ [
82
+ render_function(v, example=FUNCTION_EXAMPLES.get(v))
83
+ for x, v in FunctionType.__members__.items()
84
+ if v in FUNCTION_REGISTRY
85
+ ]
86
+ )
87
+
88
+ AGGREGATE_FUNCTIONS = [
89
+ x
90
+ for x, info in FunctionType.__members__.items()
91
+ if x in FunctionClass.AGGREGATE_FUNCTIONS.value
92
+ ]
@@ -0,0 +1,107 @@
1
+ from dataclasses import dataclass
2
+ from typing import Literal, Union
3
+
4
+ from trilogy import Environment
5
+ from trilogy.ai.models import LLMMessage, LLMRequestOptions
6
+ from trilogy.ai.prompts import TRILOGY_LEAD_IN, create_query_prompt
7
+ from trilogy.ai.providers.base import LLMProvider
8
+ from trilogy.core.exceptions import (
9
+ InvalidSyntaxException,
10
+ NoDatasourceException,
11
+ UndefinedConceptException,
12
+ UnresolvableQueryException,
13
+ )
14
+ from trilogy.core.query_processor import process_query
15
+
16
+
17
+ @dataclass
18
+ class Conversation:
19
+
20
+ messages: list[LLMMessage]
21
+ provider: LLMProvider
22
+ id: str | None = None
23
+
24
+ @classmethod
25
+ def create(
26
+ cls,
27
+ provider: LLMProvider,
28
+ model_prompt: str = TRILOGY_LEAD_IN,
29
+ id: str | None = None,
30
+ ) -> "Conversation":
31
+ system_message = LLMMessage(role="system", content=model_prompt)
32
+ messages = [system_message]
33
+ return cls(id=id, messages=messages, provider=provider)
34
+
35
+ def add_message(
36
+ self,
37
+ message: Union[LLMMessage, str],
38
+ role: Literal["user", "assistant"] = "user",
39
+ ) -> None:
40
+ """
41
+ Add a message to the conversation.
42
+
43
+ Args:
44
+ message: Either an LLMMessage object or a string content
45
+ role: The role for the message if a string is provided (default: 'user')
46
+ """
47
+ if isinstance(message, str):
48
+ message = LLMMessage(role=role, content=message)
49
+ self.messages.append(message)
50
+
51
+ def get_response(self) -> LLMMessage:
52
+ options = LLMRequestOptions()
53
+ response = self.provider.generate_completion(options, history=self.messages)
54
+ response_message = LLMMessage(role="assistant", content=response.text)
55
+ self.add_message(response_message)
56
+ return response_message
57
+
58
+ def extract_response(self, content: str) -> str:
59
+ # get contents in triple backticks
60
+ content = content.replace('"""', "```")
61
+ # replace markdown trilogy code block prefix that is
62
+ # sometimes added
63
+ content = content.replace("```trilogy", "```")
64
+ if "```" in content:
65
+ parts = content.split("```")
66
+ if len(parts) >= 3:
67
+ return parts[-2].strip()
68
+ return content
69
+
70
+ def generate_query(
71
+ self, user_input: str, environment: Environment, attempts: int = 4
72
+ ) -> str:
73
+ attempts = 0
74
+ self.add_message(create_query_prompt(user_input, environment), role="user")
75
+ e = None
76
+ while attempts < 4:
77
+ attempts += 1
78
+
79
+ response_message = self.get_response()
80
+ response = self.extract_response(response_message.content)
81
+ if not response.strip():
82
+ self.add_message(
83
+ "Your response did not contain a valid Trilogy query. Please provide a valid Trilogy query enclosed in triple backticks, without a language specification.",
84
+ role="user",
85
+ )
86
+ continue
87
+ if not response.strip()[-1] == ";":
88
+ response += ";"
89
+ try:
90
+ _, raw = environment.parse(response)
91
+ process_query(statement=raw[-1], environment=environment)
92
+ return response
93
+ except (
94
+ InvalidSyntaxException,
95
+ NoDatasourceException,
96
+ UnresolvableQueryException,
97
+ UndefinedConceptException,
98
+ SyntaxError,
99
+ ) as e2:
100
+ e = e2
101
+ self.add_message(
102
+ f"Your extracted response - {response} - could not be parsed due to the error: {str(e)}. Please generate a new query with the issues fixed. Use the same response format.",
103
+ role="user",
104
+ )
105
+ raise Exception(
106
+ f"Failed to generate a valid query after {attempts} attempts. Last error: {str(e)}. Full conversation: {self.messages}"
107
+ )
trilogy/ai/enums.py ADDED
@@ -0,0 +1,7 @@
1
+ from enum import Enum
2
+
3
+
4
+ class Provider(Enum):
5
+ OPENAI = "openai"
6
+ ANTHROPIC = "anthropic"
7
+ GOOGLE = "google"
trilogy/ai/execute.py ADDED
@@ -0,0 +1,50 @@
1
+ from trilogy import Environment
2
+ from trilogy.ai.conversation import Conversation
3
+ from trilogy.ai.enums import Provider
4
+ from trilogy.ai.providers.base import LLMProvider
5
+
6
+
7
+ def text_to_query(
8
+ environment: Environment,
9
+ user_input: str,
10
+ provider: Provider,
11
+ model: str,
12
+ secret: str | None = None,
13
+ ) -> str:
14
+ llm_provider: LLMProvider
15
+
16
+ if provider == Provider.OPENAI:
17
+ from trilogy.ai.providers.openai import OpenAIProvider
18
+
19
+ llm_provider = OpenAIProvider(
20
+ name="openai",
21
+ api_key=secret,
22
+ model=model,
23
+ )
24
+ elif provider == Provider.ANTHROPIC:
25
+ from trilogy.ai.providers.anthropic import AnthropicProvider
26
+
27
+ llm_provider = AnthropicProvider(
28
+ name="anthropic",
29
+ api_key=secret,
30
+ model=model,
31
+ )
32
+ elif provider == Provider.GOOGLE:
33
+ from trilogy.ai.providers.google import GoogleProvider
34
+
35
+ llm_provider = GoogleProvider(
36
+ name="google",
37
+ api_key=secret,
38
+ model=model,
39
+ )
40
+ else:
41
+ raise ValueError(f"Unsupported provider: {provider}")
42
+ conversation = Conversation.create(
43
+ provider=llm_provider,
44
+ )
45
+
46
+ response = conversation.generate_query(
47
+ user_input=user_input, environment=environment
48
+ )
49
+
50
+ return response
trilogy/ai/models.py ADDED
@@ -0,0 +1,34 @@
1
+ from dataclasses import dataclass
2
+ from typing import Literal, Optional
3
+
4
+
5
+ @dataclass
6
+ class UsageDict:
7
+ prompt_tokens: int
8
+ completion_tokens: int
9
+ total_tokens: int
10
+
11
+
12
+ @dataclass
13
+ class LLMResponse:
14
+ text: str
15
+ usage: UsageDict
16
+
17
+
18
+ @dataclass
19
+ class LLMRequestOptions:
20
+ max_tokens: Optional[int] = None
21
+ temperature: Optional[float] = None
22
+ top_p: Optional[float] = None
23
+
24
+
25
+ @dataclass
26
+ class LLMMessage:
27
+ role: Literal["user", "assistant", "system"]
28
+ content: str
29
+ model_info: Optional[dict] = None
30
+ hidden: bool = False # Used to hide messages in the UI
31
+
32
+ def __post_init__(self):
33
+ if self.model_info is None:
34
+ self.model_info = {}