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,29 +210,34 @@ 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)>> {
let mut new_doc_it = self.new_doc.iter_top_level_fields(); match &self.db {
let mut db_it = self.db.iter().flat_map(|db| db.iter_top_level_fields()); Some(db) => {
let mut seen_fields = BTreeSet::new(); let mut new_doc_it = self.new_doc.iter_top_level_fields();
let mut db_it = db.iter_top_level_fields();
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);
}
return Some(next);
}
loop {
match db_it.next()? {
Ok((name, value)) => {
if seen_fields.contains(name) {
continue;
} }
return Some(Ok((name, value))); return Some(next);
} }
Err(err) => return Some(Err(err)), loop {
} match db_it.next()? {
Ok((name, value)) => {
if seen_fields.contains(name) {
continue;
}
return Some(Ok((name, value)));
}
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>> {