|
52 | 52 | from sqlmesh.core.state_sync.db.snapshot import SnapshotState |
53 | 53 | from sqlmesh.core.state_sync.db.version import VersionState |
54 | 54 | from sqlmesh.core.state_sync.db.migrator import StateMigrator |
55 | | -from sqlmesh.utils.date import TimeLike, to_timestamp |
| 55 | +from sqlmesh.utils.date import TimeLike, to_timestamp, time_like_to_str |
56 | 56 | from sqlmesh.utils.errors import ConflictingPlanError, SQLMeshError |
57 | 57 |
|
58 | 58 | logger = logging.getLogger(__name__) |
@@ -358,7 +358,24 @@ def add_interval( |
358 | 358 |
|
359 | 359 | @transactional() |
360 | 360 | def add_snapshots_intervals(self, snapshots_intervals: t.Sequence[SnapshotIntervals]) -> None: |
361 | | - self.interval_state.add_snapshots_intervals(snapshots_intervals) |
| 361 | + intervals_to_insert = [] |
| 362 | + for snapshot_intervals in snapshots_intervals: |
| 363 | + snapshot_intervals = snapshot_intervals.copy( |
| 364 | + update={ |
| 365 | + "intervals": _remove_partial_intervals( |
| 366 | + snapshot_intervals.intervals, snapshot_intervals.snapshot_id, is_dev=False |
| 367 | + ), |
| 368 | + "dev_intervals": _remove_partial_intervals( |
| 369 | + snapshot_intervals.dev_intervals, |
| 370 | + snapshot_intervals.snapshot_id, |
| 371 | + is_dev=True, |
| 372 | + ), |
| 373 | + } |
| 374 | + ) |
| 375 | + if not snapshot_intervals.is_empty(): |
| 376 | + intervals_to_insert.append(snapshot_intervals) |
| 377 | + if intervals_to_insert: |
| 378 | + self.interval_state.add_snapshots_intervals(intervals_to_insert) |
362 | 379 |
|
363 | 380 | @transactional() |
364 | 381 | def remove_intervals( |
@@ -478,3 +495,27 @@ def _ensure_no_gaps( |
478 | 495 | def _transaction(self) -> t.Iterator[None]: |
479 | 496 | with self.engine_adapter.transaction(): |
480 | 497 | yield |
| 498 | + |
| 499 | + |
| 500 | +def _remove_partial_intervals( |
| 501 | + intervals: t.List[Interval], snapshot_id: t.Optional[SnapshotId], *, is_dev: bool |
| 502 | +) -> t.List[Interval]: |
| 503 | + results = [] |
| 504 | + for start_ts, end_ts in intervals: |
| 505 | + if start_ts < end_ts: |
| 506 | + logger.info( |
| 507 | + "Adding %s (%s, %s) for snapshot %s", |
| 508 | + "dev interval" if is_dev else "interval", |
| 509 | + time_like_to_str(start_ts), |
| 510 | + time_like_to_str(end_ts), |
| 511 | + snapshot_id, |
| 512 | + ) |
| 513 | + results.append((start_ts, end_ts)) |
| 514 | + else: |
| 515 | + logger.info( |
| 516 | + "Skipping partial interval (%s, %s) for snapshot %s", |
| 517 | + start_ts, |
| 518 | + end_ts, |
| 519 | + snapshot_id, |
| 520 | + ) |
| 521 | + return results |
0 commit comments