@@ -140,18 +140,8 @@ impl ExtensionPlanner for USearchExecPlanner {
140140 None => return Ok ( None ) ,
141141 } ;
142142
143- // Async: ensure the index is loaded (downloads on cache miss).
144- self . registry . ensure_loaded ( & node. table_name ) . await ?;
145-
146- let registered = match self . registry . resolve ( & node. table_name ) {
147- Some ( r) => r,
148- None => {
149- return Err ( DataFusionError :: Execution ( format ! (
150- "USearchExecPlanner: table '{}' not available after ensure_loaded" ,
151- node. table_name
152- ) ) ) ;
153- }
154- } ;
143+ // Async: bind a query-stable registry entry during planning.
144+ let registered = self . registry . prepare ( & node. table_name ) . await ?;
155145
156146 let exec_props = session_state. execution_props ( ) ;
157147
@@ -223,17 +213,22 @@ impl ExtensionPlanner for USearchExecPlanner {
223213 None
224214 } ;
225215
216+ let schema = registered. schema . clone ( ) ;
217+ let key_col = registered. key_col . clone ( ) ;
218+ let scalar_kind = registered. scalar_kind ;
219+ let brute_force_threshold = registered. config . brute_force_selectivity_threshold ;
220+
226221 Ok ( Some ( Arc :: new ( USearchExec :: new ( SearchParams {
227222 table_name : node. table_name . clone ( ) ,
228- registry : self . registry . clone ( ) ,
223+ registered ,
229224 query_vec : node. query_vec_f64 ( ) ,
230225 k : node. k ,
231226 distance_type : node. distance_type . clone ( ) ,
232227 has_filters : !node. filters . is_empty ( ) ,
233- schema : registered . schema . clone ( ) ,
234- key_col : registered . key_col . clone ( ) ,
235- scalar_kind : registered . scalar_kind ,
236- brute_force_threshold : registered . config . brute_force_selectivity_threshold ,
228+ schema,
229+ key_col,
230+ scalar_kind,
231+ brute_force_threshold,
237232 provider_scan,
238233 } ) ) ) )
239234 }
@@ -242,10 +237,10 @@ impl ExtensionPlanner for USearchExecPlanner {
242237// ── Search parameters ─────────────────────────────────────────────────────────
243238
244239/// All parameters needed to run a USearch query, cloned cheaply into execute().
245- #[ derive( Debug , Clone ) ]
240+ #[ derive( Clone ) ]
246241struct SearchParams {
247242 table_name : String ,
248- registry : Arc < dyn VectorIndexResolver > ,
243+ registered : Arc < crate :: registry :: RegisteredTable > ,
249244 query_vec : Vec < f64 > ,
250245 k : usize ,
251246 distance_type : DistanceType ,
@@ -261,6 +256,24 @@ struct SearchParams {
261256 provider_scan : Option < Arc < dyn ExecutionPlan > > ,
262257}
263258
259+ impl fmt:: Debug for SearchParams {
260+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
261+ f. debug_struct ( "SearchParams" )
262+ . field ( "table_name" , & self . table_name )
263+ . field ( "k" , & self . k )
264+ . field ( "has_filters" , & self . has_filters )
265+ . field ( "schema" , & self . schema )
266+ . field ( "key_col" , & self . key_col )
267+ . field ( "scalar_kind" , & self . scalar_kind )
268+ . field ( "brute_force_threshold" , & self . brute_force_threshold )
269+ . field (
270+ "provider_scan" ,
271+ & self . provider_scan . as_ref ( ) . map ( |_| "Some(..)" ) ,
272+ )
273+ . finish_non_exhaustive ( )
274+ }
275+ }
276+
264277// ── Physical execution node ───────────────────────────────────────────────────
265278
266279/// Leaf execution plan that defers all I/O to execute() time.
@@ -361,16 +374,7 @@ async fn usearch_execute(
361374 params : SearchParams ,
362375 task_ctx : Arc < TaskContext > ,
363376) -> Result < Vec < RecordBatch > > {
364- // Re-fetch at execute time and reload on cache miss so eviction between
365- // plan and execute is handled correctly for async-backed resolvers.
366- params. registry . ensure_loaded ( & params. table_name ) . await ?;
367-
368- let registered = params. registry . resolve ( & params. table_name ) . ok_or_else ( || {
369- DataFusionError :: Execution ( format ! (
370- "USearchExec: table '{}' not available after ensure_loaded at execute time" ,
371- params. table_name
372- ) )
373- } ) ?;
377+ let registered = params. registered . clone ( ) ;
374378
375379 if !params. has_filters {
376380 // ── Unfiltered path ───────────────────────────────────────────────
0 commit comments