Skip to content

Commit e1a390e

Browse files
crerichaizeigerman
authored andcommitted
Fix: redshift adapter can also use postgres adapter dispatch methods (#2770)
1 parent b13abbc commit e1a390e

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

sqlmesh/dbt/adapter.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,27 @@ def quote(self, identifier: str) -> str:
9797

9898
def dispatch(self, name: str, package: t.Optional[str] = None) -> t.Callable:
9999
"""Returns a dialect-specific version of a macro with the given name."""
100+
package = package or "dbt"
100101
target_type = self.jinja_globals["target"]["type"]
101-
references_to_try = [
102-
MacroReference(package=f"{package}_{target_type}", name=f"{target_type}__{name}"),
103-
MacroReference(package=package, name=f"{target_type}__{name}"),
104-
MacroReference(package=package, name=f"default__{name}"),
102+
macro_suffix = f"__{name}"
103+
104+
def _relevance(macro: MacroReference) -> int:
105+
"""Lower scores more relevant."""
106+
if macro.name.startswith("default"):
107+
return 2
108+
elif macro.name.startswith(target_type):
109+
return 0
110+
return 1
111+
112+
macros = [
113+
MacroReference(package=macro_package, name=macro_name)
114+
for macro_package, macros in self.jinja_macros.packages.items()
115+
if (macro_package == package) or (package == "dbt" and macro_package.startswith("dbt_"))
116+
for macro_name in macros.keys()
117+
if macro_name.endswith(macro_suffix)
105118
]
106-
107-
for reference in references_to_try:
108-
macro_callable = self.jinja_macros.build_macro(reference, **self.jinja_globals)
119+
for macro in sorted(macros, key=_relevance):
120+
macro_callable = self.jinja_macros.build_macro(macro, **self.jinja_globals)
109121
if macro_callable is not None:
110122
return macro_callable
111123

tests/dbt/test_adapter.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,13 @@ def test_adapter_dispatch(sushi_test_project: Project, runtime_renderer: t.Calla
148148
context = sushi_test_project.context
149149
renderer = runtime_renderer(context)
150150
assert renderer("{{ adapter.dispatch('current_engine', 'customers')() }}") == "duckdb"
151+
assert renderer("{{ adapter.dispatch('current_timestamp')() }}") == "now()"
152+
assert renderer("{{ adapter.dispatch('current_timestamp', 'dbt')() }}") == "now()"
151153

152154
with pytest.raises(ConfigError, match=r"Macro 'current_engine'.*was not found."):
153155
renderer("{{ adapter.dispatch('current_engine')() }}")
156+
with pytest.raises(ConfigError, match=r"Macro 'current_timestamp'.*was not found."):
157+
assert renderer("{{ adapter.dispatch('current_timestamp', 'customers')() }}")
154158

155159

156160
def test_adapter_map_snapshot_tables(

0 commit comments

Comments
 (0)