@@ -186,6 +186,7 @@ class SnapshotIntervals(PydanticModel):
186186 dev_intervals : Intervals = []
187187 pending_restatement_intervals : Intervals = []
188188 last_altered_ts : t .Optional [int ] = None
189+ dev_last_altered_ts : t .Optional [int ] = None
189190
190191 @property
191192 def snapshot_id (self ) -> t .Optional [SnapshotId ]:
@@ -206,6 +207,12 @@ def add_dev_interval(self, start: int, end: int) -> None:
206207 def add_pending_restatement_interval (self , start : int , end : int ) -> None :
207208 self ._add_interval (start , end , "pending_restatement_intervals" )
208209
210+ def add_last_altered_ts (self , last_altered_ts : t .Optional [int ]) -> None :
211+ self ._add_last_altered_ts (last_altered_ts , "last_altered_ts" )
212+
213+ def add_dev_last_altered_ts (self , last_altered_ts : t .Optional [int ]) -> None :
214+ self ._add_last_altered_ts (last_altered_ts , "dev_last_altered_ts" )
215+
209216 def remove_interval (self , start : int , end : int ) -> None :
210217 self ._remove_interval (start , end , "intervals" )
211218
@@ -225,6 +232,13 @@ def _add_interval(self, start: int, end: int, interval_attr: str) -> None:
225232 target_intervals = merge_intervals ([* target_intervals , (start , end )])
226233 setattr (self , interval_attr , target_intervals )
227234
235+ def _add_last_altered_ts (
236+ self , last_altered_ts : t .Optional [int ], last_altered_attr : str
237+ ) -> None :
238+ if last_altered_ts :
239+ existing_last_altered_ts = getattr (self , last_altered_attr )
240+ setattr (self , last_altered_attr , max (existing_last_altered_ts or - 1 , last_altered_ts ))
241+
228242 def _remove_interval (self , start : int , end : int , interval_attr : str ) -> None :
229243 target_intervals = getattr (self , interval_attr )
230244 target_intervals = remove_interval (target_intervals , start , end )
@@ -687,6 +701,7 @@ class Snapshot(PydanticModel, SnapshotInfoMixin):
687701 # Physical table last modified timestamp, not to be confused with the "updated_ts" field
688702 # which is for the snapshot record itself
689703 last_altered_ts : t .Optional [int ] = None
704+ dev_last_altered_ts : t .Optional [int ] = None
690705
691706 @field_validator ("ttl" )
692707 @classmethod
@@ -726,13 +741,6 @@ def hydrate_with_intervals_by_version(
726741 for interval in snapshot_intervals :
727742 snapshot .merge_intervals (interval )
728743
729- # Differentiate last_altered_ts between snapshots with shared version but
730- # different dev versions e.g prod vs FORWARD_ONLY dev
731- if snapshot .dev_version == interval .dev_version and interval .last_altered_ts :
732- snapshot .last_altered_ts = max (
733- snapshot .last_altered_ts or - 1 , interval .last_altered_ts
734- )
735-
736744 result .append (snapshot )
737745
738746 return result
@@ -939,12 +947,20 @@ def merge_intervals(self, other: t.Union[Snapshot, SnapshotIntervals]) -> None:
939947 if not apply_effective_from or end <= effective_from_ts :
940948 self .add_interval (start , end )
941949
950+ if other .last_altered_ts :
951+ self .last_altered_ts = max (self .last_altered_ts or - 1 , other .last_altered_ts )
952+
942953 if self .dev_version == other .dev_version :
943954 # Merge dev intervals if the dev versions match which would mean
944955 # that this and the other snapshot are pointing to the same dev table.
945956 for start , end in other .dev_intervals :
946957 self .add_interval (start , end , is_dev = True )
947958
959+ if other .dev_last_altered_ts :
960+ self .dev_last_altered_ts = max (
961+ self .dev_last_altered_ts or - 1 , other .dev_last_altered_ts
962+ )
963+
948964 self .pending_restatement_intervals = merge_intervals (
949965 [* self .pending_restatement_intervals , * other .pending_restatement_intervals ]
950966 )
0 commit comments