macros/find_all_hard_coded_references.sql (186 lines of code) (raw):

{% macro find_all_hard_coded_references(node) %} {{ return(adapter.dispatch('find_all_hard_coded_references', 'dbt_project_evaluator')(node)) }} {% endmacro %} {% macro default__find_all_hard_coded_references(node) %} {%- set all_hard_coded_references_list = [] -%} {% if node.resource_type == 'model' and node.language == "sql" %} {% if execute %} {%- set model_raw_sql = node.raw_sql or node.raw_code -%} {%- else -%} {%- set model_raw_sql = '' -%} {%- endif -%} {# we remove the comments that start with -- , or other characters configured #} {%- set re = modules.re -%} {%- set comment_chars_match = "(" ~ var('comment_chars') | join("|") ~ ").*" -%} {%- set model_raw_sql_no_comments = re.sub(comment_chars_match, '', model_raw_sql) -%} {#- REGEX Explanations # from_var_1 - matches (from or join) followed by some spaces and then {{var(<something>)}} # from_var_2 - matches (from or join) followed by some spaces and then {{var(<something>,<something_else>)}} # from_table_1 - matches (from or join) followed by some spaces and then <something>.<something_else> where each <something> is enclosed by (` or [ or " or ' or nothing) # from_table_2 - matches (from or join) followed by some spaces and then <something>.<something_else>.<something_different> where each <something> is enclosed by (` or [ or " or ' or nothing) # from_table_3 - matches (from or join) followed by some spaces and then <something> where <something> is enclosed by (` or [ or " or ') # notes - all regex matches exclude text that immediately follows "distinct " -#} {%- set re = modules.re -%} {%- set from_hard_coded_references = { 'from_var_1': '(?ix) # NOT following "distinct " (?<!distinct\s) # first matching group # from or join followed by at least 1 whitespace character (from|join)\s+ # second matching group # opening {{, 0 or more whitespace character(s), var, 0 or more whitespace character(s), an opening parenthesis, 0 or more whitespace character(s), 1 or 0 quotation mark ({{\s*var\s*\(\s*[\'\"]?) # third matching group # at least 1 of anything except a parenthesis or quotation mark ([^)\'\"]+) # fourth matching group # 1 or 0 quotation mark, 0 or more whitespace character(s) ([\'\"]?\s*) # fifth matching group # a closing parenthesis, 0 or more whitespace character(s), closing }} (\)\s*}}) ', 'from_var_2': '(?ix) # NOT following "distinct " (?<!distinct\s) # first matching group # from or join followed by at least 1 whitespace character (from|join)\s+ # second matching group # opening {{, 0 or more whitespace character(s), var, 0 or more whitespace character(s), an opening parenthesis, 0 or more whitespace character(s), 1 or 0 quotation mark ({{\s*var\s*\(\s*[\'\"]?) # third matching group # at least 1 of anything except a parenthesis or quotation mark ([^)\'\"]+) # fourth matching group # 1 or 0 quotation mark, 0 or more whitespace character(s) ([\'\"]?\s*) # fifth matching group # a comma (,) # sixth matching group # 0 or more whitespace character(s), 1 or 0 quotation mark (\s*[\'\"]?) # seventh matching group # at least 1 of anything except a parenthesis or quotation mark ([^)\'\"]+) # eighth matching group # 1 or 0 quotation mark, 0 or more whitespace character(s) ([\'\"]?\s*) # ninth matching group # a closing parenthesis, 0 or more whitespace character(s), closing }} (\)\s*}}) ', 'from_table_1': '(?ix) # NOT following "distinct " (?<!distinct\s) # first matching group # from or join followed by at least 1 whitespace character (from|join)\s+ # second matching group # 1 or 0 of (opening bracket, backtick, or quotation mark) ([\[`\"\']?) # third matching group # at least 1 word character (\w+-?\w*) # fouth matching group # 1 or 0 of (closing bracket, backtick, or quotation mark) ([\]`\"\']?) # fifth matching group # a period (\.) # sixth matching group # 1 or 0 of (opening bracket, backtick, or quotation mark) ([\[`\"\']?) # seventh matching group # at least 1 word character (\w+-?\w*) # eighth matching group # 1 or 0 of (closing bracket, backtick, or quotation mark) folowed by a whitespace character or end of string ([\]`\"\']?)(?=\s|$) ', 'from_table_2': '(?ix) # NOT following "distinct " (?<!distinct\s) # first matching group # from or join followed by at least 1 whitespace character (from|join)\s+ # second matching group # 1 or 0 of (opening bracket, backtick, or quotation mark) ([\[`\"\']?) # third matching group # at least 1 word character (\w+-?\w*) # fouth matching group # 1 or 0 of (closing bracket, backtick, or quotation mark) ([\]`\"\']?) # fifth matching group # a period (\.) # sixth matching group # 1 or 0 of (opening bracket, backtick, or quotation mark) ([\[`\"\']?) # seventh matching group # at least 1 word character (\w+-?\w*) # eighth matching group # 1 or 0 of (closing bracket, backtick, or quotation mark) ([\]`\"\']?) # ninth matching group # a period (\.) # tenth matching group # 1 or 0 of (closing bracket, backtick, or quotation mark) ([\[`\"\']?) # eleventh matching group # at least 1 word character (\w+-?\w*) # twelfth matching group # 1 or 0 of (closing bracket, backtick, or quotation mark) followed by a whitespace character or end of string ([\]`\"\']?)(?=\s|$) ', 'from_table_3': '(?ix) # NOT following "distinct " (?<!distinct\s) # first matching group # from or join followed by at least 1 whitespace character (from|join)\s+ # second matching group # 1 of (opening bracket, backtick, or quotation mark) ([\[`\"\']) # third matching group # at least 1 word character (\w+-?\w+) # fourth matching group # 1 of (closing bracket, backtick, or quotation mark) folowed by a whitespace character or end of string ([\]`\"\'])(?=\s|$) ' } -%} {%- for regex_name, regex_pattern in from_hard_coded_references.items() -%} {%- set all_regex_matches = re.findall(regex_pattern, model_raw_sql_no_comments) -%} {%- for match in all_regex_matches -%} {%- set raw_reference = match[1:]|join()|trim -%} {%- do all_hard_coded_references_list.append(raw_reference) -%} {%- endfor -%} {%- endfor -%} {% endif %} {% set all_hard_coded_references = set(all_hard_coded_references_list)|sort|join(', ')|trim %} {{ return(all_hard_coded_references) }} {% endmacro %}