Change implementation of MergedDocuments::iter_top_level_fields

This commit is contained in:
Louis Dureuil 2024-12-06 22:00:40 +01:00
parent 4a082683df
commit 1cf14e765f
No known key found for this signature in database

View File

@ -1,5 +1,6 @@
use std::collections::{BTreeMap, BTreeSet}; use std::collections::{BTreeMap, BTreeSet};
use either::Either;
use heed::RoTxn; use heed::RoTxn;
use raw_collections::RawMap; use raw_collections::RawMap;
use serde_json::value::RawValue; use serde_json::value::RawValue;
@ -209,11 +210,13 @@ impl<'d, 'doc: 'd, 't: 'd, Mapper: FieldIdMapper> Document<'d>
for MergedDocument<'d, 'doc, 't, Mapper> for MergedDocument<'d, 'doc, 't, Mapper>
{ {
fn iter_top_level_fields(&self) -> impl Iterator<Item = Result<(&'d str, &'d RawValue)>> { fn iter_top_level_fields(&self) -> impl Iterator<Item = Result<(&'d str, &'d RawValue)>> {
match &self.db {
Some(db) => {
let mut new_doc_it = self.new_doc.iter_top_level_fields(); let mut new_doc_it = self.new_doc.iter_top_level_fields();
let mut db_it = self.db.iter().flat_map(|db| db.iter_top_level_fields()); let mut db_it = db.iter_top_level_fields();
let mut seen_fields = BTreeSet::new(); let mut seen_fields = BTreeSet::new();
std::iter::from_fn(move || { Either::Left(std::iter::from_fn(move || {
if let Some(next) = new_doc_it.next() { if let Some(next) = new_doc_it.next() {
if let Ok((name, _)) = next { if let Ok((name, _)) = next {
seen_fields.insert(name); seen_fields.insert(name);
@ -231,7 +234,10 @@ impl<'d, 'doc: 'd, 't: 'd, Mapper: FieldIdMapper> Document<'d>
Err(err) => return Some(Err(err)), Err(err) => return Some(Err(err)),
} }
} }
}) }))
}
None => Either::Right(self.new_doc.iter_top_level_fields()),
}
} }
fn vectors_field(&self) -> Result<Option<&'d RawValue>> { fn vectors_field(&self) -> Result<Option<&'d RawValue>> {