Skip to content

Commit e1dc20a

Browse files
committed
fix(planner): use separate key column indices for scan and lookup schemas
The scan_provider and lookup_provider may have different schemas, so the key column can be at different indices. Use scan_key_col_idx when reading scan batches and lookup_key_col_idx for attach_distances on fetched rows.
1 parent 7079e80 commit e1dc20a

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

src/planner.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,15 @@ async fn adaptive_filtered_execute(
353353
task_ctx: Arc<TaskContext>,
354354
) -> Result<Vec<RecordBatch>> {
355355
let provider_schema = registered.scan_provider.schema();
356-
let key_col_idx = provider_key_col_idx(registered)?;
356+
// Key column index in scan_provider schema — used when reading scan batches.
357+
let scan_key_col_idx = provider_schema.index_of(&registered.key_col).map_err(|_| {
358+
DataFusionError::Execution(format!(
359+
"USearchExecPlanner: key column '{}' not found in scan provider schema",
360+
registered.key_col
361+
))
362+
})?;
363+
// Key column index in lookup_provider schema — used by attach_distances.
364+
let lookup_key_col_idx = provider_key_col_idx(registered)?;
357365
let vec_col_idx = provider_schema.index_of(&params.vector_col).ok();
358366
let has_vec_col = vec_col_idx.is_some();
359367

@@ -371,7 +379,7 @@ async fn adaptive_filtered_execute(
371379
while let Some(batch_result) = stream.next().await {
372380
let batch = batch_result?;
373381
let mask = evaluate_filters(&params.physical_filters, &batch)?;
374-
let keys = extract_keys_as_u64(batch.column(key_col_idx).as_ref())?;
382+
let keys = extract_keys_as_u64(batch.column(scan_key_col_idx).as_ref())?;
375383

376384
for row_idx in 0..batch.num_rows() {
377385
if !mask.is_null(row_idx)
@@ -450,7 +458,7 @@ async fn adaptive_filtered_execute(
450458
.await?;
451459

452460
let result_batches =
453-
attach_distances(data_batches, key_col_idx, &key_to_dist, &params.schema)?;
461+
attach_distances(data_batches, lookup_key_col_idx, &key_to_dist, &params.schema)?;
454462

455463
tracing::Span::current().record(
456464
"usearch.result_count",
@@ -491,7 +499,7 @@ async fn adaptive_filtered_execute(
491499
.await?;
492500

493501
let result_batches =
494-
attach_distances(data_batches, key_col_idx, &key_to_dist, &params.schema)?;
502+
attach_distances(data_batches, lookup_key_col_idx, &key_to_dist, &params.schema)?;
495503

496504
tracing::Span::current().record(
497505
"usearch.result_count",

0 commit comments

Comments
 (0)