dbt-firebolt 1.8.3__py3-none-any.whl → 1.9.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- dbt/adapters/firebolt/__init__.py +1 -1
- dbt/adapters/firebolt/impl.py +36 -5
- dbt/include/firebolt/macros/materializations/snapshot_merge.sql +19 -0
- dbt/include/firebolt/macros/relations/table/create.sql +6 -2
- {dbt_firebolt-1.8.3.dist-info → dbt_firebolt-1.9.0.dist-info}/METADATA +2 -2
- {dbt_firebolt-1.8.3.dist-info → dbt_firebolt-1.9.0.dist-info}/RECORD +9 -8
- {dbt_firebolt-1.8.3.dist-info → dbt_firebolt-1.9.0.dist-info}/LICENSE +0 -0
- {dbt_firebolt-1.8.3.dist-info → dbt_firebolt-1.9.0.dist-info}/WHEEL +0 -0
- {dbt_firebolt-1.8.3.dist-info → dbt_firebolt-1.9.0.dist-info}/top_level.txt +0 -0
dbt/adapters/firebolt/impl.py
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
import re
|
2
2
|
import time
|
3
3
|
from dataclasses import dataclass
|
4
|
-
from datetime import datetime
|
5
4
|
from typing import Any, List, Mapping, Optional, Union
|
6
5
|
|
7
6
|
import agate
|
@@ -29,21 +28,45 @@ from dbt.adapters.firebolt.connections import FireboltConnectionManager
|
|
29
28
|
from dbt.adapters.firebolt.relation import FireboltRelation
|
30
29
|
|
31
30
|
|
31
|
+
def quote_columns(columns: Union[str, List[str]]) -> Union[str, List[str]]:
|
32
|
+
if isinstance(columns, str):
|
33
|
+
return f'"{columns}"'
|
34
|
+
quoted_columns = []
|
35
|
+
for col in columns:
|
36
|
+
if col.startswith('"') and col.endswith('"'):
|
37
|
+
quoted_columns.append(col)
|
38
|
+
else:
|
39
|
+
quoted_columns.append(f'"{col}"')
|
40
|
+
return quoted_columns
|
41
|
+
|
42
|
+
|
32
43
|
@dataclass
|
33
44
|
class FireboltIndexConfig(dbtClassMixin):
|
34
45
|
index_type: str
|
46
|
+
index_name: Optional[str] = None
|
35
47
|
join_columns: Optional[Union[str, List[str]]] = None
|
36
48
|
key_columns: Optional[Union[str, List[str]]] = None
|
37
49
|
dimension_column: Optional[Union[str, List[str]]] = None
|
38
50
|
aggregation: Optional[Union[str, List[str]]] = None
|
39
51
|
|
52
|
+
def __post_init__(self) -> None:
|
53
|
+
# quote unquoted columns
|
54
|
+
if self.join_columns:
|
55
|
+
self.join_columns = quote_columns(self.join_columns)
|
56
|
+
if self.key_columns:
|
57
|
+
self.key_columns = quote_columns(self.key_columns)
|
58
|
+
if self.dimension_column:
|
59
|
+
self.dimension_column = quote_columns(self.dimension_column)
|
60
|
+
|
40
61
|
def render_name(self, relation: FireboltRelation) -> str:
|
41
62
|
"""
|
42
63
|
Name an index according to the following format, joined by `_`:
|
43
64
|
index type, relation name, key/join columns, timestamp (unix & UTC)
|
44
65
|
example index name: join_my_model_customer_id_1633504263.
|
45
66
|
"""
|
46
|
-
|
67
|
+
if self.index_name:
|
68
|
+
return self.index_name
|
69
|
+
now_unix = str(int(time.time()))
|
47
70
|
# If column_names is a list with > 1 members, join with _,
|
48
71
|
# otherwise do not. We were getting index names like
|
49
72
|
# join__idx__emf_customers__f_i_r_s_t___n_a_m_e__165093112.
|
@@ -51,14 +74,23 @@ class FireboltIndexConfig(dbtClassMixin):
|
|
51
74
|
spine_col = (
|
52
75
|
'_'.join(column_names) if isinstance(column_names, list) else column_names
|
53
76
|
)
|
77
|
+
# Additional hash to ensure uniqueness after spaces are removed
|
78
|
+
column_hash = str(hash(spine_col))[:5]
|
54
79
|
inputs = [
|
55
80
|
f'{self.index_type}_idx',
|
56
81
|
relation.identifier,
|
57
82
|
spine_col,
|
83
|
+
column_hash,
|
58
84
|
now_unix,
|
59
85
|
]
|
60
|
-
|
61
|
-
|
86
|
+
index_name = '__'.join([x for x in inputs if x is not None])
|
87
|
+
if len(index_name) > 255:
|
88
|
+
# Firebolt index names must be <= 255 characters.
|
89
|
+
# If the index name is too long, hash it.
|
90
|
+
return f'{self.index_type}_idx_{hash(index_name)}'
|
91
|
+
# Remove any spaces or quotes from the index name.
|
92
|
+
index_name = index_name.replace(' ', '_').replace('"', '')
|
93
|
+
return index_name
|
62
94
|
|
63
95
|
@classmethod
|
64
96
|
def parse(cls, raw_index: Optional[Mapping]) -> Optional['FireboltIndexConfig']:
|
@@ -274,7 +306,6 @@ class FireboltAdapter(SQLAdapter):
|
|
274
306
|
columns: the number of rows that are different between the two
|
275
307
|
relations and the number of mismatched rows.
|
276
308
|
"""
|
277
|
-
# This method only really exists for test reasons.
|
278
309
|
names: List[str]
|
279
310
|
if column_names is None:
|
280
311
|
columns = self.get_columns_in_relation(relation_a)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
{% macro firebolt__snapshot_merge_sql(target, source, insert_cols) -%}
|
2
|
+
{%- set insert_cols_csv = insert_cols | join(', ') -%}
|
3
|
+
|
4
|
+
UPDATE {{ target.render() }} AS DBT_INTERNAL_DEST
|
5
|
+
SET dbt_valid_to = DBT_INTERNAL_SOURCE.dbt_valid_to
|
6
|
+
FROM {{ source }} AS DBT_INTERNAL_SOURCE
|
7
|
+
WHERE DBT_INTERNAL_SOURCE.dbt_scd_id = DBT_INTERNAL_DEST.dbt_scd_id
|
8
|
+
AND DBT_INTERNAL_DEST.dbt_valid_to IS NULL
|
9
|
+
AND DBT_INTERNAL_SOURCE.dbt_change_type IN ('update', 'delete');
|
10
|
+
|
11
|
+
INSERT INTO {{ target.render() }} ({{ insert_cols_csv }})
|
12
|
+
SELECT {{ insert_cols_csv }}
|
13
|
+
FROM {{ source }} AS DBT_INTERNAL_SOURCE
|
14
|
+
WHERE DBT_INTERNAL_SOURCE.dbt_scd_id NOT IN (
|
15
|
+
SELECT dbt_scd_id FROM {{ target.render() }}
|
16
|
+
)
|
17
|
+
AND DBT_INTERNAL_SOURCE.dbt_change_type = 'insert';
|
18
|
+
|
19
|
+
{% endmacro %}
|
@@ -24,6 +24,10 @@
|
|
24
24
|
) }}
|
25
25
|
{%- endif -%}
|
26
26
|
|
27
|
+
{%- if temporary -%}
|
28
|
+
{%- do adapter.drop_relation(relation) -%}
|
29
|
+
{%- endif -%}
|
30
|
+
|
27
31
|
{%- set table_type = config.get(
|
28
32
|
'table_type',
|
29
33
|
default = 'dimension'
|
@@ -49,9 +53,9 @@
|
|
49
53
|
|
50
54
|
{%- if primary_index %}
|
51
55
|
primary INDEX {% if primary_index is iterable and primary_index is not string %}
|
52
|
-
{{ primary_index | join(', ') }}
|
56
|
+
"{{ primary_index | join('", "') }}"
|
53
57
|
{%- else -%}
|
54
|
-
{{ primary_index }}
|
58
|
+
"{{ primary_index }}"
|
55
59
|
{%- endif -%}
|
56
60
|
{%- endif -%}
|
57
61
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: dbt-firebolt
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.9.0
|
4
4
|
Summary: The Firebolt adapter plugin for dbt (data build tool)
|
5
5
|
Home-page: https://github.com/firebolt-db/dbt-firebolt
|
6
6
|
Author: Firebolt
|
@@ -78,7 +78,7 @@ The table below shows which dbt and Firebolt features are supported by the adapt
|
|
78
78
|
| Incremental materializations - insert_overwrite | :white_check_mark: |
|
79
79
|
| Incremental materializations - delete+insert | :white_check_mark: |
|
80
80
|
| Incremental materializations - merge | :x: |
|
81
|
-
| Snapshots | :
|
81
|
+
| Snapshots | :white_check_mark: |
|
82
82
|
| Seeds | :white_check_mark: |
|
83
83
|
| Tests | :white_check_mark: |
|
84
84
|
| Documentation | :white_check_mark: |
|
@@ -1,8 +1,8 @@
|
|
1
|
-
dbt/adapters/firebolt/__init__.py,sha256=
|
1
|
+
dbt/adapters/firebolt/__init__.py,sha256=JjZII9vG02tYg2Mx_VhNAvHCmaGklk5xXNQhOpqQcOM,411
|
2
2
|
dbt/adapters/firebolt/__version__.py,sha256=zRlZGglif76ZVuWWSjsH_MMPgtVQqmj-SryYJW25FL4,69
|
3
3
|
dbt/adapters/firebolt/column.py,sha256=COo_wjhCFgS3GFcPIPcoq7WAWgzN6DB2XqG-gk51WBc,539
|
4
4
|
dbt/adapters/firebolt/connections.py,sha256=_i0wPE6LWmLGo_C50UhPAU8IMUi_I2HU23fBZtfhi0Q,7942
|
5
|
-
dbt/adapters/firebolt/impl.py,sha256=
|
5
|
+
dbt/adapters/firebolt/impl.py,sha256=xlmGCDezIsUKiQ4gQFR60h_QtvSgW1lOacktv8Lt3ow,15143
|
6
6
|
dbt/adapters/firebolt/relation.py,sha256=Xg3Nrjw3UrF_qwnuGbPT97rSXRiDP1GlIAoBF4b7QnY,1922
|
7
7
|
dbt/adapters/firebolt/relation_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
8
8
|
dbt/include/firebolt/__init__.py,sha256=vBGWeG-dHHkimfnX8axBJ4IgAowFw8xADmo6Auzn2xc,52
|
@@ -17,6 +17,7 @@ dbt/include/firebolt/macros/dbt_external_tables/get_external_build_plan.sql,sha2
|
|
17
17
|
dbt/include/firebolt/macros/materializations/clone.sql,sha256=SKPc_tG0tF2HRKlo1-CQPvxVWGKHpXDwxvubsCwKTG8,79
|
18
18
|
dbt/include/firebolt/macros/materializations/materialized_view.sql,sha256=pdWGMP25o0RqNINx1hbn1Q4dTNcdk0Dgrlv3K8XQAbs,202
|
19
19
|
dbt/include/firebolt/macros/materializations/seed.sql,sha256=O622lwmzRGeAfaNfRpjR183ARFltILteznwgXZfPXMA,1564
|
20
|
+
dbt/include/firebolt/macros/materializations/snapshot_merge.sql,sha256=9Y4tGWkqkBDt53QHKxJPFALboKQxDJ4ZaSrLwNyRgIs,795
|
20
21
|
dbt/include/firebolt/macros/materializations/table.sql,sha256=XY0D-df9EoWOBF3kCT3TCE3Rko7bvvfuztQT0-Pqlfs,1752
|
21
22
|
dbt/include/firebolt/macros/materializations/test.sql,sha256=Wol19pNIfkPRTpVUYKAGbkipYOMZjixnAaoZ1chuP88,488
|
22
23
|
dbt/include/firebolt/macros/materializations/view.sql,sha256=0xg2mO-1UWtZKj2Wlplgm7s93l-FKBswajiBOqPu2Og,1706
|
@@ -31,7 +32,7 @@ dbt/include/firebolt/macros/relations/materialized_view/create.sql,sha256=xthF0o
|
|
31
32
|
dbt/include/firebolt/macros/relations/materialized_view/describe.sql,sha256=uMJWY-9P-49YjhwH_F1Co4szia0oNAVYqJIv2IVGzM8,164
|
32
33
|
dbt/include/firebolt/macros/relations/materialized_view/drop.sql,sha256=Ya03cid5h05t3-SIF4JndKtMMIctD46OX9gPVt9jhVw,160
|
33
34
|
dbt/include/firebolt/macros/relations/materialized_view/refresh.sql,sha256=9s4e6cjT9Dx9nCCJPMlhV5SkzHX8574cdIJUhSfNmU8,163
|
34
|
-
dbt/include/firebolt/macros/relations/table/create.sql,sha256=
|
35
|
+
dbt/include/firebolt/macros/relations/table/create.sql,sha256=5FK3XOICE-9LGojHzh0pjCy5wO-RKyeytzkEQmYT7zY,2507
|
35
36
|
dbt/include/firebolt/macros/relations/table/drop.sql,sha256=3W0SMqmlDizmZqn-QZvqXeJ9lG2KtooiFvwac3WzSzQ,110
|
36
37
|
dbt/include/firebolt/macros/relations/table/rename.sql,sha256=5dmKvuiSnMTARuthnDJBUOORdQCIeEuGMLoyZlgQxVU,185
|
37
38
|
dbt/include/firebolt/macros/relations/table/replace.sql,sha256=bw08YDtLMhkM4dO4nYXZ32U50lcnTG5Axb-Lls7XpB0,132
|
@@ -53,8 +54,8 @@ dbt/include/firebolt/macros/utils/position.sql,sha256=WPo9_bhvNYJooEAsHC9OcnNAwU
|
|
53
54
|
dbt/include/firebolt/macros/utils/right.sql,sha256=_mm1_2MvlOH4O6CmYhgvVxMLfDxAvgv-EMwZ8OBOq-I,254
|
54
55
|
dbt/include/firebolt/macros/utils/split_part.sql,sha256=5dUlbx3Pt1iWWaIlxiXyYUwUqzXuLLXMB-1aGJHNk4o,464
|
55
56
|
dbt/include/firebolt/macros/utils/timestamps.sql,sha256=22g-QpJjBuBUQOHNpQ_TuMRa-cHxaxXPv8ItEUo-vEk,397
|
56
|
-
dbt_firebolt-1.
|
57
|
-
dbt_firebolt-1.
|
58
|
-
dbt_firebolt-1.
|
59
|
-
dbt_firebolt-1.
|
60
|
-
dbt_firebolt-1.
|
57
|
+
dbt_firebolt-1.9.0.dist-info/LICENSE,sha256=Nn0EGvW3qmoZpBV_JVM3iPukFf3RiNCIizrWe_2oTHk,11354
|
58
|
+
dbt_firebolt-1.9.0.dist-info/METADATA,sha256=cusaAXb1pygjqHsGIE6sk-Xk56vD8NOhOnVzWhWn-_M,5237
|
59
|
+
dbt_firebolt-1.9.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
60
|
+
dbt_firebolt-1.9.0.dist-info/top_level.txt,sha256=B2YH4he17ajilEWOGCKHbRcEJlCuZKwCcgFcLPntLsE,4
|
61
|
+
dbt_firebolt-1.9.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|