pytrilogy 0.0.3.72__py3-none-any.whl → 0.0.3.73__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.72
3
+ Version: 0.0.3.73
4
4
  Summary: Declarative, typed query language that compiles to SQL.
5
5
  Home-page:
6
6
  Author:
@@ -1,7 +1,7 @@
1
- pytrilogy-0.0.3.72.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
- trilogy/__init__.py,sha256=nTClKJQdHtjmdR7uHkenK_MjPmcfU2r_PQcI3PwQuNQ,303
1
+ pytrilogy-0.0.3.73.dist-info/licenses/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
2
+ trilogy/__init__.py,sha256=QMg3__Goia6PP_-WfMP9ZmROmpZ0XzX4rCz9MvpBb_w,303
3
3
  trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- trilogy/constants.py,sha256=lv_aJWP6dn6e2aF4BAE72jbnNtceFddfqtiDSsvzno0,1692
4
+ trilogy/constants.py,sha256=eKb_EJvSqjN9tGbdVEViwdtwwh8fZ3-jpOEDqL71y70,1691
5
5
  trilogy/engine.py,sha256=OK2RuqCIUId6yZ5hfF8J1nxGP0AJqHRZiafcowmW0xc,1728
6
6
  trilogy/executor.py,sha256=BolR6UwgDOdIcDG0gw_OSaB23rISgIn8Dzdll0kODmg,16506
7
7
  trilogy/parser.py,sha256=o4cfk3j3yhUFoiDKq9ZX_GjBF3dKhDjXEwb63rcBkBM,293
@@ -29,7 +29,7 @@ trilogy/core/models/build_environment.py,sha256=s_C9xAHuD3yZ26T15pWVBvoqvlp2LdZ8
29
29
  trilogy/core/models/core.py,sha256=EMAuWTngoNVGCdfNrAY7_k6g528iodNQLwPRVip-8DA,10980
30
30
  trilogy/core/models/datasource.py,sha256=wogTevZ-9CyUW2a8gjzqMCieircxi-J5lkI7EOAZnck,9596
31
31
  trilogy/core/models/environment.py,sha256=TBbPfsXHpJK49QKuqHwhgZD4PwHiSAYjXmTTTomRE7o,27861
32
- trilogy/core/models/execute.py,sha256=A4SkqmOW9XrbgPDhP7LnS9dUq-Tw4vgzVcQbkkB2ljA,41706
32
+ trilogy/core/models/execute.py,sha256=Erufst3yroU3PgNJMWF5lICm14AkH02laYeesSB01UU,41705
33
33
  trilogy/core/optimizations/__init__.py,sha256=YH2-mGXZnVDnBcWVi8vTbrdw7Qs5TivG4h38rH3js_I,290
34
34
  trilogy/core/optimizations/base_optimization.py,sha256=gzDOKImoFn36k7XBD3ysEYDnbnb6vdVIztUfFQZsGnM,513
35
35
  trilogy/core/optimizations/inline_datasource.py,sha256=2sWNRpoRInnTgo9wExVT_r9RfLAQHI57reEV5cGHUcg,4329
@@ -41,7 +41,7 @@ trilogy/core/processing/discovery_node_factory.py,sha256=I3JJxoF-u8OVvqXXAOhvMg2
41
41
  trilogy/core/processing/discovery_utility.py,sha256=3xdd1ypKappSDm0SJs7WtW5YegL80SlYhDQlkNePp4E,4549
42
42
  trilogy/core/processing/discovery_validation.py,sha256=fGWJmKpgEd1f4RkK-fYOBUT1cwsJnahwXFAdRlou7MI,5365
43
43
  trilogy/core/processing/graph_utils.py,sha256=8QUVrkE9j-9C1AyrCb1nQEh8daCe0u1HuXl-Te85lag,1205
44
- trilogy/core/processing/utility.py,sha256=b1F3NT7-MP_-U4KmpC52BOAwLu6mybfndeA1iiZwChw,22016
44
+ trilogy/core/processing/utility.py,sha256=ChD1lP2iXtfsI1bS08OZsJ2o9t877OhNXrDvyEgYdmY,22581
45
45
  trilogy/core/processing/node_generators/__init__.py,sha256=w8TQQgNhyAra6JQHdg1_Ags4BGyxjXYruu6UeC5yOkI,873
46
46
  trilogy/core/processing/node_generators/basic_node.py,sha256=luN8LftafZepoFgDRv4gmvEGFlOI2j0icJ5fz4UT7uo,5165
47
47
  trilogy/core/processing/node_generators/common.py,sha256=PdysdroW9DUADP7f5Wv_GKPUyCTROZV1g3L45fawxi8,9443
@@ -57,7 +57,7 @@ trilogy/core/processing/node_generators/select_node.py,sha256=Ta1G39V94gjX_AgyZD
57
57
  trilogy/core/processing/node_generators/synonym_node.py,sha256=AnAsa_Wj50NJ_IK0HSgab_7klYmKVrv0WI1uUe-GvEY,3766
58
58
  trilogy/core/processing/node_generators/union_node.py,sha256=VNo6Oey4p8etU9xrOh2oTT2lIOTvY6PULUPRvVa2uxU,2877
59
59
  trilogy/core/processing/node_generators/unnest_node.py,sha256=ueOQtoTf2iJHO09RzWHDFQ5iKZq2fVhGf2KAF2U2kU8,2677
60
- trilogy/core/processing/node_generators/window_node.py,sha256=8ZULQZW05nKlGQ1yRQF7XsiD5-AtRlqpkPYjZ1pq7Ak,6631
60
+ trilogy/core/processing/node_generators/window_node.py,sha256=A90linr4pkZtTNfn9k2YNLqrJ_SFII3lbHxB-BC6mI8,6688
61
61
  trilogy/core/processing/node_generators/select_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  trilogy/core/processing/node_generators/select_helpers/datasource_injection.py,sha256=mKCDHxr2eyrdozXEHq_HvuwtBgnb9JPlImJIx6JGX34,7834
63
63
  trilogy/core/processing/nodes/__init__.py,sha256=zTge1EzwzEydlcMliIFO_TT7h7lS8l37lyZuQDir1h0,5487
@@ -77,16 +77,16 @@ trilogy/core/statements/common.py,sha256=KxEmz2ySySyZ6CTPzn0fJl5NX2KOk1RPyuUSwWh
77
77
  trilogy/core/statements/execute.py,sha256=rqfuoMuXPcH7L7TmE1dSiZ_K_A1ohB8whVMfGimZBOk,1294
78
78
  trilogy/dialect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
79
  trilogy/dialect/base.py,sha256=5FI4_XDdSavdHeC3VhSI8xrvQagFyRRq6Ttsh70ajo4,45241
80
- trilogy/dialect/bigquery.py,sha256=e19dGcarapgA0x5_Xmq2StyHzuDWPOOPaR4elkWXwug,4203
81
- trilogy/dialect/common.py,sha256=hhzuMTFW9QQIP7TKLT9BlJy6lw2R03a68jKQ-7t4-2c,6070
80
+ trilogy/dialect/bigquery.py,sha256=8xhEu0z_lKANjbvzvBbC7CeKrJf1iP8YyrHqNale-ug,4351
81
+ trilogy/dialect/common.py,sha256=tSthIZOXXRPQ4KeMKnDDsH7KlTmf2EVqigVtLyoc4zc,6071
82
82
  trilogy/dialect/config.py,sha256=olnyeVU5W5T6b9-dMeNAnvxuPlyc2uefb7FRME094Ec,3834
83
83
  trilogy/dialect/dataframe.py,sha256=RUbNgReEa9g3pL6H7fP9lPTrAij5pkqedpZ99D8_5AE,1522
84
84
  trilogy/dialect/duckdb.py,sha256=gsXhPKX0D7ykJ9RFK9qx8uBTjLgtHu6PYv6GlBFtnJE,4448
85
85
  trilogy/dialect/enums.py,sha256=FRNYQ5-w-B6-X0yXKNU5g9GowsMlERFogTC5u2nxL_s,4740
86
- trilogy/dialect/postgres.py,sha256=VH4EB4myjIeZTHeFU6vK00GxY9c53rCBjg2mLbdaCEE,3254
87
- trilogy/dialect/presto.py,sha256=Wd0yHq3EOSfCOy7lWPfCr13JHO3olsm8qUXgml-oTm0,3529
88
- trilogy/dialect/snowflake.py,sha256=LQIcHuyuGZXbxrv6sH17aLXLzw7yFVuRoE9M4doNk5k,3187
89
- trilogy/dialect/sql_server.py,sha256=z2Vg7Qvw83rbGiEFIvHHLqVWJTWiz2xs76kpQj4HdTU,3131
86
+ trilogy/dialect/postgres.py,sha256=el2PKwfyvWGk5EZtLudqAH5ewLitY1sFHJiocBSyxyM,3393
87
+ trilogy/dialect/presto.py,sha256=yzSF8SZ6o1dizj1UueAa7S3lR0qNYJdSXbF78EHyhY0,3668
88
+ trilogy/dialect/snowflake.py,sha256=T6_mKfhpDazB1xQxqFLS2AJwzwzBcPYY6_qxRnAtFBs,3326
89
+ trilogy/dialect/sql_server.py,sha256=HnUEvb8Yjl6MnMWTITzpFPZgDajhGzfDPz5A8dDerak,3279
90
90
  trilogy/hooks/__init__.py,sha256=T3SF3phuUDPLXKGRVE_Lf9mzuwoXWyaLolncR_1kY30,144
91
91
  trilogy/hooks/base_hook.py,sha256=I_l-NBMNC7hKTDx1JgHZPVOOCvLQ36m2oIGaR5EUMXY,1180
92
92
  trilogy/hooks/graph_hook.py,sha256=5BfR7Dt0bgEsCLgwjowgCsVkboGYfVJGOz8g9mqpnos,4756
@@ -110,8 +110,8 @@ trilogy/std/money.preql,sha256=XWwvAV3WxBsHX9zfptoYRnBigcfYwrYtBHXTME0xJuQ,2082
110
110
  trilogy/std/net.preql,sha256=7l7MqIjs6TDCpO6dBAoNJU81Ex255jZRK36kBgE1GDs,158
111
111
  trilogy/std/ranking.preql,sha256=LDoZrYyz4g3xsII9XwXfmstZD-_92i1Eox1UqkBIfi8,83
112
112
  trilogy/std/report.preql,sha256=LbV-XlHdfw0jgnQ8pV7acG95xrd1-p65fVpiIc-S7W4,202
113
- pytrilogy-0.0.3.72.dist-info/METADATA,sha256=FuNovLn_nPyODANKBbc681JtNz4gBoUVY9udJ7n7A3k,9734
114
- pytrilogy-0.0.3.72.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
115
- pytrilogy-0.0.3.72.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
116
- pytrilogy-0.0.3.72.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
117
- pytrilogy-0.0.3.72.dist-info/RECORD,,
113
+ pytrilogy-0.0.3.73.dist-info/METADATA,sha256=hMwyLjCer0xl2zhn1XH4PijoJrNy7oXV9qKyHIDfUWA,9734
114
+ pytrilogy-0.0.3.73.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
115
+ pytrilogy-0.0.3.73.dist-info/entry_points.txt,sha256=ewBPU2vLnVexZVnB-NrVj-p3E-4vukg83Zk8A55Wp2w,56
116
+ pytrilogy-0.0.3.73.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
117
+ pytrilogy-0.0.3.73.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.72"
7
+ __version__ = "0.0.3.73"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/constants.py CHANGED
@@ -37,7 +37,7 @@ class Comments:
37
37
  show: bool = False
38
38
  basic: bool = True
39
39
  joins: bool = True
40
- nullable: bool = False
40
+ nullable: bool = True
41
41
  partial: bool = True
42
42
 
43
43
 
@@ -501,7 +501,6 @@ class BaseJoin(BaseModel):
501
501
  f"Cannot join a dataself to itself, joining {self.left_datasource} and"
502
502
  f" {self.right_datasource}"
503
503
  )
504
-
505
504
  # Early returns maintained as in original code
506
505
  if self.concept_pairs or self.concepts == []:
507
506
  return self
@@ -69,6 +69,8 @@ def gen_window_node(
69
69
  # append in keys to get the right grain
70
70
  if concept.keys:
71
71
  for item in concept.keys:
72
+ if item in targets:
73
+ continue
72
74
  logger.info(
73
75
  f"{padding(depth)}{LOGGER_PREFIX} appending search for key {item}"
74
76
  )
@@ -13,6 +13,7 @@ from trilogy.core.enums import (
13
13
  FunctionClass,
14
14
  Granularity,
15
15
  JoinType,
16
+ Modifier,
16
17
  Purpose,
17
18
  )
18
19
  from trilogy.core.models.build import (
@@ -355,6 +356,20 @@ def reduce_concept_pairs(input: list[ConceptPair]) -> list[ConceptPair]:
355
356
  return final
356
357
 
357
358
 
359
+ def get_modifiers(
360
+ concept: str,
361
+ join: JoinOrderOutput,
362
+ ds_node_map: dict[str, QueryDatasource | BuildDatasource],
363
+ ):
364
+ base = []
365
+
366
+ if join.right and concept in ds_node_map[join.right].nullable_concepts:
367
+ base.append(Modifier.NULLABLE)
368
+ if join.left and concept in ds_node_map[join.left].nullable_concepts:
369
+ base.append(Modifier.NULLABLE)
370
+ return list(set(base))
371
+
372
+
358
373
  def get_node_joins(
359
374
  datasources: List[QueryDatasource | BuildDatasource],
360
375
  environment: BuildEnvironment,
@@ -400,6 +415,9 @@ def get_node_joins(
400
415
  concept_map[concept], ds_node_map[j.right]
401
416
  ),
402
417
  existing_datasource=ds_node_map[k],
418
+ modifiers=get_modifiers(
419
+ concept_map[concept].address, j, ds_node_map
420
+ ),
403
421
  )
404
422
  for k, v in j.keys.items()
405
423
  for concept in v
@@ -43,7 +43,8 @@ FUNCTION_MAP = {
43
43
 
44
44
  FUNCTION_GRAIN_MATCH_MAP = {
45
45
  **FUNCTION_MAP,
46
- FunctionType.COUNT: lambda args: "1",
46
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
47
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
47
48
  FunctionType.SUM: lambda args: f"{args[0]}",
48
49
  FunctionType.AVG: lambda args: f"{args[0]}",
49
50
  }
trilogy/dialect/common.py CHANGED
@@ -20,6 +20,7 @@ from trilogy.core.models.execute import (
20
20
 
21
21
 
22
22
  def null_wrapper(lval: str, rval: str, modifiers: list[Modifier]) -> str:
23
+
23
24
  if Modifier.NULLABLE in modifiers:
24
25
  return f"({lval} = {rval} or ({lval} is null and {rval} is null))"
25
26
  return f"{lval} = {rval}"
@@ -37,7 +37,8 @@ FUNCTION_MAP = {
37
37
 
38
38
  FUNCTION_GRAIN_MATCH_MAP = {
39
39
  **FUNCTION_MAP,
40
- FunctionType.COUNT: lambda args: f"{args[0]}",
40
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
41
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
41
42
  FunctionType.SUM: lambda args: f"{args[0]}",
42
43
  FunctionType.AVG: lambda args: f"{args[0]}",
43
44
  }
trilogy/dialect/presto.py CHANGED
@@ -39,7 +39,8 @@ FUNCTION_MAP = {
39
39
 
40
40
  FUNCTION_GRAIN_MATCH_MAP = {
41
41
  **FUNCTION_MAP,
42
- FunctionType.COUNT: lambda args: f"{args[0]}",
42
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
43
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
43
44
  FunctionType.SUM: lambda args: f"{args[0]}",
44
45
  FunctionType.AVG: lambda args: f"{args[0]}",
45
46
  }
@@ -36,7 +36,8 @@ FUNCTION_MAP = {
36
36
 
37
37
  FUNCTION_GRAIN_MATCH_MAP = {
38
38
  **FUNCTION_MAP,
39
- FunctionType.COUNT: lambda args: f"{args[0]}",
39
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
40
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
40
41
  FunctionType.SUM: lambda args: f"{args[0]}",
41
42
  FunctionType.AVG: lambda args: f"{args[0]}",
42
43
  }
@@ -31,7 +31,8 @@ FUNCTION_MAP = {
31
31
  # we may return a static value
32
32
  FUNCTION_GRAIN_MATCH_MAP = {
33
33
  **FUNCTION_MAP,
34
- FunctionType.COUNT: lambda args: "1",
34
+ FunctionType.COUNT_DISTINCT: lambda args: f"CASE WHEN{args[0]} IS NOT NULL THEN 1 ELSE 0 END",
35
+ FunctionType.COUNT: lambda args: f"CASE WHEN {args[0]} IS NOT NULL THEN 1 ELSE 0 END",
35
36
  FunctionType.SUM: lambda args: f"{args[0]}",
36
37
  FunctionType.AVG: lambda args: f"{args[0]}",
37
38
  }