pytrilogy 0.0.3.35__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.
- {pytrilogy-0.0.3.35.dist-info → pytrilogy-0.0.3.37.dist-info}/METADATA +1 -1
- {pytrilogy-0.0.3.35.dist-info → pytrilogy-0.0.3.37.dist-info}/RECORD +15 -15
- {pytrilogy-0.0.3.35.dist-info → pytrilogy-0.0.3.37.dist-info}/WHEEL +1 -1
- trilogy/__init__.py +1 -1
- trilogy/core/enums.py +1 -0
- trilogy/core/environment_helpers.py +2 -2
- trilogy/core/functions.py +6 -0
- trilogy/core/models/build.py +12 -0
- trilogy/dialect/base.py +9 -0
- trilogy/dialect/bigquery.py +17 -0
- trilogy/parsing/parse_engine.py +19 -12
- trilogy/parsing/trilogy.lark +6 -3
- {pytrilogy-0.0.3.35.dist-info → pytrilogy-0.0.3.37.dist-info}/entry_points.txt +0 -0
- {pytrilogy-0.0.3.35.dist-info → pytrilogy-0.0.3.37.dist-info}/licenses/LICENSE.md +0 -0
- {pytrilogy-0.0.3.35.dist-info → pytrilogy-0.0.3.37.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
pytrilogy-0.0.3.
|
|
2
|
-
trilogy/__init__.py,sha256=
|
|
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=
|
|
14
|
+
trilogy/core/enums.py,sha256=JwbWyAHOC2xRTZe2SeEvlIGPvmC1KjcJ4uh1Po5USzQ,7380
|
|
15
15
|
trilogy/core/env_processor.py,sha256=pFsxnluKIusGKx1z7tTnfsd_xZcPy9pZDungkjkyvI0,3170
|
|
16
|
-
trilogy/core/environment_helpers.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
74
|
-
trilogy/dialect/bigquery.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
106
|
-
pytrilogy-0.0.3.
|
|
107
|
-
pytrilogy-0.0.3.
|
|
108
|
-
pytrilogy-0.0.3.
|
|
109
|
-
pytrilogy-0.0.3.
|
|
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,,
|
trilogy/__init__.py
CHANGED
trilogy/core/enums.py
CHANGED
|
@@ -47,7 +47,7 @@ def generate_date_concepts(concept: Concept, environment: Environment):
|
|
|
47
47
|
)
|
|
48
48
|
new_concept = Concept(
|
|
49
49
|
name=f"{concept.name}.{fname}",
|
|
50
|
-
datatype=
|
|
50
|
+
datatype=function.output_datatype,
|
|
51
51
|
purpose=default_type,
|
|
52
52
|
lineage=function,
|
|
53
53
|
grain=concept.grain,
|
|
@@ -119,7 +119,7 @@ def generate_datetime_concepts(concept: Concept, environment: Environment):
|
|
|
119
119
|
)
|
|
120
120
|
new_concept = Concept(
|
|
121
121
|
name=f"{concept.name}.{fname}",
|
|
122
|
-
datatype=
|
|
122
|
+
datatype=const_function.output_datatype,
|
|
123
123
|
purpose=default_type,
|
|
124
124
|
lineage=const_function,
|
|
125
125
|
grain=concept.grain,
|
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},
|
trilogy/core/models/build.py
CHANGED
|
@@ -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
|
|
trilogy/dialect/bigquery.py
CHANGED
|
@@ -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
|
trilogy/parsing/parse_engine.py
CHANGED
|
@@ -368,18 +368,21 @@ class ParseToObjects(Transformer):
|
|
|
368
368
|
output.concept.metadata.description
|
|
369
369
|
or args[1].text.split("#")[1].strip()
|
|
370
370
|
)
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
371
|
+
# this is a bad plan for now;
|
|
372
|
+
# because a comment after an import statement is very common
|
|
373
|
+
# and it's not intuitive that it modifies the import description
|
|
374
|
+
# if isinstance(output, ImportStatement):
|
|
375
|
+
# if len(args) > 1 and isinstance(args[1], Comment):
|
|
376
|
+
# comment = args[1].text.split("#")[1].strip()
|
|
377
|
+
# namespace = output.alias
|
|
378
|
+
# for _, v in self.environment.concepts.items():
|
|
379
|
+
# if v.namespace == namespace:
|
|
380
|
+
# if v.metadata.description:
|
|
381
|
+
# v.metadata.description = (
|
|
382
|
+
# f"{comment}: {v.metadata.description}"
|
|
383
|
+
# )
|
|
384
|
+
# else:
|
|
385
|
+
# v.metadata.description = comment
|
|
383
386
|
|
|
384
387
|
return args[0]
|
|
385
388
|
|
|
@@ -1762,6 +1765,10 @@ class ParseToObjects(Transformer):
|
|
|
1762
1765
|
def fsqrt(self, meta: Meta, args) -> Function:
|
|
1763
1766
|
return self.function_factory.create_function(args, FunctionType.SQRT, meta)
|
|
1764
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
|
+
|
|
1765
1772
|
@v_args(meta=True)
|
|
1766
1773
|
def fround(self, meta, args) -> Function:
|
|
1767
1774
|
return self.function_factory.create_function(args, FunctionType.ROUND, meta)
|
trilogy/parsing/trilogy.lark
CHANGED
|
@@ -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
|
-
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|