@@ -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
0 commit comments