33import logging
44import typing as t
55from contextlib import contextmanager
6+ from functools import partial
67from pathlib import Path
78
89from sqlglot import exp , parse
@@ -134,7 +135,35 @@ def _render(
134135 if this_snapshot and (kind := this_snapshot .model_kind_name ):
135136 kwargs ["model_kind_name" ] = kind .name
136137
137- expressions = [self ._expression ]
138+ def _resolve_table (table : str | exp .Table ) -> str :
139+ return self ._resolve_table (
140+ d .normalize_model_name (table , self ._default_catalog , self ._dialect ),
141+ snapshots = snapshots ,
142+ table_mapping = table_mapping ,
143+ deployability_index = deployability_index ,
144+ ).sql (dialect = self ._dialect , identify = True , comments = False )
145+
146+ macro_evaluator = MacroEvaluator (
147+ self ._dialect ,
148+ python_env = self ._python_env ,
149+ schema = self .schema ,
150+ runtime_stage = runtime_stage ,
151+ resolve_table = _resolve_table ,
152+ resolve_tables = lambda e : self ._resolve_tables (
153+ e ,
154+ snapshots = snapshots ,
155+ table_mapping = table_mapping ,
156+ deployability_index = deployability_index ,
157+ start = start ,
158+ end = end ,
159+ execution_time = execution_time ,
160+ runtime_stage = runtime_stage ,
161+ ),
162+ snapshots = snapshots ,
163+ default_catalog = self ._default_catalog ,
164+ path = self ._path ,
165+ environment_naming_info = environment_naming_info ,
166+ )
138167
139168 start_time , end_time = (
140169 make_inclusive (start or c .EPOCH , end or c .EPOCH , self ._dialect )
@@ -153,18 +182,17 @@ def _render(
153182
154183 variables = kwargs .pop ("variables" , {})
155184 jinja_env_kwargs = {
156- ** {** render_kwargs , ** prepare_env (self ._python_env ), ** variables },
185+ ** {
186+ ** render_kwargs ,
187+ ** _prepare_python_env_for_jinja (macro_evaluator , self ._python_env ),
188+ ** variables ,
189+ },
157190 "snapshots" : snapshots or {},
158191 "table_mapping" : table_mapping ,
159192 "deployability_index" : deployability_index ,
160193 "default_catalog" : self ._default_catalog ,
161194 "runtime_stage" : runtime_stage .value ,
162- "resolve_table" : lambda table : self ._resolve_table (
163- d .normalize_model_name (table , self ._default_catalog , self ._dialect ),
164- snapshots = snapshots ,
165- table_mapping = table_mapping ,
166- deployability_index = deployability_index ,
167- ).sql (dialect = self ._dialect , identify = True , comments = False ),
195+ "resolve_table" : _resolve_table ,
168196 }
169197 if this_model :
170198 render_kwargs ["this_model" ] = this_model
@@ -174,6 +202,7 @@ def _render(
174202
175203 jinja_env = self ._jinja_macro_registry .build_environment (** jinja_env_kwargs )
176204
205+ expressions = [self ._expression ]
177206 if isinstance (self ._expression , d .Jinja ):
178207 try :
179208 expressions = []
@@ -190,29 +219,6 @@ def _render(
190219 f"Could not render or parse jinja at '{ self ._path } '.\n { ex } "
191220 ) from ex
192221
193- macro_evaluator = MacroEvaluator (
194- self ._dialect ,
195- python_env = self ._python_env ,
196- jinja_env = jinja_env ,
197- schema = self .schema ,
198- runtime_stage = runtime_stage ,
199- resolve_table = jinja_env .globals ["resolve_table" ], # type: ignore
200- resolve_tables = lambda e : self ._resolve_tables (
201- e ,
202- snapshots = snapshots ,
203- table_mapping = table_mapping ,
204- deployability_index = deployability_index ,
205- start = start ,
206- end = end ,
207- execution_time = execution_time ,
208- runtime_stage = runtime_stage ,
209- ),
210- snapshots = snapshots ,
211- default_catalog = self ._default_catalog ,
212- path = self ._path ,
213- environment_naming_info = environment_naming_info ,
214- )
215-
216222 macro_evaluator .locals .update (render_kwargs )
217223
218224 if variables :
@@ -637,3 +643,15 @@ def _optimize_query(self, query: exp.Query, all_deps: t.Set[str]) -> exp.Query:
637643 annotate_types (select )
638644
639645 return query
646+
647+
648+ def _prepare_python_env_for_jinja (
649+ evaluator : MacroEvaluator ,
650+ python_env : t .Dict [str , Executable ],
651+ ) -> t .Dict [str , t .Any ]:
652+ prepared_env = prepare_env (python_env )
653+ # Pass the evaluator to all macro functions
654+ return {
655+ key : partial (value , evaluator ) if callable (value ) else value
656+ for key , value in prepared_env .items ()
657+ }
0 commit comments