diff --git a/src/core/segment_reader.rs b/src/core/segment_reader.rs index b97d498b8..1aabf3e9c 100644 --- a/src/core/segment_reader.rs +++ b/src/core/segment_reader.rs @@ -295,8 +295,8 @@ impl SegmentReader { } /// Returns an iterator that will iterate over the alive document ids - pub fn doc_ids_alive(&self) -> SegmentReaderAliveDocsIterator<'_> { - SegmentReaderAliveDocsIterator::new(&self) + pub fn doc_ids_alive<'a>(&'a self) -> impl Iterator + 'a { + (0u32..self.max_doc).filter(move |doc| !self.is_deleted(*doc)) } /// Summarize total space usage of this segment. @@ -324,52 +324,6 @@ impl fmt::Debug for SegmentReader { } } -/// Implements the iterator trait to allow easy iteration -/// over non-deleted ("alive") DocIds in a SegmentReader -pub struct SegmentReaderAliveDocsIterator<'a> { - reader: &'a SegmentReader, - max_doc: DocId, - current: DocId, -} - -impl<'a> SegmentReaderAliveDocsIterator<'a> { - pub fn new(reader: &'a SegmentReader) -> SegmentReaderAliveDocsIterator<'a> { - SegmentReaderAliveDocsIterator { - reader, - max_doc: reader.max_doc(), - current: 0, - } - } -} - -impl<'a> Iterator for SegmentReaderAliveDocsIterator<'a> { - type Item = DocId; - - fn next(&mut self) -> Option { - // TODO: Use TinySet (like in BitSetDocSet) to speed this process up - if self.current >= self.max_doc { - return None; - } - - // find the next alive doc id - while self.reader.is_deleted(self.current) { - self.current += 1; - - if self.current >= self.max_doc { - return None; - } - } - - // capture the current alive DocId - let result = Some(self.current); - - // move down the chain - self.current += 1; - - result - } -} - #[cfg(test)] mod test { use crate::core::Index;