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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pytrilogy
3
- Version: 0.0.3.25
3
+ Version: 0.0.3.26
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.25.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
- trilogy/__init__.py,sha256=piV4nnwA9-0AitLYz0ClSA6czFL0v_VeaN4NIfqH7xw,303
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=wuW667WD3mhZnXmN2VXzohseHpdlmzrfLvPtQJNdhdw,7165
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=LjB3UsLyw7TncgS8EiMGtovGU_txyUki_QK94rSsJq0,7631
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=U-IkBF-HEaGFXF-PgB993CVTnDFE850LHXW-HFfhttc,25391
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=7libFS5HNiyHJYzr5_lEiY-Lpqit04_PgyIPHMZT7-w,12928
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.25.dist-info/METADATA,sha256=emvDFD0vE0A1aIYfJZDD1qNZG9QnYUt2XQ7UkYeO49s,9100
100
- pytrilogy-0.0.3.25.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
101
- pytrilogy-0.0.3.25.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
102
- pytrilogy-0.0.3.25.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
103
- pytrilogy-0.0.3.25.dist-info/RECORD,,
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
@@ -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.25"
7
+ __version__ = "0.0.3.26"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/core/enums.py CHANGED
@@ -298,6 +298,7 @@ class DatePart(Enum):
298
298
  HOUR = "hour"
299
299
  MINUTE = "minute"
300
300
  SECOND = "second"
301
+ DAY_OF_WEEK = "day_of_week"
301
302
 
302
303
  @classmethod
303
304
  def _missing_(cls, value):
@@ -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
- const_function: Function = Function(
44
+ function = factory.create_function(
44
45
  operator=ftype,
45
- output_datatype=DataType.INTEGER,
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=const_function,
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
- const_function: Function = Function(
91
+
92
+ const_function = factory.create_function(
92
93
  operator=ftype,
93
- output_datatype=DataType.INTEGER,
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: DataType | ListType | MapType | StructType | NumericType | None = None
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
- output_type=DataType.INTEGER,
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(
@@ -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