Skip to content

Commit 6f3c0af

Browse files
committed
Fix: Ignore expired environments in the selector (#3059)
1 parent 913d13d commit 6f3c0af

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

sqlmesh/core/selector.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ def select_models(
6868
A dictionary of models.
6969
"""
7070
target_env = self._state_reader.get_environment(Environment.sanitize_name(target_env_name))
71+
if target_env and target_env.expired:
72+
target_env = None
73+
7174
if not target_env and fallback_env_name:
7275
target_env = self._state_reader.get_environment(
7376
Environment.sanitize_name(fallback_env_name)

tests/core/test_selector.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from sqlmesh.core.selector import Selector
1515
from sqlmesh.core.snapshot import SnapshotChangeCategory
1616
from sqlmesh.utils import UniqueKeyDict
17+
from sqlmesh.utils.date import now_timestamp
1718

1819

1920
@pytest.mark.parametrize(
@@ -185,6 +186,81 @@ def test_select_models(mocker: MockerFixture, make_snapshot, default_catalog: t.
185186
)
186187

187188

189+
def test_select_models_expired_environment(mocker: MockerFixture, make_snapshot):
190+
modified_model_v1 = SqlModel(
191+
name="db.modified_model",
192+
query=d.parse_one("SELECT a + 1 FROM db.added_model"),
193+
)
194+
modified_model_v2 = SqlModel(
195+
name="db.modified_model",
196+
query=d.parse_one("SELECT a + 2 FROM db.added_model"),
197+
)
198+
removed_model = SqlModel(
199+
name="db.removed_model",
200+
query=d.parse_one("SELECT a FROM db.added_model"),
201+
)
202+
standalone_audit = StandaloneAudit(
203+
name="test_audit", query=d.parse_one("SELECT * FROM added_model WHERE a IS NULL")
204+
)
205+
206+
modified_model_v1_snapshot = make_snapshot(modified_model_v1)
207+
modified_model_v1_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
208+
removed_model_snapshot = make_snapshot(removed_model)
209+
removed_model_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
210+
standalone_audit_snapshot = make_snapshot(standalone_audit)
211+
standalone_audit_snapshot.categorize_as(SnapshotChangeCategory.BREAKING)
212+
213+
prod_env = Environment(
214+
name="prod",
215+
snapshots=[modified_model_v1_snapshot.table_info],
216+
start_at="2023-01-01",
217+
end_at="2023-02-01",
218+
plan_id="test_plan_id",
219+
)
220+
221+
env_name = "test_env"
222+
dev_env = Environment(
223+
name=env_name,
224+
snapshots=[modified_model_v1_snapshot.table_info, removed_model_snapshot.table_info],
225+
start_at="2023-01-01",
226+
end_at="2023-02-01",
227+
plan_id="test_plan_id",
228+
)
229+
230+
state_reader_mock = mocker.Mock()
231+
state_reader_mock.get_environment.side_effect = (
232+
lambda name: prod_env if name == "prod" else dev_env
233+
)
234+
235+
all_snapshots = {
236+
modified_model_v1_snapshot.snapshot_id: modified_model_v1_snapshot,
237+
removed_model_snapshot.snapshot_id: removed_model_snapshot,
238+
}
239+
state_reader_mock.get_snapshots.side_effect = lambda snapshots: {
240+
s.snapshot_id: all_snapshots[s.snapshot_id] for s in snapshots
241+
}
242+
243+
local_models: UniqueKeyDict[str, Model] = UniqueKeyDict("models")
244+
local_models[modified_model_v2.fqn] = modified_model_v2
245+
selector = Selector(state_reader_mock, local_models)
246+
247+
_assert_models_equal(
248+
selector.select_models(["*.modified_model"], env_name, fallback_env_name="prod"),
249+
{
250+
removed_model.fqn: removed_model,
251+
modified_model_v2.fqn: modified_model_v2,
252+
},
253+
)
254+
255+
dev_env.expiration_ts = now_timestamp() - 1
256+
_assert_models_equal(
257+
selector.select_models(["*.modified_model"], env_name, fallback_env_name="prod"),
258+
{
259+
modified_model_v2.fqn: modified_model_v2,
260+
},
261+
)
262+
263+
188264
def test_select_change_schema(mocker: MockerFixture, make_snapshot):
189265
parent = SqlModel(
190266
name="db.parent",

0 commit comments

Comments
 (0)