|
42 | 42 | yesterday_ds, |
43 | 43 | to_timestamp, |
44 | 44 | time_like_to_str, |
| 45 | + is_relative, |
45 | 46 | ) |
46 | 47 | from sqlmesh.utils.errors import NoChangesPlanError, PlanError |
47 | 48 |
|
@@ -139,7 +140,7 @@ def __init__( |
139 | 140 | self._include_unmodified = include_unmodified |
140 | 141 | self._restate_models = set(restate_models) if restate_models is not None else None |
141 | 142 | self._effective_from = effective_from |
142 | | - self._execution_time = execution_time |
| 143 | + self._execution_time = execution_time or now() |
143 | 144 | self._backfill_models = backfill_models |
144 | 145 | self._end = end or default_end |
145 | 146 | self._apply = apply |
@@ -176,20 +177,18 @@ def is_start_and_end_allowed(self) -> bool: |
176 | 177 |
|
177 | 178 | @property |
178 | 179 | def start(self) -> t.Optional[TimeLike]: |
179 | | - if self._start and self._execution_time: |
| 180 | + if self._start and is_relative(self._start): |
| 181 | + # only do this for relative expressions otherwise inclusive date strings like '2020-01-01' can be turned into exclusive timestamps eg '2020-01-01 00:00:00' |
180 | 182 | return to_datetime(self._start, relative_base=to_datetime(self._execution_time)) |
181 | 183 | return self._start |
182 | 184 |
|
183 | 185 | @property |
184 | 186 | def end(self) -> t.Optional[TimeLike]: |
185 | | - if self._end and self._execution_time: |
| 187 | + if self._end and is_relative(self._end): |
| 188 | + # only do this for relative expressions otherwise inclusive date strings like '2020-01-01' can be turned into exclusive timestamps eg '2020-01-01 00:00:00' |
186 | 189 | return to_datetime(self._end, relative_base=to_datetime(self._execution_time)) |
187 | 190 | return self._end |
188 | 191 |
|
189 | | - @property |
190 | | - def execution_time(self) -> TimeLike: |
191 | | - return self._execution_time or now() |
192 | | - |
193 | 192 | def set_start(self, new_start: TimeLike) -> PlanBuilder: |
194 | 193 | self._start = new_start |
195 | 194 | self.override_start = True |
@@ -274,7 +273,8 @@ def build(self) -> Plan: |
274 | 273 | ) |
275 | 274 |
|
276 | 275 | restatements = self._build_restatements( |
277 | | - dag, earliest_interval_start(self._context_diff.snapshots.values(), self.execution_time) |
| 276 | + dag, |
| 277 | + earliest_interval_start(self._context_diff.snapshots.values(), self._execution_time), |
278 | 278 | ) |
279 | 279 | models_to_backfill = self._build_models_to_backfill(dag, restatements) |
280 | 280 |
|
@@ -307,7 +307,7 @@ def build(self) -> Plan: |
307 | 307 | selected_models_to_backfill=self._backfill_models, |
308 | 308 | models_to_backfill=models_to_backfill, |
309 | 309 | effective_from=self._effective_from, |
310 | | - execution_time=self.execution_time, |
| 310 | + execution_time=self._execution_time, |
311 | 311 | end_bounded=self._end_bounded, |
312 | 312 | ensure_finalized_snapshots=self._ensure_finalized_snapshots, |
313 | 313 | user_provided_flags=self._user_provided_flags, |
@@ -764,9 +764,9 @@ def _ensure_valid_date_range(self) -> None: |
764 | 764 | ) |
765 | 765 |
|
766 | 766 | if end := self.end: |
767 | | - if to_datetime(end) > to_datetime(self.execution_time): |
| 767 | + if to_datetime(end) > to_datetime(self._execution_time): |
768 | 768 | raise PlanError( |
769 | | - f"Plan end date: '{time_like_to_str(end)}' cannot be in the future (execution time: '{time_like_to_str(self.execution_time)}')" |
| 769 | + f"Plan end date: '{time_like_to_str(end)}' cannot be in the future (execution time: '{time_like_to_str(self._execution_time)}')" |
770 | 770 | ) |
771 | 771 |
|
772 | 772 | def _ensure_no_forward_only_revert(self) -> None: |
|
0 commit comments