Skip to content

Commit

Permalink
Merge branch 'dbt-labs:main' into redshift_connector_2.0.914
Browse files Browse the repository at this point in the history
  • Loading branch information
soksamnanglim authored Sep 18, 2023
2 parents 639ce75 + 08625fe commit 6715454
Show file tree
Hide file tree
Showing 19 changed files with 181 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.7.0b1
current_version = 1.7.0b2
parse = (?P<major>[\d]+) # major version number
\.(?P<minor>[\d]+) # minor version number
\.(?P<patch>[\d]+) # patch version number
Expand Down
24 changes: 24 additions & 0 deletions .changes/1.7.0-b2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
## dbt-redshift 1.7.0-b2 - September 15, 2023

### Features

- use get_replace_sql in redshift__get_alter_materialized_view_as_sql, avoid renaming materialized views with custom table.sql and view.sql ([#606](https://github.com/dbt-labs/dbt-redshift/issues/606))

### Fixes

- allow auto_refresh to take in boolean and str values for materialized views ([#560](https://github.com/dbt-labs/dbt-redshift/issues/560))
- Fix to support removal of hologram, remove unused IAMDuration encoder ([#591](https://github.com/dbt-labs/dbt-redshift/issues/591))
- changes expected value types to AnyInteger to take into account changes in core ([#597](https://github.com/dbt-labs/dbt-redshift/issues/597))

### Under the Hood

- Restructure macro files to be more granular; organize macros by relation and type (create, drop, etc.) ([#590](https://github.com/dbt-labs/dbt-redshift/issues/590))
- allow for bool/str input to backup/autorefresh when configuring materialized views ([#606](https://github.com/dbt-labs/dbt-redshift/issues/606))

### Dependencies

- Bump mypy from 1.5.0 to 1.5.1 ([#585](https://github.com/dbt-labs/dbt-redshift/pull/585))
- Update tox requirement from ~=4.9 to ~=4.10 ([#588](https://github.com/dbt-labs/dbt-redshift/pull/588))
- Update tox requirement from ~=4.10 to ~=4.11 ([#594](https://github.com/dbt-labs/dbt-redshift/pull/594))
- Update pre-commit requirement from ~=3.3 to ~=3.4 ([#596](https://github.com/dbt-labs/dbt-redshift/pull/596))
- Update black requirement from ~=23.7 to ~=23.9 ([#600](https://github.com/dbt-labs/dbt-redshift/pull/600))
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ body: use get_replace_sql in redshift__get_alter_materialized_view_as_sql, avoid
time: 2023-09-12T13:33:27.451042-07:00
custom:
Author: colin-rogers-dbt
Issue: "606"
7 changes: 7 additions & 0 deletions .changes/1.7.0/Under the Hood-20230914-135547.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
kind: Under the Hood
body: allow for bool/str input to backup/autorefresh when configuring materialized
views
time: 2023-09-14T13:55:47.951848-07:00
custom:
Author: colin-rogers-dbt
Issue: "606"
28 changes: 27 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,33 @@
- "Breaking changes" listed under a version may require action from end users or external maintainers when upgrading to that version.
- Do not edit this file directly. This file is auto-generated using [changie](https://github.com/miniscruff/changie). For details on how to document a change, see [the contributing guide](https://github.com/dbt-labs/dbt-redshift/blob/main/CONTRIBUTING.md#adding-changelog-entry)

## dbt-redshift 1.7.0-b2 - September 15, 2023

### Features

- use get_replace_sql in redshift__get_alter_materialized_view_as_sql, avoid renaming materialized views with custom table.sql and view.sql ([#606](https://github.com/dbt-labs/dbt-redshift/issues/606))

### Fixes

- allow auto_refresh to take in boolean and str values for materialized views ([#560](https://github.com/dbt-labs/dbt-redshift/issues/560))
- Fix to support removal of hologram, remove unused IAMDuration encoder ([#591](https://github.com/dbt-labs/dbt-redshift/issues/591))
- changes expected value types to AnyInteger to take into account changes in core ([#597](https://github.com/dbt-labs/dbt-redshift/issues/597))

### Under the Hood

- Restructure macro files to be more granular; organize macros by relation and type (create, drop, etc.) ([#590](https://github.com/dbt-labs/dbt-redshift/issues/590))
- allow for bool/str input to backup/autorefresh when configuring materialized views ([#606](https://github.com/dbt-labs/dbt-redshift/issues/606))

### Dependencies

- Bump mypy from 1.5.0 to 1.5.1 ([#585](https://github.com/dbt-labs/dbt-redshift/pull/585))
- Update tox requirement from ~=4.9 to ~=4.10 ([#588](https://github.com/dbt-labs/dbt-redshift/pull/588))
- Update tox requirement from ~=4.10 to ~=4.11 ([#594](https://github.com/dbt-labs/dbt-redshift/pull/594))
- Update pre-commit requirement from ~=3.3 to ~=3.4 ([#596](https://github.com/dbt-labs/dbt-redshift/pull/596))
- Update black requirement from ~=23.7 to ~=23.9 ([#600](https://github.com/dbt-labs/dbt-redshift/pull/600))



## dbt-redshift 1.7.0-b1 - August 17, 2023

### Features
Expand Down Expand Up @@ -38,7 +65,6 @@
### Contributors
- [@WillAyd](https://github.com/WillAyd) ([#255](https://github.com/dbt-labs/dbt-redshift/issues/255))


## Previous Releases
For information on prior major and minor releases, see their changelogs:
- [1.6](https://github.com/dbt-labs/dbt-redshift/blob/1.6.latest/CHANGELOG.md)
Expand Down
2 changes: 1 addition & 1 deletion dbt/adapters/redshift/__version__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
version = "1.7.0b1"
version = "1.7.0b2"
22 changes: 7 additions & 15 deletions dbt/adapters/redshift/relation_configs/materialized_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
RedshiftSortConfig,
RedshiftSortConfigChange,
)
from dbt.adapters.redshift.utility import evaluate_bool


@dataclass(frozen=True, eq=True, unsafe_hash=True)
Expand Down Expand Up @@ -122,25 +123,16 @@ def parse_model_node(cls, model_node: ModelNode) -> dict:
"mv_name": model_node.identifier,
"schema_name": model_node.schema,
"database_name": model_node.database,
"backup": model_node.config.extra.get("backup"),
}

# backup/autorefresh can be bools or strings
backup_value = model_node.config.extra.get("backup")
if backup_value is not None:
config_dict["backup"] = evaluate_bool(backup_value)

autorefresh_value = model_node.config.extra.get("auto_refresh")
if autorefresh_value is not None:
if isinstance(autorefresh_value, bool):
config_dict["autorefresh"] = autorefresh_value
elif isinstance(autorefresh_value, str):
lower_autorefresh = autorefresh_value.lower()
if lower_autorefresh == "true":
config_dict["autorefresh"] = True
elif lower_autorefresh == "false":
config_dict["autorefresh"] = False
else:
raise ValueError(
"Invalid autorefresh representation. Please use accepted value ex.( True, 'true', 'True')"
)
else:
raise TypeError("Invalid autorefresh value: expecting boolean or str.")
config_dict["autorefresh"] = evaluate_bool(autorefresh_value)

if query := model_node.compiled_code:
config_dict.update({"query": query.strip()})
Expand Down
25 changes: 25 additions & 0 deletions dbt/adapters/redshift/utility.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from typing import Union


def evaluate_bool_str(value: str) -> bool:
value = value.strip().lower()
if value == "true":
return True
elif value == "false":
return False
else:
raise ValueError(f"Invalid boolean string value: {value}")


def evaluate_bool(value: Union[str, bool]) -> bool:
if not value:
return False
if isinstance(value, bool):
return value
elif isinstance(value, str):
return evaluate_bool_str(value)
else:
raise TypeError(
f"Invalid type for boolean evaluation, "
f"expecting boolean or str, recieved: {type(value)}"
)
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,13 @@
MaterializedViewChangesContinueMixin,
MaterializedViewChangesFailMixin,
)
from dbt.tests.adapter.materialized_view.files import MY_TABLE, MY_VIEW
from dbt.tests.util import assert_message_in_logs, get_model_file, set_model_file
from dbt.tests.adapter.materialized_view.files import MY_TABLE, MY_VIEW, MY_SEED
from dbt.tests.util import (
assert_message_in_logs,
get_model_file,
set_model_file,
run_dbt,
)

from tests.functional.adapter.materialized_view_tests.utils import (
query_autorefresh,
Expand All @@ -22,7 +27,6 @@
run_dbt_and_capture_with_retries_redshift_mv,
)


MY_MATERIALIZED_VIEW = """
{{ config(
materialized='materialized_view',
Expand Down Expand Up @@ -233,3 +237,29 @@ class TestRedshiftMaterializedViewChangesFail(
):
# Note: using retries doesn't work when we expect `dbt_run` to fail
pass


NO_BACKUP_MATERIALIZED_VIEW = """
{{ config(
materialized='materialized_view',
backup=False
) }}
select * from {{ ref('my_seed') }}
"""


class TestRedshiftMaterializedViewWithBackupConfig:
@pytest.fixture(scope="class", autouse=True)
def models(self):
yield {
"my_materialized_view.sql": NO_BACKUP_MATERIALIZED_VIEW,
}

@pytest.fixture(scope="class", autouse=True)
def seeds(self):
return {"my_seed.csv": MY_SEED}

def test_running_mv_with_backup_false_succeeds(self, project):
run_dbt(["seed"])
result = run_dbt(["run"])
assert result[0].node.config_call_dict["backup"] is False
55 changes: 55 additions & 0 deletions tests/unit/relation_configs/test_materialized_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from unittest.mock import Mock

import pytest

from dbt.adapters.redshift.relation_configs import RedshiftMaterializedViewConfig


@pytest.mark.parametrize("bool_value", [True, False, "True", "False", "true", "false"])
def test_redshift_materialized_view_config_handles_all_valid_bools(bool_value):
config = RedshiftMaterializedViewConfig(
database_name="somedb",
schema_name="public",
mv_name="someview",
query="select * from sometable",
)
model_node = Mock()
model_node.config.extra.get = (
lambda x, y=None: bool_value if x in ["auto_refresh", "backup"] else "someDistValue"
)
config_dict = config.parse_model_node(model_node)
assert isinstance(config_dict["autorefresh"], bool)
assert isinstance(config_dict["backup"], bool)


@pytest.mark.parametrize("bool_value", [1])
def test_redshift_materialized_view_config_throws_expected_exception_with_invalid_types(
bool_value,
):
config = RedshiftMaterializedViewConfig(
database_name="somedb",
schema_name="public",
mv_name="someview",
query="select * from sometable",
)
model_node = Mock()
model_node.config.extra.get = (
lambda x, y=None: bool_value if x in ["auto_refresh", "backup"] else "someDistValue"
)
with pytest.raises(TypeError):
config.parse_model_node(model_node)


def test_redshift_materialized_view_config_throws_expected_exception_with_invalid_str():
config = RedshiftMaterializedViewConfig(
database_name="somedb",
schema_name="public",
mv_name="someview",
query="select * from sometable",
)
model_node = Mock()
model_node.config.extra.get = (
lambda x, y=None: "notABool" if x in ["auto_refresh", "backup"] else "someDistValue"
)
with pytest.raises(ValueError):
config.parse_model_node(model_node)

0 comments on commit 6715454

Please sign in to comment.