Skip to content

Commit f562991

Browse files
Feat(dbt): Add support for selected resources context variable
1 parent cd37002 commit f562991

3 files changed

Lines changed: 111 additions & 0 deletions

File tree

sqlmesh/core/context.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
run_tests,
118118
)
119119
from sqlmesh.core.user import User
120+
from sqlmesh.dbt.builtin import set_selected_resources
120121
from sqlmesh.utils import UniqueKeyDict, Verbosity
121122
from sqlmesh.utils.concurrency import concurrent_apply_to_values
122123
from sqlmesh.utils.dag import DAG
@@ -1583,6 +1584,11 @@ def plan_builder(
15831584
"Selector did not return any models. Please check your model selection and try again."
15841585
)
15851586

1587+
if self._project_type != c.NATIVE:
1588+
set_selected_resources(
1589+
models=model_selector.expand_model_selections(select_models or "*")
1590+
)
1591+
15861592
snapshots = self._snapshots(models_override)
15871593
context_diff = self._context_diff(
15881594
environment or c.PROD,
@@ -2482,6 +2488,9 @@ def _run(
24822488
select_models, no_auto_upstream, snapshots.values()
24832489
)
24842490

2491+
if self._project_type != c.NATIVE:
2492+
set_selected_resources(models=select_models or set([s.name for s in snapshots.keys()]))
2493+
24852494
completion_status = scheduler.run(
24862495
environment,
24872496
start=start,

sqlmesh/dbt/builtin.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@ def create_builtin_globals(
540540
"run_query": sql_execution.run_query,
541541
"statement": sql_execution.statement,
542542
"graph": adapter.graph,
543+
"selected_resources": get_selected_resources(),
543544
}
544545
)
545546

@@ -567,3 +568,33 @@ def _relation_info_to_relation(
567568
}
568569
)
569570
return relation_type.create(**relation_info, quote_policy=quote_policy)
571+
572+
573+
_selected_resources: t.List[str] = []
574+
575+
576+
def set_selected_resources(
577+
models: t.Optional[t.Set[str]] = None,
578+
) -> None:
579+
global _selected_resources
580+
resources = []
581+
582+
if models:
583+
for model in models:
584+
resources.append(dbt_model_id(model))
585+
586+
_selected_resources = sorted(resources)
587+
588+
589+
def dbt_model_id(sqlmesh_model_name: str) -> str:
590+
parts = [part.strip('"') for part in sqlmesh_model_name.split(".")]
591+
return f"model.{parts[0]}.{parts[-1]}"
592+
593+
594+
def get_selected_resources() -> t.List[str]:
595+
return _selected_resources
596+
597+
598+
def clear_selected_resources() -> None:
599+
global _selected_resources
600+
_selected_resources = []

tests/dbt/test_transformation.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@
4545
from sqlmesh.core.state_sync.db.snapshot import _snapshot_to_json
4646
from sqlmesh.dbt.builtin import _relation_info_to_relation, Config
4747
from sqlmesh.dbt.common import Dependencies
48+
from sqlmesh.dbt.builtin import (
49+
_relation_info_to_relation,
50+
dbt_model_id,
51+
clear_selected_resources,
52+
get_selected_resources,
53+
)
4854
from sqlmesh.dbt.column import (
4955
ColumnConfig,
5056
column_descriptions_to_sqlmesh,
@@ -2352,3 +2358,68 @@ def test_dynamic_var_names_in_macro(sushi_test_project: Project):
23522358
)
23532359
converted_model = model_config.to_sqlmesh(context)
23542360
assert "dynamic_test_var" in converted_model.jinja_macros.global_objs["vars"] # type: ignore
2361+
2362+
2363+
def test_selected_resources_with_selectors():
2364+
sushi_context = Context(paths=["tests/fixtures/dbt/sushi_test"])
2365+
2366+
# A plan with a specific model selection
2367+
clear_selected_resources()
2368+
sushi_context.plan_builder(select_models=["sushi.customers"])
2369+
2370+
selected = get_selected_resources()
2371+
assert "model.memory.customers" in selected
2372+
assert len(selected) == 1
2373+
2374+
# Plan without model selections
2375+
clear_selected_resources()
2376+
sushi_context.plan_builder()
2377+
selected = get_selected_resources()
2378+
assert sorted(
2379+
[
2380+
"model.memory.customer_revenue_by_day",
2381+
"model.memory.customers",
2382+
"model.memory.items",
2383+
"model.memory.items_check_snapshot",
2384+
"model.memory.items_no_hard_delete_snapshot",
2385+
"model.memory.items_snapshot",
2386+
"model.memory.order_items",
2387+
"model.memory.orders",
2388+
"model.memory.simple_model_a",
2389+
"model.memory.simple_model_b",
2390+
"model.memory.top_waiters",
2391+
"model.memory.waiter_as_customer_by_day",
2392+
"model.memory.waiter_names",
2393+
"model.memory.waiter_revenue_by_day_v1",
2394+
"model.memory.waiter_revenue_by_day_v2",
2395+
"model.memory.waiters",
2396+
]
2397+
) == sorted(selected)
2398+
2399+
# Test with downstream models as well
2400+
clear_selected_resources()
2401+
sushi_context.plan_builder(select_models=["sushi.customers+"])
2402+
selected = get_selected_resources()
2403+
assert sorted(["model.memory.customers", "model.memory.waiter_as_customer_by_day"]) == sorted(
2404+
selected
2405+
)
2406+
2407+
# Test wildcard selection
2408+
clear_selected_resources()
2409+
sushi_context.plan_builder(select_models=["sushi.waiter_*"])
2410+
selected = get_selected_resources()
2411+
assert sorted(
2412+
[
2413+
"model.memory.waiter_as_customer_by_day",
2414+
"model.memory.waiter_names",
2415+
"model.memory.waiter_revenue_by_day_v1",
2416+
"model.memory.waiter_revenue_by_day_v2",
2417+
]
2418+
) == sorted(selected)
2419+
clear_selected_resources()
2420+
2421+
2422+
def test_dbt_model_id_conversion():
2423+
assert dbt_model_id("jaffle_shop.main.customers") == "model.jaffle_shop.customers"
2424+
assert dbt_model_id("jaffle_shop.main.orders") == "model.jaffle_shop.orders"
2425+
assert dbt_model_id('"jaffle_shop"."customers"') == "model.jaffle_shop.customers"

0 commit comments

Comments
 (0)