pytrilogy 0.0.3.116__tar.gz → 0.0.3.119__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pytrilogy might be problematic. Click here for more details.

Files changed (174) hide show
  1. {pytrilogy-0.0.3.116/pytrilogy.egg-info → pytrilogy-0.0.3.119}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/SOURCES.txt +2 -1
  4. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_typing.py +6 -3
  5. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/__init__.py +1 -1
  6. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/functions.py +31 -1
  7. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/author.py +7 -2
  8. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/core.py +7 -0
  9. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/parse_engine.py +57 -13
  10. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/trilogy.lark +5 -2
  11. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/ranking.preql +1 -0
  12. pytrilogy-0.0.3.119/trilogy/std/semantic.preql +6 -0
  13. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/LICENSE.md +0 -0
  14. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/README.md +0 -0
  15. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/pyproject.toml +0 -0
  16. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/dependency_links.txt +0 -0
  17. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/entry_points.txt +0 -0
  18. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/requires.txt +0 -0
  19. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/top_level.txt +0 -0
  20. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/requirements.txt +0 -0
  21. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/setup.cfg +0 -0
  22. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_datatypes.py +0 -0
  23. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_declarations.py +0 -0
  24. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_derived_concepts.py +0 -0
  25. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_discovery_nodes.py +0 -0
  26. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_enums.py +0 -0
  27. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_environment.py +0 -0
  28. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_execute_models.py +0 -0
  29. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_executor.py +0 -0
  30. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_failure.py +0 -0
  31. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_functions.py +0 -0
  32. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_imports.py +0 -0
  33. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_metadata.py +0 -0
  34. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_models.py +0 -0
  35. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_multi_join_assignments.py +0 -0
  36. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_parse_engine.py +0 -0
  37. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_parsing.py +0 -0
  38. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_parsing_failures.py +0 -0
  39. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_partial_handling.py +0 -0
  40. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_query_processing.py +0 -0
  41. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_query_render.py +0 -0
  42. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_select.py +0 -0
  43. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_show.py +0 -0
  44. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_statements.py +0 -0
  45. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_undefined_concept.py +0 -0
  46. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_user_functions.py +0 -0
  47. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_validators.py +0 -0
  48. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/tests/test_where_clause.py +0 -0
  49. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/__init__.py +0 -0
  50. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/constants.py +0 -0
  51. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/conversation.py +0 -0
  52. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/enums.py +0 -0
  53. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/execute.py +0 -0
  54. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/models.py +0 -0
  55. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/prompts.py +0 -0
  56. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/providers/__init__.py +0 -0
  57. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/providers/anthropic.py +0 -0
  58. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/providers/base.py +0 -0
  59. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/providers/google.py +0 -0
  60. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/providers/openai.py +0 -0
  61. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/ai/providers/utils.py +0 -0
  62. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/authoring/__init__.py +0 -0
  63. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/constants.py +0 -0
  64. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/__init__.py +0 -0
  65. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/constants.py +0 -0
  66. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/enums.py +0 -0
  67. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/env_processor.py +0 -0
  68. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/environment_helpers.py +0 -0
  69. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/ergonomics.py +0 -0
  70. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/exceptions.py +0 -0
  71. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/graph_models.py +0 -0
  72. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/internal.py +0 -0
  73. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/__init__.py +0 -0
  74. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/build.py +0 -0
  75. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/build_environment.py +0 -0
  76. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/datasource.py +0 -0
  77. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/environment.py +0 -0
  78. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/models/execute.py +0 -0
  79. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/optimization.py +0 -0
  80. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/__init__.py +0 -0
  81. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/base_optimization.py +0 -0
  82. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/hide_unused_concept.py +0 -0
  83. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/inline_datasource.py +0 -0
  84. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  85. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/__init__.py +0 -0
  86. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  87. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/discovery_node_factory.py +0 -0
  88. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/discovery_utility.py +0 -0
  89. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/discovery_validation.py +0 -0
  90. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/graph_utils.py +0 -0
  91. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/__init__.py +0 -0
  92. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  93. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/common.py +0 -0
  94. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/constant_node.py +0 -0
  95. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  96. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/group_node.py +0 -0
  97. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  98. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  99. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  100. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/recursive_node.py +0 -0
  101. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  102. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  103. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
  104. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
  105. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_node.py +0 -0
  106. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/synonym_node.py +0 -0
  107. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/union_node.py +0 -0
  108. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  109. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/window_node.py +0 -0
  110. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/__init__.py +0 -0
  111. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/base_node.py +0 -0
  112. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/filter_node.py +0 -0
  113. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/group_node.py +0 -0
  114. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/merge_node.py +0 -0
  115. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/recursive_node.py +0 -0
  116. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  117. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/union_node.py +0 -0
  118. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  119. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/window_node.py +0 -0
  120. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/processing/utility.py +0 -0
  121. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/query_processor.py +0 -0
  122. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/statements/__init__.py +0 -0
  123. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/statements/author.py +0 -0
  124. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/statements/build.py +0 -0
  125. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/statements/common.py +0 -0
  126. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/statements/execute.py +0 -0
  127. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/utility.py +0 -0
  128. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/validation/__init__.py +0 -0
  129. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/validation/common.py +0 -0
  130. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/validation/concept.py +0 -0
  131. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/validation/datasource.py +0 -0
  132. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/validation/environment.py +0 -0
  133. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/core/validation/fix.py +0 -0
  134. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/__init__.py +0 -0
  135. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/base.py +0 -0
  136. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/bigquery.py +0 -0
  137. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/common.py +0 -0
  138. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/config.py +0 -0
  139. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/dataframe.py +0 -0
  140. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/duckdb.py +0 -0
  141. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/enums.py +0 -0
  142. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/metadata.py +0 -0
  143. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/postgres.py +0 -0
  144. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/presto.py +0 -0
  145. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/snowflake.py +0 -0
  146. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/dialect/sql_server.py +0 -0
  147. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/engine.py +0 -0
  148. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/executor.py +0 -0
  149. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/hooks/__init__.py +0 -0
  150. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/hooks/base_hook.py +0 -0
  151. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/hooks/graph_hook.py +0 -0
  152. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/hooks/query_debugger.py +0 -0
  153. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/metadata/__init__.py +0 -0
  154. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parser.py +0 -0
  155. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/__init__.py +0 -0
  156. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/common.py +0 -0
  157. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/config.py +0 -0
  158. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/exceptions.py +0 -0
  159. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/helpers.py +0 -0
  160. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/parsing/render.py +0 -0
  161. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/py.typed +0 -0
  162. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/render.py +0 -0
  163. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/scripts/__init__.py +0 -0
  164. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/scripts/trilogy.py +0 -0
  165. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/__init__.py +0 -0
  166. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/color.preql +0 -0
  167. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/date.preql +0 -0
  168. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/display.preql +0 -0
  169. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/geography.preql +0 -0
  170. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/metric.preql +0 -0
  171. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/money.preql +0 -0
  172. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/net.preql +0 -0
  173. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/std/report.preql +0 -0
  174. {pytrilogy-0.0.3.116 → pytrilogy-0.0.3.119}/trilogy/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.116
3
+ Version: 0.0.3.119
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Classifier: Programming Language :: Python
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.116
3
+ Version: 0.0.3.119
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Classifier: Programming Language :: Python
6
6
  Classifier: Programming Language :: Python :: 3
@@ -168,4 +168,5 @@ trilogy/std/metric.preql
168
168
  trilogy/std/money.preql
169
169
  trilogy/std/net.preql
170
170
  trilogy/std/ranking.preql
171
- trilogy/std/report.preql
171
+ trilogy/std/report.preql
172
+ trilogy/std/semantic.preql
@@ -110,9 +110,12 @@ signup_date.year::int::dtypes.year as signup_year_two;"""
110
110
 
111
111
  assert "dtypes.year" in env.environment.data_types
112
112
 
113
- assert env.environment.concepts["signup_year_two"].datatype.traits == [
114
- "dtypes.year"
115
- ]
113
+ assert set(env.environment.concepts["signup_year_two"].datatype.traits) == set(
114
+ [
115
+ "year",
116
+ "dtypes.year",
117
+ ]
118
+ )
116
119
 
117
120
 
118
121
  def test_typing_aggregate():
@@ -4,6 +4,6 @@ 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.3.116"
7
+ __version__ = "0.0.3.119"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -19,6 +19,7 @@ from trilogy.core.models.author import (
19
19
  Concept,
20
20
  ConceptRef,
21
21
  Conditional,
22
+ CustomType,
22
23
  Function,
23
24
  Parenthetical,
24
25
  UndefinedConcept,
@@ -40,6 +41,11 @@ from trilogy.core.models.environment import Environment
40
41
  GENERIC_ARGS = Concept | ConceptRef | Function | str | int | float | date | datetime
41
42
 
42
43
 
44
+ CUSTOM_PLACEHOLDER = CustomType(
45
+ name="__placeholder__", type=DataType.UNKNOWN, drop_on=[], add_on=[]
46
+ )
47
+
48
+
43
49
  @dataclass
44
50
  class FunctionConfig:
45
51
  arg_count: int = 1
@@ -99,7 +105,18 @@ def get_attr_datatype(
99
105
 
100
106
  def get_cast_output_type(
101
107
  args: list[Any],
102
- ) -> DataType:
108
+ ) -> DataType | TraitDataType:
109
+ base = arg_to_datatype(args[0])
110
+ if isinstance(base, TraitDataType):
111
+ traits = base.traits
112
+ else:
113
+ traits = []
114
+ if isinstance(args[1], TraitDataType):
115
+ return TraitDataType(
116
+ type=args[1].type, traits=list(set(traits + args[1].traits))
117
+ )
118
+ elif traits:
119
+ return TraitDataType(type=args[1], traits=traits)
103
120
  return args[1]
104
121
 
105
122
 
@@ -995,6 +1012,19 @@ class FunctionFactory:
995
1012
  final_output_type = base_output_type
996
1013
  else:
997
1014
  raise SyntaxError(f"Could not determine output type for {operator}")
1015
+ if isinstance(final_output_type, TraitDataType) and self.environment:
1016
+ final_output_type = TraitDataType(
1017
+ type=final_output_type.type,
1018
+ traits=[
1019
+ x
1020
+ for x in final_output_type.traits
1021
+ if operator
1022
+ not in self.environment.data_types.get(
1023
+ x, CUSTOM_PLACEHOLDER
1024
+ ).drop_on
1025
+ ],
1026
+ )
1027
+
998
1028
  if not output_purpose:
999
1029
  if operator in FunctionClass.AGGREGATE_FUNCTIONS.value:
1000
1030
  output_purpose = Purpose.METRIC
@@ -2598,11 +2598,16 @@ class ArgBinding(Namespaced, DataTyped, BaseModel):
2598
2598
 
2599
2599
  class CustomType(BaseModel):
2600
2600
  name: str
2601
- type: DataType
2601
+ type: DataType | list[DataType]
2602
+ drop_on: list[FunctionType] = Field(default_factory=list)
2603
+ add_on: list[FunctionType] = Field(default_factory=list)
2602
2604
 
2603
2605
  def with_namespace(self, namespace: str) -> "CustomType":
2604
2606
  return CustomType.model_construct(
2605
- name=address_with_namespace(self.name, namespace), type=self.type
2607
+ name=address_with_namespace(self.name, namespace),
2608
+ type=self.type,
2609
+ drop_on=self.drop_on,
2610
+ add_on=self.add_on,
2606
2611
  )
2607
2612
 
2608
2613
 
@@ -99,6 +99,7 @@ class DataType(Enum):
99
99
 
100
100
  # PARSING
101
101
  UNKNOWN = "unknown"
102
+ ANY = "any"
102
103
 
103
104
  @property
104
105
  def data_type(self):
@@ -411,6 +412,12 @@ def merge_datatypes(
411
412
 
412
413
  def is_compatible_datatype(left, right):
413
414
  # for unknown types, we can't make any assumptions
415
+ if isinstance(left, list):
416
+ return any(is_compatible_datatype(ltype, right) for ltype in left)
417
+ if isinstance(right, list):
418
+ return any(is_compatible_datatype(left, rtype) for rtype in right)
419
+ if left == DataType.ANY or right == DataType.ANY:
420
+ return True
414
421
  if all(
415
422
  isinstance(x, NumericType)
416
423
  or x in (DataType.INTEGER, DataType.FLOAT, DataType.NUMERIC)
@@ -171,6 +171,16 @@ class FunctionBindingType:
171
171
  type: DataType | TraitDataType | None = None
172
172
 
173
173
 
174
+ @dataclass
175
+ class DropOn:
176
+ functions: List[FunctionType]
177
+
178
+
179
+ @dataclass
180
+ class AddOn:
181
+ functions: List[FunctionType]
182
+
183
+
174
184
  with open(join(dirname(__file__), "trilogy.lark"), "r") as f:
175
185
  PARSER = Lark(
176
186
  f.read(),
@@ -425,6 +435,9 @@ class ParseToObjects(Transformer):
425
435
  def IDENTIFIER(self, args) -> str:
426
436
  return args.value
427
437
 
438
+ def ORDER_IDENTIFIER(self, args) -> ConceptRef:
439
+ return self.environment.concepts[args.value.strip()].reference
440
+
428
441
  def WILDCARD_IDENTIFIER(self, args) -> str:
429
442
  return args.value
430
443
 
@@ -1509,11 +1522,35 @@ class ParseToObjects(Transformer):
1509
1522
  def function(self, meta: Meta, args) -> Function:
1510
1523
  return args[0]
1511
1524
 
1525
+ @v_args(meta=True)
1526
+ def type_drop_clause(self, meta: Meta, args) -> DropOn:
1527
+ return DropOn([FunctionType(x) for x in args])
1528
+
1529
+ @v_args(meta=True)
1530
+ def type_add_clause(self, meta: Meta, args) -> AddOn:
1531
+ return AddOn([FunctionType(x) for x in args])
1532
+
1512
1533
  @v_args(meta=True)
1513
1534
  def type_declaration(self, meta: Meta, args) -> TypeDeclaration:
1514
1535
  key = args[0]
1515
- datatype = args[1]
1516
- new = CustomType(name=key, type=datatype)
1536
+ datatype: list[DataType] = [x for x in args[1:] if isinstance(x, DataType)]
1537
+ if len(datatype) == 1:
1538
+ final_datatype: list[DataType] | DataType = datatype[0]
1539
+ else:
1540
+ final_datatype = datatype
1541
+ add_on = None
1542
+ drop_on = None
1543
+ for x in args[1:]:
1544
+ if isinstance(x, AddOn):
1545
+ add_on = x
1546
+ elif isinstance(x, DropOn):
1547
+ drop_on = x
1548
+ new = CustomType(
1549
+ name=key,
1550
+ type=final_datatype,
1551
+ drop_on=drop_on.functions if drop_on else [],
1552
+ add_on=add_on.functions if add_on else [],
1553
+ )
1517
1554
  self.environment.data_types[key] = new
1518
1555
  return TypeDeclaration(type=new)
1519
1556
 
@@ -2346,7 +2383,7 @@ def inject_context_maker(pos: int, text: str, span: int = 40) -> str:
2346
2383
  rcap = ""
2347
2384
  # if it goes beyond the end of text, no ...
2348
2385
  # if it terminates on a space, no need for ...
2349
- if not after[-1].isspace() and not (end > len(text)):
2386
+ if after and not after[-1].isspace() and not (end > len(text)):
2350
2387
  rcap = "..."
2351
2388
  lcap = ""
2352
2389
  if start > 0 and not before[0].isspace():
@@ -2405,6 +2442,10 @@ def parse_text(
2405
2442
  """Handle UnexpectedToken errors to make friendlier error messages."""
2406
2443
  # Handle ordering direction error
2407
2444
  pos = e.pos_in_stream or 0
2445
+ if e.interactive_parser.lexer_thread.state:
2446
+ last_token = e.interactive_parser.lexer_thread.state.last_token
2447
+ else:
2448
+ last_token = None
2408
2449
  if e.expected == {"ORDERING_DIRECTION"}:
2409
2450
  raise _create_syntax_error(210, pos, text)
2410
2451
 
@@ -2412,19 +2453,22 @@ def parse_text(
2412
2453
  parsed_tokens = (
2413
2454
  [x.value for x in e.token_history if x] if e.token_history else []
2414
2455
  )
2456
+
2415
2457
  if parsed_tokens == ["FROM"]:
2416
2458
  raise _create_syntax_error(101, pos, text)
2417
2459
  # check if they are missing a semicolon
2418
- try:
2419
- e.interactive_parser.feed_token(Token("_TERMINATOR", ";"))
2420
- state = e.interactive_parser.lexer_thread.state
2421
- if state and state.last_token:
2422
- new_pos = state.last_token.end_pos or pos
2423
- else:
2424
- new_pos = pos
2425
- raise _create_syntax_error(202, new_pos, text)
2426
- except UnexpectedToken:
2427
- pass
2460
+ if last_token and e.token.type == "$END":
2461
+ try:
2462
+
2463
+ e.interactive_parser.feed_token(Token("_TERMINATOR", ";"))
2464
+ state = e.interactive_parser.lexer_thread.state
2465
+ if state and state.last_token:
2466
+ new_pos = state.last_token.end_pos or pos
2467
+ else:
2468
+ new_pos = pos
2469
+ raise _create_syntax_error(202, new_pos, text)
2470
+ except UnexpectedToken:
2471
+ pass
2428
2472
  # check if they forgot an as
2429
2473
  try:
2430
2474
  e.interactive_parser.feed_token(Token("AS", "AS"))
@@ -109,7 +109,9 @@
109
109
  raw_function: "def" IDENTIFIER "(" function_binding_list ")" "->" expr
110
110
 
111
111
  // TYPE blocks
112
- type_declaration: "type" IDENTIFIER data_type
112
+ type_drop_clause: "DROP" IDENTIFIER ("|" IDENTIFIER)*
113
+ //type_add_clause: "ADD" IDENTIFIER ("|" IDENTIFIER)* type_add_clause?
114
+ type_declaration: "type" IDENTIFIER data_type ("|" data_type)* type_drop_clause?
113
115
 
114
116
  // user_id where state = Mexico
115
117
  _filter_alt: (IDENTIFIER | literal | "(" expr ")") "?" conditional
@@ -139,7 +141,8 @@
139
141
 
140
142
  limit: "LIMIT"i /[0-9]+/
141
143
 
142
- _order_atom: expr ordering
144
+ ORDER_IDENTIFIER.2: /(?!LIMIT)[a-zA-Z_][a-zA-Z0-9_\.]*\s+/
145
+ _order_atom: (ORDER_IDENTIFIER ordering) | (expr ordering)
143
146
 
144
147
  order_list: _order_atom ("," _order_atom)* ","?
145
148
 
@@ -4,3 +4,4 @@ type score int;
4
4
  type position int;
5
5
  type index int;
6
6
  type grade int;
7
+ type letter_grade string;
@@ -0,0 +1,6 @@
1
+
2
+
3
+ type identifier any;
4
+ type flag any
5
+ drop sum|count|avg|add|subtract|multiply|divide|mod
6
+ ;
File without changes
File without changes
File without changes