@@ -399,8 +399,10 @@ def __init__(
399399 self ._standalone_audits : UniqueKeyDict [str , StandaloneAudit ] = UniqueKeyDict (
400400 "standaloneaudits"
401401 )
402- self ._models_with_tests : t .Set [str ] = set ()
403402 self ._model_test_metadata : t .List [ModelTestMetadata ] = []
403+ self ._model_test_metadata_path_index : t .Dict [Path , t .List [ModelTestMetadata ]] = {}
404+ self ._model_test_metadata_fully_qualified_name_index : t .Dict [str , ModelTestMetadata ] = {}
405+ self ._models_with_tests : t .Set [str ] = set ()
404406 self ._macros : UniqueKeyDict [str , ExecutableOrMacro ] = UniqueKeyDict ("macros" )
405407 self ._metrics : UniqueKeyDict [str , Metric ] = UniqueKeyDict ("metrics" )
406408 self ._jinja_macros = JinjaMacroRegistry ()
@@ -639,8 +641,10 @@ def load(self, update_schemas: bool = True) -> GenericContext[C]:
639641 self ._excluded_requirements .clear ()
640642 self ._linters .clear ()
641643 self ._environment_statements = []
642- self ._models_with_tests .clear ()
643644 self ._model_test_metadata .clear ()
645+ self ._model_test_metadata_path_index .clear ()
646+ self ._model_test_metadata_fully_qualified_name_index .clear ()
647+ self ._models_with_tests .clear ()
644648
645649 for loader , project in zip (self ._loaders , loaded_projects ):
646650 self ._jinja_macros = self ._jinja_macros .merge (project .jinja_macros )
@@ -652,8 +656,15 @@ def load(self, update_schemas: bool = True) -> GenericContext[C]:
652656 self ._requirements .update (project .requirements )
653657 self ._excluded_requirements .update (project .excluded_requirements )
654658 self ._environment_statements .extend (project .environment_statements )
655- self ._models_with_tests .update (project .models_with_tests )
656659 self ._model_test_metadata .extend (project .model_test_metadata )
660+ for metadata in project .model_test_metadata :
661+ if metadata .path not in self ._model_test_metadata_path_index :
662+ self ._model_test_metadata_path_index [metadata .path ] = []
663+ self ._model_test_metadata_path_index [metadata .path ].append (metadata )
664+ self ._model_test_metadata_fully_qualified_name_index [
665+ metadata .fully_qualified_test_name
666+ ] = metadata
667+ self ._models_with_tests .add (metadata .model_name )
657668
658669 config = loader .config
659670 self ._linters [config .project ] = Linter .from_rules (
@@ -2232,7 +2243,7 @@ def test(
22322243
22332244 pd .set_option ("display.max_columns" , None )
22342245
2235- test_meta = self ._filter_preloaded_tests (
2246+ test_meta = self ._select_tests (
22362247 test_meta = self ._model_test_metadata , tests = tests , patterns = match_patterns
22372248 )
22382249
@@ -2796,7 +2807,7 @@ def _get_engine_adapter(self, gateway: t.Optional[str] = None) -> EngineAdapter:
27962807 raise SQLMeshError (f"Gateway '{ gateway } ' not found in the available engine adapters." )
27972808 return self .engine_adapter
27982809
2799- def _filter_preloaded_tests (
2810+ def _select_tests (
28002811 self ,
28012812 test_meta : t .List [ModelTestMetadata ],
28022813 tests : t .Optional [t .List [str ]] = None ,
@@ -2808,14 +2819,14 @@ def _filter_preloaded_tests(
28082819 filtered_tests = []
28092820 for test in tests :
28102821 if "::" in test :
2811- filename , test_name = test .split ("::" , maxsplit = 1 )
2812- test_path = Path (filename )
2813- filtered_tests .extend (
2814- [t for t in test_meta if t .path == test_path and t .test_name == test_name ]
2815- )
2822+ if test in self ._model_test_metadata_fully_qualified_name_index :
2823+ filtered_tests .append (
2824+ self ._model_test_metadata_fully_qualified_name_index [test ]
2825+ )
28162826 else :
28172827 test_path = Path (test )
2818- filtered_tests .extend ([t for t in test_meta if t .path == test_path ])
2828+ if test_path in self ._model_test_metadata_path_index :
2829+ filtered_tests .extend (self ._model_test_metadata_path_index [test_path ])
28192830 test_meta = filtered_tests
28202831
28212832 if patterns :
0 commit comments