pytrilogy 0.0.3.31__py3-none-any.whl → 0.0.3.32__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.31
3
+ Version: 0.0.3.32
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.31.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
- trilogy/__init__.py,sha256=Dog7tuREzq6Ze49P4b5EKC9L7--I9sWPetmSqHJXGnk,303
1
+ pytrilogy-0.0.3.32.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
+ trilogy/__init__.py,sha256=LEjwWz5ASSeELMnWJRDTgcuJHGstMRNS9gvzU8PvHfQ,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
@@ -13,7 +13,7 @@ trilogy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  trilogy/core/constants.py,sha256=7XaCpZn5mQmjTobbeBn56SzPWq9eMNDfzfsRU-fP0VE,171
14
14
  trilogy/core/enums.py,sha256=7SW4V0PpceeAUREyxDKPBe2JAtDMOM5IOFhn9fYKObM,7318
15
15
  trilogy/core/env_processor.py,sha256=pFsxnluKIusGKx1z7tTnfsd_xZcPy9pZDungkjkyvI0,3170
16
- trilogy/core/environment_helpers.py,sha256=i0oyxfLjFQW6ZbD6g2wa0DXUoEvd2sHG28TZ1UBs2os,7573
16
+ trilogy/core/environment_helpers.py,sha256=5ayyhf4CGBlg_LssPu3DbS_H9H1Kq6Qog5TgR8pwyMk,8518
17
17
  trilogy/core/ergonomics.py,sha256=e-7gE29vPLFdg0_A1smQ7eOrUwKl5VYdxRSTddHweRA,1631
18
18
  trilogy/core/exceptions.py,sha256=JPYyBcit3T_pRtlHdtKSeVJkIyWUTozW2aaut25A2xI,673
19
19
  trilogy/core/functions.py,sha256=z5uyC5sAS_vnFBJcky7TjA0QAy-xI4Z9uD_9vK_XP1s,27134
@@ -22,12 +22,12 @@ trilogy/core/internal.py,sha256=iicDBlC6nM8d7e7jqzf_ZOmpUsW8yrr2AA8AqEiLx-s,1577
22
22
  trilogy/core/optimization.py,sha256=xGO8piVsLrpqrx-Aid_Y56_5slSv4eZmlP64hCHRiEc,7957
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
- trilogy/core/models/author.py,sha256=2lkuKm6FKEMoYx6h03g7WhCTCooT5sCbKJmlVfAlMG8,75876
25
+ trilogy/core/models/author.py,sha256=FtECoNRevZ8sD9JI-D8a9ngxxVoKNtfrdEjbnofYcg8,76131
26
26
  trilogy/core/models/build.py,sha256=3_n6qxoMuzX3Ahu9HLfoyPbtH0Wb--6crZNwCnZhu7k,58104
27
27
  trilogy/core/models/build_environment.py,sha256=8UggvlPU708GZWYPJMc_ou2r7M3TY2g69eqGvz03YX0,5528
28
28
  trilogy/core/models/core.py,sha256=wx6hJcFECMG-Ij972ADNkr-3nFXkYESr82ObPiC46_U,10875
29
29
  trilogy/core/models/datasource.py,sha256=6RjJUd2u4nYmEwFBpJlM9LbHVYDv8iHJxqiBMZqUrwI,9422
30
- trilogy/core/models/environment.py,sha256=eB52hyb1e9fJFybP5u5tUiaNbBHGXkMdm0i2V-LUUiw,26888
30
+ trilogy/core/models/environment.py,sha256=yd19vDdC-IiKPV5YbNZcDUOEr1BC_ZxE_5fQDIipa3s,26910
31
31
  trilogy/core/models/execute.py,sha256=KZHiovlSr_3ZjyzKD1mdBlAqnPCqFCChQkO4_4WlGtg,34224
32
32
  trilogy/core/optimizations/__init__.py,sha256=EBanqTXEzf1ZEYjAneIWoIcxtMDite5-n2dQ5xcfUtg,356
33
33
  trilogy/core/optimizations/base_optimization.py,sha256=gzDOKImoFn36k7XBD3ysEYDnbnb6vdVIztUfFQZsGnM,513
@@ -75,7 +75,7 @@ trilogy/dialect/bigquery.py,sha256=PkjFcNGZHYOe655PmJhb8a0afdFULuovqP0qQVO8m0I,2
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
78
- trilogy/dialect/duckdb.py,sha256=TepCOhYWYw1oUuOT6ZGlB3l4X6S8rYcldWe3zZm3HoU,3710
78
+ trilogy/dialect/duckdb.py,sha256=XTBK4RhE1_wF2_IA_7c2W5ih0uxZx0wZ1mfJ3YFIuso,3768
79
79
  trilogy/dialect/enums.py,sha256=FRNYQ5-w-B6-X0yXKNU5g9GowsMlERFogTC5u2nxL_s,4740
80
80
  trilogy/dialect/postgres.py,sha256=VH4EB4myjIeZTHeFU6vK00GxY9c53rCBjg2mLbdaCEE,3254
81
81
  trilogy/dialect/presto.py,sha256=Mw7_F8h19mWfuZHkHQJizQWbpu1lIHe6t2PA0r88gsY,3392
@@ -102,8 +102,8 @@ trilogy/std/date.preql,sha256=0MHeGLp2mG4QBKtmozcBZ7qVjOAdWOtrliIKn6hz1Pc,95
102
102
  trilogy/std/display.preql,sha256=2BbhvqR4rcltyAbOXAUo7SZ_yGFYZgFnurglHMbjW2g,40
103
103
  trilogy/std/geography.preql,sha256=-fqAGnBL6tR-UtT8DbSek3iMFg66ECR_B_41pODxv-k,504
104
104
  trilogy/std/money.preql,sha256=ZHW-csTX-kYbOLmKSO-TcGGgQ-_DMrUXy0BjfuJSFxM,80
105
- pytrilogy-0.0.3.31.dist-info/METADATA,sha256=UeaeD5QuDfabB2gWgJAAVtot6L8YS7s_TjHXTzL5Qs0,9100
106
- pytrilogy-0.0.3.31.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
107
- pytrilogy-0.0.3.31.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
108
- pytrilogy-0.0.3.31.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
109
- pytrilogy-0.0.3.31.dist-info/RECORD,,
105
+ pytrilogy-0.0.3.32.dist-info/METADATA,sha256=xnPeyXro94RAWPJBvFkrPPA219KCrQe0sAUhb0kcFgA,9100
106
+ pytrilogy-0.0.3.32.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
107
+ pytrilogy-0.0.3.32.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
108
+ pytrilogy-0.0.3.32.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
109
+ pytrilogy-0.0.3.32.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.31"
7
+ __version__ = "0.0.3.32"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -1,5 +1,5 @@
1
1
  from trilogy.constants import DEFAULT_NAMESPACE
2
- from trilogy.core.enums import ConceptSource, FunctionType, Purpose
2
+ from trilogy.core.enums import ConceptSource, DatePart, FunctionType, Purpose
3
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
@@ -64,6 +64,30 @@ def generate_date_concepts(concept: Concept, environment: Environment):
64
64
  if new_concept.name in environment.concepts:
65
65
  continue
66
66
  environment.add_concept(new_concept, add_derived=False)
67
+ for grain in [DatePart.MONTH, DatePart.YEAR]:
68
+ function = factory.create_function(
69
+ operator=FunctionType.DATE_TRUNCATE,
70
+ args=[concept, grain],
71
+ )
72
+ new_concept = Concept(
73
+ name=f"{concept.name}.{grain.value}_start",
74
+ datatype=DataType.DATE,
75
+ purpose=Purpose.PROPERTY,
76
+ lineage=function,
77
+ grain=concept.grain,
78
+ namespace=concept.namespace,
79
+ keys=set(
80
+ [concept.address],
81
+ ),
82
+ metadata=Metadata(
83
+ description=f"Auto-derived from {base_description}. The date truncated to the {grain.value}.",
84
+ line_number=base_line_number,
85
+ concept_source=ConceptSource.AUTO_DERIVED,
86
+ ),
87
+ )
88
+ if new_concept.name in environment.concepts:
89
+ continue
90
+ environment.add_concept(new_concept, add_derived=False)
67
91
 
68
92
 
69
93
  def generate_datetime_concepts(concept: Concept, environment: Environment):
@@ -1658,8 +1658,13 @@ class Function(DataTyped, ConceptArgs, Mergeable, Namespaced, BaseModel):
1658
1658
  # attempt to exit early to avoid checking all types
1659
1659
  break
1660
1660
  elif isinstance(arg, ptype):
1661
+ if isinstance(arg, str) and DataType.DATE_PART in valid_inputs[idx]:
1662
+ if arg not in [x.value for x in DatePart]:
1663
+ pass
1664
+ else:
1665
+ break
1661
1666
  raise TypeError(
1662
- f"Invalid {dtype} constant passed into {operator_name} {arg}, expecting one of {valid_inputs[idx]}"
1667
+ f'Invalid {dtype} constant passed into {operator_name} "{arg}", expecting one of {valid_inputs[idx]}'
1663
1668
  )
1664
1669
  return v
1665
1670
 
@@ -2362,6 +2367,7 @@ FuncArgs = (
2362
2367
  | FilterItem
2363
2368
  | int
2364
2369
  | float
2370
+ | DatePart
2365
2371
  | str
2366
2372
  | date
2367
2373
  | datetime
@@ -2371,7 +2377,6 @@ FuncArgs = (
2371
2377
  | ListType
2372
2378
  | MapType
2373
2379
  | NumericType
2374
- | DatePart
2375
2380
  | list
2376
2381
  | ListWrapper[Any]
2377
2382
  )
@@ -250,7 +250,7 @@ class Environment(BaseModel):
250
250
  imports=dict(self.imports),
251
251
  namespace=self.namespace,
252
252
  working_path=self.working_path,
253
- environment_config=self.config,
253
+ environment_config=self.config.model_copy(deep=True),
254
254
  version=self.version,
255
255
  cte_name_map=dict(self.cte_name_map),
256
256
  materialized_concepts=set(self.materialized_concepts),
trilogy/dialect/duckdb.py CHANGED
@@ -27,6 +27,7 @@ FUNCTION_MAP = {
27
27
  FunctionType.INDEX_ACCESS: lambda args: (f"{args[0]}[{args[1]}]"),
28
28
  # datetime is aliased
29
29
  FunctionType.CURRENT_DATETIME: lambda x: "cast(get_current_timestamp() as datetime)",
30
+ FunctionType.DATE: lambda x: f"cast({x[0]} as date)",
30
31
  FunctionType.DATE_TRUNCATE: lambda x: f"date_trunc('{x[1]}', {x[0]})",
31
32
  FunctionType.DATE_ADD: lambda x: f"date_add({x[0]}, {x[2]} * INTERVAL 1 {x[1]})",
32
33
  FunctionType.DATE_PART: lambda x: f"date_part('{x[1]}', {x[0]})",