From 4f0c3ba7d8812bec1cd7fecdbb700f111da0a17c Mon Sep 17 00:00:00 2001 From: Michiel De Smet Date: Wed, 3 Aug 2022 18:16:29 +0200 Subject: [PATCH] Apply adapter macro fixes on dbt-utils --- integration_tests/dbt_utils/dbt_project.yml | 2 - macros/dbt_utils/cross_db_utils/any_value.sql | 6 +-- macros/dbt_utils/cross_db_utils/bool_or.sql | 6 +-- macros/dbt_utils/cross_db_utils/datatypes.sql | 7 +--- .../dbt_utils/cross_db_utils/date_trunc.sql | 2 +- macros/dbt_utils/cross_db_utils/dateadd.sql | 6 +-- macros/dbt_utils/cross_db_utils/datediff.sql | 33 ++++++++++++---- macros/dbt_utils/cross_db_utils/hash.sql | 2 +- macros/dbt_utils/cross_db_utils/listagg.sql | 39 +++---------------- macros/dbt_utils/cross_db_utils/right.sql | 7 +--- 10 files changed, 42 insertions(+), 68 deletions(-) diff --git a/integration_tests/dbt_utils/dbt_project.yml b/integration_tests/dbt_utils/dbt_project.yml index e8ce844..8aeed94 100644 --- a/integration_tests/dbt_utils/dbt_project.yml +++ b/integration_tests/dbt_utils/dbt_project.yml @@ -28,8 +28,6 @@ models: cross_db_utils: test_datediff: +enabled: false - test_listagg: - +enabled: false datetime: test_date_spine: diff --git a/macros/dbt_utils/cross_db_utils/any_value.sql b/macros/dbt_utils/cross_db_utils/any_value.sql index b641888..360883d 100644 --- a/macros/dbt_utils/cross_db_utils/any_value.sql +++ b/macros/dbt_utils/cross_db_utils/any_value.sql @@ -1,5 +1,3 @@ -{% macro default__any_value(expression) -%} - +{% macro trino__any_value(expression) -%} min({{ expression }}) - -{%- endmacro %} \ No newline at end of file +{%- endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/bool_or.sql b/macros/dbt_utils/cross_db_utils/bool_or.sql index 02e486e..2e4a4a0 100644 --- a/macros/dbt_utils/cross_db_utils/bool_or.sql +++ b/macros/dbt_utils/cross_db_utils/bool_or.sql @@ -1,5 +1,3 @@ -{% macro default__bool_or(expression) -%} - +{% macro trino__bool_or(expression) -%} bool_or({{ expression }}) - -{%- endmacro %} \ No newline at end of file +{%- endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/datatypes.sql b/macros/dbt_utils/cross_db_utils/datatypes.sql index bdcb8c4..92dff4b 100644 --- a/macros/dbt_utils/cross_db_utils/datatypes.sql +++ b/macros/dbt_utils/cross_db_utils/datatypes.sql @@ -7,12 +7,9 @@ {% endmacro %} {% macro trino__type_numeric() %} - DECIMAL( - 28, - 6 - ) + DECIMAL(28, 6) {% endmacro %} {%- macro trino__type_int() -%} integer -{%- endmacro -%} \ No newline at end of file +{%- endmacro -%} diff --git a/macros/dbt_utils/cross_db_utils/date_trunc.sql b/macros/dbt_utils/cross_db_utils/date_trunc.sql index 0159d8e..4ece68f 100644 --- a/macros/dbt_utils/cross_db_utils/date_trunc.sql +++ b/macros/dbt_utils/cross_db_utils/date_trunc.sql @@ -1,3 +1,3 @@ {% macro trino__date_trunc(datepart, date) %} date_trunc('{{datepart}}', {{date}}) -{% endmacro %} \ No newline at end of file +{% endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/dateadd.sql b/macros/dbt_utils/cross_db_utils/dateadd.sql index 5c5e103..ed6dfa0 100644 --- a/macros/dbt_utils/cross_db_utils/dateadd.sql +++ b/macros/dbt_utils/cross_db_utils/dateadd.sql @@ -1,7 +1,3 @@ {% macro trino__dateadd(datepart, interval, from_date_or_timestamp) %} - date_add( - '{{ datepart }}', - {{ interval }}, - {{ from_date_or_timestamp }} - ) + date_add('{{ datepart }}', {{ interval }}, {{ from_date_or_timestamp }}) {% endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/datediff.sql b/macros/dbt_utils/cross_db_utils/datediff.sql index 0a9c558..44c582d 100644 --- a/macros/dbt_utils/cross_db_utils/datediff.sql +++ b/macros/dbt_utils/cross_db_utils/datediff.sql @@ -1,9 +1,28 @@ {% macro trino__datediff(first_date, second_date, datepart) %} - - date_diff( - '{{ datepart }}', - {{ first_date }}, - {{ second_date }} - ) - + {% if datepart == 'year' %} + (year(CAST({{ second_date }} AS TIMESTAMP)) - year(CAST({{ first_date }} AS TIMESTAMP))) + {% elif datepart == 'quarter' %} + ({{ datediff(first_date, second_date, 'year') }} * 4) + quarter(CAST({{ second_date }} AS TIMESTAMP)) - quarter(CAST({{ first_date }} AS TIMESTAMP)) + {% elif datepart == 'month' %} + ({{ datediff(first_date, second_date, 'year') }} * 12) + month(CAST({{ second_date }} AS TIMESTAMP)) - month(CAST({{ first_date }} AS TIMESTAMP)) + {% elif datepart == 'day' %} + ((to_milliseconds((CAST(CAST({{ second_date }} AS TIMESTAMP) AS DATE) - CAST(CAST({{ first_date }} AS TIMESTAMP) AS DATE)))) / 86400000) + {% elif datepart == 'week' %} + ({{ datediff(first_date, second_date, 'day') }} / 7 + case + when dow(CAST({{first_date}} AS TIMESTAMP)) <= dow(CAST({{second_date}} AS TIMESTAMP)) then + case when {{first_date}} <= {{second_date}} then 0 else -1 end + else + case when {{first_date}} <= {{second_date}} then 1 else 0 end + end) + {% elif datepart == 'hour' %} + ({{ datediff(first_date, second_date, 'day') }} * 24 + hour(CAST({{ second_date }} AS TIMESTAMP)) - hour(CAST({{ first_date }} AS TIMESTAMP))) + {% elif datepart == 'minute' %} + ({{ datediff(first_date, second_date, 'hour') }} * 60 + minute(CAST({{ second_date }} AS TIMESTAMP)) - minute(CAST({{ first_date }} AS TIMESTAMP))) + {% elif datepart == 'second' %} + ({{ datediff(first_date, second_date, 'minute') }} * 60 + second(CAST({{ second_date }} AS TIMESTAMP)) - second(CAST({{ first_date }} AS TIMESTAMP))) + {% elif datepart == 'millisecond' %} + (to_milliseconds((CAST({{ second_date }} AS TIMESTAMP) - CAST({{ first_date }} AS TIMESTAMP)))) + {% else %} + {% if execute %}{{ exceptions.raise_compiler_error("Unsupported datepart for macro datediff in Trino: {!r}".format(datepart)) }}{% endif %} + {% endif %} {% endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/hash.sql b/macros/dbt_utils/cross_db_utils/hash.sql index 01d4e01..135ce7b 100644 --- a/macros/dbt_utils/cross_db_utils/hash.sql +++ b/macros/dbt_utils/cross_db_utils/hash.sql @@ -1,3 +1,3 @@ {% macro trino__hash(field) -%} lower(to_hex(md5(to_utf8(cast({{field}} as varchar))))) -{%- endmacro %}t \ No newline at end of file +{%- endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/listagg.sql b/macros/dbt_utils/cross_db_utils/listagg.sql index 08e6c8d..d1d4ae6 100644 --- a/macros/dbt_utils/cross_db_utils/listagg.sql +++ b/macros/dbt_utils/cross_db_utils/listagg.sql @@ -1,34 +1,7 @@ -{# if there are instances of delimiter_text within your measure, you cannot include a limit_num #} {% macro trino__listagg(measure, delimiter_text, order_by_clause, limit_num) -%} - - {% if limit_num -%} - {% set ns = namespace() %} - {% set ns.delimiter_text_regex = delimiter_text|trim("'") %} - {% set special_chars %}\,^,$,.,|,?,*,+,(,),[,],{,}{% endset %} - {%- for char in special_chars.split(',') -%} - {% set escape_char %}\\{{ char }}{% endset %} - {% set ns.delimiter_text_regex = ns.delimiter_text_regex|replace(char,escape_char) %} - {%- endfor -%} - - {% set regex %}'([^{{ ns.delimiter_text_regex }}]+{{ ns.delimiter_text_regex }}){1,{{ limit_num - 1}}}[^{{ ns.delimiter_text_regex }}]+'{% endset %} - regexp_substr( - listagg( - {{ measure }}, - {{ delimiter_text }} - ) - {% if order_by_clause -%} - within group ({{ order_by_clause }}) - {%- endif %} - ,{{ regex }} - ) - {%- else %} - listagg( - {{ measure }}, - {{ delimiter_text }} - ) - {% if order_by_clause -%} - within group ({{ order_by_clause }}) - {%- endif %} - {%- endif %} - -{%- endmacro %} \ No newline at end of file + {% set collect_list %} array_agg({{ measure }} {% if order_by_clause -%}{{ order_by_clause }}{%- endif %}) {% endset %} + {% set limited %} slice({{ collect_list }}, 1, {{ limit_num }}) {% endset %} + {% set collected = limited if limit_num else collect_list %} + {% set final %} array_join({{ collected }}, {{ delimiter_text }}) {% endset %} + {% do return(final) %} +{%- endmacro %} diff --git a/macros/dbt_utils/cross_db_utils/right.sql b/macros/dbt_utils/cross_db_utils/right.sql index 102d0b9..1c96e01 100644 --- a/macros/dbt_utils/cross_db_utils/right.sql +++ b/macros/dbt_utils/cross_db_utils/right.sql @@ -1,12 +1,7 @@ {% macro trino__right(string_text, length_expression) %} - case when {{ length_expression }} = 0 then '' else - substr( - {{ string_text }}, - -1 * ({{ length_expression }}) - ) + substr({{ string_text }}, -1 * ({{ length_expression }})) end - {%- endmacro -%}