Skip to content

Commit 883a90d

Browse files
committed
fix save_test_history macro to work when a model (snapshot or model) depends_on a source with the same name
1 parent 930ee9a commit 883a90d

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

macros/run_end/save_results_history.sql

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,29 @@
3838
{% set any_refs = modules.re.findall("ref\(\'(?P<name>.*)\'\)", el.node.test_metadata.kwargs['model']) %}
3939
{% set any_source = modules.re.findall("source\(\'(?P<one>.*)\'\,\s+\'(?P<two>.*)\'\)", el.node.test_metadata.kwargs['model']) %}
4040

41+
-- Separate `depends_on` nodes into sources and models to avoid incorrect matching of a test to a source
42+
-- when it fact it refers to a model (snapshot or regular model)
43+
{% set depends_on_sources = [] %}
44+
{% set depends_on_models = [] %}
45+
{% for full_name in el.node.depends_on.nodes %}
46+
{%- if full_name.split('.')[0] == "source" -%}
47+
{% do depends_on_sources.append(full_name)%}
48+
{%- else -%}
49+
{% do depends_on_models.append(full_name)%}
50+
{%- endif -%}
51+
{% endfor %}
52+
4153
{% if any_refs %}
4254
{% set name = any_refs[0] %}
43-
-- NOTE: This relies on snapshot models to include the word "snapshot" in the model name or
44-
-- the column `dbt_scd_id` to be included in the metadata kwargs (since this is a good proxy
45-
-- for this model being a snapshot given `dbt_scd_id` is an internal dbt field).
46-
-- There doesn't seem to be another, easily accessible field to tell us unambigously that this node is a snapshot
47-
{% set metadata_column_name = el.node.to_dict().get('test_metadata', dict()).get('kwargs', dict()).get('column_name') %}
48-
{% if "snapshot" in name or metadata_column_name == "dbt_scd_id" %}
49-
{% set ref_type = "snapshot" %}
50-
{% else %}
51-
{% set ref_type = "model" %}
52-
{% endif %}
53-
{% set node_name = re_data.priv_full_name_from_depends(el.node, name, ref_type) %}
55+
{% set node_name = re_data.priv_full_name_from_depends(el.node, name, depends_on_models) %}
5456
{% set schema = graph.nodes.get(node_name)['schema'] %}
5557
{% set database = graph.nodes.get(node_name)['database'] %}
5658
{% set table_name = (database + '.' + schema + '.' + name) | lower %}
5759

5860
{% elif any_source %}
5961
{% set package_name = any_source[0][0] %}
6062
{% set name = any_source[0][1] %}
61-
{% set node_name = re_data.priv_full_name_from_depends(el.node, name, "source") %}
63+
{% set node_name = re_data.priv_full_name_from_depends(el.node, name, depends_on_sources) %}
6264
{% set schema = graph.sources.get(node_name)['schema'] %}
6365
{% set database = graph.sources.get(node_name)['database'] %}
6466
{% set table_name = (database + '.' + schema + '.' + name) | lower %}
@@ -108,12 +110,11 @@
108110

109111
{% endmacro %}
110112

111-
{% macro priv_full_name_from_depends(node, name, type) %}
113+
{% macro priv_full_name_from_depends(node, name, depends_on_nodes) %}
112114

113-
{% for full_name in node.depends_on.nodes %}
115+
{% for full_name in depends_on_nodes %}
114116
{% set node_name = full_name.split('.')[-1] %}
115-
{% set node_type = full_name.split('.')[0] %}
116-
{% if node_name == name and node_type == type %}
117+
{% if node_name == name %}
117118
{{ return(full_name) }}
118119
{% endif %}
119120
{% endfor %}

0 commit comments

Comments
 (0)