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

Lift + shift for cross-db macros #192

Merged
merged 11 commits into from
Jun 17, 2022
5 changes: 5 additions & 0 deletions dbt/include/bigquery/macros/utils/bool_or.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% macro bigquery__bool_or(expression) -%}

logical_or({{ expression }})

{%- endmacro %}
7 changes: 7 additions & 0 deletions dbt/include/bigquery/macros/utils/date_trunc.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{% macro bigquery__date_trunc(datepart, date) -%}
timestamp_trunc(
cast({{date}} as timestamp),
{{datepart}}
)

{%- endmacro %}
8 changes: 8 additions & 0 deletions dbt/include/bigquery/macros/utils/dateadd.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{% macro bigquery__dateadd(datepart, interval, from_date_or_timestamp) %}

datetime_add(
cast( {{ from_date_or_timestamp }} as datetime),
interval {{ interval }} {{ datepart }}
)

{% endmacro %}
15 changes: 15 additions & 0 deletions dbt/include/bigquery/macros/utils/datediff.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{% macro bigquery__datediff(first_date, second_date, datepart) -%}

{% if dbt_version[0] == 1 and dbt_version[2] >= 2 %}
{{ return(dbt.datediff(first_date, second_date, datepart)) }}
{% else %}

datetime_diff(
cast({{second_date}} as datetime),
cast({{first_date}} as datetime),
{{datepart}}
)

{% endif %}

{%- endmacro %}
4 changes: 4 additions & 0 deletions dbt/include/bigquery/macros/utils/escape_single_quotes.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{# /*BigQuery uses a single backslash: they're -> they\'re. The second backslash is to escape it from Jinja */ #}
{% macro bigquery__escape_single_quotes(expression) -%}
{{ expression | replace("'", "\\'") }}
{%- endmacro %}
5 changes: 5 additions & 0 deletions dbt/include/bigquery/macros/utils/except.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% macro bigquery__except() %}

except distinct

{% endmacro %}
3 changes: 3 additions & 0 deletions dbt/include/bigquery/macros/utils/hash.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{% macro bigquery__hash(field) -%}
to_hex({{dbt.default__hash(field)}})
{%- endmacro %}
5 changes: 5 additions & 0 deletions dbt/include/bigquery/macros/utils/intersect.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{% macro bigquery__intersect() %}

intersect distinct

{% endmacro %}
14 changes: 14 additions & 0 deletions dbt/include/bigquery/macros/utils/listagg.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{% macro bigquery__listagg(measure, delimiter_text, order_by_clause, limit_num) -%}

string_agg(
{{ measure }},
{{ delimiter_text }}
{% if order_by_clause -%}
{{ order_by_clause }}
{%- endif %}
{% if limit_num -%}
limit {{ limit_num }}
{%- endif %}
)

{%- endmacro %}
9 changes: 9 additions & 0 deletions dbt/include/bigquery/macros/utils/position.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{% macro bigquery__position(substring_text, string_text) %}

strpos(
{{ string_text }},
{{ substring_text }}

)

{%- endmacro -%}
12 changes: 12 additions & 0 deletions dbt/include/bigquery/macros/utils/right.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% macro bigquery__right(string_text, length_expression) %}

case when {{ length_expression }} = 0
then ''
else
substr(
{{ string_text }},
-1 * ({{ length_expression }})
)
end

{%- endmacro -%}
3 changes: 3 additions & 0 deletions dbt/include/bigquery/macros/utils/safe_cast.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{% macro bigquery__safe_cast(field, type) %}
safe_cast({{field}} as {{type}})
{% endmacro %}
20 changes: 20 additions & 0 deletions dbt/include/bigquery/macros/utils/split_part.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{% macro bigquery__split_part(string_text, delimiter_text, part_number) %}

{% if part_number >= 0 %}
split(
{{ string_text }},
{{ delimiter_text }}
)[safe_offset({{ part_number - 1 }})]
{% else %}
split(
{{ string_text }},
{{ delimiter_text }}
)[safe_offset(
length({{ string_text }})
- length(
replace({{ string_text }}, {{ delimiter_text }}, '')
) + 1
)]
{% endif %}

{% endmacro %}
103 changes: 103 additions & 0 deletions tests/functional/adapter/test_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import pytest
from dbt.tests.adapter.utils.base_utils import BaseUtils
from dbt.tests.adapter.utils.test_any_value import BaseAnyValue
from dbt.tests.adapter.utils.test_bool_or import BaseBoolOr
from dbt.tests.adapter.utils.test_cast_bool_to_text import BaseCastBoolToText
from dbt.tests.adapter.utils.test_concat import BaseConcat
from dbt.tests.adapter.utils.test_dateadd import BaseDateAdd
from dbt.tests.adapter.utils.test_datediff import BaseDateDiff
from dbt.tests.adapter.utils.test_date_trunc import BaseDateTrunc
from dbt.tests.adapter.utils.test_escape_single_quotes import BaseEscapeSingleQuotesQuote
from dbt.tests.adapter.utils.test_escape_single_quotes import BaseEscapeSingleQuotesBackslash
from dbt.tests.adapter.utils.test_except import BaseExcept
from dbt.tests.adapter.utils.test_hash import BaseHash
from dbt.tests.adapter.utils.test_intersect import BaseIntersect
from dbt.tests.adapter.utils.test_last_day import BaseLastDay
from dbt.tests.adapter.utils.test_length import BaseLength
from dbt.tests.adapter.utils.test_listagg import BaseListagg
from dbt.tests.adapter.utils.test_position import BasePosition
from dbt.tests.adapter.utils.test_replace import BaseReplace
from dbt.tests.adapter.utils.test_right import BaseRight
from dbt.tests.adapter.utils.test_safe_cast import BaseSafeCast
from dbt.tests.adapter.utils.test_split_part import BaseSplitPart
from dbt.tests.adapter.utils.test_string_literal import BaseStringLiteral


class TestAnyValue(BaseAnyValue):
pass


class TestBoolOr(BaseBoolOr):
pass


class TestCastBoolToText(BaseCastBoolToText):
pass


class TestConcat(BaseConcat):
pass


class TestDateAdd(BaseDateAdd):
pass


class TestDateDiff(BaseDateDiff):
pass


class TestDateTrunc(BaseDateTrunc):
pass


class TestEscapeSingleQuotes(BaseEscapeSingleQuotesBackslash):
pass


class TestExcept(BaseExcept):
pass


class TestHash(BaseHash):
pass


class TestIntersect(BaseIntersect):
pass


class TestLastDay(BaseLastDay):
pass


class TestLength(BaseLength):
pass


class TestListagg(BaseListagg):
pass


class TestPosition(BasePosition):
pass


class TestReplace(BaseReplace):
pass


class TestRight(BaseRight):
pass


class TestSafeCast(BaseSafeCast):
pass


class TestSplitPart(BaseSplitPart):
pass


class TestStringLiteral(BaseStringLiteral):
pass