Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions integration_tests/models/generic_tests/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,12 @@ seeds:
combination_of_columns:
- month
- product
- dbt_utils.unique_combination_of_columns:
name: unique_combination_of_columns_arguments_syntax
arguments:
combination_of_columns:
- month
- product

- name: data_cardinality_equality_a
columns:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

- dbt_utils.unique_combination_of_columns:
name: unique_combination_of_columns_arguments_syntax
arguments:
combination_of_columns: ['month', 'product']

- dbt_utils.unique_combination_of_columns:
name: unique_combination_of_columns_old_syntax
combination_of_columns: ['month', 'product']

- dbt_utils.unique_combination_of_columns:
name: unique_combination_of_columns_quoted_arguments
arguments:
combination_of_columns: ['month', 'product']
quote_columns: true
34 changes: 17 additions & 17 deletions macros/generic_tests/unique_combination_of_columns.sql
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
{% test unique_combination_of_columns(model, combination_of_columns, quote_columns=false) %}
{{ return(adapter.dispatch('test_unique_combination_of_columns', 'dbt_utils')(model, combination_of_columns, quote_columns)) }}
{% endtest %}

{% macro default__test_unique_combination_of_columns(model, combination_of_columns, quote_columns=false) %}

-- Support dbt Core 1.10+ 'arguments:' syntax (kwargs)
{% set combination_of_columns = kwargs.get('combination_of_columns', combination_of_columns) %}
{% set quote_columns = kwargs.get('quote_columns', quote_columns) %}

-- Also handle possible nested 'args' or 'arguments' keys for future compatibility
{% if kwargs.get('args') is mapping %}
{% set combination_of_columns = kwargs.args.get('combination_of_columns', combination_of_columns) %}
{% set quote_columns = kwargs.args.get('quote_columns', quote_columns) %}
{% elif kwargs.get('arguments') is mapping %}
{% set combination_of_columns = kwargs.arguments.get('combination_of_columns', combination_of_columns) %}
{% set quote_columns = kwargs.arguments.get('quote_columns', quote_columns) %}
{% endif %}

{% if not quote_columns %}
{%- set column_list=combination_of_columns %}
{%- set column_list = combination_of_columns %}
{% elif quote_columns %}
{%- set column_list=[] %}
{% for column in combination_of_columns -%}
{% do column_list.append( adapter.quote(column) ) %}
{%- endfor %}
{%- set column_list = quote_columns(combination_of_columns) %}
{% else %}
{{ exceptions.raise_compiler_error(
"`quote_columns` argument for unique_combination_of_columns test must be one of [True, False] Got: '" ~ quote ~"'.'"
) }}
{{ exceptions.raise_compiler_error("Invalid 'quote_columns' argument provided. Got '" ~ quote_columns ~ "' but expected boolean True/False") }}
{% endif %}

{%- set columns_csv=column_list | join(', ') %}

{%- set columns_csv = column_list | join(', ') %}

with validation_errors as (

select
{{ columns_csv }}
from {{ model }}
group by {{ columns_csv }}
having count(*) > 1

)

select *
from validation_errors


{% endmacro %}
Loading