Skip to content

Commit b0443a6

Browse files
committed
Switched missing_interval and physical model logic to use deployability instead of representativeness for determining whether dev or prod instance of each should be used.
Signed-off-by: davem-bis <68955845+davem-bis@users.noreply.github.com>
1 parent d91bc18 commit b0443a6

4 files changed

Lines changed: 80 additions & 4 deletions

File tree

sqlmesh/core/snapshot/definition.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ def missing_intervals(
10481048

10491049
deployability_index = deployability_index or DeployabilityIndex.all_deployable()
10501050
intervals = (
1051-
self.intervals if deployability_index.is_representative(self) else self.dev_intervals
1051+
self.intervals if deployability_index.is_deployable(self) else self.dev_intervals
10521052
)
10531053

10541054
if not self.evaluatable or (self.is_seed and intervals):

sqlmesh/core/snapshot/evaluator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@ def _promote_snapshot(
12701270
if environment_naming_info.gateway_managed
12711271
else self.adapter
12721272
)
1273-
table_name = snapshot.table_name(deployability_index.is_representative(snapshot))
1273+
table_name = snapshot.table_name(deployability_index.is_deployable(snapshot))
12741274
view_name = snapshot.qualified_view_name.for_environment(
12751275
environment_naming_info, dialect=adapter.dialect
12761276
)

tests/core/test_snapshot.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,43 @@ def test_missing_intervals_start_override_per_model(make_snapshot: t.Callable[..
637637
(to_timestamp("2023-02-07"), to_timestamp("2023-02-08")),
638638
]
639639

640+
def test__missing_intervals__deployable_snapshot_prod_intervals_returned(snapshot: Snapshot):
641+
# Arrange
642+
snapshot.add_interval(start="2020-01-01", end="2020-01-01", is_dev=False)
643+
snapshot.add_interval(start="2020-01-02", end="2020-01-02", is_dev=False)
644+
snapshot.add_interval(start="2020-01-01", end="2020-01-01", is_dev=True)
645+
646+
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
647+
deployability_index = DeployabilityIndex.create([snapshot])
648+
649+
# Act
650+
missing_intervals = snapshot.missing_intervals(start="2020-01-01", end="2020-01-03", deployability_index=deployability_index)
651+
652+
# Assert
653+
assert deployability_index.is_deployable(snapshot)
654+
assert missing_intervals == [
655+
(to_timestamp("2020-01-03"), to_timestamp("2020-01-04")),
656+
]
657+
658+
def test__missing_intervals__non_deployable_snapshot_dev_intervals_returned(snapshot: Snapshot):
659+
# Arrange
660+
snapshot.add_interval(start="2020-01-01", end="2020-01-01", is_dev=False)
661+
snapshot.add_interval(start="2020-01-02", end="2020-01-02", is_dev=False)
662+
snapshot.add_interval(start="2020-01-01", end="2020-01-01", is_dev=True)
663+
664+
snapshot.categorize_as(SnapshotChangeCategory.BREAKING, forward_only=True)
665+
deployability_index = DeployabilityIndex.create([snapshot])
666+
667+
# Act
668+
missing_intervals = snapshot.missing_intervals(start="2020-01-01", end="2020-01-03", deployability_index=deployability_index)
669+
670+
# Assert
671+
assert not deployability_index.is_deployable(snapshot)
672+
assert missing_intervals == [
673+
(to_timestamp("2020-01-02"), to_timestamp("2020-01-03")), # Not missing from prod intervals
674+
(to_timestamp("2020-01-03"), to_timestamp("2020-01-04")),
675+
]
676+
640677

641678
def test_incremental_time_self_reference(make_snapshot):
642679
snapshot = make_snapshot(
@@ -3962,3 +3999,4 @@ def test_snapshot_id_and_version_optional_kind_name():
39623999
assert snapshot.model_kind_name
39634000
assert snapshot.is_incremental_unmanaged
39644001
assert snapshot.full_history_restatement_only
4002+

tests/core/test_snapshot_evaluator.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def increment_stage_counter(evaluator) -> None:
307307
)
308308

309309

310-
def test_promote(mocker: MockerFixture, adapter_mock, make_snapshot):
310+
def test_promote__deployable__non_dev_physical(mocker: MockerFixture, adapter_mock, make_snapshot):
311311
evaluator = SnapshotEvaluator(adapter_mock)
312312

313313
model = SqlModel(
@@ -319,8 +319,13 @@ def test_promote(mocker: MockerFixture, adapter_mock, make_snapshot):
319319

320320
snapshot = make_snapshot(model)
321321
snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
322+
deployability_index = DeployabilityIndex.create([snapshot])
322323

323-
evaluator.promote([snapshot], EnvironmentNamingInfo(name="test_env"))
324+
evaluator.promote(
325+
target_snapshots=[snapshot],
326+
environment_naming_info=EnvironmentNamingInfo(name="test_env"),
327+
deployability_index=deployability_index
328+
)
324329

325330
adapter_mock.transaction.assert_called()
326331
adapter_mock.session.assert_called()
@@ -336,6 +341,39 @@ def test_promote(mocker: MockerFixture, adapter_mock, make_snapshot):
336341
)
337342

338343

344+
def test_promote__non_deployable__dev_physical(mocker: MockerFixture, adapter_mock, make_snapshot):
345+
evaluator = SnapshotEvaluator(adapter_mock)
346+
347+
model = SqlModel(
348+
name="test_schema.test_model",
349+
kind=IncrementalByTimeRangeKind(time_column="a"),
350+
storage_format="parquet",
351+
query=parse_one("SELECT a FROM tbl WHERE ds BETWEEN @start_ds and @end_ds"),
352+
)
353+
354+
snapshot = make_snapshot(model)
355+
snapshot.categorize_as(SnapshotChangeCategory.BREAKING, forward_only=True)
356+
deployability_index = DeployabilityIndex.create([snapshot])
357+
358+
evaluator.promote(
359+
target_snapshots=[snapshot],
360+
environment_naming_info=EnvironmentNamingInfo(name="test_env"),
361+
deployability_index=deployability_index
362+
)
363+
364+
adapter_mock.transaction.assert_called()
365+
adapter_mock.session.assert_called()
366+
adapter_mock.create_schema.assert_called_once_with(to_schema("test_schema__test_env"))
367+
adapter_mock.create_view.assert_called_once_with(
368+
"test_schema__test_env.test_model",
369+
parse_one(
370+
f"SELECT * FROM sqlmesh__test_schema.test_schema__test_model__{snapshot.version}__dev"
371+
),
372+
table_description=None,
373+
column_descriptions=None,
374+
view_properties={},
375+
)
376+
339377
def test_demote(mocker: MockerFixture, adapter_mock, make_snapshot):
340378
evaluator = SnapshotEvaluator(adapter_mock)
341379

0 commit comments

Comments
 (0)