pytrilogy 0.0.2.4__py3-none-any.whl → 0.0.2.5__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.4
3
+ Version: 0.0.2.5
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=sspl5Npt0npzVRC6wCwiYXa0nK0E7a_biwiL2T4kbjM,290
1
+ trilogy/__init__.py,sha256=G0m-s6-kVPyb3h30zrE3-u5ozpWLm2Rh5Xa1s_XCQkA,290
2
2
  trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  trilogy/constants.py,sha256=KIvi-cgU4R9urNgDdGiCsRkCrzjAfM4xGHhZb1SVy2w,881
4
4
  trilogy/engine.py,sha256=R5ubIxYyrxRExz07aZCUfrTsoXCHQ8DKFTDsobXdWdA,1102
@@ -16,13 +16,13 @@ trilogy/core/exceptions.py,sha256=NvV_4qLOgKXbpotgRf7c8BANDEvHxlqRPaA53IThQ2o,56
16
16
  trilogy/core/functions.py,sha256=ARJAyBjeS415-54k3G_bx807rkPZonEulMaLRxSP7vU,10371
17
17
  trilogy/core/graph_models.py,sha256=oJUMSpmYhqXlavckHLpR07GJxuQ8dZ1VbB1fB0KaS8c,2036
18
18
  trilogy/core/internal.py,sha256=jNGFHKENnbMiMCtAgsnLZYVSENDK4b5ALecXFZpTDzQ,1075
19
- trilogy/core/models.py,sha256=KVPUfupZVhQxJZCViMP7PELzvNR7WOwkjmqqgEM4oeM,137120
19
+ trilogy/core/models.py,sha256=LXjP2zAS_GlHYpnEwXI7XvIf0fgfufFbwG7ND6c0UZ4,137206
20
20
  trilogy/core/optimization.py,sha256=A8S9C9H5RcQcFSQLYtEEBnm-r1CW_e9GEWlLK7q3MqA,4930
21
21
  trilogy/core/query_processor.py,sha256=6JiX6YqsTgnsEkIxcmWFxJuM6kRJbXbPGRCQgi8g-B8,17941
22
22
  trilogy/core/optimizations/__init__.py,sha256=pxRzNzd2g8oRMy4f_ub5va6bNS2pd4hnyp9JBzTKc1E,300
23
23
  trilogy/core/optimizations/base_optimization.py,sha256=tWWT-xnTbnEU-mNi_isMNbywm8B9WTRsNFwGpeh3rqE,468
24
24
  trilogy/core/optimizations/inline_constant.py,sha256=kHNyc2UoaPVdYfVAPAFwnWuk4sJ_IF5faRtVcDOrBtw,1110
25
- trilogy/core/optimizations/inline_datasource.py,sha256=KiwZ4fnRnSOVK8zzdwMAkafszo3fNn5LY8xgb0X1CbI,3194
25
+ trilogy/core/optimizations/inline_datasource.py,sha256=9_jTjKZrRG_mPeQlvuKK2grSiZMMD2pqG4E9PAL9J4U,3383
26
26
  trilogy/core/optimizations/predicate_pushdown.py,sha256=iVZV_BVaL3I6wlELPOuJAiuF0heOM7bCUnNqyCxxRVw,6370
27
27
  trilogy/core/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  trilogy/core/processing/concept_strategies_v3.py,sha256=xCPfg1ySHP6C-u777kqnV8eqIK1X68hqwvRcw61q5X0,23968
@@ -49,11 +49,11 @@ trilogy/core/processing/nodes/select_node_v2.py,sha256=COu-WPuyabGAc3HTkJB-_7eNz
49
49
  trilogy/core/processing/nodes/unnest_node.py,sha256=JFtm90IVM-46aCYkTNIaJah6v9ApAfonjVhcVM1HmDE,1903
50
50
  trilogy/core/processing/nodes/window_node.py,sha256=X7qxLUKd3tekjUUsmH_4vz5b-U89gMnGd04VBxuu2Ns,1280
51
51
  trilogy/dialect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
- trilogy/dialect/base.py,sha256=aE8iJJhkGtZE04mYm_wQx3ebQKYbcRsKISUd9mbrZ2A,28782
52
+ trilogy/dialect/base.py,sha256=x7fcFej-UuQs9zJ-hdvJptcoWPRaMpU4uJ6iriviQ2c,28782
53
53
  trilogy/dialect/bigquery.py,sha256=15KJ-cOpBlk9O7FPviPgmg8xIydJeKx7WfmL3SSsPE8,2953
54
54
  trilogy/dialect/common.py,sha256=5jdOHWIj3Xv8F8y5mnyWHLjxD_we2fncM-ZnNetJP7U,2781
55
55
  trilogy/dialect/config.py,sha256=tLVEMctaTDhUgARKXUNfHUcIolGaALkQ0RavUvXAY4w,2994
56
- trilogy/dialect/duckdb.py,sha256=JEdhctDxZr-FEodot5V4De6JnrQDJT02zbjX48j6ay8,3125
56
+ trilogy/dialect/duckdb.py,sha256=PHDNekefyUgdtpdJS-MVZQgfaich5pSec0e50IVPMMw,3124
57
57
  trilogy/dialect/enums.py,sha256=4NdpsydBpDn6jnh0JzFz5VvQEtnShErWtWHVyT6TNpw,3948
58
58
  trilogy/dialect/postgres.py,sha256=ev1RJZsC8BB3vJSxJ4q-TTYqZ4Hk1NXUtuRkLrQEBX0,3254
59
59
  trilogy/dialect/presto.py,sha256=InvHDXsGLDG3E3ffl7hGZ-9y3vH8RO6UhNE0OSra01g,3269
@@ -74,9 +74,9 @@ trilogy/parsing/render.py,sha256=Gy_6wVYPwYLf35Iota08sbqveuWILtUhI8MYStcvtJM,121
74
74
  trilogy/parsing/trilogy.lark,sha256=uQlyb4RQ6Tpp8lRlXLK_Qb8sD1qzYVYErRI97v22Zak,11317
75
75
  trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  trilogy/scripts/trilogy.py,sha256=PHxvv6f2ODv0esyyhWxlARgra8dVhqQhYl0lTrSyVNo,3729
77
- pytrilogy-0.0.2.4.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
78
- pytrilogy-0.0.2.4.dist-info/METADATA,sha256=R3D4ULv2Y2yJRO0sToJ5FlPPiqkU8H02X035M-vaG9s,7906
79
- pytrilogy-0.0.2.4.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
80
- pytrilogy-0.0.2.4.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
81
- pytrilogy-0.0.2.4.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
82
- pytrilogy-0.0.2.4.dist-info/RECORD,,
77
+ pytrilogy-0.0.2.5.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
78
+ pytrilogy-0.0.2.5.dist-info/METADATA,sha256=_CyF8RQ_R1rWgRwlxBpPWeiYJyAGyfTd-2XMW2PRyHI,7906
79
+ pytrilogy-0.0.2.5.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
80
+ pytrilogy-0.0.2.5.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
81
+ pytrilogy-0.0.2.5.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
82
+ pytrilogy-0.0.2.5.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.4"
7
+ __version__ = "0.0.2.5"
8
8
 
9
9
  __all__ = ["parse", "Executor", "Dialects", "Environment", "CONFIG"]
trilogy/core/models.py CHANGED
@@ -2433,7 +2433,13 @@ class CTE(BaseModel):
2433
2433
  # if we've entirely removed the need to join to someplace to get the concept
2434
2434
  # drop the join as well.
2435
2435
  for removed_cte in removed:
2436
- still_required = any([removed_cte in x for x in self.source_map.values()])
2436
+ still_required = any(
2437
+ [
2438
+ removed_cte in x
2439
+ for x in self.source_map.values()
2440
+ or self.existence_source_map.values()
2441
+ ]
2442
+ )
2437
2443
  if not still_required:
2438
2444
  self.joins = [
2439
2445
  join
@@ -2451,6 +2457,7 @@ class CTE(BaseModel):
2451
2457
  candidates = [x.name for x in self.parent_ctes]
2452
2458
  self.base_name_override = candidates[0] if candidates else None
2453
2459
  self.base_alias_override = candidates[0] if candidates else None
2460
+ return True
2454
2461
 
2455
2462
  def inline_parent_datasource(self, parent: CTE, force_group: bool = False) -> bool:
2456
2463
  qds_being_inlined = parent.source
@@ -3315,7 +3322,7 @@ class Comparison(
3315
3322
  and self.operator == other.operator
3316
3323
  )
3317
3324
 
3318
- def inline_constant(self, constant: Concept) -> "Comparison":
3325
+ def inline_constant(self, constant: Concept):
3319
3326
  assert isinstance(constant.lineage, Function)
3320
3327
  new_val = constant.lineage.arguments[0]
3321
3328
  if isinstance(self.left, ConstantInlineable):
@@ -3332,10 +3339,7 @@ class Comparison(
3332
3339
  else:
3333
3340
  new_right = self.right
3334
3341
 
3335
- if self.right == constant:
3336
- new_right = new_val
3337
-
3338
- return Comparison(
3342
+ return self.__class__(
3339
3343
  left=new_left,
3340
3344
  right=new_right,
3341
3345
  operator=self.operator,
@@ -43,10 +43,14 @@ class InlineDatasource(OptimizationRule):
43
43
  continue
44
44
  root_outputs = {x.address for x in root.output_concepts}
45
45
  cte_outputs = {x.address for x in cte.output_columns}
46
+ inherited = {x for x, v in cte.source_map.items() if v}
46
47
  # cte_inherited_outputs = {x.address for x in parent_cte.output_columns if parent_cte.source_map.get(x.address)}
47
48
  grain_components = {x.address for x in root.grain.components}
48
- if not cte_outputs.issubset(root_outputs):
49
- self.log(f"Not all {parent_cte.name} outputs are found on datasource")
49
+ if not inherited.issubset(root_outputs):
50
+ cte_missing = inherited - root_outputs
51
+ self.log(
52
+ f"Not all {parent_cte.name} require inputs are found on datasource, missing {cte_missing}"
53
+ )
50
54
  continue
51
55
  if not grain_components.issubset(cte_outputs):
52
56
  self.log("Not all datasource components in cte outputs, forcing group")
trilogy/dialect/base.py CHANGED
@@ -188,10 +188,11 @@ FUNCTION_GRAIN_MATCH_MAP = {
188
188
  GENERIC_SQL_TEMPLATE = Template(
189
189
  """{%- if ctes %}
190
190
  WITH {% for cte in ctes %}
191
- {{cte.name}} as ({{cte.statement}}){% if not loop.last %},{% endif %}{% endfor %}{% endif %}
191
+ {{cte.name}} as (
192
+ {{cte.statement}}){% if not loop.last %},{% endif %}{% endfor %}{% endif %}
192
193
  {%- if full_select -%}
193
194
  {{full_select}}
194
- {%- else -%}
195
+ {% else -%}
195
196
  SELECT
196
197
  {%- if limit is not none %}
197
198
  TOP {{ limit }}{% endif %}
trilogy/dialect/duckdb.py CHANGED
@@ -49,7 +49,6 @@ WITH {% for cte in ctes %}
49
49
  {{cte.name}} as ({{cte.statement}}){% if not loop.last %},{% endif %}{% endfor %}{% endif %}
50
50
  {% if full_select -%}{{full_select}}
51
51
  {% else -%}
52
-
53
52
  SELECT
54
53
  {%- for select in select_columns %}
55
54
  {{ select }}{% if not loop.last %},{% endif %}{% endfor %}