Skip to content

Commit 03cb4f5

Browse files
committed
Fix: Normalize canonical names and use in circular ref workaround
1 parent 5ffed10 commit 03cb4f5

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

sqlmesh/dbt/basemodel.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,9 @@ def canonical_name(self, context: DbtContext) -> str:
222222
)
223223
if relation.database == context.target.database:
224224
relation = relation.include(database=False)
225-
self._canonical_name = relation.render()
225+
self._canonical_name = d.normalize_model_name(
226+
relation.render(), context.target.database, context.default_dialect
227+
)
226228
return self._canonical_name
227229

228230
@property
@@ -334,7 +336,7 @@ def sqlmesh_model_kwargs(
334336
{
335337
source.canonical_name(context)
336338
for source in model_context.sources.values()
337-
if source.fqn not in context.model_fqns
339+
if source.canonical_name(context) not in context.model_canonical_names
338340
# Allow dbt projects to reference a model as a source without causing a cycle
339341
},
340342
),

sqlmesh/dbt/context.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class DbtContext:
5151
_project_name: t.Optional[str] = None
5252
_variables: t.Dict[str, t.Any] = field(default_factory=dict)
5353
_models: t.Dict[str, ModelConfig] = field(default_factory=dict)
54-
_model_fqns: t.Set[str] = field(default_factory=set)
54+
_model_canonical_names: t.Set[str] = field(default_factory=set)
5555
_seeds: t.Dict[str, SeedConfig] = field(default_factory=dict)
5656
_sources: t.Dict[str, SourceConfig] = field(default_factory=dict)
5757
_refs: t.Dict[str, t.Union[ModelConfig, SeedConfig]] = field(default_factory=dict)
@@ -145,7 +145,7 @@ def models(self) -> t.Dict[str, ModelConfig]:
145145
def models(self, models: t.Dict[str, ModelConfig]) -> None:
146146
self._models = {}
147147
self._refs = {}
148-
self._model_fqns = set()
148+
self._model_canonical_names = set()
149149
self.add_models(models)
150150

151151
def add_models(self, models: t.Dict[str, ModelConfig]) -> None:
@@ -154,10 +154,12 @@ def add_models(self, models: t.Dict[str, ModelConfig]) -> None:
154154
self._jinja_environment = None
155155

156156
@property
157-
def model_fqns(self) -> t.Set[str]:
158-
if not self._model_fqns:
159-
self._model_fqns = {model.fqn for model in self._models.values()}
160-
return self._model_fqns
157+
def model_canonical_names(self) -> t.Set[str]:
158+
if not self._model_canonical_names:
159+
self._model_canonical_names = {
160+
model.canonical_name(self) for model in self._models.values()
161+
}
162+
return self._model_canonical_names
161163

162164
@property
163165
def seeds(self) -> t.Dict[str, SeedConfig]:

sqlmesh/dbt/source.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from pydantic import Field
66

7+
from sqlmesh.core import dialect as d
78
from sqlmesh.core.config.base import UpdateStrategy
89
from sqlmesh.dbt.column import ColumnConfig
910
from sqlmesh.dbt.common import GeneralConfig
@@ -89,7 +90,9 @@ def canonical_name(self, context: DbtContext) -> str:
8990
)
9091
if relation.database == context.target.database:
9192
relation = relation.include(database=False)
92-
self._canonical_name = relation.render()
93+
self._canonical_name = d.normalize_model_name(
94+
relation.render(), context.target.database, context.default_dialect
95+
)
9396
return self._canonical_name
9497

9598
@property

tests/dbt/test_transformation.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2687,23 +2687,23 @@ def test_ignore_source_depends_on_when_also_model(dbt_dummy_postgres_config: Pos
26872687

26882688
source_a = SourceConfig(
26892689
name="source_a",
2690-
fqn=["package", "schema", "model_a"],
26912690
)
2692-
source_a._canonical_name = "schema.source_a"
2691+
source_a._canonical_name = "schema.model_a"
26932692
source_b = SourceConfig(
26942693
name="source_b",
2695-
fqn=["package", "schema", "source_b"],
26962694
)
26972695
source_b._canonical_name = "schema.source_b"
26982696
context.sources = {"source_a": source_a, "source_b": source_b}
26992697

27002698
model = ModelConfig(
27012699
dependencies=Dependencies(sources={"source_a", "source_b"}),
2702-
fqn=["package", "schema", "test_model"],
27032700
)
2701+
model._canonical_name = "schema.test_model"
2702+
model_a = ModelConfig(name="model_a")
2703+
model_a._canonical_name = "schema.model_a"
27042704
context.models = {
27052705
"test_model": model,
2706-
"model_a": ModelConfig(name="model_a", fqn=["package", "schema", "model_a"]),
2706+
"model_a": model_a,
27072707
}
27082708

27092709
assert model.sqlmesh_model_kwargs(context)["depends_on"] == {"schema.source_b"}

0 commit comments

Comments
 (0)