pytrilogy 0.0.2.39__py3-none-any.whl → 0.0.2.40__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.39
3
+ Version: 0.0.2.40
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -21,10 +21,10 @@ Requires-Dist: pyodbc
21
21
  Requires-Dist: pydantic
22
22
  Requires-Dist: duckdb-engine
23
23
  Requires-Dist: click
24
- Provides-Extra: bigquery
25
- Requires-Dist: sqlalchemy-bigquery; extra == "bigquery"
26
24
  Provides-Extra: postgres
27
25
  Requires-Dist: psycopg2-binary; extra == "postgres"
26
+ Provides-Extra: bigquery
27
+ Requires-Dist: sqlalchemy-bigquery; extra == "bigquery"
28
28
  Provides-Extra: snowflake
29
29
  Requires-Dist: snowflake-sqlalchemy; extra == "snowflake"
30
30
 
@@ -1,4 +1,4 @@
1
- trilogy/__init__.py,sha256=yX0F1t4N_maMFKbruOAtDv1ZZx40t3DP_jLMW2X1-tA,291
1
+ trilogy/__init__.py,sha256=2E7nMoyCbDG8XWcPC2wKkOfnlTRrPzFPzBTUxxpk8U4,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
@@ -16,7 +16,7 @@ trilogy/core/exceptions.py,sha256=NvV_4qLOgKXbpotgRf7c8BANDEvHxlqRPaA53IThQ2o,56
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=hNW55X6rqDoe7tm9DM61zqEvleAjcVktTTmYyEHYZdU,163003
19
+ trilogy/core/models.py,sha256=S_Qq1HpDDTFI1JRrr9Ky-2K2VusiUkpe7rfq44CclBQ,163041
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
@@ -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=wkK8NESHfko7bUavaMFvJHzaGNoHd3r03j-kfIyD4bY,34626
53
+ trilogy/dialect/base.py,sha256=ubBrXe-Pb-9LjG1bCvZW7U3M0Nor4R1Ulgu1u6YcULY,34606
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
@@ -70,14 +70,14 @@ trilogy/parsing/common.py,sha256=_GW9LU6_4RuUgcdcr8EE1ybCRd-7cz3idZtjHZ66pYA,101
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=NMBFZ3EPUYEsPhBFrUAxs8qEEKV7Naiz8e0sUvB_M7k,65252
74
- trilogy/parsing/render.py,sha256=FWKk2xEA0gWwE4WFHLo4Q9mGPcujT1aPHRxmqnGGQ8A,15714
73
+ trilogy/parsing/parse_engine.py,sha256=KMeHQf8iW-UKd4JstGgcoo6O3OZ14MaQW50g1PMjEEQ,65256
74
+ trilogy/parsing/render.py,sha256=-qqpXQg4yHcv284Vosjnsc_vrPveH6oaYbeCd3ZSvs0,15682
75
75
  trilogy/parsing/trilogy.lark,sha256=YOgt-rE_0ZHRex_fTeqZiHvu5a4BX5UBOUu1LAVCyug,12391
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.39.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
79
- pytrilogy-0.0.2.39.dist-info/METADATA,sha256=fxJFY0sR884pHmLQY7SL1LFG3BmXLZ3xCTOzTm4-nOg,8424
80
- pytrilogy-0.0.2.39.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
81
- pytrilogy-0.0.2.39.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
82
- pytrilogy-0.0.2.39.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
83
- pytrilogy-0.0.2.39.dist-info/RECORD,,
78
+ pytrilogy-0.0.2.40.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
79
+ pytrilogy-0.0.2.40.dist-info/METADATA,sha256=xgH5_k_JkGbPM1lpHQYkEQvbPizwXPjnZduBAZUrdzs,8424
80
+ pytrilogy-0.0.2.40.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
81
+ pytrilogy-0.0.2.40.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
82
+ pytrilogy-0.0.2.40.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
83
+ pytrilogy-0.0.2.40.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
trilogy/__init__.py CHANGED
@@ -4,6 +4,6 @@ from trilogy.executor import Executor
4
4
  from trilogy.parser import parse
5
5
  from trilogy.constants import CONFIG
6
6
 
7
- __version__ = "0.0.2.39"
7
+ __version__ = "0.0.2.40"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/core/models.py CHANGED
@@ -448,8 +448,8 @@ class Concept(Mergeable, Namespaced, SelectContext, BaseModel):
448
448
  ] = None
449
449
  namespace: Optional[str] = Field(default=DEFAULT_NAMESPACE, validate_default=True)
450
450
  keys: Optional[Tuple["Concept", ...]] = None
451
- grain: "Grain" = Field(default=None, validate_default=True)
452
- modifiers: Optional[List[Modifier]] = Field(default_factory=list)
451
+ grain: "Grain" = Field(default=None, validate_default=True) # type: ignore
452
+ modifiers: List[Modifier] = Field(default_factory=list) # type: ignore
453
453
  pseudonyms: set[str] = Field(default_factory=set)
454
454
  _address_cache: str | None = None
455
455
 
@@ -3372,7 +3372,7 @@ class Environment(BaseModel):
3372
3372
  functions: Dict[str, Function] = Field(default_factory=dict)
3373
3373
  data_types: Dict[str, DataType] = Field(default_factory=dict)
3374
3374
  imports: Dict[str, list[ImportStatement]] = Field(
3375
- default_factory=lambda: defaultdict(list)
3375
+ default_factory=lambda: defaultdict(list) # type: ignore
3376
3376
  )
3377
3377
  namespace: str = DEFAULT_NAMESPACE
3378
3378
  working_path: str | Path = Field(default_factory=lambda: os.getcwd())
trilogy/dialect/base.py CHANGED
@@ -138,10 +138,10 @@ FUNCTION_MAP = {
138
138
  FunctionType.STRUCT: lambda x: f"{{{', '.join(struct_arg(x))}}}",
139
139
  FunctionType.ARRAY: lambda x: f"[{', '.join(x)}]",
140
140
  # math
141
- FunctionType.ADD: lambda x: f"{x[0]} + {x[1]}",
142
- FunctionType.SUBTRACT: lambda x: f"{x[0]} - {x[1]}",
143
- FunctionType.DIVIDE: lambda x: f"{x[0]} / {x[1]}",
144
- FunctionType.MULTIPLY: lambda x: f"{x[0]} * {x[1]}",
141
+ FunctionType.ADD: lambda x: " + ".join(x),
142
+ FunctionType.SUBTRACT: lambda x: " - ".join(x),
143
+ FunctionType.DIVIDE: lambda x: " / ".join(x),
144
+ FunctionType.MULTIPLY: lambda x: " * ".join(x),
145
145
  FunctionType.ROUND: lambda x: f"round({x[0]},{x[1]})",
146
146
  FunctionType.MOD: lambda x: f"({x[0]} % {x[1]})",
147
147
  # aggregate types
@@ -1777,7 +1777,7 @@ class ParseToObjects(Transformer):
1777
1777
  output_datatype=output_datatype,
1778
1778
  output_purpose=function_args_to_output_purpose(args),
1779
1779
  valid_inputs={DataType.INTEGER, DataType.FLOAT, DataType.NUMBER},
1780
- arg_count=2,
1780
+ arg_count=-1,
1781
1781
  )
1782
1782
 
1783
1783
  @v_args(meta=True)
@@ -1790,7 +1790,7 @@ class ParseToObjects(Transformer):
1790
1790
  output_datatype=output_datatype,
1791
1791
  output_purpose=function_args_to_output_purpose(args),
1792
1792
  valid_inputs={DataType.INTEGER, DataType.FLOAT, DataType.NUMBER},
1793
- arg_count=2,
1793
+ arg_count=-1,
1794
1794
  )
1795
1795
 
1796
1796
  @v_args(meta=True)
@@ -1803,7 +1803,7 @@ class ParseToObjects(Transformer):
1803
1803
  output_datatype=output_datatype,
1804
1804
  output_purpose=function_args_to_output_purpose(args),
1805
1805
  valid_inputs={DataType.INTEGER, DataType.FLOAT, DataType.NUMBER},
1806
- arg_count=2,
1806
+ arg_count=-1,
1807
1807
  )
1808
1808
 
1809
1809
  @v_args(meta=True)
@@ -1817,7 +1817,7 @@ class ParseToObjects(Transformer):
1817
1817
  output_datatype=DataType.FLOAT, # division always returns a float
1818
1818
  output_purpose=function_args_to_output_purpose(args),
1819
1819
  valid_inputs={DataType.INTEGER, DataType.FLOAT, DataType.NUMBER},
1820
- arg_count=2,
1820
+ arg_count=-1,
1821
1821
  )
1822
1822
 
1823
1823
  @v_args(meta=True)
trilogy/parsing/render.py CHANGED
@@ -395,13 +395,13 @@ class Renderer:
395
395
  args = [self.to_string(c) for c in arg.arguments]
396
396
 
397
397
  if arg.operator == FunctionType.SUBTRACT:
398
- return f"{args[0]} - {args[1]}"
398
+ return " - ".join(args)
399
399
  if arg.operator == FunctionType.ADD:
400
- return f"{args[0]} + {args[1]}"
400
+ return " + ".join(args)
401
401
  if arg.operator == FunctionType.MULTIPLY:
402
- return f"{args[0]} * {args[1]}"
402
+ return " * ".join(args)
403
403
  if arg.operator == FunctionType.DIVIDE:
404
- return f"{args[0]} / {args[1]}"
404
+ return " / ".join(args)
405
405
  if arg.operator == FunctionType.MOD:
406
406
  return f"{args[0]} % {args[1]}"
407
407