Skip to content

Commit 7519f43

Browse files
authored
Fix!: render audits at runtime (#3667)
1 parent 5d1fe65 commit 7519f43

3 files changed

Lines changed: 44 additions & 3 deletions

File tree

sqlmesh/core/model/definition.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,11 +1765,13 @@ def load_sql_based_model(
17651765

17661766
unrendered_merge_filter = None
17671767
unrendered_signals = None
1768+
unrendered_audits = None
17681769

17691770
for prop in meta.expressions:
17701771
if prop.name.lower() == "signals":
17711772
unrendered_signals = prop.args.get("value")
1772-
1773+
if prop.name.lower() == "audits":
1774+
unrendered_audits = prop.args.get("value")
17731775
if (
17741776
prop.name.lower() == "kind"
17751777
and (value := prop.args.get("value"))
@@ -1816,10 +1818,13 @@ def load_sql_based_model(
18161818
**kwargs,
18171819
}
18181820

1819-
# Signals and merge_filter must remain unrendered, so that they can be rendered later at evaluation runtime.
1821+
# signals, audits and merge_filter must remain unrendered, so that they can be rendered later at evaluation runtime
18201822
if unrendered_signals:
18211823
meta_fields["signals"] = unrendered_signals
18221824

1825+
if unrendered_audits:
1826+
meta_fields["audits"] = unrendered_audits
1827+
18231828
if unrendered_merge_filter:
18241829
for idx, kind_prop in enumerate(meta_fields["kind"].expressions):
18251830
if kind_prop.name.lower() == "merge_filter":

tests/core/test_model.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1172,7 +1172,8 @@ def test_audits():
11721172
name db.seed,
11731173
audits (
11741174
audit_a,
1175-
audit_b(key='value')
1175+
audit_b(key='value'),
1176+
audit_c(key=@start_ds)
11761177
),
11771178
tags (foo)
11781179
);
@@ -1184,6 +1185,7 @@ def test_audits():
11841185
assert model.audits == [
11851186
("audit_a", {}),
11861187
("audit_b", {"key": exp.Literal.string("value")}),
1188+
("audit_c", {"key": d.MacroVar(this="start_ds")}),
11871189
]
11881190
assert model.tags == ["foo"]
11891191

tests/core/test_snapshot_evaluator.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
IncrementalByTimeRangeKind,
2929
IncrementalUnmanagedKind,
3030
IncrementalByPartitionKind,
31+
IncrementalByUniqueKeyKind,
3132
PythonModel,
3233
SqlModel,
3334
TimeColumn,
@@ -2708,6 +2709,39 @@ def test_audit_wap(adapter_mock, make_snapshot):
27082709
adapter_mock.wap_publish.assert_called_once_with(snapshot.table_name(), wap_id)
27092710

27102711

2712+
def test_audit_with_datetime_macros(adapter_mock, make_snapshot):
2713+
evaluator = SnapshotEvaluator(adapter_mock)
2714+
2715+
model = SqlModel(
2716+
name="test_schema.test_table",
2717+
kind=IncrementalByUniqueKeyKind(unique_key="a"),
2718+
query=parse_one("SELECT a, start_ds FROM tbl"),
2719+
audits=[
2720+
(
2721+
"unique_combination_of_columns",
2722+
{
2723+
"columns": exp.Array(expressions=[exp.to_column("a")]),
2724+
"condition": d.MacroVar(this="start_ds").neq("2020-01-01"),
2725+
},
2726+
),
2727+
],
2728+
)
2729+
snapshot = make_snapshot(model)
2730+
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
2731+
2732+
adapter_mock.fetchone.return_value = (0,)
2733+
evaluator.audit(snapshot, snapshots={}, start="2020-01-01")
2734+
2735+
call_args = adapter_mock.fetchone.call_args_list
2736+
assert len(call_args) == 1
2737+
2738+
unique_combination_of_columns_query = call_args[0][0][0]
2739+
assert (
2740+
unique_combination_of_columns_query.sql(dialect="duckdb")
2741+
== """SELECT COUNT(*) FROM (SELECT "a" AS "a" FROM (SELECT * FROM "test_schema"."test_table" AS "test_table") AS "_q_0" WHERE '2020-01-01' <> '2020-01-01' GROUP BY "a" HAVING COUNT(*) > 1) AS audit"""
2742+
)
2743+
2744+
27112745
def test_audit_set_blocking_at_use_site(adapter_mock, make_snapshot):
27122746
evaluator = SnapshotEvaluator(adapter_mock)
27132747

0 commit comments

Comments
 (0)