Skip to content
This repository has been archived by the owner on Apr 4, 2023. It is now read-only.

Fix finite pagination with placeholder search #743

Merged
merged 1 commit into from
Dec 15, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions milli/src/search/criteria/initial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,24 @@ impl<D: Distinct> Criterion for Initial<'_, D> {
self.answer
.take()
.map(|mut answer| {
if self.exhaustive_number_hits && answer.query_tree.is_some() {
if self.exhaustive_number_hits {
// resolve the whole query tree to retrieve an exhaustive list of documents matching the query.
// then remove the potential soft deleted documents.
let mut candidates = resolve_query_tree(
self.ctx,
answer.query_tree.as_ref().unwrap(),
params.wdcache,
)? - params.excluded_candidates;
let candidates = answer
.query_tree
.as_ref()
.map(|query_tree| resolve_query_tree(self.ctx, query_tree, params.wdcache))
.transpose()?;

// then intersect the candidates with the potential filtered candidates.
let mut candidates = match (candidates, answer.filtered_candidates.take()) {
(Some(candidates), Some(filtered)) => candidates & filtered,
(Some(candidates), None) => candidates,
(None, Some(filtered)) => filtered,
(None, None) => self.ctx.documents_ids()?,
};

// Apply the filters on the documents retrieved with the query tree.
if let Some(ref filtered_candidates) = answer.filtered_candidates {
candidates &= filtered_candidates;
}
// then remove the potential soft deleted documents.
candidates -= params.excluded_candidates;

// because the initial_candidates should be an exhaustive count of the matching documents,
// we precompute the distinct attributes.
Expand Down