mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-02-11 04:53:30 +01:00
Some bugfixes for incremental facets
This commit is contained in:
parent
025be5147f
commit
eb5ebdb6d7
@ -147,9 +147,14 @@ impl FacetsUpdateIncrementalInner {
|
|||||||
.prefix_iter_mut(wtxn, &parent_level_left_bound)?;
|
.prefix_iter_mut(wtxn, &parent_level_left_bound)?;
|
||||||
match it.next() {
|
match it.next() {
|
||||||
// 1. left of the current left bound, or
|
// 1. left of the current left bound, or
|
||||||
Some(Ok((_first_key, _first_value))) => {
|
Some(Ok((first_key, _first_value))) => 'change_left_bound: {
|
||||||
|
// make sure we don't spill on the neighboring fid (level also included defensively)
|
||||||
|
if first_key.field_id != self.field_id || first_key.level != parent_level {
|
||||||
|
break 'change_left_bound;
|
||||||
|
}
|
||||||
|
// remove old left bound
|
||||||
unsafe { it.del_current()? };
|
unsafe { it.del_current()? };
|
||||||
// pop all elements
|
// pop all elements and order to visit the new left bound
|
||||||
if let Some(first) = touched_children.last() {
|
if let Some(first) = touched_children.last() {
|
||||||
touched_parents.push(first);
|
touched_parents.push(first);
|
||||||
} else {
|
} else {
|
||||||
@ -158,7 +163,7 @@ impl FacetsUpdateIncrementalInner {
|
|||||||
}
|
}
|
||||||
Some(Err(err)) => return Err(err.into()),
|
Some(Err(err)) => return Err(err.into()),
|
||||||
// 2. max level reached, exit
|
// 2. max level reached, exit
|
||||||
None => return Ok(()),
|
None => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.find_touched_parents(
|
self.find_touched_parents(
|
||||||
@ -225,20 +230,30 @@ impl FacetsUpdateIncrementalInner {
|
|||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut child_it = self.db.range(wtxn, &(child_left_bound, child_right_bound))?;
|
let mut child_it = self.db.range(wtxn, &(child_left_bound, child_right_bound))?;
|
||||||
let res: Result<_> = child_it.by_ref().take(self.max_group_size as usize).try_fold(
|
let res: Result<_> = child_it
|
||||||
(None, FacetGroupValue { size: 0, bitmap: Default::default() }),
|
.by_ref()
|
||||||
|(bounds, mut group_value), child_res| {
|
.take(self.max_group_size as usize)
|
||||||
let (child_key, child_value) = child_res?;
|
// stop if we go to the next level or field id
|
||||||
let bounds = match bounds {
|
.take_while(|res| match res {
|
||||||
Some((left_bound, _)) => Some((left_bound, child_key.left_bound)),
|
Ok((child_key, _)) => {
|
||||||
None => Some((child_key.left_bound, child_key.left_bound)),
|
child_key.field_id == self.field_id && child_key.level == child_level
|
||||||
};
|
}
|
||||||
// max_group_size <= u8::MAX
|
Err(_) => true,
|
||||||
group_value.size += 1;
|
})
|
||||||
group_value.bitmap |= &child_value.bitmap;
|
.try_fold(
|
||||||
Ok((bounds, group_value))
|
(None, FacetGroupValue { size: 0, bitmap: Default::default() }),
|
||||||
},
|
|(bounds, mut group_value), child_res| {
|
||||||
);
|
let (child_key, child_value) = child_res?;
|
||||||
|
let bounds = match bounds {
|
||||||
|
Some((left_bound, _)) => Some((left_bound, child_key.left_bound)),
|
||||||
|
None => Some((child_key.left_bound, child_key.left_bound)),
|
||||||
|
};
|
||||||
|
// max_group_size <= u8::MAX
|
||||||
|
group_value.size += 1;
|
||||||
|
group_value.bitmap |= &child_value.bitmap;
|
||||||
|
Ok((bounds, group_value))
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
let (bounds, group_value) = res?;
|
let (bounds, group_value) = res?;
|
||||||
|
|
||||||
|
@ -745,11 +745,13 @@ fn compute_facet_level_database(
|
|||||||
let _entered = span.enter();
|
let _entered = span.enter();
|
||||||
match delta {
|
match delta {
|
||||||
super::merger::FacetFieldIdDelta::Bulk => {
|
super::merger::FacetFieldIdDelta::Bulk => {
|
||||||
|
/// TODO: remove info before shipping (or downgrade to debug)
|
||||||
tracing::info!(%fid, "bulk string facet processing");
|
tracing::info!(%fid, "bulk string facet processing");
|
||||||
FacetsUpdateBulk::new_not_updating_level_0(index, vec![fid], FacetType::String)
|
FacetsUpdateBulk::new_not_updating_level_0(index, vec![fid], FacetType::String)
|
||||||
.execute(wtxn)?
|
.execute(wtxn)?
|
||||||
}
|
}
|
||||||
super::merger::FacetFieldIdDelta::Incremental(delta_data) => {
|
super::merger::FacetFieldIdDelta::Incremental(delta_data) => {
|
||||||
|
/// TODO: remove info before shipping (or downgrade to debug)
|
||||||
tracing::info!(%fid, len=%delta_data.len(), "incremental string facet processing");
|
tracing::info!(%fid, len=%delta_data.len(), "incremental string facet processing");
|
||||||
FacetsUpdateIncremental::new(
|
FacetsUpdateIncremental::new(
|
||||||
index,
|
index,
|
||||||
@ -770,12 +772,15 @@ fn compute_facet_level_database(
|
|||||||
let _entered = span.enter();
|
let _entered = span.enter();
|
||||||
match delta {
|
match delta {
|
||||||
super::merger::FacetFieldIdDelta::Bulk => {
|
super::merger::FacetFieldIdDelta::Bulk => {
|
||||||
|
/// TODO: remove info before shipping (or downgrade to debug)
|
||||||
tracing::info!(%fid, "bulk number facet processing");
|
tracing::info!(%fid, "bulk number facet processing");
|
||||||
FacetsUpdateBulk::new_not_updating_level_0(index, vec![fid], FacetType::Number)
|
FacetsUpdateBulk::new_not_updating_level_0(index, vec![fid], FacetType::Number)
|
||||||
.execute(wtxn)?
|
.execute(wtxn)?
|
||||||
}
|
}
|
||||||
super::merger::FacetFieldIdDelta::Incremental(delta_data) => {
|
super::merger::FacetFieldIdDelta::Incremental(delta_data) => {
|
||||||
|
/// TODO: remove info before shipping (or downgrade to debug)
|
||||||
tracing::info!(%fid, len=%delta_data.len(), "incremental number facet processing");
|
tracing::info!(%fid, len=%delta_data.len(), "incremental number facet processing");
|
||||||
|
/// TODO: check is_valid lmdb key
|
||||||
FacetsUpdateIncremental::new(
|
FacetsUpdateIncremental::new(
|
||||||
index,
|
index,
|
||||||
FacetType::Number,
|
FacetType::Number,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user