Skip to content

Commit

Permalink
Merge branch 'main' into dbeatty/fix-553
Browse files Browse the repository at this point in the history
  • Loading branch information
mikealfare authored Oct 10, 2023
2 parents bf9776f + 85d3720 commit 140b5b9
Show file tree
Hide file tree
Showing 40 changed files with 486 additions and 55 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))
6 changes: 6 additions & 0 deletions .changes/1.7.0/Dependencies-20230901-230919.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: "Dependencies"
body: "Update tox requirement from ~=4.10 to ~=4.11"
time: 2023-09-01T23:09:19.00000Z
custom:
Author: dependabot[bot]
PR: 594
6 changes: 6 additions & 0 deletions .changes/1.7.0/Dependencies-20230904-193307.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: "Dependencies"
body: "Update pre-commit requirement from ~=3.3 to ~=3.4"
time: 2023-09-04T19:33:07.00000Z
custom:
Author: dependabot[bot]
PR: 596
6 changes: 6 additions & 0 deletions .changes/1.7.0/Dependencies-20230912-002353.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: "Dependencies"
body: "Update black requirement from ~=23.7 to ~=23.9"
time: 2023-09-12T00:23:53.00000Z
custom:
Author: dependabot[bot]
PR: 600
File renamed without changes.
File renamed without changes.
6 changes: 6 additions & 0 deletions .changes/1.7.0/Fixes-20230908-113019.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Fixes
body: changes expected value types to AnyInteger to take into account changes in core
time: 2023-09-08T11:30:19.77143-05:00
custom:
Author: McKnight-42
Issue: "597"
6 changes: 6 additions & 0 deletions .changes/1.7.0/Fixes-20230912-133327.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Features
body: use get_replace_sql in redshift__get_alter_materialized_view_as_sql, avoid renaming materialized views with custom table.sql and view.sql
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"
6 changes: 6 additions & 0 deletions .changes/unreleased/Dependencies-20230918-190833.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: "Dependencies"
body: "Update ddtrace requirement from ~=1.18 to ~=1.19"
time: 2023-09-18T19:08:33.00000Z
custom:
Author: dependabot[bot]
PR: 610
6 changes: 6 additions & 0 deletions .changes/unreleased/Fixes-20230923-091155.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Fixes
body: avoid nested loop in query planner execution of redshift__get_relations
time: 2023-09-23T09:11:55.2152725-04:00
custom:
Author: slin30
Issue: "609"
6 changes: 6 additions & 0 deletions .changes/unreleased/Under the Hood-20230925-150132.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Under the Hood
body: Add tests for inlined limit + sql_header in dbt show query
time: 2023-09-25T15:01:32.025325+01:00
custom:
Author: michelleark
Issue: "616"
30 changes: 30 additions & 0 deletions .github/workflows/repository-cleanup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# **what?**
# Cleanup branches left over from automation and testing. Also cleanup
# draft releases from release testing.

# **why?**
# The automations are leaving behind branches and releases that clutter
# the repository. Sometimes we need them to debug processes so we don't
# want them immediately deleted. Running on Saturday to avoid running
# at the same time as an actual release to prevent breaking a release
# mid-release.

# **when?**
# Mainly on a schedule of 12:00 Saturday.
# Manual trigger can also run on demand

name: Repository Cleanup

on:
schedule:
- cron: '0 12 * * SAT' # At 12:00 on Saturday - details in `why` above

workflow_dispatch: # for manual triggering

permissions:
contents: write

jobs:
cleanup-repo:
uses: dbt-labs/actions/.github/workflows/repository-cleanup.yml@main
secrets: inherit
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"
11 changes: 11 additions & 0 deletions dbt/adapters/redshift/relation.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ class RedshiftRelation(BaseRelation):
relation_configs = {
RelationType.MaterializedView.value: RedshiftMaterializedViewConfig,
}
renameable_relations = frozenset(
{
RelationType.View,
RelationType.Table,
}
)
replaceable_relations = frozenset(
{
RelationType.View,
}
)

def __post_init__(self):
# Check for length of Redshift table/view names.
Expand Down
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)}"
)
69 changes: 69 additions & 0 deletions dbt/include/redshift/macros/materializations/table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{% materialization table, adapter='redshift' %}

{%- set existing_relation = load_cached_relation(this) -%}
{%- set target_relation = this.incorporate(type='table') %}
{%- set intermediate_relation = make_intermediate_relation(target_relation) -%}
-- the intermediate_relation should not already exist in the database; get_relation
-- will return None in that case. Otherwise, we get a relation that we can drop
-- later, before we try to use this name for the current operation
{%- set preexisting_intermediate_relation = load_cached_relation(intermediate_relation) -%}
/*
See ../view/view.sql for more information about this relation.
*/
{%- set backup_relation_type = 'table' if existing_relation is none else existing_relation.type -%}
{%- set backup_relation = make_backup_relation(target_relation, backup_relation_type) -%}
-- as above, the backup_relation should not already exist
{%- set preexisting_backup_relation = load_cached_relation(backup_relation) -%}
-- grab current tables grants config for comparision later on
{% set grant_config = config.get('grants') %}

-- drop the temp relations if they exist already in the database
{{ drop_relation_if_exists(preexisting_intermediate_relation) }}
{{ drop_relation_if_exists(preexisting_backup_relation) }}

{{ run_hooks(pre_hooks, inside_transaction=False) }}

-- `BEGIN` happens here:
{{ run_hooks(pre_hooks, inside_transaction=True) }}

-- build model
{% call statement('main') -%}
{{ get_create_table_as_sql(False, intermediate_relation, sql) }}
{%- endcall %}

-- cleanup
{% if existing_relation is not none %}
/* Do the equivalent of rename_if_exists. 'existing_relation' could have been dropped
since the variable was first set. */
{% set existing_relation = load_cached_relation(existing_relation) %}
{% if existing_relation is not none %}
{% if existing_relation.can_be_renamed %}
{{ adapter.rename_relation(existing_relation, backup_relation) }}
{% else %}
{{ drop_relation_if_exists(existing_relation) }}
{% endif %}
{% endif %}
{% endif %}


{{ adapter.rename_relation(intermediate_relation, target_relation) }}

{% do create_indexes(target_relation) %}

{{ run_hooks(post_hooks, inside_transaction=True) }}

{% set should_revoke = should_revoke(existing_relation, full_refresh_mode=True) %}
{% do apply_grants(target_relation, grant_config, should_revoke=should_revoke) %}

{% do persist_docs(target_relation, model) %}

-- `COMMIT` happens here
{{ adapter.commit() }}

-- finally, drop the existing/backup relation after the commit
{{ drop_relation_if_exists(backup_relation) }}

{{ run_hooks(post_hooks, inside_transaction=False) }}

{{ return({'relations': [target_relation]}) }}
{% endmaterialization %}
Loading

0 comments on commit 140b5b9

Please sign in to comment.