@@ -91,12 +91,12 @@ def test_sql_delta(template_path):
9191 WHEN MATCHED THEN UPDATE
9292 SET target.col01= source.col01
9393 ,target.col02= source.col02
94- , target.updt_prcs_nm = 'SOURCE_FOO'
95- , target.updt_prcs_ld_id = 1
96- , target.updt_asat_dt = to_timestamp('20250201', 'yyyyMMdd')
94+ , target.updt_load_src = 'SOURCE_FOO'
95+ , target.updt_load_id = 1
96+ , target.updt_load_date = to_timestamp('20250201', 'yyyyMMdd')
9797 WHEN NOT MATCHED THEN INSERT
9898 (
99- col01, col02, pk_col, start_dt, end_dt, delete_f, prcs_nm, prcs_ld_id, asat_dt, updt_prcs_nm, updt_prcs_ld_id, updt_asat_dt
99+ col01, col02, pk_col, load_src, load_id, load_date, updt_load_src, updt_load_id, updt_load_date
100100 )
101101 VALUES (
102102 source.col01,
@@ -138,12 +138,12 @@ def test_sql_delta(template_path):
138138 WHEN MATCHED THEN UPDATE
139139 SET target.col01= source.col01
140140 ,target.col02= source.col02
141- , target.updt_prcs_nm = 'SOURCE_FOO'
142- , target.updt_prcs_ld_id = 1
143- , target.updt_asat_dt = to_timestamp('20250201', 'yyyyMMdd')
141+ , target.updt_load_src = 'SOURCE_FOO'
142+ , target.updt_load_id = 1
143+ , target.updt_load_date = to_timestamp('20250201', 'yyyyMMdd')
144144 WHEN NOT MATCHED THEN INSERT
145145 (
146- col01, col02, pk_col01, pk_col02, start_dt, end_dt, delete_f, prcs_nm, prcs_ld_id, asat_dt, updt_prcs_nm, updt_prcs_ld_id, updt_asat_dt
146+ col01, col02, pk_col01, pk_col02, load_src, load_id, load_date, updt_load_src, updt_load_id, updt_load_date
147147 )
148148 VALUES (
149149 source.col01,
@@ -158,3 +158,77 @@ def test_sql_delta(template_path):
158158 to_timestamp('20250201', 'yyyyMMdd')
159159 )
160160 """ ).strip ('\n ' )
161+
162+
163+ def test_sql_scd1_soft_delete (template_path ):
164+ select_sql : SQLPlate = (
165+ SQLPlate .system ('databricks' , path = template_path )
166+ .template ('etl.scd1-soft-delete' )
167+ .option ('catalog' , 'catalog-name' )
168+ .option ('schema' , 'schema-name' )
169+ .option ('table' , 'table-name' )
170+ .option ('pk' , 'pk_col' )
171+ .option ('load_src' , 'SOURCE_FOO' )
172+ .option ('load_id' , 1 )
173+ .option ('load_date' , datetime (2025 , 2 , 1 , 10 ))
174+ )
175+ statement : str = (
176+ select_sql
177+ .option ('columns' , ['col01' , 'col02' ])
178+ .option ('query' , 'SELECT * FROM catalog-name.schema-name.source-name' )
179+ .load ()
180+ )
181+ assert prepare_statement (statement ) == dedent ("""
182+ MERGE INTO catalog-name.schema-name.table-name AS target
183+ USING (
184+ WITH change_query AS (
185+ SELECT
186+ src.*,
187+ CASE WHEN tgt.pk_col IS NULL THEN 99
188+ WHEN hash(src.col01, src.col02) <> hash(tgt.col01, tgt.col02) THEN 1
189+ ELSE 0 END AS data_change
190+ FROM ( SELECT * FROM catalog-name.schema-name.source-name ) AS src
191+ LEFT JOIN catalog-name.schema-name.table-name AS tgt
192+ ON tgt.col01 = src.col01
193+ AND tgt.col02 = src.col02
194+ )
195+ SELECT * FROM change_query
196+ ) AS source
197+ ON target.pk_col = source.pk_col
198+ WHEN MATCHED AND data_change = 1
199+ THEN UPDATE
200+ SET {', '.join(_p_col_update)}
201+ , target.delete_f = 0
202+ , target.updt_load_src = 'SOURCE_FOO'
203+ , target.updt_load_id = 1
204+ , target.updt_load_date = to_timestamp('20250201', 'yyyyMMdd')
205+ WHEN MATCHED AND data_change = 0 AND target.delete_f = 1
206+ THEN UPDATE
207+ SET target.delete_f = 0
208+ , target.updt_load_src = 'SOURCE_FOO'
209+ , target.updt_load_id = 1
210+ , target.updt_load_date = to_timestamp('20250201', 'yyyyMMdd')
211+ WHEN NOT MATCHED AND data_change = 99
212+ THEN INSERT
213+ (
214+ col01, col02, pk_col, load_src, load_id, load_date, updt_load_src, updt_load_id, updt_load_date
215+ )
216+ VALUES (
217+ source.col01,
218+ source.col02,
219+ source.pk_col,
220+ 0,
221+ 'SOURCE_FOO',
222+ 1,
223+ 20250201,
224+ 'SOURCE_FOO',
225+ 1,
226+ to_timestamp('20250201', 'yyyyMMdd')
227+ )
228+ WHEN NOT MATCHED BY SOURCE AND target.delete_f = 0
229+ THEN UPDATE
230+ SET target.delete_f = 1
231+ , target.updt_load_src = 'SOURCE_FOO'
232+ , target.updt_load_id = 1
233+ , target.updt_load_date = to_timestamp('20250201', 'yyyyMMdd')
234+ """ ).strip ('\n ' )
0 commit comments