pytrilogy 0.0.3.36__py3-none-any.whl → 0.0.3.37__py3-none-any.whl

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

Potentially problematic release.


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

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.36
3
+ Version: 0.0.3.37
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,5 +1,5 @@
1
- pytrilogy-0.0.3.36.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
- trilogy/__init__.py,sha256=CEI-dbK4Y9yMxHpvZ7Rb_WeJdCZfUpJEbJ22AnMWjco,303
1
+ pytrilogy-0.0.3.37.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
+ trilogy/__init__.py,sha256=5M7wcjmeEthyEiIJM3OK2LvRgaZK8UTv_Zcf0SXA8t0,303
3
3
  trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  trilogy/constants.py,sha256=5eQxk1A0pv-TQk3CCvgZCFA9_K-6nxrOm7E5Lxd7KIY,1652
5
5
  trilogy/engine.py,sha256=OK2RuqCIUId6yZ5hfF8J1nxGP0AJqHRZiafcowmW0xc,1728
@@ -11,19 +11,19 @@ trilogy/utility.py,sha256=euQccZLKoYBz0LNg5tzLlvv2YHvXh9HArnYp1V3uXsM,763
11
11
  trilogy/authoring/__init__.py,sha256=v9PRuZs4fTnxhpXAnwTxCDwlLasUax6g2FONidcujR4,2369
12
12
  trilogy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  trilogy/core/constants.py,sha256=7XaCpZn5mQmjTobbeBn56SzPWq9eMNDfzfsRU-fP0VE,171
14
- trilogy/core/enums.py,sha256=fWexUZtssfvP5TiD7eQ66Q_tPUCNCCTGNSzLbVXrnqQ,7358
14
+ trilogy/core/enums.py,sha256=JwbWyAHOC2xRTZe2SeEvlIGPvmC1KjcJ4uh1Po5USzQ,7380
15
15
  trilogy/core/env_processor.py,sha256=pFsxnluKIusGKx1z7tTnfsd_xZcPy9pZDungkjkyvI0,3170
16
16
  trilogy/core/environment_helpers.py,sha256=80XJrhSBd3CO7aWUc7r_oxXh6CeiR9cv0zaPyfK_uDM,8540
17
17
  trilogy/core/ergonomics.py,sha256=e-7gE29vPLFdg0_A1smQ7eOrUwKl5VYdxRSTddHweRA,1631
18
18
  trilogy/core/exceptions.py,sha256=JPYyBcit3T_pRtlHdtKSeVJkIyWUTozW2aaut25A2xI,673
19
- trilogy/core/functions.py,sha256=YjPbZtfQauY6u7puehFLmPsauB5IuGa5xGETKDAgHrU,27396
19
+ trilogy/core/functions.py,sha256=bgmvWdO9x2fTZ0zjekspUb4YQ4xbVfpKYIE1wu8ftPQ,27567
20
20
  trilogy/core/graph_models.py,sha256=z17EoO8oky2QOuO6E2aMWoVNKEVJFhLdsQZOhC4fNLU,2079
21
21
  trilogy/core/internal.py,sha256=iicDBlC6nM8d7e7jqzf_ZOmpUsW8yrr2AA8AqEiLx-s,1577
22
22
  trilogy/core/optimization.py,sha256=aihzx4-2-mSjx5td1TDTYGvc7e9Zvy-_xEyhPqLS-Ig,8314
23
23
  trilogy/core/query_processor.py,sha256=Do8YpdPBdsbKtl9n37hobzk8SORMGqH-e_zNNxd-BE4,19456
24
24
  trilogy/core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  trilogy/core/models/author.py,sha256=rb-OVaCVBlaE08JhWNFK2sMi9r7yGBT2QK97JE0oKJg,76950
26
- trilogy/core/models/build.py,sha256=6Mjq4NoBqk5U7IWg8Fbb6AAOdMHazVymfYXOm-wcWv4,59346
26
+ trilogy/core/models/build.py,sha256=PgTLergGdBnq2NTDqoxnGtZctw3LEOmILPzp8ldf9ws,59569
27
27
  trilogy/core/models/build_environment.py,sha256=s_C9xAHuD3yZ26T15pWVBvoqvlp2LdZ8yjsv2_HdXLk,5363
28
28
  trilogy/core/models/core.py,sha256=wx6hJcFECMG-Ij972ADNkr-3nFXkYESr82ObPiC46_U,10875
29
29
  trilogy/core/models/datasource.py,sha256=6RjJUd2u4nYmEwFBpJlM9LbHVYDv8iHJxqiBMZqUrwI,9422
@@ -70,8 +70,8 @@ trilogy/core/statements/build.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
70
70
  trilogy/core/statements/common.py,sha256=KxEmz2ySySyZ6CTPzn0fJl5NX2KOk1RPyuUSwWhnK1g,759
71
71
  trilogy/core/statements/execute.py,sha256=cSlvpHFOqpiZ89pPZ5GDp9Hu6j6uj-5_h21FWm_L-KM,1248
72
72
  trilogy/dialect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- trilogy/dialect/base.py,sha256=lm3rUjmGENoW9wyXAzzJmBohXLVv4sLvvtfB-YCeHPY,41006
74
- trilogy/dialect/bigquery.py,sha256=PkjFcNGZHYOe655PmJhb8a0afdFULuovqP0qQVO8m0I,2953
73
+ trilogy/dialect/base.py,sha256=zeuSrurbKxM22uAZBLd6__a6a27bl8zUFk3zqTV8GO0,41361
74
+ trilogy/dialect/bigquery.py,sha256=j5PQvwMUMcLHaxZgbqe6P-v-pwhHDQ38z8uK6ecxzR0,3359
75
75
  trilogy/dialect/common.py,sha256=XjHkP8Dqezjkd2JU5xoAlMRS_6HNyXQCF4CykLK3C8o,5011
76
76
  trilogy/dialect/config.py,sha256=olnyeVU5W5T6b9-dMeNAnvxuPlyc2uefb7FRME094Ec,3834
77
77
  trilogy/dialect/dataframe.py,sha256=RUbNgReEa9g3pL6H7fP9lPTrAij5pkqedpZ99D8_5AE,1522
@@ -91,9 +91,9 @@ trilogy/parsing/common.py,sha256=0fRM9_9k3Y24oanSTgHHjVI6LSTAaxTvkaq5ESVWR5o,235
91
91
  trilogy/parsing/config.py,sha256=Z-DaefdKhPDmSXLgg5V4pebhSB0h590vI0_VtHnlukI,111
92
92
  trilogy/parsing/exceptions.py,sha256=92E5i2frv5hj9wxObJZsZqj5T6bglvPzvdvco_vW1Zk,38
93
93
  trilogy/parsing/helpers.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
94
- trilogy/parsing/parse_engine.py,sha256=tAgcQMVTrqRQ9SUO_EvvJ3XbZ6iq_Q_2cOPU8gjSBgw,63710
94
+ trilogy/parsing/parse_engine.py,sha256=Ol4nGl-TnOshE9Gjbo_tis-l-x9a-6c11ZrJ3RuYjBc,63873
95
95
  trilogy/parsing/render.py,sha256=hI4y-xjXrEXvHslY2l2TQ8ic0zAOpN41ADH37J2_FZY,19047
96
- trilogy/parsing/trilogy.lark,sha256=ErSKUy2sqpmc3OnflRbQnzTeE81y3ISfUJBD_wvypFM,13159
96
+ trilogy/parsing/trilogy.lark,sha256=VqGM8rS157hVZpOqA-1aHsrb0jS-iVlTvqrCbPyqMSY,13276
97
97
  trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  trilogy/scripts/trilogy.py,sha256=1L0XrH4mVHRt1C9T1HnaDv2_kYEfbWTb5_-cBBke79w,3774
99
99
  trilogy/std/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -102,8 +102,8 @@ trilogy/std/display.preql,sha256=2BbhvqR4rcltyAbOXAUo7SZ_yGFYZgFnurglHMbjW2g,40
102
102
  trilogy/std/geography.preql,sha256=-fqAGnBL6tR-UtT8DbSek3iMFg66ECR_B_41pODxv-k,504
103
103
  trilogy/std/money.preql,sha256=ZHW-csTX-kYbOLmKSO-TcGGgQ-_DMrUXy0BjfuJSFxM,80
104
104
  trilogy/std/report.preql,sha256=LbV-XlHdfw0jgnQ8pV7acG95xrd1-p65fVpiIc-S7W4,202
105
- pytrilogy-0.0.3.36.dist-info/METADATA,sha256=629jTMl39NavZtrtjqTJKkBjaQzVgGiFaPEneMx0hZE,9100
106
- pytrilogy-0.0.3.36.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
107
- pytrilogy-0.0.3.36.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
108
- pytrilogy-0.0.3.36.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
109
- pytrilogy-0.0.3.36.dist-info/RECORD,,
105
+ pytrilogy-0.0.3.37.dist-info/METADATA,sha256=QJwr5jfw6iF9Njsd4mSH9WwvcLR9YykKvzlf9OmWuLg,9100
106
+ pytrilogy-0.0.3.37.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
107
+ pytrilogy-0.0.3.37.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
108
+ pytrilogy-0.0.3.37.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
109
+ pytrilogy-0.0.3.37.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
trilogy/__init__.py CHANGED
@@ -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.36"
7
+ __version__ = "0.0.3.37"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/core/enums.py CHANGED
@@ -155,6 +155,7 @@ class FunctionType(Enum):
155
155
  ROUND = "round"
156
156
  ABS = "abs"
157
157
  SQRT = "sqrt"
158
+ RANDOM = "random"
158
159
 
159
160
  # Aggregates
160
161
  ## group is not a real aggregate - it just means group by this + some other set of fields
trilogy/core/functions.py CHANGED
@@ -620,6 +620,12 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
620
620
  output_type=DataType.INTEGER,
621
621
  arg_count=1,
622
622
  ),
623
+ FunctionType.RANDOM: FunctionConfig(
624
+ valid_inputs=[],
625
+ output_purpose=Purpose.PROPERTY,
626
+ output_type=DataType.FLOAT,
627
+ arg_count=1,
628
+ ),
623
629
  FunctionType.ROUND: FunctionConfig(
624
630
  valid_inputs=[
625
631
  {DataType.INTEGER, DataType.FLOAT, DataType.NUMBER, DataType.NUMERIC},
@@ -1929,6 +1929,18 @@ class Factory:
1929
1929
  def _(self, base: TraitDataType):
1930
1930
  return base
1931
1931
 
1932
+ @build.register
1933
+ def _(self, base: ListType):
1934
+ return base
1935
+
1936
+ @build.register
1937
+ def _(self, base: StructType):
1938
+ return base
1939
+
1940
+ @build.register
1941
+ def _(self, base: MapType):
1942
+ return base
1943
+
1932
1944
  @build.register
1933
1945
  def _(self, base: Datasource):
1934
1946
  local_cache: dict[str, BuildConcept] = {}
trilogy/dialect/base.py CHANGED
@@ -132,6 +132,11 @@ DATATYPE_MAP: dict[DataType, str] = {
132
132
  DataType.MAP: "map",
133
133
  DataType.DATE: "date",
134
134
  DataType.DATETIME: "datetime",
135
+ DataType.LIST: "list",
136
+ }
137
+
138
+ COMPLEX_DATATYPE_MAP = {
139
+ DataType.LIST: lambda x: f"{x}[]",
135
140
  }
136
141
 
137
142
 
@@ -172,6 +177,7 @@ FUNCTION_MAP = {
172
177
  FunctionType.ROUND: lambda x: f"round({x[0]},{x[1]})",
173
178
  FunctionType.MOD: lambda x: f"({x[0]} % {x[1]})",
174
179
  FunctionType.SQRT: lambda x: f"sqrt({x[0]})",
180
+ FunctionType.RANDOM: lambda x: "random()",
175
181
  # aggregate types
176
182
  FunctionType.COUNT_DISTINCT: lambda x: f"count(distinct {x[0]})",
177
183
  FunctionType.COUNT: lambda x: f"count({x[0]})",
@@ -283,6 +289,7 @@ class BaseDialect:
283
289
  QUOTE_CHARACTER = "`"
284
290
  SQL_TEMPLATE = GENERIC_SQL_TEMPLATE
285
291
  DATATYPE_MAP = DATATYPE_MAP
292
+ COMPLEX_DATATYPE_MAP = COMPLEX_DATATYPE_MAP
286
293
  UNNEST_MODE = UnnestMode.CROSS_APPLY
287
294
 
288
295
  def __init__(self, rendering: Rendering | None = None):
@@ -682,6 +689,8 @@ class BaseDialect:
682
689
  return self.FUNCTION_MAP[FunctionType.DATETIME_LITERAL](e)
683
690
  elif isinstance(e, TraitDataType):
684
691
  return self.render_expr(e.type, cte=cte, cte_map=cte_map)
692
+ elif isinstance(e, ListType):
693
+ return f"{self.COMPLEX_DATATYPE_MAP[DataType.LIST](self.render_expr(e.value_data_type, cte=cte, cte_map=cte_map))}"
685
694
  else:
686
695
  raise ValueError(f"Unable to render type {type(e)} {e}")
687
696
 
@@ -3,6 +3,9 @@ from typing import Any, Callable, Mapping
3
3
  from jinja2 import Template
4
4
 
5
5
  from trilogy.core.enums import FunctionType, UnnestMode, WindowType
6
+ from trilogy.core.models.core import (
7
+ DataType,
8
+ )
6
9
  from trilogy.dialect.base import BaseDialect
7
10
 
8
11
  WINDOW_FUNCTION_MAP: Mapping[WindowType, Callable[[Any, Any, Any], str]] = {}
@@ -36,6 +39,19 @@ FUNCTION_GRAIN_MATCH_MAP = {
36
39
  FunctionType.AVG: lambda args: f"{args[0]}",
37
40
  }
38
41
 
42
+ DATATYPE_MAP: dict[DataType, str] = {
43
+ DataType.STRING: "STRING",
44
+ DataType.INTEGER: "INT64",
45
+ DataType.FLOAT: "FLOAT64",
46
+ DataType.BOOL: "BOOL",
47
+ DataType.NUMERIC: "NUMERIC",
48
+ DataType.MAP: "MAP",
49
+ DataType.DATE: "DATE",
50
+ DataType.DATETIME: "DATETIME",
51
+ DataType.TIMESTAMP: "TIMESTAMP",
52
+ }
53
+
54
+
39
55
  BQ_SQL_TEMPLATE = Template(
40
56
  """{%- if output %}
41
57
  CREATE OR REPLACE TABLE {{ output.address.location }} AS
@@ -80,3 +96,4 @@ class BigqueryDialect(BaseDialect):
80
96
  QUOTE_CHARACTER = "`"
81
97
  SQL_TEMPLATE = BQ_SQL_TEMPLATE
82
98
  UNNEST_MODE = UnnestMode.CROSS_JOIN
99
+ DATATYPE_MAP = DATATYPE_MAP
@@ -1765,6 +1765,10 @@ class ParseToObjects(Transformer):
1765
1765
  def fsqrt(self, meta: Meta, args) -> Function:
1766
1766
  return self.function_factory.create_function(args, FunctionType.SQRT, meta)
1767
1767
 
1768
+ @v_args(meta=True)
1769
+ def frandom(self, meta: Meta, args) -> Function:
1770
+ return self.function_factory.create_function(args, FunctionType.RANDOM, meta)
1771
+
1768
1772
  @v_args(meta=True)
1769
1773
  def fround(self, meta, args) -> Function:
1770
1774
  return self.function_factory.create_function(args, FunctionType.ROUND, meta)
@@ -196,9 +196,12 @@
196
196
  fmod: ( "mod"i "(" expr "," (int_lit | concept_lit ) ")") | ( expr "%" (int_lit | concept_lit ) )
197
197
  fround: "round"i "(" expr "," expr ")"
198
198
  fabs: "abs"i "(" expr ")"
199
- fsqrt: "sqrt"i "(" expr ")"
199
+ _SQRT.1: "sqrt("
200
+ fsqrt: _SQRT expr ")"
201
+ _RANDOM.1: "random("i
202
+ frandom: _RANDOM expr ")"
200
203
 
201
- _math_functions: fmul | fdiv | fadd | fsub | fround | fmod | fabs | fsqrt
204
+ _math_functions: fmul | fdiv | fadd | fsub | fround | fmod | fabs | fsqrt | frandom
202
205
 
203
206
  //generic
204
207
  _fcast_primary: "cast"i "(" expr "as"i data_type ")"
@@ -354,7 +357,7 @@
354
357
 
355
358
  struct_type: "struct"i "<" ((data_type | IDENTIFIER) ",")* (data_type | IDENTIFIER) ","? ">"
356
359
 
357
- list_type: "list"i "<" data_type ">"
360
+ list_type: ("list"i "<" data_type ">" ) | ("array"i "<" data_type ">" )
358
361
 
359
362
  numeric_type: "numeric"i "(" int_lit "," int_lit ")"
360
363