fix: address manual mapping review comments

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Luca Cominardi
2026-07-22 14:50:29 +02:00
parent fe1bdf4a54
commit 2554072e8f
2 changed files with 14 additions and 16 deletions
+2 -2
View File
@@ -100,7 +100,7 @@ impl DocIdMapping {
fn from_new_id_to_old_id_inner<E: Error>(
new_doc_id_to_old: Vec<DocId>,
mut check: impl FnMut(DocId) -> Result<(), E>,
mut validate: impl FnMut(DocId) -> Result<(), E>,
) -> Result<Self, E> {
let max_doc = new_doc_id_to_old.len();
let old_max_doc = new_doc_id_to_old
@@ -111,7 +111,7 @@ impl DocIdMapping {
.unwrap_or(0);
let mut old_doc_id_to_new = vec![0; old_max_doc as usize];
for i in 0..max_doc {
(check)(new_doc_id_to_old[i])?;
(validate)(new_doc_id_to_old[i])?;
old_doc_id_to_new[new_doc_id_to_old[i] as usize] = i as DocId;
}
Ok(DocIdMapping {
+12 -14
View File
@@ -4,7 +4,7 @@ use crate::indexer::operation::AddOperation;
use crate::indexer::segment_updater::save_metas;
use crate::indexer::{DocIdMapping, SegmentWriter};
use crate::schema::document::Document;
use crate::{Directory, Index, IndexMeta, IndexSettings, Opstamp, Segment, TantivyDocument};
use crate::{Directory, Index, IndexMeta, Opstamp, Segment, TantivyDocument};
#[doc(hidden)]
pub struct SingleSegmentIndexWriter<D: Document = TantivyDocument> {
@@ -45,9 +45,8 @@ impl<D: Document> SingleSegmentIndexWriter<D> {
} = self;
let max_doc = segment_writer.max_doc();
segment_writer.finalize()?;
let remapping_required = segment.index().settings().sort_by_field.is_some();
let index_settings = segment.index().settings().clone();
Self::finalize_inner(segment, max_doc, remapping_required, index_settings)
let did_remapping = segment.index().settings().sort_by_field.is_some();
Self::finalize_inner(segment, max_doc, did_remapping, false)
}
pub fn finalize_with_doc_id_mapping(self, mapping: &DocIdMapping) -> crate::Result<Index> {
@@ -58,30 +57,29 @@ impl<D: Document> SingleSegmentIndexWriter<D> {
} = self;
let max_doc = segment_writer.max_doc();
segment_writer.finalize_with_doc_id_mapping(mapping)?;
let mut index_settings = segment.index().settings().clone();
index_settings.manual_doc_id_mapping = false;
let mut index = Self::finalize_inner(segment, max_doc, true, index_settings)?;
index.settings_mut().manual_doc_id_mapping = false;
Ok(index)
Self::finalize_inner(segment, max_doc, true, true)
}
fn finalize_inner(
segment: Segment,
max_doc: u32,
remapping_required: bool,
index_settings: IndexSettings,
did_remapping: bool,
clear_manual_doc_id_mapping: bool,
) -> crate::Result<Index> {
let segment: Segment = segment.with_max_doc(max_doc);
let segment_meta = segment.meta();
let mut index = segment.index().clone();
if clear_manual_doc_id_mapping {
index.settings_mut().manual_doc_id_mapping = false;
}
if remapping_required {
if did_remapping {
// Untrack the temp docstore file from the segment metadata.
segment_meta.untrack_temp_docstore();
}
let index_meta = IndexMeta {
index_settings,
index_settings: index.settings().clone(),
segments: vec![segment_meta.clone()],
schema: index.schema(),
opstamp: 0,
@@ -90,7 +88,7 @@ impl<D: Document> SingleSegmentIndexWriter<D> {
save_metas(&index_meta, index.directory())?;
index.directory().sync_directory()?;
if remapping_required {
if did_remapping {
// Run the garbage collector to remove the temp docstore file from the directory.
let mut living_files = segment_meta.list_files();
living_files.insert(crate::core::META_FILEPATH.to_path_buf());