2121from sqlmesh .core .model import Model , ModelKindMixin , ModelKindName , ViewKind , CustomKind
2222from sqlmesh .core .model .definition import _Model
2323from sqlmesh .core .node import IntervalUnit , NodeType
24- from sqlmesh .utils import sanitize_name
24+ from sqlmesh .utils import sanitize_name , unique
2525from sqlmesh .utils .dag import DAG
2626from sqlmesh .utils .date import (
2727 TimeLike ,
@@ -2180,7 +2180,7 @@ def snapshots_to_dag(snapshots: t.Collection[Snapshot]) -> DAG[SnapshotId]:
21802180
21812181def apply_auto_restatements (
21822182 snapshots : t .Dict [SnapshotId , Snapshot ], execution_time : TimeLike
2183- ) -> t .List [SnapshotIntervals ]:
2183+ ) -> t .Tuple [ t . List [SnapshotIntervals ], t . Dict [ SnapshotId , t . List [ SnapshotId ]] ]:
21842184 """Applies auto restatements to the snapshots.
21852185
21862186 This operation results in the removal of intervals for snapshots that are ready to be restated based
@@ -2195,6 +2195,7 @@ def apply_auto_restatements(
21952195 A list of SnapshotIntervals with **new** intervals that need to be restated.
21962196 """
21972197 dag = snapshots_to_dag (snapshots .values ())
2198+ auto_restatement_triggers : t .Dict [SnapshotId , t .List [SnapshotId ]] = {}
21982199 auto_restated_intervals_per_snapshot : t .Dict [SnapshotId , Interval ] = {}
21992200 for s_id in dag :
22002201 if s_id not in snapshots :
@@ -2209,6 +2210,7 @@ def apply_auto_restatements(
22092210 for parent_s_id in snapshot .parents
22102211 if parent_s_id in auto_restated_intervals_per_snapshot
22112212 ]
2213+ upstream_triggers = []
22122214 if next_auto_restated_interval :
22132215 logger .info (
22142216 "Calculated the next auto restated interval (%s, %s) for snapshot %s" ,
@@ -2218,6 +2220,18 @@ def apply_auto_restatements(
22182220 )
22192221 auto_restated_intervals .append (next_auto_restated_interval )
22202222
2223+ # auto-restated snapshot is its own trigger
2224+ upstream_triggers = [s_id ]
2225+ else :
2226+ # inherit each parent's auto-restatement triggers (if any)
2227+ for parent_s_id in snapshot .parents :
2228+ if parent_s_id in auto_restatement_triggers :
2229+ upstream_triggers .extend (auto_restatement_triggers [parent_s_id ])
2230+
2231+ # remove duplicate triggers, retaining order and keeping first seen of duplicates
2232+ if upstream_triggers :
2233+ auto_restatement_triggers [s_id ] = unique (upstream_triggers )
2234+
22212235 if auto_restated_intervals :
22222236 auto_restated_interval_start = sys .maxsize
22232237 auto_restated_interval_end = - sys .maxsize
@@ -2247,20 +2261,22 @@ def apply_auto_restatements(
22472261
22482262 snapshot .apply_pending_restatement_intervals ()
22492263 snapshot .update_next_auto_restatement_ts (execution_time )
2250-
2251- return [
2252- SnapshotIntervals (
2253- name = snapshots [s_id ].name ,
2254- identifier = None ,
2255- version = snapshots [s_id ].version ,
2256- dev_version = None ,
2257- intervals = [],
2258- dev_intervals = [],
2259- pending_restatement_intervals = [interval ],
2260- )
2261- for s_id , interval in auto_restated_intervals_per_snapshot .items ()
2262- if s_id in snapshots
2263- ]
2264+ return (
2265+ [
2266+ SnapshotIntervals (
2267+ name = snapshots [s_id ].name ,
2268+ identifier = None ,
2269+ version = snapshots [s_id ].version ,
2270+ dev_version = None ,
2271+ intervals = [],
2272+ dev_intervals = [],
2273+ pending_restatement_intervals = [interval ],
2274+ )
2275+ for s_id , interval in auto_restated_intervals_per_snapshot .items ()
2276+ if s_id in snapshots
2277+ ],
2278+ auto_restatement_triggers ,
2279+ )
22642280
22652281
22662282def parent_snapshots_by_name (
0 commit comments