From e15d5e6d931cf5824dcb7c8218aa7da3d52b0a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Thu, 13 Dec 2018 11:54:47 +0100 Subject: [PATCH] feat: Improve the query distinct performances --- src/rank/query_builder.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/rank/query_builder.rs b/src/rank/query_builder.rs index 0644d3a4d..3f8579b2a 100644 --- a/src/rank/query_builder.rs +++ b/src/rank/query_builder.rs @@ -1,6 +1,6 @@ use std::{mem, vec, str, char}; -use std::ops::{Deref, Range}; use std::error::Error; +use std::ops::Deref; use std::hash::Hash; use group_by::GroupByMut; @@ -148,15 +148,16 @@ where D: Deref, F: Fn(DocumentId, &DatabaseView) -> Option, K: Hash + Eq, { - pub fn query(&self, query: &str, range: Range) -> Vec { + pub fn query(&self, query: &str, limit: usize) -> Vec { let mut documents = self.inner.query_all(query); let mut groups = vec![documents.as_mut_slice()]; let view = &self.inner.view; for criterion in self.inner.criteria.as_ref() { let tmp_groups = mem::replace(&mut groups, Vec::new()); + let mut seen = DistinctMap::new(self.size); - for group in tmp_groups { + 'group: for group in tmp_groups { group.sort_unstable_by(|a, b| criterion.evaluate(a, b, view)); for group in GroupByMut::new(group, |a, b| criterion.eq(a, b, view)) { for document in group.iter() { @@ -166,11 +167,12 @@ where D: Deref, }; } groups.push(group); + if seen.len() >= limit { break 'group } } } } - let mut out_documents = Vec::with_capacity(range.len()); + let mut out_documents = Vec::with_capacity(limit); let mut seen = DistinctMap::new(self.size); for document in documents { @@ -180,10 +182,8 @@ where D: Deref, }; if accepted { - if seen.len() == range.end { break } - if seen.len() >= range.start { - out_documents.push(document); - } + out_documents.push(document); + if out_documents.len() == limit { break } } }