pytrilogy 0.0.2.35__py3-none-any.whl → 0.0.2.36__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.1
2
2
  Name: pytrilogy
3
- Version: 0.0.2.35
3
+ Version: 0.0.2.36
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,8 +1,8 @@
1
- trilogy/__init__.py,sha256=U5WUYHe0fhxaKEzGbop_KX-WSQsCDldtJFhRs5Ojqys,291
1
+ trilogy/__init__.py,sha256=nmEtedZ0VhRnMAaMT0xsUW46MvwSivUw-Vq9Y6h2M70,291
2
2
  trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  trilogy/constants.py,sha256=HQAnGUqJ5uMri7TWtqXHhz8iVWBzi2LCfRG8vKnBIB8,1269
4
4
  trilogy/engine.py,sha256=R5ubIxYyrxRExz07aZCUfrTsoXCHQ8DKFTDsobXdWdA,1102
5
- trilogy/executor.py,sha256=VcZ2U3RUU2al_VJ75AKVwmCJQLltYouxlgTjq4oxPB0,12577
5
+ trilogy/executor.py,sha256=0b0iEd660aR3_rJlHp73azRu5iQK6si5qEszoSwz8FU,13472
6
6
  trilogy/parser.py,sha256=UtuqSiGiCjpMAYgo1bvNq-b7NSzCA5hzbUW31RXaMII,281
7
7
  trilogy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  trilogy/utility.py,sha256=zM__8r29EsyDW7K9VOHz8yvZC2bXFzh7xKy3cL7GKsk,707
@@ -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=9jSrHBh8aE2BD4aoETm_QhRN3KI1mI009xKHTp8fLWE,162668
19
+ trilogy/core/models.py,sha256=iP1ioJmKDS1_43TE0mIGWZGDtFPD3m8kKvXYA9lwCkg,162860
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
@@ -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=ukdJ5QlWcWGkvb7kd3PnnOXEVpURHm0rap8QCvvjALg,63811
74
- trilogy/parsing/render.py,sha256=VKyo8wEOuiOzUtJ6w9EoGGmkhlqDQyy8wFj_Q_h6EfE,15263
75
- trilogy/parsing/trilogy.lark,sha256=Tuqw5oGMwOYt3TYOEx_hZqGpsAp-PiAKiMW8S3EFRcg,12236
73
+ trilogy/parsing/parse_engine.py,sha256=Mv2GrE-7IteyK67wZBPm0iEXY2Wbnb4CPNNSD3kXn-E,63915
74
+ trilogy/parsing/render.py,sha256=dhHkwmZ5HNNJr-z81JDpN2TBe4Ktqarus5vtMn2-_B8,15502
75
+ trilogy/parsing/trilogy.lark,sha256=o3gZiqPE3FNEJjJZDeSZ-ETD3HUQDIFZaYWrVDmxSB4,12319
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.35.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
79
- pytrilogy-0.0.2.35.dist-info/METADATA,sha256=X18LM4yuJMZ4kh9Q6BUOWlxvEZgmRXMBCp9F3GNmQuA,8424
80
- pytrilogy-0.0.2.35.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
81
- pytrilogy-0.0.2.35.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
82
- pytrilogy-0.0.2.35.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
83
- pytrilogy-0.0.2.35.dist-info/RECORD,,
78
+ pytrilogy-0.0.2.36.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
79
+ pytrilogy-0.0.2.36.dist-info/METADATA,sha256=Zl-ztc3tMnv-LbxCvmAItYOrmJ-p1pIDYW0uOmRFwYI,8424
80
+ pytrilogy-0.0.2.36.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
81
+ pytrilogy-0.0.2.36.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
82
+ pytrilogy-0.0.2.36.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
83
+ pytrilogy-0.0.2.36.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.4.0)
2
+ Generator: setuptools (75.5.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.35"
7
+ __version__ = "0.0.2.36"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/core/models.py CHANGED
@@ -3276,7 +3276,7 @@ class EnvironmentConceptDict(dict):
3276
3276
  return default
3277
3277
 
3278
3278
  def __getitem__(
3279
- self, key, line_no: int | None = None
3279
+ self, key, line_no: int | None = None, file: Path | None = None
3280
3280
  ) -> Concept | UndefinedConcept:
3281
3281
  try:
3282
3282
  return super(EnvironmentConceptDict, self).__getitem__(key)
@@ -3304,6 +3304,10 @@ class EnvironmentConceptDict(dict):
3304
3304
  message += f" Suggestions: {matches}"
3305
3305
 
3306
3306
  if line_no:
3307
+ if file:
3308
+ raise UndefinedConceptException(
3309
+ f"{file}: {line_no}: " + message, matches
3310
+ )
3307
3311
  raise UndefinedConceptException(f"line: {line_no}: " + message, matches)
3308
3312
  raise UndefinedConceptException(message, matches)
3309
3313
 
trilogy/executor.py CHANGED
@@ -20,6 +20,8 @@ from trilogy.core.models import (
20
20
  ConceptDeclarationStatement,
21
21
  Datasource,
22
22
  CopyStatement,
23
+ ImportStatement,
24
+ MergeStatementV2,
23
25
  )
24
26
  from trilogy.dialect.base import BaseDialect
25
27
  from trilogy.dialect.enums import Dialects
@@ -104,6 +106,7 @@ class Executor(object):
104
106
  ProcessedShowStatement,
105
107
  ProcessedQueryPersist,
106
108
  ProcessedCopyStatement,
109
+ ProcessedRawSQLStatement,
107
110
  ),
108
111
  ):
109
112
  return None
@@ -142,7 +145,6 @@ class Executor(object):
142
145
 
143
146
  @execute_query.register
144
147
  def _(self, query: str) -> CursorResult:
145
-
146
148
  return self.execute_text(query)[-1]
147
149
 
148
150
  @execute_query.register
@@ -181,6 +183,35 @@ class Executor(object):
181
183
  ],
182
184
  )
183
185
 
186
+ @execute_query.register
187
+ def _(self, query: ImportStatement) -> CursorResult:
188
+ self.environment.add_file_import(query.path, query.alias)
189
+ return MockResult(
190
+ [
191
+ {
192
+ "path": query.path,
193
+ "alias": query.alias,
194
+ }
195
+ ],
196
+ ["path", "alias"],
197
+ )
198
+
199
+ @execute_query.register
200
+ def _(self, query: MergeStatementV2) -> CursorResult:
201
+
202
+ self.environment.merge_concept(
203
+ query.source, query.target, modifiers=query.modifiers
204
+ )
205
+ return MockResult(
206
+ [
207
+ {
208
+ "source": query.source.address,
209
+ "target": query.target.address,
210
+ }
211
+ ],
212
+ ["source", "target"],
213
+ )
214
+
184
215
  @execute_query.register
185
216
  def _(self, query: ProcessedRawSQLStatement) -> CursorResult:
186
217
  return self.execute_raw_sql(query.text)
@@ -302,6 +302,9 @@ class ParseToObjects(Transformer):
302
302
  def IDENTIFIER(self, args) -> str:
303
303
  return args.value
304
304
 
305
+ def QUOTED_IDENTIFIER(self, args) -> str:
306
+ return args.value[1:-1]
307
+
305
308
  @v_args(meta=True)
306
309
  def concept_lit(self, meta: Meta, args) -> Concept:
307
310
  return self.environment.concepts.__getitem__(args[0], meta.line)
@@ -386,7 +389,7 @@ class ParseToObjects(Transformer):
386
389
  modifiers += concept_list[:-1]
387
390
  concept = concept_list[-1]
388
391
  resolved = self.environment.concepts.__getitem__( # type: ignore
389
- key=concept, line_no=meta.line
392
+ key=concept, line_no=meta.line, file=self.token_address
390
393
  )
391
394
  return ColumnAssignment(alias=alias, modifiers=modifiers, concept=resolved)
392
395
 
trilogy/parsing/render.py CHANGED
@@ -368,9 +368,15 @@ class Renderer:
368
368
 
369
369
  @to_string.register
370
370
  def _(self, arg: "ImportStatement"):
371
- if arg.alias == DEFAULT_NAMESPACE:
372
- return f"import {arg.path};"
373
- return f"import {arg.path} as {arg.alias};"
371
+ path: str = str(arg.path).replace("\\", ".")
372
+ path = path.replace("/", ".")
373
+ if path.endswith(".preql"):
374
+ path = path.rsplit(".", 1)[0]
375
+ if path.startswith("."):
376
+ path = path[1:]
377
+ if arg.alias == DEFAULT_NAMESPACE or not arg.alias:
378
+ return f"import {path};"
379
+ return f"import {path} as {arg.alias};"
374
380
 
375
381
  @to_string.register
376
382
  def _(self, arg: "Concept"):
@@ -49,7 +49,7 @@
49
49
 
50
50
  //column_assignment
51
51
  //figure out if we want static
52
- column_assignment: (raw_column_assignment | IDENTIFIER | _static_functions ) ":" concept_assignment
52
+ column_assignment: (raw_column_assignment | IDENTIFIER | QUOTED_IDENTIFIER | _static_functions ) ":" concept_assignment
53
53
 
54
54
  RAW_ENTRY.1: /raw\s*\(/s
55
55
 
@@ -292,6 +292,7 @@
292
292
  // base language constructs
293
293
  concept_lit: IDENTIFIER
294
294
  IDENTIFIER: /[a-zA-Z\_][a-zA-Z0-9\_\-\.]*/
295
+ QUOTED_IDENTIFIER: /`[a-zA-Z\_][a-zA-Z0-9\_\.\-\*\:\s]*`/
295
296
  QUOTED_ADDRESS: /`[a-zA-Z\_][a-zA-Z0-9\_\.\-\*\:]*`/
296
297
  ADDRESS: IDENTIFIER
297
298