Skip to content

Commit 1c95414

Browse files
Feat(dbt): Add support for selected resources context variable
1 parent 4c42b45 commit 1c95414

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
@@ -545,6 +545,7 @@ def create_builtin_globals(
545545
"run_query": sql_execution.run_query,
546546
"statement": sql_execution.statement,
547547
"graph": adapter.graph,
548+
"selected_resources": get_selected_resources(),
548549
}
549550
)
550551

@@ -572,3 +573,33 @@ def _relation_info_to_relation(
572573
}
573574
)
574575
return relation_type.create(**relation_info, quote_policy=quote_policy)
576+
577+
578+
_selected_resources: t.List[str] = []
579+
580+
581+
def set_selected_resources(
582+
models: t.Optional[t.Set[str]] = None,
583+
) -> None:
584+
global _selected_resources
585+
resources = []
586+
587+
if models:
588+
for model in models:
589+
resources.append(dbt_model_id(model))
590+
591+
_selected_resources = sorted(resources)
592+
593+
594+
def dbt_model_id(sqlmesh_model_name: str) -> str:
595+
parts = [part.strip('"') for part in sqlmesh_model_name.split(".")]
596+
return f"model.{parts[0]}.{parts[-1]}"
597+
598+
599+
def get_selected_resources() -> t.List[str]:
600+
return _selected_resources
601+
602+
603+
def clear_selected_resources() -> None:
604+
global _selected_resources
605+
_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,
@@ -2375,3 +2381,68 @@ def test_dynamic_var_names_in_macro(sushi_test_project: Project):
23752381
)
23762382
converted_model = model_config.to_sqlmesh(context)
23772383
assert "dynamic_test_var" in converted_model.jinja_macros.global_objs["vars"] # type: ignore
2384+
2385+
2386+
def test_selected_resources_with_selectors():
2387+
sushi_context = Context(paths=["tests/fixtures/dbt/sushi_test"])
2388+
2389+
# A plan with a specific model selection
2390+
clear_selected_resources()
2391+
sushi_context.plan_builder(select_models=["sushi.customers"])
2392+
2393+
selected = get_selected_resources()
2394+
assert "model.memory.customers" in selected
2395+
assert len(selected) == 1
2396+
2397+
# Plan without model selections
2398+
clear_selected_resources()
2399+
sushi_context.plan_builder()
2400+
selected = get_selected_resources()
2401+
assert sorted(
2402+
[
2403+
"model.memory.customer_revenue_by_day",
2404+
"model.memory.customers",
2405+
"model.memory.items",
2406+
"model.memory.items_check_snapshot",
2407+
"model.memory.items_no_hard_delete_snapshot",
2408+
"model.memory.items_snapshot",
2409+
"model.memory.order_items",
2410+
"model.memory.orders",
2411+
"model.memory.simple_model_a",
2412+
"model.memory.simple_model_b",
2413+
"model.memory.top_waiters",
2414+
"model.memory.waiter_as_customer_by_day",
2415+
"model.memory.waiter_names",
2416+
"model.memory.waiter_revenue_by_day_v1",
2417+
"model.memory.waiter_revenue_by_day_v2",
2418+
"model.memory.waiters",
2419+
]
2420+
) == sorted(selected)
2421+
2422+
# Test with downstream models as well
2423+
clear_selected_resources()
2424+
sushi_context.plan_builder(select_models=["sushi.customers+"])
2425+
selected = get_selected_resources()
2426+
assert sorted(["model.memory.customers", "model.memory.waiter_as_customer_by_day"]) == sorted(
2427+
selected
2428+
)
2429+
2430+
# Test wildcard selection
2431+
clear_selected_resources()
2432+
sushi_context.plan_builder(select_models=["sushi.waiter_*"])
2433+
selected = get_selected_resources()
2434+
assert sorted(
2435+
[
2436+
"model.memory.waiter_as_customer_by_day",
2437+
"model.memory.waiter_names",
2438+
"model.memory.waiter_revenue_by_day_v1",
2439+
"model.memory.waiter_revenue_by_day_v2",
2440+
]
2441+
) == sorted(selected)
2442+
clear_selected_resources()
2443+
2444+
2445+
def test_dbt_model_id_conversion():
2446+
assert dbt_model_id("jaffle_shop.main.customers") == "model.jaffle_shop.customers"
2447+
assert dbt_model_id("jaffle_shop.main.orders") == "model.jaffle_shop.orders"
2448+
assert dbt_model_id('"jaffle_shop"."customers"') == "model.jaffle_shop.customers"

0 commit comments

Comments
 (0)