Skip to content

Commit 638999a

Browse files
committed
optimizing lookups
1 parent f18f7e4 commit 638999a

File tree

3 files changed

+23
-18
lines changed

3 files changed

+23
-18
lines changed

sqlmesh/core/context.py

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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:

sqlmesh/core/loader.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ class LoadedProject:
6565
environment_statements: t.List[EnvironmentStatements]
6666
user_rules: RuleSet
6767
model_test_metadata: t.List[ModelTestMetadata]
68-
models_with_tests: t.Set[str]
6968

7069

7170
class CacheBase(abc.ABC):
@@ -247,10 +246,6 @@ def load(self) -> LoadedProject:
247246

248247
model_test_metadata = self.load_model_tests()
249248

250-
models_with_tests = {
251-
model_test_metadata.model_name for model_test_metadata in model_test_metadata
252-
}
253-
254249
project = LoadedProject(
255250
macros=macros,
256251
jinja_macros=jinja_macros,
@@ -263,7 +258,6 @@ def load(self) -> LoadedProject:
263258
environment_statements=environment_statements,
264259
user_rules=user_rules,
265260
model_test_metadata=model_test_metadata,
266-
models_with_tests=models_with_tests,
267261
)
268262
return project
269263

sqlmesh/core/test/discovery.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def fully_qualified_test_name(self) -> str:
2222

2323
@property
2424
def model_name(self) -> str:
25-
return self.body["model"]
25+
return self.body.get("model", "")
2626

2727
def __hash__(self) -> int:
2828
return self.fully_qualified_test_name.__hash__()

0 commit comments

Comments
 (0)