pytrilogy 0.0.3.117__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.117/pytrilogy.egg-info → pytrilogy-0.0.3.119}/PKG-INFO +1 -1
  2. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119/pytrilogy.egg-info}/PKG-INFO +1 -1
  3. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/SOURCES.txt +2 -1
  4. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_typing.py +6 -3
  5. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/__init__.py +1 -1
  6. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/functions.py +31 -1
  7. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/author.py +7 -2
  8. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/core.py +7 -0
  9. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/parse_engine.py +37 -5
  10. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/trilogy.lark +3 -1
  11. {pytrilogy-0.0.3.117 → 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.117 → pytrilogy-0.0.3.119}/LICENSE.md +0 -0
  14. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/README.md +0 -0
  15. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/pyproject.toml +0 -0
  16. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/dependency_links.txt +0 -0
  17. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/entry_points.txt +0 -0
  18. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/requires.txt +0 -0
  19. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/pytrilogy.egg-info/top_level.txt +0 -0
  20. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/requirements.txt +0 -0
  21. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/setup.cfg +0 -0
  22. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_datatypes.py +0 -0
  23. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_declarations.py +0 -0
  24. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_derived_concepts.py +0 -0
  25. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_discovery_nodes.py +0 -0
  26. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_enums.py +0 -0
  27. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_environment.py +0 -0
  28. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_execute_models.py +0 -0
  29. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_executor.py +0 -0
  30. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_failure.py +0 -0
  31. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_functions.py +0 -0
  32. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_imports.py +0 -0
  33. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_metadata.py +0 -0
  34. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_models.py +0 -0
  35. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_multi_join_assignments.py +0 -0
  36. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_parse_engine.py +0 -0
  37. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_parsing.py +0 -0
  38. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_parsing_failures.py +0 -0
  39. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_partial_handling.py +0 -0
  40. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_query_processing.py +0 -0
  41. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_query_render.py +0 -0
  42. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_select.py +0 -0
  43. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_show.py +0 -0
  44. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_statements.py +0 -0
  45. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_undefined_concept.py +0 -0
  46. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_user_functions.py +0 -0
  47. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_validators.py +0 -0
  48. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/tests/test_where_clause.py +0 -0
  49. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/__init__.py +0 -0
  50. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/constants.py +0 -0
  51. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/conversation.py +0 -0
  52. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/enums.py +0 -0
  53. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/execute.py +0 -0
  54. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/models.py +0 -0
  55. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/prompts.py +0 -0
  56. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/providers/__init__.py +0 -0
  57. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/providers/anthropic.py +0 -0
  58. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/providers/base.py +0 -0
  59. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/providers/google.py +0 -0
  60. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/providers/openai.py +0 -0
  61. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/ai/providers/utils.py +0 -0
  62. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/authoring/__init__.py +0 -0
  63. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/constants.py +0 -0
  64. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/__init__.py +0 -0
  65. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/constants.py +0 -0
  66. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/enums.py +0 -0
  67. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/env_processor.py +0 -0
  68. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/environment_helpers.py +0 -0
  69. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/ergonomics.py +0 -0
  70. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/exceptions.py +0 -0
  71. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/graph_models.py +0 -0
  72. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/internal.py +0 -0
  73. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/__init__.py +0 -0
  74. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/build.py +0 -0
  75. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/build_environment.py +0 -0
  76. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/datasource.py +0 -0
  77. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/environment.py +0 -0
  78. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/models/execute.py +0 -0
  79. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/optimization.py +0 -0
  80. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/__init__.py +0 -0
  81. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/base_optimization.py +0 -0
  82. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/hide_unused_concept.py +0 -0
  83. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/inline_datasource.py +0 -0
  84. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/optimizations/predicate_pushdown.py +0 -0
  85. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/__init__.py +0 -0
  86. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/concept_strategies_v3.py +0 -0
  87. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/discovery_node_factory.py +0 -0
  88. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/discovery_utility.py +0 -0
  89. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/discovery_validation.py +0 -0
  90. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/graph_utils.py +0 -0
  91. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/__init__.py +0 -0
  92. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/basic_node.py +0 -0
  93. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/common.py +0 -0
  94. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/constant_node.py +0 -0
  95. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/filter_node.py +0 -0
  96. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/group_node.py +0 -0
  97. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/group_to_node.py +0 -0
  98. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/multiselect_node.py +0 -0
  99. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/node_merge_node.py +0 -0
  100. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/recursive_node.py +0 -0
  101. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/rowset_node.py +0 -0
  102. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_helpers/__init__.py +0 -0
  103. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +0 -0
  104. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_merge_node.py +0 -0
  105. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/select_node.py +0 -0
  106. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/synonym_node.py +0 -0
  107. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/union_node.py +0 -0
  108. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/unnest_node.py +0 -0
  109. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/node_generators/window_node.py +0 -0
  110. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/__init__.py +0 -0
  111. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/base_node.py +0 -0
  112. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/filter_node.py +0 -0
  113. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/group_node.py +0 -0
  114. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/merge_node.py +0 -0
  115. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/recursive_node.py +0 -0
  116. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/select_node_v2.py +0 -0
  117. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/union_node.py +0 -0
  118. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/unnest_node.py +0 -0
  119. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/nodes/window_node.py +0 -0
  120. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/processing/utility.py +0 -0
  121. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/query_processor.py +0 -0
  122. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/statements/__init__.py +0 -0
  123. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/statements/author.py +0 -0
  124. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/statements/build.py +0 -0
  125. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/statements/common.py +0 -0
  126. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/statements/execute.py +0 -0
  127. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/utility.py +0 -0
  128. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/validation/__init__.py +0 -0
  129. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/validation/common.py +0 -0
  130. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/validation/concept.py +0 -0
  131. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/validation/datasource.py +0 -0
  132. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/validation/environment.py +0 -0
  133. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/core/validation/fix.py +0 -0
  134. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/__init__.py +0 -0
  135. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/base.py +0 -0
  136. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/bigquery.py +0 -0
  137. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/common.py +0 -0
  138. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/config.py +0 -0
  139. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/dataframe.py +0 -0
  140. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/duckdb.py +0 -0
  141. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/enums.py +0 -0
  142. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/metadata.py +0 -0
  143. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/postgres.py +0 -0
  144. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/presto.py +0 -0
  145. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/snowflake.py +0 -0
  146. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/dialect/sql_server.py +0 -0
  147. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/engine.py +0 -0
  148. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/executor.py +0 -0
  149. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/hooks/__init__.py +0 -0
  150. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/hooks/base_hook.py +0 -0
  151. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/hooks/graph_hook.py +0 -0
  152. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/hooks/query_debugger.py +0 -0
  153. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/metadata/__init__.py +0 -0
  154. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parser.py +0 -0
  155. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/__init__.py +0 -0
  156. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/common.py +0 -0
  157. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/config.py +0 -0
  158. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/exceptions.py +0 -0
  159. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/helpers.py +0 -0
  160. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/parsing/render.py +0 -0
  161. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/py.typed +0 -0
  162. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/render.py +0 -0
  163. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/scripts/__init__.py +0 -0
  164. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/scripts/trilogy.py +0 -0
  165. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/__init__.py +0 -0
  166. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/color.preql +0 -0
  167. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/date.preql +0 -0
  168. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/display.preql +0 -0
  169. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/geography.preql +0 -0
  170. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/metric.preql +0 -0
  171. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/money.preql +0 -0
  172. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/net.preql +0 -0
  173. {pytrilogy-0.0.3.117 → pytrilogy-0.0.3.119}/trilogy/std/report.preql +0 -0
  174. {pytrilogy-0.0.3.117 → 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.117
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.117
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.117"
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(),
@@ -1512,11 +1522,35 @@ class ParseToObjects(Transformer):
1512
1522
  def function(self, meta: Meta, args) -> Function:
1513
1523
  return args[0]
1514
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
+
1515
1533
  @v_args(meta=True)
1516
1534
  def type_declaration(self, meta: Meta, args) -> TypeDeclaration:
1517
1535
  key = args[0]
1518
- datatype = args[1]
1519
- 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
+ )
1520
1554
  self.environment.data_types[key] = new
1521
1555
  return TypeDeclaration(type=new)
1522
1556
 
@@ -2349,7 +2383,7 @@ def inject_context_maker(pos: int, text: str, span: int = 40) -> str:
2349
2383
  rcap = ""
2350
2384
  # if it goes beyond the end of text, no ...
2351
2385
  # if it terminates on a space, no need for ...
2352
- if not after[-1].isspace() and not (end > len(text)):
2386
+ if after and not after[-1].isspace() and not (end > len(text)):
2353
2387
  rcap = "..."
2354
2388
  lcap = ""
2355
2389
  if start > 0 and not before[0].isspace():
@@ -2444,8 +2478,6 @@ def parse_text(
2444
2478
  else:
2445
2479
  new_pos = pos
2446
2480
  e.interactive_parser.feed_token(Token("IDENTIFIER", e.token.value))
2447
- next(e.interactive_parser.iter_parse())
2448
-
2449
2481
  raise _create_syntax_error(201, new_pos, text)
2450
2482
  except UnexpectedToken:
2451
2483
  pass
@@ -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
@@ -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