Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support multiple conditions in CONDITIONAL_HASH #48

Merged
merged 1 commit into from
Nov 7, 2022
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
{% macro bigquery__test_conditional_hash() %}
{% set expression = "column1" %}
{% set default_method = "SHA256" %}
{% set condition = "contains_pseudonymized_unique_identifiers" %}
{% set conditions = ["contains_pseudonymized_unique_identifiers"] %}

{% set column_conditions = {"contains_pseudonymized_unique_identifiers": true} %}
{% set result = dbt_data_privacy.conditional_hash(
column_conditions=column_conditions,
expression=expression,
default_method=default_method,
condition=condition,
conditions=conditions,
data_type=none) %}
{% set expected = "column1" %}
{{ assert_equals(result, expected) }}
Expand All @@ -21,7 +21,7 @@
column_conditions=column_conditions,
expression=expression,
default_method=default_method,
condition=condition,
conditions=conditions,
data_type="ARRAY") %}
{% set expected = "column1" %}
{{ assert_equals(result, expected) }}
Expand All @@ -31,7 +31,7 @@
column_conditions=column_conditions,
expression=expression,
default_method=default_method,
condition=condition,
conditions=conditions,
data_type=none) %}
{% set expected = "SHA256(CAST(column1 AS STRING))" %}
{{ assert_equals(result, expected) }}
Expand All @@ -40,7 +40,7 @@
column_conditions=column_conditions,
expression=expression,
default_method=default_method,
condition=condition,
conditions=conditions,
data_type="ARRAY") %}
{% set expected = "ARRAY(SELECT SHA256(CAST(e AS STRING)) FROM UNNEST(column1) AS e)" %}
{{ assert_equals(result, expected) }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
'method': 'CONDITIONAL_HASH',
'with': {
'default_method': 'SHA256',
'condition': 'contains_pseudonymized_unique_identifiers'
'conditions': ['contains_pseudonymized_unique_identifiers']
}
},
'highly_restricted': {'method': 'DROPPED'}
Expand Down
3 changes: 2 additions & 1 deletion integration_tests/resources/vars/vars-bigquery.basic.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ data_privacy:
method: CONDITIONAL_HASH
with:
default_method: SHA256
condition: contains_pseudonymized_unique_identifiers
conditions:
- contains_pseudonymized_unique_identifiers
highly_restricted:
method: DROPPED
23 changes: 16 additions & 7 deletions macros/pseudonymization/conditional_hash.sql
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
{% macro conditional_hash(column_conditions, expression, default_method, condition, data_type=none) -%}
{% macro conditional_hash(column_conditions, expression, default_method, conditions, data_type=none) -%}
{% if column_conditions is none or column_conditions is not mapping %}
{% do exceptions.raise_compiler_error("Invalid column_conditions {}".format(column_conditions)) %}
{% endif %}

{% if condition not in column_conditions %}
{% do exceptions.raise_compiler_error("Invalid condition {} to {}".format(condition, column_conditions)) %}
{% endif %}
{% for condition in conditions %}
{% if condition not in column_conditions %}
{% do exceptions.raise_compiler_error("Invalid condition {} to {}".format(condition, column_conditions)) %}
{% endif %}
{% endfor %}

{{- return(adapter.dispatch('conditional_hash', 'dbt_data_privacy')(
column_conditions=column_conditions,
expression=expression,
default_method=default_method,
condition=condition,
conditions=conditions,
data_type=data_type)) -}}
{%- endmacro %}

{% macro bigquery__conditional_hash(column_conditions, expression, default_method, condition, data_type=none) -%}
{% if column_conditions.get(condition, false) %}
{% macro bigquery__conditional_hash(column_conditions, expression, default_method, conditions, data_type=none) -%}
{% set condition_values = [] %}
{% for condition in conditions %}
{% if condition in column_conditions and column_conditions.get(condition) is sameas false %}
{% do condition_values.append(false) %}
{% endif %}
{% endfor %}

{% if false not in condition_values %}
{%- do return(expression) -%}
{% else %}
{%- set secured_expression = dbt_data_privacy.get_secured_expression_by_method(expression, default_method, data_type=data_type) -%}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
{% elif uppercase_method == "CONDITIONAL_HASH" %}
{% if with_params is mapping
and with_params.default_method is defined
and with_params.condition is defined %}
and with_params.conditions is defined %}
{% set secured_expression = dbt_data_privacy.conditional_hash(
column_conditions=column_conditions,
expression=expression,
default_method=with_params.default_method,
condition=with_params.condition,
conditions=with_params.conditions,
data_type=data_type) %}
{% else %}
{{ exceptions.raise_compiler_error("Invalid inputs for {} with {} under {} ".format(expression, method, column_conditions)) }}
Expand Down