6262 Config ,
6363 load_configs ,
6464)
65+ from sqlmesh .core .config .connection import ConnectionConfig
6566from sqlmesh .core .config .loader import C
67+ from sqlmesh .core .config .root import RegexKeyDict
6668from sqlmesh .core .console import get_console
6769from sqlmesh .core .context_diff import ContextDiff
6870from sqlmesh .core .dialect import (
9193from sqlmesh .core .plan .definition import UserProvidedFlags
9294from sqlmesh .core .reference import ReferenceGraph
9395from sqlmesh .core .scheduler import Scheduler , CompletionStatus
96+ from sqlmesh .core .schema_diff import SchemaDiffer
9497from sqlmesh .core .schema_loader import create_external_models_file
9598from sqlmesh .core .selector import Selector
9699from sqlmesh .core .snapshot import (
@@ -366,7 +369,7 @@ def __init__(
366369 self ._environment_statements : t .List [EnvironmentStatements ] = []
367370 self ._excluded_requirements : t .Set [str ] = set ()
368371 self ._default_catalog : t .Optional [str ] = None
369- self ._default_catalog_per_gateway : t .Optional [t . Dict [ str , str ] ] = None
372+ self ._engine_adapter : t .Optional [EngineAdapter ] = None
370373 self ._linters : t .Dict [str , Linter ] = {}
371374 self ._loaded : bool = False
372375
@@ -407,24 +410,15 @@ def __init__(
407410 for path , config in self .configs .items ()
408411 ]
409412
410- self ._connection_config = self . config . get_connection ( self . gateway )
413+ self ._concurrent_tasks = concurrent_tasks
411414 self ._state_connection_config = (
412415 self .config .get_state_connection (self .gateway ) or self ._connection_config
413416 )
414- self .concurrent_tasks = concurrent_tasks or self ._connection_config .concurrent_tasks
415-
416- self ._engine_adapters : t .Dict [str , EngineAdapter ] = {
417- self .selected_gateway : self ._connection_config .create_engine_adapter ()
418- }
419417
420418 self ._snapshot_evaluator : t .Optional [SnapshotEvaluator ] = None
421419
422420 self .console = get_console ()
423- setattr (self .console , "dialect" , self .engine_adapter .dialect )
424-
425- self ._test_connection_config = self .config .get_test_connection (
426- self .gateway , self .default_catalog , default_catalog_dialect = self .engine_adapter .DIALECT
427- )
421+ setattr (self .console , "dialect" , self .config .dialect )
428422
429423 self ._provided_state_sync : t .Optional [StateSync ] = state_sync
430424 self ._state_sync : t .Optional [StateSync ] = None
@@ -435,14 +429,6 @@ def __init__(
435429 self .users = list ({user .username : user for user in self .users }.values ())
436430 self ._register_notification_targets ()
437431
438- if (
439- self .config .environment_catalog_mapping
440- and not self .engine_adapter .catalog_support .is_multi_catalog_supported
441- ):
442- raise SQLMeshError (
443- "Environment catalog mapping is only supported for engine adapters that support multiple catalogs"
444- )
445-
446432 if load :
447433 self .load ()
448434
@@ -453,7 +439,9 @@ def default_dialect(self) -> t.Optional[str]:
453439 @property
454440 def engine_adapter (self ) -> EngineAdapter :
455441 """Returns the default engine adapter."""
456- return self ._engine_adapters [self .selected_gateway ]
442+ if self ._engine_adapter is None :
443+ self ._engine_adapter = self ._connection_config .create_engine_adapter ()
444+ return self ._engine_adapter
457445
458446 @property
459447 def snapshot_evaluator (self ) -> SnapshotEvaluator :
@@ -1535,7 +1523,7 @@ def plan_builder(
15351523 allow_destructive_models = expanded_destructive_models ,
15361524 environment_ttl = environment_ttl ,
15371525 environment_suffix_target = self .config .environment_suffix_target ,
1538- environment_catalog_mapping = self .config . environment_catalog_mapping ,
1526+ environment_catalog_mapping = self .environment_catalog_mapping ,
15391527 categorizer_config = categorizer_config or self .auto_categorize_changes ,
15401528 auto_categorization_enabled = not no_auto_categorization ,
15411529 effective_from = effective_from ,
@@ -1547,7 +1535,7 @@ def plan_builder(
15471535 ),
15481536 end_bounded = not run ,
15491537 ensure_finalized_snapshots = self .config .plan .use_finalized_state ,
1550- engine_schema_differ = self . engine_adapter . SCHEMA_DIFFER ,
1538+ engine_schema_differ = SchemaDiffer (), # TODO: fix to properly handle it
15511539 interval_end_per_model = max_interval_end_per_model ,
15521540 console = self .console ,
15531541 user_provided_flags = user_provided_flags ,
@@ -1636,7 +1624,7 @@ def diff(self, environment: t.Optional[str] = None, detailed: bool = False) -> b
16361624 self .console .show_model_difference_summary (
16371625 context_diff ,
16381626 EnvironmentNamingInfo .from_environment_catalog_mapping (
1639- self .config . environment_catalog_mapping ,
1627+ self .environment_catalog_mapping ,
16401628 name = environment ,
16411629 suffix_target = self .config .environment_suffix_target ,
16421630 normalize_name = context_diff .normalize_environment_name ,
@@ -2036,7 +2024,7 @@ def test(
20362024 preserve_fixtures = preserve_fixtures ,
20372025 stream = stream ,
20382026 default_catalog = self .default_catalog ,
2039- default_catalog_dialect = self .engine_adapter . DIALECT ,
2027+ default_catalog_dialect = self .config . dialect or "" ,
20402028 )
20412029
20422030 @python_api_analytics
@@ -2496,7 +2484,7 @@ def _model_tables(self) -> t.Dict[str, str]:
24962484 if snapshot .version
24972485 else snapshot .qualified_view_name .for_environment (
24982486 EnvironmentNamingInfo .from_environment_catalog_mapping (
2499- self .config . environment_catalog_mapping ,
2487+ self .environment_catalog_mapping ,
25002488 name = c .PROD ,
25012489 suffix_target = self .config .environment_suffix_target ,
25022490 )
@@ -2508,23 +2496,47 @@ def _model_tables(self) -> t.Dict[str, str]:
25082496 @cached_property
25092497 def engine_adapters (self ) -> t .Dict [str , EngineAdapter ]:
25102498 """Returns all the engine adapters for the gateways defined in the configuration."""
2499+ adapters : t .Dict [str , EngineAdapter ] = {self .selected_gateway : self .engine_adapter }
25112500 for gateway_name in self .config .gateways :
25122501 if gateway_name != self .selected_gateway :
25132502 connection = self .config .get_connection (gateway_name )
25142503 adapter = connection .create_engine_adapter (concurrent_tasks = self .concurrent_tasks )
2515- self . _engine_adapters [gateway_name ] = adapter
2516- return self . _engine_adapters
2504+ adapters [gateway_name ] = adapter
2505+ return adapters
25172506
25182507 @cached_property
25192508 def default_catalog_per_gateway (self ) -> t .Dict [str , str ]:
25202509 """Returns the default catalogs for each engine adapter."""
2521- if self ._default_catalog_per_gateway is None :
2522- self ._default_catalog_per_gateway = {
2523- name : adapter .default_catalog
2524- for name , adapter in self .engine_adapters .items ()
2525- if adapter .default_catalog
2526- }
2527- return self ._default_catalog_per_gateway
2510+ if self .gateway_managed_virtual_layer :
2511+ return self ._scheduler .get_default_catalog_per_gateway (self )
2512+ return {}
2513+
2514+ @cached_property
2515+ def concurrent_tasks (self ) -> int :
2516+ if self ._concurrent_tasks is None :
2517+ self ._concurrent_tasks = self ._connection_config .concurrent_tasks
2518+ return self ._concurrent_tasks
2519+
2520+ @cached_property
2521+ def _connection_config (self ) -> ConnectionConfig :
2522+ return self .config .get_connection (self .gateway )
2523+
2524+ @cached_property
2525+ def _test_connection_config (self ) -> ConnectionConfig :
2526+ return self .config .get_test_connection (
2527+ self .gateway , self .default_catalog , default_catalog_dialect = self .engine_adapter .DIALECT
2528+ )
2529+
2530+ @cached_property
2531+ def environment_catalog_mapping (self ) -> RegexKeyDict :
2532+ if (
2533+ self .config .environment_catalog_mapping
2534+ and not self .engine_adapter .catalog_support .is_multi_catalog_supported
2535+ ):
2536+ raise SQLMeshError (
2537+ "Environment catalog mapping is only supported for engine adapters that support multiple catalogs"
2538+ )
2539+ return self .config .environment_catalog_mapping
25282540
25292541 def _get_engine_adapter (self , gateway : t .Optional [str ] = None ) -> EngineAdapter :
25302542 if gateway :
0 commit comments