|
116 | 116 | run_tests, |
117 | 117 | ) |
118 | 118 | from sqlmesh.core.user import User |
119 | | -from sqlmesh.utils import UniqueKeyDict, Verbosity |
| 119 | +from sqlmesh.utils import UniqueKeyDict, Verbosity, CorrelationId |
120 | 120 | from sqlmesh.utils.concurrency import concurrent_apply_to_values |
121 | 121 | from sqlmesh.utils.dag import DAG |
122 | 122 | from sqlmesh.utils.date import ( |
@@ -418,7 +418,7 @@ def __init__( |
418 | 418 | self.config.get_state_connection(self.gateway) or self.connection_config |
419 | 419 | ) |
420 | 420 |
|
421 | | - self._snapshot_evaluator: t.Optional[SnapshotEvaluator] = None |
| 421 | + self._snapshot_evaluators: t.Dict[t.Optional[CorrelationId], SnapshotEvaluator] = {} |
422 | 422 |
|
423 | 423 | self.console = get_console() |
424 | 424 | setattr(self.console, "dialect", self.config.dialect) |
@@ -446,20 +446,18 @@ def engine_adapter(self) -> EngineAdapter: |
446 | 446 | self._engine_adapter = self.connection_config.create_engine_adapter() |
447 | 447 | return self._engine_adapter |
448 | 448 |
|
449 | | - def snapshot_evaluator(self, job_id: t.Optional[str] = None) -> SnapshotEvaluator: |
| 449 | + def snapshot_evaluator(self, job_id: t.Optional[CorrelationId] = None) -> SnapshotEvaluator: |
450 | 450 | # Cache snapshot evaluators by job_id to avoid old job_ids being attached to future Context operations |
451 | | - if not self._snapshot_evaluator or any( |
452 | | - adapter._job_id != job_id for adapter in self._snapshot_evaluator.adapters.values() |
453 | | - ): |
454 | | - self._snapshot_evaluator = SnapshotEvaluator( |
| 451 | + if job_id not in self._snapshot_evaluators: |
| 452 | + self._snapshot_evaluators[job_id] = SnapshotEvaluator( |
455 | 453 | { |
456 | 454 | gateway: adapter.with_settings(level=logging.INFO, job_id=job_id) |
457 | 455 | for gateway, adapter in self.engine_adapters.items() |
458 | 456 | }, |
459 | 457 | ddl_concurrent_tasks=self.concurrent_tasks, |
460 | 458 | selected_gateway=self.selected_gateway, |
461 | 459 | ) |
462 | | - return self._snapshot_evaluator |
| 460 | + return self._snapshot_evaluators[job_id] |
463 | 461 |
|
464 | 462 | def execution_context( |
465 | 463 | self, |
@@ -541,7 +539,7 @@ def scheduler(self, environment: t.Optional[str] = None) -> Scheduler: |
541 | 539 | return self.create_scheduler(snapshots) |
542 | 540 |
|
543 | 541 | def create_scheduler( |
544 | | - self, snapshots: t.Iterable[Snapshot], job_id: t.Optional[str] = None |
| 542 | + self, snapshots: t.Iterable[Snapshot], job_id: t.Optional[CorrelationId] = None |
545 | 543 | ) -> Scheduler: |
546 | 544 | """Creates the built-in scheduler. |
547 | 545 |
|
@@ -1594,7 +1592,7 @@ def apply( |
1594 | 1592 | ) |
1595 | 1593 | explainer.evaluate( |
1596 | 1594 | plan.to_evaluatable(), |
1597 | | - snapshot_evaluator=self.snapshot_evaluator(job_id=plan.plan_id), |
| 1595 | + snapshot_evaluator=self.snapshot_evaluator(job_id=CorrelationId.from_plan(plan)), |
1598 | 1596 | ) |
1599 | 1597 | return |
1600 | 1598 |
|
@@ -2341,8 +2339,8 @@ def print_environment_names(self) -> None: |
2341 | 2339 |
|
2342 | 2340 | def close(self) -> None: |
2343 | 2341 | """Releases all resources allocated by this context.""" |
2344 | | - if self._snapshot_evaluator: |
2345 | | - self._snapshot_evaluator.close() |
| 2342 | + for evaluator in self._snapshot_evaluators.values(): |
| 2343 | + evaluator.close() |
2346 | 2344 | if self._state_sync: |
2347 | 2345 | self._state_sync.close() |
2348 | 2346 |
|
@@ -2397,7 +2395,7 @@ def _run( |
2397 | 2395 | def _apply(self, plan: Plan, circuit_breaker: t.Optional[t.Callable[[], bool]]) -> None: |
2398 | 2396 | self._scheduler.create_plan_evaluator(self).evaluate( |
2399 | 2397 | plan.to_evaluatable(), |
2400 | | - snapshot_evaluator=self.snapshot_evaluator(job_id=plan.plan_id), |
| 2398 | + snapshot_evaluator=self.snapshot_evaluator(job_id=CorrelationId.from_plan(plan)), |
2401 | 2399 | circuit_breaker=circuit_breaker, |
2402 | 2400 | ) |
2403 | 2401 |
|
|
0 commit comments