pytrilogy 0.0.2.41__py3-none-any.whl → 0.0.2.43__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.2.41.dist-info → pytrilogy-0.0.2.43.dist-info}/METADATA +1 -1
- {pytrilogy-0.0.2.41.dist-info → pytrilogy-0.0.2.43.dist-info}/RECORD +14 -14
- trilogy/__init__.py +1 -1
- trilogy/core/exceptions.py +4 -0
- trilogy/core/models.py +27 -9
- trilogy/core/processing/node_generators/select_node.py +1 -1
- trilogy/core/processing/node_generators/window_node.py +10 -3
- trilogy/dialect/base.py +55 -22
- trilogy/parsing/common.py +12 -2
- trilogy/parsing/parse_engine.py +1 -3
- {pytrilogy-0.0.2.41.dist-info → pytrilogy-0.0.2.43.dist-info}/LICENSE.md +0 -0
- {pytrilogy-0.0.2.41.dist-info → pytrilogy-0.0.2.43.dist-info}/WHEEL +0 -0
- {pytrilogy-0.0.2.41.dist-info → pytrilogy-0.0.2.43.dist-info}/entry_points.txt +0 -0
- {pytrilogy-0.0.2.41.dist-info → pytrilogy-0.0.2.43.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
trilogy/__init__.py,sha256=
|
|
1
|
+
trilogy/__init__.py,sha256=ZEWVL1pix9g4txlIjL_AeU_gXI3663YOp9C-hV2cXeM,291
|
|
2
2
|
trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
trilogy/constants.py,sha256=UPymm94T2c6a55XdDaXw0aleTe1pOJ6lf6gOWLKZyKg,1430
|
|
4
4
|
trilogy/engine.py,sha256=R5ubIxYyrxRExz07aZCUfrTsoXCHQ8DKFTDsobXdWdA,1102
|
|
@@ -12,11 +12,11 @@ trilogy/core/enums.py,sha256=z-qBLh0YW52tkRtp6VLn6afxLfgI45r7_QfDtGH9CSw,6858
|
|
|
12
12
|
trilogy/core/env_processor.py,sha256=SHVB3nkidIlFc5dz-sofRMKXx66stpLQNuVdQSjC-So,2586
|
|
13
13
|
trilogy/core/environment_helpers.py,sha256=DIsoo-GcXmXVPB1JbNh8Oku25Nyef9mexPIdy2ur_sk,7159
|
|
14
14
|
trilogy/core/ergonomics.py,sha256=ASLDd0RqKWrZiG3XcKHo8nyTjaB_8xfE9t4NZ1UvGpc,1639
|
|
15
|
-
trilogy/core/exceptions.py,sha256=
|
|
15
|
+
trilogy/core/exceptions.py,sha256=1c1lQCwSw4_5CQS3q7scOkXU8GQvullJXfPHubprl90,617
|
|
16
16
|
trilogy/core/functions.py,sha256=IhVpt3n6wEanKHnGu3oA2w6-hKIlxWpEyz7fHN66mpo,10720
|
|
17
17
|
trilogy/core/graph_models.py,sha256=mameUTiuCajtihDw_2-W218xyJlvTusOWrEKP1yAWgk,2003
|
|
18
18
|
trilogy/core/internal.py,sha256=jNGFHKENnbMiMCtAgsnLZYVSENDK4b5ALecXFZpTDzQ,1075
|
|
19
|
-
trilogy/core/models.py,sha256=
|
|
19
|
+
trilogy/core/models.py,sha256=Fos3AY_biCCYh-Y9p-n9di8CJ9UvdxnNgiNTxYjlH-4,163631
|
|
20
20
|
trilogy/core/optimization.py,sha256=VFSvJLNoCCOraip-PZUKeE4qrlxtXARjQUzJZiW-yRk,7325
|
|
21
21
|
trilogy/core/query_processor.py,sha256=mbcZlgjChrRjDHkdmMbKe-T70UpbBkJhS09MyU5a6UY,17785
|
|
22
22
|
trilogy/core/optimizations/__init__.py,sha256=bWQecbeiwiDx9LJnLsa7dkWxdbl2wcnkcTN69JyP8iI,356
|
|
@@ -38,9 +38,9 @@ trilogy/core/processing/node_generators/multiselect_node.py,sha256=_KO9lqzHQoy4V
|
|
|
38
38
|
trilogy/core/processing/node_generators/node_merge_node.py,sha256=dIEv5P2MTViAES2MzqJgccYzM3HldjHrQYFwH00cqyc,14003
|
|
39
39
|
trilogy/core/processing/node_generators/rowset_node.py,sha256=KtdN6t2xM8CJxobc4aQX4W8uX98U6IabeuBF_FtBLR4,4583
|
|
40
40
|
trilogy/core/processing/node_generators/select_merge_node.py,sha256=UF4xra2sJ6dGg9TLJUgqtTX-UxqUaCEfAGo-uq7HlVs,12139
|
|
41
|
-
trilogy/core/processing/node_generators/select_node.py,sha256=
|
|
41
|
+
trilogy/core/processing/node_generators/select_node.py,sha256=xTCWOoucRPBWkTccm5wepidhuZix-wd0YXWyOsy8nLs,1795
|
|
42
42
|
trilogy/core/processing/node_generators/unnest_node.py,sha256=cZ26CN338CBnd6asML1OBUtNcDzmNlFpY0Vnade4yrc,2256
|
|
43
|
-
trilogy/core/processing/node_generators/window_node.py,sha256=
|
|
43
|
+
trilogy/core/processing/node_generators/window_node.py,sha256=Ywb2K0T5Ym_Y4XStzIE2fuWV1fW2dp5eQ2hXVFTLsGM,3511
|
|
44
44
|
trilogy/core/processing/nodes/__init__.py,sha256=qS5EJDRwwIrCEfS7ibCA2ESE0RPzsAIii1UWd_wNsHA,4760
|
|
45
45
|
trilogy/core/processing/nodes/base_node.py,sha256=sc3HrXkWk-xpsAQ7B7ltX1ZejYAkqFiv8Ei8Jg5VGkQ,15579
|
|
46
46
|
trilogy/core/processing/nodes/filter_node.py,sha256=GfZ9eghpFDI-s7iQP2UqTljCmn25LT_T5TAxDlh7PkQ,2343
|
|
@@ -50,7 +50,7 @@ trilogy/core/processing/nodes/select_node_v2.py,sha256=7WoFxeGEAzhpS4y4Zw2nH2tt7
|
|
|
50
50
|
trilogy/core/processing/nodes/unnest_node.py,sha256=mAmFluzm2yeeiQ6NfIB7BU_8atRGh-UJfPf9ROwbhr8,2152
|
|
51
51
|
trilogy/core/processing/nodes/window_node.py,sha256=ro0QfMFi4ZmIn5Q4D0M_vJWfnHH_C0MN7XkVkx8Gygg,1214
|
|
52
52
|
trilogy/dialect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
-
trilogy/dialect/base.py,sha256=
|
|
53
|
+
trilogy/dialect/base.py,sha256=Aj0U5JUFPzBuo-5LNASYIkJVIYiMhL3A4nGEslY7xAg,36301
|
|
54
54
|
trilogy/dialect/bigquery.py,sha256=15KJ-cOpBlk9O7FPviPgmg8xIydJeKx7WfmL3SSsPE8,2953
|
|
55
55
|
trilogy/dialect/common.py,sha256=eqJi_Si1iyb2sV0siTf8g8JOHueWu6RkdtQZtutKazk,3826
|
|
56
56
|
trilogy/dialect/config.py,sha256=tLVEMctaTDhUgARKXUNfHUcIolGaALkQ0RavUvXAY4w,2994
|
|
@@ -66,18 +66,18 @@ trilogy/hooks/graph_hook.py,sha256=onHvMQPwj_KOS3HOTpRFiy7QLLKAiycq2MzJ_Q0Oh5Y,2
|
|
|
66
66
|
trilogy/hooks/query_debugger.py,sha256=787umJjdGA057DCC714dqFstzJRUbwmz3MNr66IdpQI,4404
|
|
67
67
|
trilogy/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
68
|
trilogy/parsing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
|
-
trilogy/parsing/common.py,sha256=
|
|
69
|
+
trilogy/parsing/common.py,sha256=3kly4cH36F_8nwR1evKB5_yk1ezEtwwoeav4PrHUJ6o,10417
|
|
70
70
|
trilogy/parsing/config.py,sha256=Z-DaefdKhPDmSXLgg5V4pebhSB0h590vI0_VtHnlukI,111
|
|
71
71
|
trilogy/parsing/exceptions.py,sha256=92E5i2frv5hj9wxObJZsZqj5T6bglvPzvdvco_vW1Zk,38
|
|
72
72
|
trilogy/parsing/helpers.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
73
|
-
trilogy/parsing/parse_engine.py,sha256=
|
|
73
|
+
trilogy/parsing/parse_engine.py,sha256=fWE_0n30ecBdlT6OvAZL5DYJRs-q2MiD-m8wqxQ_9XE,65201
|
|
74
74
|
trilogy/parsing/render.py,sha256=-qqpXQg4yHcv284Vosjnsc_vrPveH6oaYbeCd3ZSvs0,15682
|
|
75
75
|
trilogy/parsing/trilogy.lark,sha256=B6NM3-rBHtYB_WSEti0DiS8Z-I8YH3kZU47xNzQvBx4,12389
|
|
76
76
|
trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
77
77
|
trilogy/scripts/trilogy.py,sha256=PHxvv6f2ODv0esyyhWxlARgra8dVhqQhYl0lTrSyVNo,3729
|
|
78
|
-
pytrilogy-0.0.2.
|
|
79
|
-
pytrilogy-0.0.2.
|
|
80
|
-
pytrilogy-0.0.2.
|
|
81
|
-
pytrilogy-0.0.2.
|
|
82
|
-
pytrilogy-0.0.2.
|
|
83
|
-
pytrilogy-0.0.2.
|
|
78
|
+
pytrilogy-0.0.2.43.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
|
|
79
|
+
pytrilogy-0.0.2.43.dist-info/METADATA,sha256=Lx7C3ItHKIzLZwQ_nwBHpJrnYWyG3PR305v4SXcGzBs,8426
|
|
80
|
+
pytrilogy-0.0.2.43.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
81
|
+
pytrilogy-0.0.2.43.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
|
|
82
|
+
pytrilogy-0.0.2.43.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
|
|
83
|
+
pytrilogy-0.0.2.43.dist-info/RECORD,,
|
trilogy/__init__.py
CHANGED
trilogy/core/exceptions.py
CHANGED
|
@@ -16,6 +16,10 @@ class NoDatasourceException(Exception):
|
|
|
16
16
|
pass
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
class FrozenEnvironmentException(Exception):
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
|
|
19
23
|
class AmbiguousRelationshipResolutionException(Exception):
|
|
20
24
|
def __init__(self, message, parents: List[set[str]]):
|
|
21
25
|
super().__init__(self, message)
|
trilogy/core/models.py
CHANGED
|
@@ -67,7 +67,10 @@ from trilogy.core.enums import (
|
|
|
67
67
|
SelectFiltering,
|
|
68
68
|
IOType,
|
|
69
69
|
)
|
|
70
|
-
from trilogy.core.exceptions import
|
|
70
|
+
from trilogy.core.exceptions import (
|
|
71
|
+
UndefinedConceptException,
|
|
72
|
+
InvalidSyntaxException,
|
|
73
|
+
)
|
|
71
74
|
from trilogy.utility import unique
|
|
72
75
|
from collections import UserList, UserDict
|
|
73
76
|
from functools import cached_property
|
|
@@ -555,6 +558,8 @@ class Concept(Mergeable, Namespaced, SelectContext, BaseModel):
|
|
|
555
558
|
v = Grain(components=[])
|
|
556
559
|
elif isinstance(v, Concept):
|
|
557
560
|
v = Grain(components=[v])
|
|
561
|
+
elif isinstance(v, dict):
|
|
562
|
+
v = Grain.model_validate(v)
|
|
558
563
|
if not v:
|
|
559
564
|
raise SyntaxError(f"Invalid grain {v} for concept {values['name']}")
|
|
560
565
|
return v
|
|
@@ -3337,7 +3342,7 @@ class EnvironmentConceptDict(dict):
|
|
|
3337
3342
|
class ImportStatement(HasUUID, BaseModel):
|
|
3338
3343
|
alias: str
|
|
3339
3344
|
path: Path
|
|
3340
|
-
environment: Union["Environment", None] = None
|
|
3345
|
+
# environment: Union["Environment", None] = None
|
|
3341
3346
|
# TODO: this might result in a lot of duplication
|
|
3342
3347
|
# environment:"Environment"
|
|
3343
3348
|
|
|
@@ -3385,9 +3390,13 @@ class Environment(BaseModel):
|
|
|
3385
3390
|
environment_config: EnvironmentOptions = Field(default_factory=EnvironmentOptions)
|
|
3386
3391
|
version: str = Field(default_factory=get_version)
|
|
3387
3392
|
cte_name_map: Dict[str, str] = Field(default_factory=dict)
|
|
3388
|
-
|
|
3389
|
-
materialized_concepts: List[Concept] = Field(default_factory=list)
|
|
3393
|
+
materialized_concepts: set[str] = Field(default_factory=set)
|
|
3390
3394
|
alias_origin_lookup: Dict[str, Concept] = Field(default_factory=dict)
|
|
3395
|
+
# TODO: support freezing environments to avoid mutation
|
|
3396
|
+
# frozen: bool = False
|
|
3397
|
+
|
|
3398
|
+
def duplicate(self):
|
|
3399
|
+
return self.model_copy(deep=True)
|
|
3391
3400
|
|
|
3392
3401
|
def __init__(self, **data):
|
|
3393
3402
|
super().__init__(**data)
|
|
@@ -3405,6 +3414,12 @@ class Environment(BaseModel):
|
|
|
3405
3414
|
)
|
|
3406
3415
|
self.add_concept(concept)
|
|
3407
3416
|
|
|
3417
|
+
# def freeze(self):
|
|
3418
|
+
# self.frozen = True
|
|
3419
|
+
|
|
3420
|
+
# def thaw(self):
|
|
3421
|
+
# self.frozen = False
|
|
3422
|
+
|
|
3408
3423
|
@classmethod
|
|
3409
3424
|
def from_file(cls, path: str | Path) -> "Environment":
|
|
3410
3425
|
with open(path, "r") as f:
|
|
@@ -3435,14 +3450,17 @@ class Environment(BaseModel):
|
|
|
3435
3450
|
for datasource in self.datasources.values():
|
|
3436
3451
|
for concept in datasource.output_concepts:
|
|
3437
3452
|
concrete_addresses.add(concept.address)
|
|
3438
|
-
self.materialized_concepts =
|
|
3439
|
-
[
|
|
3453
|
+
self.materialized_concepts = set(
|
|
3454
|
+
[
|
|
3455
|
+
c.address
|
|
3456
|
+
for c in self.concepts.values()
|
|
3457
|
+
if c.address in concrete_addresses
|
|
3458
|
+
]
|
|
3440
3459
|
+ [
|
|
3441
|
-
c
|
|
3460
|
+
c.address
|
|
3442
3461
|
for c in self.alias_origin_lookup.values()
|
|
3443
3462
|
if c.address in concrete_addresses
|
|
3444
3463
|
],
|
|
3445
|
-
"address",
|
|
3446
3464
|
)
|
|
3447
3465
|
|
|
3448
3466
|
def validate_concept(self, new_concept: Concept, meta: Meta | None = None):
|
|
@@ -3602,7 +3620,7 @@ class Environment(BaseModel):
|
|
|
3602
3620
|
f"Unable to import file {target.parent}, parsing error: {e}"
|
|
3603
3621
|
)
|
|
3604
3622
|
env = nparser.environment
|
|
3605
|
-
imps = ImportStatement(alias=alias, path=target
|
|
3623
|
+
imps = ImportStatement(alias=alias, path=target)
|
|
3606
3624
|
self.add_import(alias, source=env, imp_stm=imps)
|
|
3607
3625
|
return imps
|
|
3608
3626
|
|
|
@@ -10,7 +10,9 @@ from trilogy.core.processing.utility import padding
|
|
|
10
10
|
LOGGER_PREFIX = "[GEN_WINDOW_NODE]"
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
def resolve_window_parent_concepts(
|
|
13
|
+
def resolve_window_parent_concepts(
|
|
14
|
+
concept: Concept, environment: Environment
|
|
15
|
+
) -> tuple[Concept, List[Concept]]:
|
|
14
16
|
if not isinstance(concept.lineage, WindowItem):
|
|
15
17
|
raise ValueError
|
|
16
18
|
base = []
|
|
@@ -18,6 +20,11 @@ def resolve_window_parent_concepts(concept: Concept) -> tuple[Concept, List[Conc
|
|
|
18
20
|
base += concept.lineage.over
|
|
19
21
|
if concept.lineage.order_by:
|
|
20
22
|
for item in concept.lineage.order_by:
|
|
23
|
+
# TODO: we do want to use the rehydrated value, but
|
|
24
|
+
# that introduces a circular dependency on an aggregate
|
|
25
|
+
# that is grouped by a window
|
|
26
|
+
# need to figure out how to resolve this
|
|
27
|
+
# base += [environment.concepts[item.expr.output.address]]
|
|
21
28
|
base += [item.expr.output]
|
|
22
29
|
return concept.lineage.content, unique(base, "address")
|
|
23
30
|
|
|
@@ -32,12 +39,12 @@ def gen_window_node(
|
|
|
32
39
|
history: History | None = None,
|
|
33
40
|
conditions: WhereClause | None = None,
|
|
34
41
|
) -> StrategyNode | None:
|
|
35
|
-
base, parent_concepts = resolve_window_parent_concepts(concept)
|
|
42
|
+
base, parent_concepts = resolve_window_parent_concepts(concept, environment)
|
|
36
43
|
equivalent_optional = [
|
|
37
44
|
x
|
|
38
45
|
for x in local_optional
|
|
39
46
|
if isinstance(x.lineage, WindowItem)
|
|
40
|
-
and resolve_window_parent_concepts(x)[1] == parent_concepts
|
|
47
|
+
and resolve_window_parent_concepts(x, environment)[1] == parent_concepts
|
|
41
48
|
]
|
|
42
49
|
|
|
43
50
|
non_equivalent_optional = [
|
trilogy/dialect/base.py
CHANGED
|
@@ -348,12 +348,31 @@ class BaseDialect:
|
|
|
348
348
|
):
|
|
349
349
|
rval = f":{c.safe_address}"
|
|
350
350
|
else:
|
|
351
|
-
args = [
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
351
|
+
args = []
|
|
352
|
+
for arg in c.lineage.arguments:
|
|
353
|
+
if (
|
|
354
|
+
isinstance(arg, Concept)
|
|
355
|
+
and arg.lineage
|
|
356
|
+
and isinstance(arg.lineage, Function)
|
|
357
|
+
and arg.lineage.operator
|
|
358
|
+
in (
|
|
359
|
+
FunctionType.ADD,
|
|
360
|
+
FunctionType.SUBTRACT,
|
|
361
|
+
FunctionType.DIVIDE,
|
|
362
|
+
FunctionType.MULTIPLY,
|
|
363
|
+
)
|
|
364
|
+
):
|
|
365
|
+
args.append(
|
|
366
|
+
self.render_expr(
|
|
367
|
+
Parenthetical(content=arg),
|
|
368
|
+
cte=cte,
|
|
369
|
+
raise_invalid=raise_invalid,
|
|
370
|
+
)
|
|
371
|
+
)
|
|
372
|
+
else:
|
|
373
|
+
args.append(
|
|
374
|
+
self.render_expr(arg, cte=cte, raise_invalid=raise_invalid)
|
|
375
|
+
)
|
|
357
376
|
|
|
358
377
|
if cte.group_to_grain:
|
|
359
378
|
rval = f"{self.FUNCTION_MAP[c.lineage.operator](args)}"
|
|
@@ -492,25 +511,39 @@ class BaseDialect:
|
|
|
492
511
|
elif isinstance(e, CaseElse):
|
|
493
512
|
return f"ELSE {self.render_expr(e.expr, cte=cte, cte_map=cte_map, raise_invalid=raise_invalid) }"
|
|
494
513
|
elif isinstance(e, Function):
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
514
|
+
arguments = []
|
|
515
|
+
for arg in e.arguments:
|
|
516
|
+
if (
|
|
517
|
+
isinstance(arg, Concept)
|
|
518
|
+
and arg.lineage
|
|
519
|
+
and isinstance(arg.lineage, Function)
|
|
520
|
+
and arg.lineage.operator
|
|
521
|
+
in (
|
|
522
|
+
FunctionType.ADD,
|
|
523
|
+
FunctionType.SUBTRACT,
|
|
524
|
+
FunctionType.DIVIDE,
|
|
525
|
+
FunctionType.MULTIPLY,
|
|
526
|
+
)
|
|
527
|
+
):
|
|
528
|
+
arguments.append(
|
|
499
529
|
self.render_expr(
|
|
500
|
-
|
|
530
|
+
Parenthetical(content=arg),
|
|
531
|
+
cte=cte,
|
|
532
|
+
cte_map=cte_map,
|
|
533
|
+
raise_invalid=raise_invalid,
|
|
501
534
|
)
|
|
502
|
-
for z in e.arguments
|
|
503
|
-
]
|
|
504
|
-
)
|
|
505
|
-
|
|
506
|
-
return self.FUNCTION_GRAIN_MATCH_MAP[e.operator](
|
|
507
|
-
[
|
|
508
|
-
self.render_expr(
|
|
509
|
-
z, cte=cte, cte_map=cte_map, raise_invalid=raise_invalid
|
|
510
535
|
)
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
536
|
+
else:
|
|
537
|
+
arguments.append(
|
|
538
|
+
self.render_expr(
|
|
539
|
+
arg, cte=cte, cte_map=cte_map, raise_invalid=raise_invalid
|
|
540
|
+
)
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
if cte and cte.group_to_grain:
|
|
544
|
+
return self.FUNCTION_MAP[e.operator](arguments)
|
|
545
|
+
|
|
546
|
+
return self.FUNCTION_GRAIN_MATCH_MAP[e.operator](arguments)
|
|
514
547
|
elif isinstance(e, AggregateWrapper):
|
|
515
548
|
return self.render_expr(
|
|
516
549
|
e.function, cte, cte_map=cte_map, raise_invalid=raise_invalid
|
trilogy/parsing/common.py
CHANGED
|
@@ -13,6 +13,7 @@ from trilogy.core.models import (
|
|
|
13
13
|
Parenthetical,
|
|
14
14
|
FunctionClass,
|
|
15
15
|
Environment,
|
|
16
|
+
DataType,
|
|
16
17
|
)
|
|
17
18
|
from typing import List, Tuple
|
|
18
19
|
from trilogy.core.functions import (
|
|
@@ -25,7 +26,7 @@ from trilogy.core.enums import PurposeLineage
|
|
|
25
26
|
from trilogy.constants import (
|
|
26
27
|
VIRTUAL_CONCEPT_PREFIX,
|
|
27
28
|
)
|
|
28
|
-
from trilogy.core.enums import Modifier
|
|
29
|
+
from trilogy.core.enums import Modifier, WindowType
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
def get_upstream_modifiers(keys: List[Concept]) -> list[Modifier]:
|
|
@@ -234,9 +235,18 @@ def window_item_to_concept(
|
|
|
234
235
|
else:
|
|
235
236
|
grain = parent.over + [parent.content.output]
|
|
236
237
|
modifiers = get_upstream_modifiers(parent.content.concept_arguments)
|
|
238
|
+
datatype = parent.content.datatype
|
|
239
|
+
if parent.type in (
|
|
240
|
+
WindowType.RANK,
|
|
241
|
+
WindowType.ROW_NUMBER,
|
|
242
|
+
WindowType.COUNT,
|
|
243
|
+
WindowType.COUNT_DISTINCT,
|
|
244
|
+
):
|
|
245
|
+
datatype = DataType.INTEGER
|
|
246
|
+
|
|
237
247
|
return Concept(
|
|
238
248
|
name=name,
|
|
239
|
-
datatype=
|
|
249
|
+
datatype=datatype,
|
|
240
250
|
purpose=local_purpose,
|
|
241
251
|
lineage=parent,
|
|
242
252
|
metadata=fmetadata,
|
trilogy/parsing/parse_engine.py
CHANGED
|
@@ -907,9 +907,7 @@ class ParseToObjects(Transformer):
|
|
|
907
907
|
except Exception as e:
|
|
908
908
|
raise ImportError(f"Unable to import file {target}, parsing error: {e}")
|
|
909
909
|
|
|
910
|
-
imps = ImportStatement(
|
|
911
|
-
alias=alias, path=Path(args[0]), environment=nparser.environment
|
|
912
|
-
)
|
|
910
|
+
imps = ImportStatement(alias=alias, path=Path(args[0]))
|
|
913
911
|
self.environment.add_import(alias, nparser.environment, imps)
|
|
914
912
|
return imps
|
|
915
913
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|