@@ -112,22 +112,48 @@ def with_optimized_query(self, model: Model, name: t.Optional[str] = None) -> bo
112112 cache_entry = self ._file_cache .get (name )
113113 if cache_entry :
114114 try :
115- # If the optimized rendered query is None, then there are likely adapter calls in the query
116- # that prevent us from rendering it at load time. This means that we can safely set the
117- # unoptimized cache to None as well to prevent attempts to render it downstream.
118- optimized = cache_entry .optimized_rendered_query is not None
119- model ._query_renderer .update_cache (
120- cache_entry .optimized_rendered_query ,
121- cache_entry .renderer_violations ,
122- optimized = optimized ,
123- )
115+ self .with_optimized_query_entry (model , cache_entry )
124116 return True
125117 except Exception as ex :
126118 logger .warning ("Failed to load a cache entry '%s': %s" , name , ex )
127119
128120 self ._put (name , model )
129121 return False
130122
123+ @staticmethod
124+ def with_optimized_query_entry (model : Model , cache_entry : OptimizedQueryCacheEntry ) -> None :
125+ """Adds an already-decoded optimized query cache entry to a model."""
126+ if not isinstance (model , SqlModel ):
127+ return
128+
129+ # If the optimized rendered query is None, then there are likely adapter calls in the
130+ # query that prevent us from rendering it at load time. This means that we can safely
131+ # set the unoptimized cache to None as well to prevent attempts to render it downstream.
132+ optimized = cache_entry .optimized_rendered_query is not None
133+ model ._query_renderer .update_cache (
134+ cache_entry .optimized_rendered_query ,
135+ cache_entry .renderer_violations ,
136+ optimized = optimized ,
137+ )
138+
139+ def get_or_create_entry (
140+ self , model : Model , name : t .Optional [str ] = None
141+ ) -> t .Optional [OptimizedQueryCacheEntry ]:
142+ """Returns one decoded cache entry, creating it when necessary."""
143+ if not isinstance (model , SqlModel ):
144+ return None
145+
146+ name = self ._entry_name (model ) if name is None else name
147+ cache_entry = self ._file_cache .get (name )
148+ if cache_entry :
149+ try :
150+ self .with_optimized_query_entry (model , cache_entry )
151+ return cache_entry
152+ except Exception as ex :
153+ logger .warning ("Failed to load a cache entry '%s': %s" , name , ex )
154+
155+ return self ._put (name , model )
156+
131157 def put (self , model : Model ) -> t .Optional [str ]:
132158 if not isinstance (model , SqlModel ):
133159 return None
@@ -140,14 +166,15 @@ def put(self, model: Model) -> t.Optional[str]:
140166 self ._put (name , model )
141167 return name
142168
143- def _put (self , name : str , model : SqlModel ) -> None :
169+ def _put (self , name : str , model : SqlModel ) -> OptimizedQueryCacheEntry :
144170 optimized_query = model .render_query ()
145171
146172 new_entry = OptimizedQueryCacheEntry (
147173 optimized_rendered_query = optimized_query ,
148174 renderer_violations = model .violated_rules_for_query ,
149175 )
150176 self ._file_cache .put (name , value = new_entry )
177+ return new_entry
151178
152179 @staticmethod
153180 def _entry_name (model : SqlModel ) -> str :
@@ -197,7 +224,13 @@ def load_optimized_query(
197224
198225def load_optimized_query_and_mapping (
199226 model : Model , mapping : t .Dict
200- ) -> t .Tuple [str , t .Optional [str ], str , str , t .Dict ]:
227+ ) -> t .Tuple [
228+ str ,
229+ t .Optional [OptimizedQueryCacheEntry ],
230+ str ,
231+ str ,
232+ t .Dict ,
233+ ]:
201234 assert _optimized_query_cache
202235
203236 schema = MappingSchema (normalize = False )
@@ -207,13 +240,13 @@ def load_optimized_query_and_mapping(
207240
208241 if isinstance (model , SqlModel ):
209242 entry_name = _optimized_query_cache ._entry_name (model )
210- _optimized_query_cache .with_optimized_query (model , entry_name )
243+ cache_entry = _optimized_query_cache .get_or_create_entry (model , entry_name )
211244 else :
212- entry_name = None
245+ cache_entry = None
213246
214247 return (
215248 model .fqn ,
216- entry_name ,
249+ cache_entry ,
217250 model .data_hash ,
218251 model .metadata_hash ,
219252 model .mapping_schema ,
0 commit comments