Skip to content

Commit

Permalink
Added integration test and cleaned up code
Browse files Browse the repository at this point in the history
  • Loading branch information
bodschut committed Jun 18, 2020
1 parent 33b4e78 commit fb90144
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 4 deletions.
28 changes: 24 additions & 4 deletions plugins/bigquery/dbt/adapters/bigquery/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -596,16 +596,33 @@ def get_table_ref_from_relation(self, conn, relation):
conn)

def _update_column_dict(self, bq_column_dict, dbt_columns, parent=''):
# bq_colunmn_dict generated by SchemaField.to_api_repr()
dotted_column_name = '{}.{}'.format(parent, bq_column_dict['name']) if parent else bq_column_dict['name']
"""
Helper function to recursively traverse the schema of a table in the
update_column_descriptions function below.
bq_column_dict should be a dict as obtained by the to_api_repr()
function of a SchemaField object.
"""
if parent:
dotted_column_name = '{}.{}'.format(parent, bq_column_dict['name'])
else:
dotted_column_name = bq_column_dict['name']

if dotted_column_name in dbt_columns:
column_config = dbt_columns[dotted_column_name]
bq_column_dict['description'] = column_config.get('description')

new_fields = []
for child_col_dict in bq_column_dict.get('fields', list()):
new_child_column_dict = self._update_column_dict(child_col_dict, dbt_columns, parent=dotted_column_name)
new_child_column_dict = self._update_column_dict(
child_col_dict,
dbt_columns,
parent=dotted_column_name
)
new_fields.append(new_child_column_dict)

bq_column_dict['fields'] = new_fields

return bq_column_dict

@available.parse_none
Expand All @@ -620,7 +637,10 @@ def update_column_descriptions(self, relation, columns):
new_schema = []
for bq_column in table.schema:
bq_column_dict = bq_column.to_api_repr()
new_bq_column_dict = self._update_column_dict(bq_column_dict, columns)
new_bq_column_dict = self._update_column_dict(
bq_column_dict,
columns
)
new_schema.append(SchemaField.from_api_repr(new_bq_column_dict))

new_table = google.cloud.bigquery.Table(table_ref, schema=new_schema)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: 2

models:
- name: table_model_nested
columns:
- name: level_1
description: level_1 column description
- name: level_1.level_2
description: level_2 column description
- name: level_1.level_2.level_3_a
description: level_3 column description
- name: view_model_nested
columns:
- name: level_1
description: level_1 column description
- name: level_1.level_2
description: level_2 column description
- name: level_1.level_2.level_3_a
description: level_3 column description
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{{ config(materialized='table') }}
SELECT
STRUCT(
STRUCT(
1 AS level_3_a,
2 AS level_3_b
) AS level_2
) AS level_1
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{{ config(materialized='view') }}
SELECT
STRUCT(
STRUCT(
1 AS level_3_a,
2 AS level_3_b
) AS level_2
) AS level_1
67 changes: 67 additions & 0 deletions test/integration/060_persist_docs_tests/test_persist_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,70 @@ def test_snowflake_persist_docs(self):
@use_profile('bigquery')
def test_bigquery_persist_docs(self):
self.run_dbt()


class TestPersistDocsNested(BasePersistDocsTest):
@property
def project_config(self):
return {
'config-version': 2,
'models': {
'test': {
'+persist_docs': {
"relation": True,
"columns": True,
},
}
}
}

@property
def models(self):
return 'models-bigquery-nested'

@use_profile('bigquery')
def test_bigquery_persist_docs(self):
"""
run dbt and use the bigquery client from the adapter to check if the
colunmn descriptions are persisted on the test model table and view.
"""
import sys
self.run_dbt()

with self.adapter.connection_named('_test'):
client = self.adapter.connections.get_thread_connection().handle

# test for table model
table_id = "{}.{}.{}".format(
self.default_database,
self.unique_schema(),
"table_model_nested"
)
bq_table_schema = client.get_table(table_id).schema

level_1_field = bq_table_schema[0]
assert level_1_field.description == "level_1 column description"

level_2_field = level_1_field.fields[0]
assert level_2_field.description == "level_2 column description"

level_3_field = level_2_field.fields[0]
assert level_3_field.description == "level_3 column description"

# test for view model
view_id = "{}.{}.{}".format(
self.default_database,
self.unique_schema(),
"view_model_nested"
)
bq_view_schema = client.get_table(view_id).schema

level_1_field = bq_view_schema[0]
assert level_1_field.description == "level_1 column description"

level_2_field = level_1_field.fields[0]
assert level_2_field.description == "level_2 column description"

level_3_field = level_2_field.fields[0]
assert level_3_field.description == "level_3 column description"

0 comments on commit fb90144

Please sign in to comment.