pytrilogy 0.0.3.25__py3-none-any.whl → 0.0.3.26__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.25.dist-info → pytrilogy-0.0.3.26.dist-info}/METADATA +1 -1
- {pytrilogy-0.0.3.25.dist-info → pytrilogy-0.0.3.26.dist-info}/RECORD +11 -11
- trilogy/__init__.py +1 -1
- trilogy/core/enums.py +1 -0
- trilogy/core/environment_helpers.py +9 -10
- trilogy/core/functions.py +37 -11
- trilogy/parsing/trilogy.lark +1 -1
- {pytrilogy-0.0.3.25.dist-info → pytrilogy-0.0.3.26.dist-info}/WHEEL +0 -0
- {pytrilogy-0.0.3.25.dist-info → pytrilogy-0.0.3.26.dist-info}/entry_points.txt +0 -0
- {pytrilogy-0.0.3.25.dist-info → pytrilogy-0.0.3.26.dist-info}/licenses/LICENSE.md +0 -0
- {pytrilogy-0.0.3.25.dist-info → pytrilogy-0.0.3.26.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.26.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
|
|
2
|
+
trilogy/__init__.py,sha256=jpttmNzh2EbgBflGCJnC8pwUwKWANddEpY_K5_4Hsn0,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,12 +11,12 @@ trilogy/utility.py,sha256=euQccZLKoYBz0LNg5tzLlvv2YHvXh9HArnYp1V3uXsM,763
|
|
|
11
11
|
trilogy/authoring/__init__.py,sha256=ohkYA3_LGYZh3fwzEYKTN6ofACDI5GYl3VCbGxVvlzY,2233
|
|
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=zpXhm8qk6i_ih4O6ro5sPMbIQSQDtzLcBcX5eKWQZU4,7197
|
|
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=i0oyxfLjFQW6ZbD6g2wa0DXUoEvd2sHG28TZ1UBs2os,7573
|
|
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=Ke8-d2RtHZszAQdx_6dNyHtELbvMIGZo2CsglxqtvEQ,26890
|
|
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=xGO8piVsLrpqrx-Aid_Y56_5slSv4eZmlP64hCHRiEc,7957
|
|
@@ -93,11 +93,11 @@ trilogy/parsing/exceptions.py,sha256=92E5i2frv5hj9wxObJZsZqj5T6bglvPzvdvco_vW1Zk
|
|
|
93
93
|
trilogy/parsing/helpers.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
94
94
|
trilogy/parsing/parse_engine.py,sha256=Ffm3YB2jTPcA81CZTkpQ7iAwD1LP10QQpjoKk9fey4I,61849
|
|
95
95
|
trilogy/parsing/render.py,sha256=o_XuQWhcwx1lD9eGVqkqZEwkmQK0HdmWWokGBtdeH4I,17837
|
|
96
|
-
trilogy/parsing/trilogy.lark,sha256=
|
|
96
|
+
trilogy/parsing/trilogy.lark,sha256=GYRO0LJYUtzf1__d2b0L2EJzRGfnsI2SaQHzh9RgxnA,12945
|
|
97
97
|
trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
98
98
|
trilogy/scripts/trilogy.py,sha256=1L0XrH4mVHRt1C9T1HnaDv2_kYEfbWTb5_-cBBke79w,3774
|
|
99
|
-
pytrilogy-0.0.3.
|
|
100
|
-
pytrilogy-0.0.3.
|
|
101
|
-
pytrilogy-0.0.3.
|
|
102
|
-
pytrilogy-0.0.3.
|
|
103
|
-
pytrilogy-0.0.3.
|
|
99
|
+
pytrilogy-0.0.3.26.dist-info/METADATA,sha256=-Klg8gwJa_TaSlCwqqMiknzDCnTFjv2HMP_iHfgFoOw,9100
|
|
100
|
+
pytrilogy-0.0.3.26.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
101
|
+
pytrilogy-0.0.3.26.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
|
|
102
|
+
pytrilogy-0.0.3.26.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
|
|
103
|
+
pytrilogy-0.0.3.26.dist-info/RECORD,,
|
trilogy/__init__.py
CHANGED
trilogy/core/enums.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from trilogy.constants import DEFAULT_NAMESPACE
|
|
2
2
|
from trilogy.core.enums import ConceptSource, FunctionType, Purpose
|
|
3
|
-
from trilogy.core.functions import AttrAccess
|
|
3
|
+
from trilogy.core.functions import AttrAccess, FunctionFactory
|
|
4
4
|
from trilogy.core.models.author import Concept, Function, Metadata
|
|
5
5
|
from trilogy.core.models.core import DataType, StructType, arg_to_datatype
|
|
6
6
|
from trilogy.core.models.environment import Environment
|
|
@@ -19,6 +19,7 @@ FUNCTION_DESCRIPTION_MAPS = {
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def generate_date_concepts(concept: Concept, environment: Environment):
|
|
22
|
+
factory = FunctionFactory(environment=environment)
|
|
22
23
|
if concept.metadata and concept.metadata.description:
|
|
23
24
|
base_description = concept.metadata.description
|
|
24
25
|
else:
|
|
@@ -40,17 +41,15 @@ def generate_date_concepts(concept: Concept, environment: Environment):
|
|
|
40
41
|
if concept.purpose == Purpose.CONSTANT
|
|
41
42
|
else Purpose.PROPERTY
|
|
42
43
|
)
|
|
43
|
-
|
|
44
|
+
function = factory.create_function(
|
|
44
45
|
operator=ftype,
|
|
45
|
-
|
|
46
|
-
output_purpose=default_type,
|
|
47
|
-
arguments=[concept],
|
|
46
|
+
args=[concept],
|
|
48
47
|
)
|
|
49
48
|
new_concept = Concept(
|
|
50
49
|
name=f"{concept.name}.{fname}",
|
|
51
50
|
datatype=DataType.INTEGER,
|
|
52
51
|
purpose=default_type,
|
|
53
|
-
lineage=
|
|
52
|
+
lineage=function,
|
|
54
53
|
grain=concept.grain,
|
|
55
54
|
namespace=concept.namespace,
|
|
56
55
|
keys=set(
|
|
@@ -68,6 +67,7 @@ def generate_date_concepts(concept: Concept, environment: Environment):
|
|
|
68
67
|
|
|
69
68
|
|
|
70
69
|
def generate_datetime_concepts(concept: Concept, environment: Environment):
|
|
70
|
+
factory = FunctionFactory(environment=environment)
|
|
71
71
|
if concept.metadata and concept.metadata.description:
|
|
72
72
|
base_description = concept.metadata.description
|
|
73
73
|
else:
|
|
@@ -88,11 +88,10 @@ def generate_datetime_concepts(concept: Concept, environment: Environment):
|
|
|
88
88
|
if concept.purpose == Purpose.CONSTANT
|
|
89
89
|
else Purpose.PROPERTY
|
|
90
90
|
)
|
|
91
|
-
|
|
91
|
+
|
|
92
|
+
const_function = factory.create_function(
|
|
92
93
|
operator=ftype,
|
|
93
|
-
|
|
94
|
-
output_purpose=default_type,
|
|
95
|
-
arguments=[concept],
|
|
94
|
+
args=[concept],
|
|
96
95
|
)
|
|
97
96
|
new_concept = Concept(
|
|
98
97
|
name=f"{concept.name}.{fname}",
|
trilogy/core/functions.py
CHANGED
|
@@ -43,7 +43,9 @@ class FunctionConfig:
|
|
|
43
43
|
arg_count: int = 1
|
|
44
44
|
valid_inputs: set[DataType] | list[set[DataType]] | None = None
|
|
45
45
|
output_purpose: Purpose | None = None
|
|
46
|
-
output_type:
|
|
46
|
+
output_type: (
|
|
47
|
+
DataType | ListType | MapType | StructType | NumericType | TraitDataType | None
|
|
48
|
+
) = None
|
|
47
49
|
output_type_function: Optional[Callable] = None
|
|
48
50
|
|
|
49
51
|
|
|
@@ -124,6 +126,30 @@ def create_struct_output(
|
|
|
124
126
|
return StructType(fields=types, fields_map=zipped)
|
|
125
127
|
|
|
126
128
|
|
|
129
|
+
def get_date_part_output(args: list[Any]):
|
|
130
|
+
target = args[1]
|
|
131
|
+
if target == DatePart.YEAR:
|
|
132
|
+
return TraitDataType(type=DataType.INTEGER, traits=["year"])
|
|
133
|
+
elif target == DatePart.MONTH:
|
|
134
|
+
return TraitDataType(type=DataType.INTEGER, traits=["month"])
|
|
135
|
+
elif target == DatePart.DAY:
|
|
136
|
+
return TraitDataType(type=DataType.INTEGER, traits=["day"])
|
|
137
|
+
elif target == DatePart.HOUR:
|
|
138
|
+
return TraitDataType(type=DataType.INTEGER, traits=["hour"])
|
|
139
|
+
elif target == DatePart.MINUTE:
|
|
140
|
+
return TraitDataType(type=DataType.INTEGER, traits=["minute"])
|
|
141
|
+
elif target == DatePart.SECOND:
|
|
142
|
+
return TraitDataType(type=DataType.INTEGER, traits=["second"])
|
|
143
|
+
elif target == DatePart.WEEK:
|
|
144
|
+
return TraitDataType(type=DataType.INTEGER, traits=["week"])
|
|
145
|
+
elif target == DatePart.QUARTER:
|
|
146
|
+
return TraitDataType(type=DataType.INTEGER, traits=["quarter"])
|
|
147
|
+
elif target == DatePart.DAY_OF_WEEK:
|
|
148
|
+
return TraitDataType(type=DataType.INTEGER, traits=["day_of_week"])
|
|
149
|
+
else:
|
|
150
|
+
raise InvalidSyntaxException(f"Date part not supported for {target}")
|
|
151
|
+
|
|
152
|
+
|
|
127
153
|
def get_date_trunc_output(
|
|
128
154
|
args: list[Any],
|
|
129
155
|
):
|
|
@@ -360,7 +386,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
360
386
|
{DataType.DATE_PART},
|
|
361
387
|
],
|
|
362
388
|
output_purpose=Purpose.PROPERTY,
|
|
363
|
-
|
|
389
|
+
output_type_function=get_date_part_output,
|
|
364
390
|
arg_count=2,
|
|
365
391
|
),
|
|
366
392
|
FunctionType.DATE_ADD: FunctionConfig(
|
|
@@ -443,7 +469,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
443
469
|
DataType.STRING,
|
|
444
470
|
},
|
|
445
471
|
output_purpose=Purpose.PROPERTY,
|
|
446
|
-
output_type=DataType.INTEGER,
|
|
472
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["second"]),
|
|
447
473
|
arg_count=1,
|
|
448
474
|
),
|
|
449
475
|
FunctionType.MINUTE: FunctionConfig(
|
|
@@ -454,7 +480,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
454
480
|
DataType.STRING,
|
|
455
481
|
},
|
|
456
482
|
output_purpose=Purpose.PROPERTY,
|
|
457
|
-
output_type=DataType.INTEGER,
|
|
483
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["minute"]),
|
|
458
484
|
arg_count=1,
|
|
459
485
|
),
|
|
460
486
|
FunctionType.HOUR: FunctionConfig(
|
|
@@ -465,7 +491,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
465
491
|
DataType.STRING,
|
|
466
492
|
},
|
|
467
493
|
output_purpose=Purpose.PROPERTY,
|
|
468
|
-
output_type=DataType.INTEGER,
|
|
494
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["hour"]),
|
|
469
495
|
arg_count=1,
|
|
470
496
|
),
|
|
471
497
|
FunctionType.DAY: FunctionConfig(
|
|
@@ -476,7 +502,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
476
502
|
DataType.STRING,
|
|
477
503
|
},
|
|
478
504
|
output_purpose=Purpose.PROPERTY,
|
|
479
|
-
output_type=DataType.INTEGER,
|
|
505
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["day"]),
|
|
480
506
|
arg_count=1,
|
|
481
507
|
),
|
|
482
508
|
FunctionType.WEEK: FunctionConfig(
|
|
@@ -487,7 +513,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
487
513
|
DataType.STRING,
|
|
488
514
|
},
|
|
489
515
|
output_purpose=Purpose.PROPERTY,
|
|
490
|
-
output_type=DataType.INTEGER,
|
|
516
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["week"]),
|
|
491
517
|
arg_count=1,
|
|
492
518
|
),
|
|
493
519
|
FunctionType.MONTH: FunctionConfig(
|
|
@@ -498,7 +524,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
498
524
|
DataType.STRING,
|
|
499
525
|
},
|
|
500
526
|
output_purpose=Purpose.PROPERTY,
|
|
501
|
-
output_type=DataType.INTEGER,
|
|
527
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["month"]),
|
|
502
528
|
arg_count=1,
|
|
503
529
|
),
|
|
504
530
|
FunctionType.QUARTER: FunctionConfig(
|
|
@@ -509,7 +535,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
509
535
|
DataType.STRING,
|
|
510
536
|
},
|
|
511
537
|
output_purpose=Purpose.PROPERTY,
|
|
512
|
-
output_type=DataType.INTEGER,
|
|
538
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["quarter"]),
|
|
513
539
|
arg_count=1,
|
|
514
540
|
),
|
|
515
541
|
FunctionType.YEAR: FunctionConfig(
|
|
@@ -520,7 +546,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
520
546
|
DataType.STRING,
|
|
521
547
|
},
|
|
522
548
|
output_purpose=Purpose.PROPERTY,
|
|
523
|
-
output_type=DataType.INTEGER,
|
|
549
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["year"]),
|
|
524
550
|
arg_count=1,
|
|
525
551
|
),
|
|
526
552
|
FunctionType.DAY_OF_WEEK: FunctionConfig(
|
|
@@ -531,7 +557,7 @@ FUNCTION_REGISTRY: dict[FunctionType, FunctionConfig] = {
|
|
|
531
557
|
DataType.STRING,
|
|
532
558
|
},
|
|
533
559
|
output_purpose=Purpose.PROPERTY,
|
|
534
|
-
output_type=DataType.INTEGER,
|
|
560
|
+
output_type=TraitDataType(type=DataType.INTEGER, traits=["day_of_week"]),
|
|
535
561
|
arg_count=1,
|
|
536
562
|
),
|
|
537
563
|
FunctionType.ADD: FunctionConfig(
|
trilogy/parsing/trilogy.lark
CHANGED
|
@@ -287,7 +287,7 @@
|
|
|
287
287
|
_YEAR.1: "year("i
|
|
288
288
|
fyear: _YEAR expr ")"
|
|
289
289
|
|
|
290
|
-
DATE_PART: "DAY"i | "WEEK"i | "MONTH"i | "QUARTER"i | "YEAR"i | "MINUTE"i | "HOUR"i | "SECOND"i
|
|
290
|
+
DATE_PART: "DAY"i | "WEEK"i | "MONTH"i | "QUARTER"i | "YEAR"i | "MINUTE"i | "HOUR"i | "SECOND"i | "DAY_OF_WEEK"i
|
|
291
291
|
_DATE_TRUNC.1: "date_trunc("i
|
|
292
292
|
fdate_trunc: _DATE_TRUNC expr "," DATE_PART ")"
|
|
293
293
|
_DATE_PART.1: "date_part("i
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|