diff --git a/seaweed-vector/crates/core/src/segments.rs b/seaweed-vector/crates/core/src/segments.rs index e7767efafd..6b83f14344 100644 --- a/seaweed-vector/crates/core/src/segments.rs +++ b/seaweed-vector/crates/core/src/segments.rs @@ -23,6 +23,20 @@ pub async fn segment_fragments( dataset: &Dataset, field: &str, ) -> Result> { + Ok(named_segment_fragments(dataset, field) + .await? + .into_iter() + .map(|(id, _, b)| (id, b)) + .collect()) +} + +/// Like `segment_fragments` but carries the logical index name — sharded +/// builds create one named index per shard, and a `with_index_segments` +/// scan must not mix names, so a fanout planner groups by name. +pub async fn named_segment_fragments( + dataset: &Dataset, + field: &str, +) -> Result> { let field = dataset .schema() .field(field) @@ -33,7 +47,11 @@ pub async fn segment_fragments( .await? .iter() .filter(|i| i.fields == [field.id]) - .filter_map(|i| i.fragment_bitmap.clone().map(|b| (i.uuid, b & &live))) + .filter_map(|i| { + i.fragment_bitmap + .clone() + .map(|b| (i.uuid, i.name.clone(), b & &live)) + }) .collect()) }