From 8e666380df54f446dd6dde6a2be82591dc21a2af Mon Sep 17 00:00:00 2001 From: Gerda Shank Date: Tue, 11 Jun 2024 14:16:34 -0400 Subject: [PATCH] Fix deferred manifest and selector methods for saved_queries --- core/dbt/contracts/graph/manifest.py | 1 + core/dbt/graph/selector_methods.py | 8 ++++++-- tests/functional/saved_queries/fixtures.py | 12 ------------ .../saved_queries/test_saved_query_parsing.py | 18 ++++++++++++++++-- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/core/dbt/contracts/graph/manifest.py b/core/dbt/contracts/graph/manifest.py index 9ca11166388..95b018bd69b 100644 --- a/core/dbt/contracts/graph/manifest.py +++ b/core/dbt/contracts/graph/manifest.py @@ -1094,6 +1094,7 @@ def from_writable_manifest(cls, writable_manifest: WritableManifest) -> "Manifes metrics=cls._map_resources_to_map_nodes(writable_manifest.metrics), groups=cls._map_resources_to_map_nodes(writable_manifest.groups), semantic_models=cls._map_resources_to_map_nodes(writable_manifest.semantic_models), + saved_queries=cls._map_resources_to_map_nodes(writable_manifest.saved_queries), selectors={ selector_id: selector for selector_id, selector in writable_manifest.selectors.items() diff --git a/core/dbt/graph/selector_methods.py b/core/dbt/graph/selector_methods.py index 31d6d6c1fc6..dbeaf7ed4c3 100644 --- a/core/dbt/graph/selector_methods.py +++ b/core/dbt/graph/selector_methods.py @@ -109,7 +109,7 @@ def is_selected_node(fqn: List[str], node_selector: str, is_versioned: bool) -> SelectorTarget = Union[ - SourceDefinition, ManifestNode, Exposure, Metric, SemanticModel, UnitTestDefinition + SourceDefinition, ManifestNode, Exposure, Metric, SemanticModel, UnitTestDefinition, SavedQuery ] @@ -202,6 +202,7 @@ def all_nodes( self.metric_nodes(included_nodes), self.unit_tests(included_nodes), self.semantic_model_nodes(included_nodes), + self.saved_query_nodes(included_nodes), ) def configurable_nodes( @@ -680,7 +681,8 @@ def check_modified_content( self, old: Optional[SelectorTarget], new: SelectorTarget, adapter_type: str ) -> bool: if isinstance( - new, (SourceDefinition, Exposure, Metric, SemanticModel, UnitTestDefinition) + new, + (SourceDefinition, Exposure, Metric, SemanticModel, UnitTestDefinition, SavedQuery), ): # these all overwrite `same_contents` different_contents = not new.same_contents(old) # type: ignore @@ -775,6 +777,8 @@ def search(self, included_nodes: Set[UniqueId], selector: str) -> Iterator[Uniqu previous_node = SemanticModel.from_resource(manifest.semantic_models[unique_id]) elif unique_id in manifest.unit_tests: previous_node = UnitTestDefinition.from_resource(manifest.unit_tests[unique_id]) + elif unique_id in manifest.saved_queries: + previous_node = SavedQuery.from_resource(manifest.saved_queries[unique_id]) keyword_args = {} if checker.__name__ in [ diff --git a/tests/functional/saved_queries/fixtures.py b/tests/functional/saved_queries/fixtures.py index e938760a12e..77735c9d1a9 100644 --- a/tests/functional/saved_queries/fixtures.py +++ b/tests/functional/saved_queries/fixtures.py @@ -3,8 +3,6 @@ """ saved_queries_yml = """ -version: 2 - saved_queries: - name: test_saved_query description: "{{ doc('saved_query_description') }}" @@ -27,8 +25,6 @@ """ saved_queries_with_defaults_yml = """ -version: 2 - saved_queries: - name: test_saved_query description: "{{ doc('saved_query_description') }}" @@ -50,8 +46,6 @@ """ saved_queries_with_diff_filters_yml = """ -version: 2 - saved_queries: - name: test_saved_query_where_list description: "{{ doc('saved_query_description') }}" @@ -83,8 +77,6 @@ """ saved_query_with_extra_config_attributes_yml = """ -version: 2 - saved_queries: - name: test_saved_query description: "{{ doc('saved_query_description') }}" @@ -105,8 +97,6 @@ """ saved_query_with_export_configs_defined_at_saved_query_level_yml = """ -version: 2 - saved_queries: - name: test_saved_query description: "{{ doc('saved_query_description') }}" @@ -131,8 +121,6 @@ """ saved_query_without_export_configs_defined_yml = """ -version: 2 - saved_queries: - name: test_saved_query description: "{{ doc('saved_query_description') }}" diff --git a/tests/functional/saved_queries/test_saved_query_parsing.py b/tests/functional/saved_queries/test_saved_query_parsing.py index 8aff5c09c6c..5d4c9536501 100644 --- a/tests/functional/saved_queries/test_saved_query_parsing.py +++ b/tests/functional/saved_queries/test_saved_query_parsing.py @@ -1,6 +1,6 @@ -from typing import List import os import shutil +from typing import List import pytest from dbt_semantic_interfaces.type_enums.export_destination_type import ( @@ -8,13 +8,14 @@ ) from dbt.contracts.graph.manifest import Manifest -from dbt.tests.util import write_file, run_dbt +from dbt.tests.util import run_dbt, write_file from dbt_common.events.base_types import BaseEvent from tests.functional.assertions.test_runner import dbtTestRunner from tests.functional.saved_queries.fixtures import ( saved_queries_with_diff_filters_yml, saved_queries_yml, saved_query_description, + saved_query_with_cache_configs_defined_yml, ) from tests.functional.semantic_models.fixtures import ( fct_revenue_sql, @@ -59,10 +60,23 @@ def test_semantic_model_parsing(self, project): assert saved_query.exports[0].config.export_as == ExportDestinationType.TABLE assert saved_query.exports[0].config.schema_name == "my_export_schema_name" + # Save state self.copy_state() + # Nothing has changed, so no state:modified results results = run_dbt(["ls", "--select", "state:modified", "--state", "./state"]) assert len(results) == 0 + # Change saved_query + write_file( + saved_query_with_cache_configs_defined_yml, + project.project_root, + "models", + "saved_queries.yml", + ) + # State modified finds changed saved_query + results = run_dbt(["ls", "--select", "state:modified", "--state", "./state"]) + assert len(results) == 1 + def test_saved_query_error(self, project): error_schema_yml = saved_queries_yml.replace("simple_metric", "metric_not_found") write_file(error_schema_yml, project.project_root, "models", "saved_queries.yml")