pytrilogy 0.0.2.29__py3-none-any.whl → 0.0.2.31__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.29
3
+ Version: 0.0.2.31
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,4 +1,4 @@
1
- trilogy/__init__.py,sha256=0Y9rVM2nobxcrfYQcGTfJVv_-3fbl5QtzNRClHX50TU,291
1
+ trilogy/__init__.py,sha256=VblpsLULNBnUhw05evBTHbgeqv65Ler6brQxBYz86lM,291
2
2
  trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  trilogy/constants.py,sha256=KiyYnctoZen4Hzv8WG2jeN-IE-dfQbWHdVCUeTZYjBg,1270
4
4
  trilogy/engine.py,sha256=R5ubIxYyrxRExz07aZCUfrTsoXCHQ8DKFTDsobXdWdA,1102
@@ -70,14 +70,14 @@ trilogy/parsing/common.py,sha256=t7yiL_3f6rz_rouF9et84v5orAgs-EprV4V9ghQ6ql4,100
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=JwG98fotPpvh5VC-CcHknCTFid9-Zj1Wfo8CyPOnJzs,64431
74
- trilogy/parsing/render.py,sha256=B9J2GrYQcE76kddMQSeAmvAPX-9pv39mpeSHZ10SNj8,14655
73
+ trilogy/parsing/parse_engine.py,sha256=goN7oQqvSjU3Vqm4lXs4bNVAoHEMT-JkL_o_fhYy9vo,64591
74
+ trilogy/parsing/render.py,sha256=VKyo8wEOuiOzUtJ6w9EoGGmkhlqDQyy8wFj_Q_h6EfE,15263
75
75
  trilogy/parsing/trilogy.lark,sha256=_z5px2N-e8oLUf7SpPMXXNqbAykDkZOvP4_lPgf5-Uk,12245
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.29.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
79
- pytrilogy-0.0.2.29.dist-info/METADATA,sha256=_grlNHrTsokAIFDU4uIYFOrJ8t7X_R5vr0kcuNMzJ6g,8403
80
- pytrilogy-0.0.2.29.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
81
- pytrilogy-0.0.2.29.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
82
- pytrilogy-0.0.2.29.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
83
- pytrilogy-0.0.2.29.dist-info/RECORD,,
78
+ pytrilogy-0.0.2.31.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
79
+ pytrilogy-0.0.2.31.dist-info/METADATA,sha256=ouEJ1harU8vFjegOhfJuIsAfDrwyyhA8Tb1rbQiH4lU,8403
80
+ pytrilogy-0.0.2.31.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
81
+ pytrilogy-0.0.2.31.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
82
+ pytrilogy-0.0.2.31.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
83
+ pytrilogy-0.0.2.31.dist-info/RECORD,,
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.29"
7
+ __version__ = "0.0.2.31"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
@@ -162,6 +162,21 @@ def parse_concept_reference(
162
162
  return lookup, namespace, name, parent
163
163
 
164
164
 
165
+ def expr_to_boolean(
166
+ root,
167
+ ) -> Union[Comparison, Conditional, SubselectComparison, Parenthetical]:
168
+ if not isinstance(root, (Comparison, Conditional, Parenthetical)):
169
+ if arg_to_datatype(root) == DataType.BOOL:
170
+ root = Comparison(left=root, right=True, operator=ComparisonOperator.EQ)
171
+ else:
172
+ root = Comparison(
173
+ left=root,
174
+ right=MagicConstants.NULL,
175
+ operator=ComparisonOperator.IS_NOT,
176
+ )
177
+ return root
178
+
179
+
165
180
  def unwrap_transformation(
166
181
  input: Union[
167
182
  FilterItem,
@@ -1022,15 +1037,7 @@ class ParseToObjects(Transformer):
1022
1037
 
1023
1038
  def where(self, args):
1024
1039
  root = args[0]
1025
- if not isinstance(root, (Comparison, Conditional, Parenthetical)):
1026
- if arg_to_datatype(root) == DataType.BOOL:
1027
- root = Comparison(left=root, right=True, operator=ComparisonOperator.EQ)
1028
- else:
1029
- root = Comparison(
1030
- left=root,
1031
- right=MagicConstants.NULL,
1032
- operator=ComparisonOperator.IS_NOT,
1033
- )
1040
+ root = expr_to_boolean(root)
1034
1041
  return WhereClause(conditional=root)
1035
1042
 
1036
1043
  def having(self, args):
@@ -1838,7 +1845,8 @@ class ParseToObjects(Transformer):
1838
1845
  @v_args(meta=True)
1839
1846
  def fcase_when(self, meta, args) -> CaseWhen:
1840
1847
  args = process_function_args(args, meta=meta, environment=self.environment)
1841
- return CaseWhen(comparison=args[0], expr=args[1])
1848
+ root = expr_to_boolean(args[0])
1849
+ return CaseWhen(comparison=root, expr=args[1])
1842
1850
 
1843
1851
  @v_args(meta=True)
1844
1852
  def fcase_else(self, meta, args) -> CaseElse:
trilogy/parsing/render.py CHANGED
@@ -386,13 +386,31 @@ class Renderer:
386
386
 
387
387
  @to_string.register
388
388
  def _(self, arg: "Function"):
389
- inputs = ",".join(self.to_string(c) for c in arg.arguments)
389
+ args = [self.to_string(c) for c in arg.arguments]
390
+
391
+ if arg.operator == FunctionType.SUBTRACT:
392
+ return f"{args[0]} - {args[1]}"
393
+ if arg.operator == FunctionType.ADD:
394
+ return f"{args[0]} + {args[1]}"
395
+ if arg.operator == FunctionType.MULTIPLY:
396
+ return f"{args[0]} * {args[1]}"
397
+ if arg.operator == FunctionType.DIVIDE:
398
+ return f"{args[0]} / {args[1]}"
399
+ if arg.operator == FunctionType.MOD:
400
+ return f"{args[0]} % {args[1]}"
401
+
402
+ inputs = ",".join(args)
403
+
390
404
  if arg.operator == FunctionType.CONSTANT:
391
405
  return f"{inputs}"
392
406
  if arg.operator == FunctionType.CAST:
393
407
  return f"CAST({self.to_string(arg.arguments[0])} AS {self.to_string(arg.arguments[1])})"
394
408
  if arg.operator == FunctionType.INDEX_ACCESS:
395
409
  return f"{self.to_string(arg.arguments[0])}[{self.to_string(arg.arguments[1])}]"
410
+
411
+ if arg.operator == FunctionType.CASE:
412
+ inputs = "\n".join(args)
413
+ return f"CASE {inputs}\nEND"
396
414
  return f"{arg.operator.value}({inputs})"
397
415
 
398
416
  @to_string.register