mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-07-04 20:37:15 +02:00
Fix some of the edition 2024 warnings
This commit is contained in:
parent
2762d5a32a
commit
aa87064a13
82 changed files with 323 additions and 317 deletions
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "milli"
|
||||
edition = "2021"
|
||||
edition = "2024"
|
||||
publish = false
|
||||
|
||||
version.workspace = true
|
||||
|
|
|
@ -8,7 +8,7 @@ use crate::documents::DocumentsBatchBuilder;
|
|||
use crate::Object;
|
||||
|
||||
macro_rules! tri {
|
||||
($e:expr) => {
|
||||
($e:expr_2021) => {
|
||||
match $e {
|
||||
Ok(r) => r,
|
||||
Err(e) => return Ok(Err(e.into())),
|
||||
|
|
|
@ -301,26 +301,26 @@ impl<'a> FacetDistribution<'a> {
|
|||
let mut distribution = BTreeMap::new();
|
||||
for (fid, name) in fields_ids_map.iter() {
|
||||
if self.select_field(name, &filterable_attributes_rules) {
|
||||
let min_value = if let Some(min_value) = crate::search::facet::facet_min_value(
|
||||
let min_value = match crate::search::facet::facet_min_value(
|
||||
self.index,
|
||||
self.rtxn,
|
||||
fid,
|
||||
candidates.clone(),
|
||||
)? {
|
||||
)? { Some(min_value) => {
|
||||
min_value
|
||||
} else {
|
||||
} _ => {
|
||||
continue;
|
||||
};
|
||||
let max_value = if let Some(max_value) = crate::search::facet::facet_max_value(
|
||||
}};
|
||||
let max_value = match crate::search::facet::facet_max_value(
|
||||
self.index,
|
||||
self.rtxn,
|
||||
fid,
|
||||
candidates.clone(),
|
||||
)? {
|
||||
)? { Some(max_value) => {
|
||||
max_value
|
||||
} else {
|
||||
} _ => {
|
||||
continue;
|
||||
};
|
||||
}};
|
||||
|
||||
distribution.insert(name.to_string(), (min_value, max_value));
|
||||
}
|
||||
|
|
|
@ -37,12 +37,12 @@ where
|
|||
let mut fd = LexicographicFacetDistribution { rtxn, db, field_id, callback };
|
||||
let highest_level = get_highest_level(rtxn, db, field_id)?;
|
||||
|
||||
if let Some(first_bound) = get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)? {
|
||||
match get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)? { Some(first_bound) => {
|
||||
fd.iterate(candidates, highest_level, first_bound, usize::MAX)?;
|
||||
Ok(())
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(())
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
pub fn count_iterate_over_facet_distribution<'t, CB>(
|
||||
|
|
|
@ -53,17 +53,16 @@ where
|
|||
let mut f = FacetRangeSearch { rtxn, db, field_id, left, right, universe, docids };
|
||||
let highest_level = get_highest_level(rtxn, db, field_id)?;
|
||||
|
||||
if let Some(starting_left_bound) =
|
||||
get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)?
|
||||
{
|
||||
match get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)?
|
||||
{ Some(starting_left_bound) => {
|
||||
let rightmost_bound =
|
||||
Bound::Included(get_last_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)?.unwrap()); // will not fail because get_first_facet_value succeeded
|
||||
let group_size = usize::MAX;
|
||||
f.run(highest_level, starting_left_bound, rightmost_bound, group_size)?;
|
||||
Ok(())
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(())
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
/// Fetch the document ids that have a facet with a value between the two given bounds
|
||||
|
|
|
@ -36,7 +36,7 @@ pub fn ascending_facet_sort<'t>(
|
|||
candidates: RoaringBitmap,
|
||||
) -> Result<impl Iterator<Item = Result<(RoaringBitmap, &'t [u8])>> + 't> {
|
||||
let highest_level = get_highest_level(rtxn, db, field_id)?;
|
||||
if let Some(first_bound) = get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)? {
|
||||
match get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)? { Some(first_bound) => {
|
||||
let first_key = FacetGroupKey { field_id, level: highest_level, left_bound: first_bound };
|
||||
let iter = db.range(rtxn, &(first_key..)).unwrap().take(usize::MAX);
|
||||
|
||||
|
@ -46,9 +46,9 @@ pub fn ascending_facet_sort<'t>(
|
|||
field_id,
|
||||
stack: vec![(candidates, iter)],
|
||||
}))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(itertools::Either::Right(std::iter::empty()))
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
struct AscendingFacetSort<'t, 'e> {
|
||||
|
|
|
@ -19,7 +19,7 @@ pub fn descending_facet_sort<'t>(
|
|||
candidates: RoaringBitmap,
|
||||
) -> Result<impl Iterator<Item = Result<(RoaringBitmap, &'t [u8])>> + 't> {
|
||||
let highest_level = get_highest_level(rtxn, db, field_id)?;
|
||||
if let Some(first_bound) = get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)? {
|
||||
match get_first_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)? { Some(first_bound) => {
|
||||
let first_key = FacetGroupKey { field_id, level: highest_level, left_bound: first_bound };
|
||||
let last_bound = get_last_facet_value::<BytesRefCodec, _>(rtxn, db, field_id)?.unwrap();
|
||||
let last_key = FacetGroupKey { field_id, level: highest_level, left_bound: last_bound };
|
||||
|
@ -30,9 +30,9 @@ pub fn descending_facet_sort<'t>(
|
|||
field_id,
|
||||
stack: vec![(candidates, iter, Bound::Included(last_bound))],
|
||||
}))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(itertools::Either::Right(std::iter::empty()))
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
struct DescendingFacetSort<'t> {
|
||||
|
|
|
@ -23,7 +23,7 @@ fn facet_extreme_value<'t>(
|
|||
mut extreme_it: impl Iterator<Item = heed::Result<(RoaringBitmap, &'t [u8])>> + 't,
|
||||
) -> Result<Option<f64>> {
|
||||
let extreme_value =
|
||||
if let Some(extreme_value) = extreme_it.next() { extreme_value } else { return Ok(None) };
|
||||
match extreme_it.next() { Some(extreme_value) => { extreme_value } _ => { return Ok(None) }};
|
||||
let (_, extreme_value) = extreme_value?;
|
||||
OrderedF64Codec::bytes_decode(extreme_value)
|
||||
.map(Some)
|
||||
|
@ -67,14 +67,14 @@ where
|
|||
level0prefix.push(0);
|
||||
let mut level0_iter_forward =
|
||||
db.remap_types::<Bytes, DecodeIgnore>().prefix_iter(txn, level0prefix.as_slice())?;
|
||||
if let Some(first) = level0_iter_forward.next() {
|
||||
match level0_iter_forward.next() { Some(first) => {
|
||||
let (first_key, _) = first?;
|
||||
let first_key = FacetGroupKeyCodec::<BoundCodec>::bytes_decode(first_key)
|
||||
.map_err(heed::Error::Decoding)?;
|
||||
Ok(Some(first_key.left_bound))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(None)
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
/// Get the last facet value in the facet database
|
||||
|
@ -91,14 +91,14 @@ where
|
|||
level0prefix.push(0);
|
||||
let mut level0_iter_backward =
|
||||
db.remap_types::<Bytes, DecodeIgnore>().rev_prefix_iter(txn, level0prefix.as_slice())?;
|
||||
if let Some(last) = level0_iter_backward.next() {
|
||||
match level0_iter_backward.next() { Some(last) => {
|
||||
let (last_key, _) = last?;
|
||||
let last_key = FacetGroupKeyCodec::<BoundCodec>::bytes_decode(last_key)
|
||||
.map_err(heed::Error::Decoding)?;
|
||||
Ok(Some(last_key.left_bound))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(None)
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
/// Get the height of the highest level in the facet database
|
||||
|
|
|
@ -146,7 +146,7 @@ pub fn bucket_sort<'ctx, Q: RankingRuleQueryTrait>(
|
|||
let mut cur_offset = 0usize;
|
||||
|
||||
macro_rules! maybe_add_to_results {
|
||||
($candidates:expr) => {
|
||||
($candidates:expr_2021) => {
|
||||
maybe_add_to_results(
|
||||
ctx,
|
||||
from,
|
||||
|
|
|
@ -54,15 +54,15 @@ where
|
|||
/// Insert the given value into the dedup-interner, and return
|
||||
/// its index.
|
||||
pub fn insert(&mut self, s: T) -> Interned<T> {
|
||||
if let Some(interned) = self.lookup.get(&s) {
|
||||
match self.lookup.get(&s) { Some(interned) => {
|
||||
*interned
|
||||
} else {
|
||||
} _ => {
|
||||
assert!(self.stable_store.len() < u16::MAX as usize);
|
||||
self.stable_store.push(s.clone());
|
||||
let interned = Interned::from_raw(self.stable_store.len() as u16 - 1);
|
||||
self.lookup.insert(s, interned);
|
||||
interned
|
||||
}
|
||||
}}
|
||||
}
|
||||
/// Get a reference to the interned value.
|
||||
pub fn get(&self, interned: Interned<T>) -> &T {
|
||||
|
@ -117,7 +117,7 @@ impl<T> FixedSizeInterner<T> {
|
|||
pub fn map_indexes<U>(&self, map_f: impl Fn(Interned<T>) -> U) -> MappedInterner<T, U> {
|
||||
MappedInterner { stable_store: self.indexes().map(map_f).collect(), _phantom: PhantomData }
|
||||
}
|
||||
pub fn indexes(&self) -> impl Iterator<Item = Interned<T>> {
|
||||
pub fn indexes(&self) -> impl Iterator<Item = Interned<T>> + use<T> {
|
||||
(0..self.stable_store.len()).map(|i| Interned::from_raw(i as u16))
|
||||
}
|
||||
pub fn iter(&self) -> impl Iterator<Item = (Interned<T>, &T)> {
|
||||
|
@ -167,7 +167,7 @@ impl<T> Interner<T> {
|
|||
pub fn map_indexes<U>(&self, map_f: impl Fn(Interned<T>) -> U) -> MappedInterner<T, U> {
|
||||
MappedInterner { stable_store: self.indexes().map(map_f).collect(), _phantom: PhantomData }
|
||||
}
|
||||
pub fn indexes(&self) -> impl Iterator<Item = Interned<T>> {
|
||||
pub fn indexes(&self) -> impl Iterator<Item = Interned<T>> + use<T> {
|
||||
(0..self.stable_store.len()).map(|i| Interned::from_raw(i as u16))
|
||||
}
|
||||
pub fn iter(&self) -> impl Iterator<Item = (Interned<T>, &T)> {
|
||||
|
|
|
@ -206,11 +206,11 @@ struct DetailedLoggerFinish<'ctx> {
|
|||
|
||||
impl<'ctx> DetailedLoggerFinish<'ctx> {
|
||||
fn cur_file(&mut self) -> &mut BufWriter<File> {
|
||||
if let Some(file) = self.file_for_internal_state.as_mut() {
|
||||
match self.file_for_internal_state.as_mut() { Some(file) => {
|
||||
file
|
||||
} else {
|
||||
} _ => {
|
||||
&mut self.index_file
|
||||
}
|
||||
}}
|
||||
}
|
||||
fn pop_rr_action(&mut self) {
|
||||
self.file_for_internal_state = None;
|
||||
|
@ -531,11 +531,11 @@ fill: \"#B6E2D3\"
|
|||
paths: Vec<Vec<Interned<R::Condition>>>,
|
||||
) -> Result<()> {
|
||||
self.make_new_file_for_internal_state_if_needed()?;
|
||||
let file = if let Some(file) = self.file_for_internal_state.as_mut() {
|
||||
let file = match self.file_for_internal_state.as_mut() { Some(file) => {
|
||||
file
|
||||
} else {
|
||||
} _ => {
|
||||
&mut self.index_file
|
||||
};
|
||||
}};
|
||||
writeln!(file, "Path {{")?;
|
||||
for (path_idx, condition_indexes) in paths.iter().enumerate() {
|
||||
writeln!(file, "{path_idx} {{")?;
|
||||
|
|
|
@ -853,7 +853,7 @@ fn check_sort_criteria(
|
|||
let sortable_fields = ctx.index.sortable_fields(ctx.txn)?;
|
||||
for asc_desc in sort_criteria {
|
||||
match asc_desc.member() {
|
||||
Member::Field(ref field) if !crate::is_faceted(field, &sortable_fields) => {
|
||||
Member::Field(field) if !crate::is_faceted(field, &sortable_fields) => {
|
||||
let (valid_fields, hidden_fields) =
|
||||
ctx.index.remove_hidden_fields(ctx.txn, sortable_fields)?;
|
||||
|
||||
|
|
|
@ -266,11 +266,11 @@ pub fn partially_initialized_term_from_word(
|
|||
}
|
||||
|
||||
fn find_split_words(ctx: &mut SearchContext<'_>, word: &str) -> Result<Option<Interned<Phrase>>> {
|
||||
if let Some((l, r)) = split_best_frequency(ctx, word)? {
|
||||
match split_best_frequency(ctx, word)? { Some((l, r)) => {
|
||||
Ok(Some(ctx.phrase_interner.insert(Phrase { words: vec![Some(l), Some(r)] })))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(None)
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
impl Interned<QueryTerm> {
|
||||
|
|
|
@ -110,7 +110,7 @@ impl ExactTerm {
|
|||
pub fn interned_words<'ctx>(
|
||||
&self,
|
||||
ctx: &'ctx SearchContext<'ctx>,
|
||||
) -> impl Iterator<Item = Option<Interned<String>>> + 'ctx {
|
||||
) -> impl Iterator<Item = Option<Interned<String>>> + 'ctx + use<'ctx> {
|
||||
match *self {
|
||||
ExactTerm::Phrase(phrase) => {
|
||||
let phrase = ctx.phrase_interner.get(phrase);
|
||||
|
|
|
@ -193,7 +193,7 @@ pub fn located_query_terms_from_tokens(
|
|||
|
||||
pub fn number_of_typos_allowed<'ctx>(
|
||||
ctx: &SearchContext<'ctx>,
|
||||
) -> Result<impl Fn(&str) -> u8 + 'ctx> {
|
||||
) -> Result<impl Fn(&str) -> u8 + 'ctx + use<'ctx>> {
|
||||
let authorize_typos = ctx.index.authorize_typos(ctx.txn)?;
|
||||
let min_len_one_typo = ctx.index.min_word_len_one_typo(ctx.txn)?;
|
||||
let min_len_two_typos = ctx.index.min_word_len_two_typos(ctx.txn)?;
|
||||
|
|
|
@ -77,11 +77,11 @@ pub fn compute_docids(
|
|||
if universe.is_disjoint(ctx.get_phrase_docids(left_phrase)?) {
|
||||
continue;
|
||||
}
|
||||
} else if let Some(left_word_docids) = ctx.word_docids(Some(universe), left_word)? {
|
||||
} else { match ctx.word_docids(Some(universe), left_word)? { Some(left_word_docids) => {
|
||||
if left_word_docids.is_empty() {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} _ => {}}}
|
||||
}
|
||||
|
||||
for (right_word, right_phrase) in right_derivs {
|
||||
|
|
|
@ -195,15 +195,15 @@ pub fn compute_phrase_docids(
|
|||
}
|
||||
let mut candidates = None;
|
||||
for word in words.iter().flatten().copied() {
|
||||
if let Some(word_docids) = ctx.word_docids(None, Word::Original(word))? {
|
||||
match ctx.word_docids(None, Word::Original(word))? { Some(word_docids) => {
|
||||
if let Some(candidates) = candidates.as_mut() {
|
||||
*candidates &= word_docids;
|
||||
} else {
|
||||
candidates = Some(word_docids);
|
||||
}
|
||||
} else {
|
||||
} _ => {
|
||||
return Ok(RoaringBitmap::new());
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
let Some(mut candidates) = candidates else {
|
||||
|
|
|
@ -196,10 +196,10 @@ impl<'ctx, Query: RankingRuleQueryTrait> RankingRule<'ctx, Query> for Sort<'ctx,
|
|||
universe: &RoaringBitmap,
|
||||
) -> Result<Option<RankingRuleOutput<Query>>> {
|
||||
let iter = self.iter.as_mut().unwrap();
|
||||
if let Some(mut bucket) = iter.next_bucket()? {
|
||||
match iter.next_bucket()? { Some(mut bucket) => {
|
||||
bucket.candidates &= universe;
|
||||
Ok(Some(bucket))
|
||||
} else {
|
||||
} _ => {
|
||||
let query = self.original_query.as_ref().unwrap().clone();
|
||||
Ok(Some(RankingRuleOutput {
|
||||
query,
|
||||
|
@ -211,7 +211,7 @@ impl<'ctx, Query: RankingRuleQueryTrait> RankingRule<'ctx, Query> for Sort<'ctx,
|
|||
value: serde_json::Value::Null,
|
||||
}),
|
||||
}))
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "trace", skip_all, target = "search::sort")]
|
||||
|
|
|
@ -27,7 +27,7 @@ pub fn default_db_snapshot_settings_for_test(name: Option<&str>) -> (insta::Sett
|
|||
}
|
||||
#[macro_export]
|
||||
macro_rules! milli_snap {
|
||||
($value:expr, $name:expr) => {
|
||||
($value:expr_2021, $name:expr_2021) => {
|
||||
let (settings, _) = $crate::snapshot_tests::default_db_snapshot_settings_for_test(None);
|
||||
settings.bind(|| {
|
||||
let snap = $value;
|
||||
|
@ -37,7 +37,7 @@ macro_rules! milli_snap {
|
|||
}
|
||||
});
|
||||
};
|
||||
($value:expr) => {
|
||||
($value:expr_2021) => {
|
||||
let (settings, test_name) = $crate::snapshot_tests::default_db_snapshot_settings_for_test(None);
|
||||
settings.bind(|| {
|
||||
let snap = $value;
|
||||
|
@ -47,7 +47,7 @@ macro_rules! milli_snap {
|
|||
}
|
||||
});
|
||||
};
|
||||
($value:expr, @$inline:literal) => {
|
||||
($value:expr_2021, @$inline:literal) => {
|
||||
let (settings, test_name) = $crate::snapshot_tests::default_db_snapshot_settings_for_test(None);
|
||||
settings.bind(|| {
|
||||
let snap = $value;
|
||||
|
@ -61,7 +61,7 @@ macro_rules! milli_snap {
|
|||
}
|
||||
});
|
||||
};
|
||||
($value:expr, $name:expr, @$inline:literal) => {
|
||||
($value:expr_2021, $name:expr_2021, @$inline:literal) => {
|
||||
let (settings, _) = $crate::snapshot_tests::default_db_snapshot_settings_for_test(None);
|
||||
settings.bind(|| {
|
||||
let snap = $value;
|
||||
|
@ -142,7 +142,7 @@ db_snap!(index, word_docids, "some_identifier", @"");
|
|||
*/
|
||||
#[macro_export]
|
||||
macro_rules! db_snap {
|
||||
($index:ident, $db_name:ident, $name:expr) => {
|
||||
($index:ident, $db_name:ident, $name:expr_2021) => {
|
||||
let (settings, _) = $crate::snapshot_tests::default_db_snapshot_settings_for_test(Some(
|
||||
&format!("{}", $name),
|
||||
));
|
||||
|
@ -178,7 +178,7 @@ macro_rules! db_snap {
|
|||
}
|
||||
});
|
||||
};
|
||||
($index:ident, $db_name:ident, $name:expr, @$inline:literal) => {
|
||||
($index:ident, $db_name:ident, $name:expr_2021, @$inline:literal) => {
|
||||
let (settings, _) = $crate::snapshot_tests::default_db_snapshot_settings_for_test(Some(&format!("{}", $name)));
|
||||
settings.bind(|| {
|
||||
let snap = $crate::full_snap_of_db!($index, $db_name);
|
||||
|
|
|
@ -647,7 +647,7 @@ mod comparison_bench {
|
|||
// insert one document
|
||||
//
|
||||
for _ in 0..nbr_doc {
|
||||
index.insert(&mut txn, 0, &r.gen(), &once(1).collect());
|
||||
index.insert(&mut txn, 0, &r.r#gen(), &once(1).collect());
|
||||
}
|
||||
let time_spent = timer.elapsed().as_millis();
|
||||
println!(" add {nbr_doc} : {time_spent}ms");
|
||||
|
|
|
@ -143,11 +143,11 @@ pub fn extract_fid_docid_facet_values<R: io::Read + io::Seek>(
|
|||
strings_key_buffer.extend_from_slice(docid_bytes);
|
||||
|
||||
// We insert the document id on the Del and the Add side if the field exists.
|
||||
let (ref mut del_exists, ref mut add_exists) =
|
||||
let (del_exists, add_exists) =
|
||||
facet_exists_docids.entry(field_id).or_default();
|
||||
let (ref mut del_is_null, ref mut add_is_null) =
|
||||
let (del_is_null, add_is_null) =
|
||||
facet_is_null_docids.entry(field_id).or_default();
|
||||
let (ref mut del_is_empty, ref mut add_is_empty) =
|
||||
let (del_is_empty, add_is_empty) =
|
||||
facet_is_empty_docids.entry(field_id).or_default();
|
||||
|
||||
if del_value.is_some() {
|
||||
|
|
|
@ -453,14 +453,14 @@ pub fn extract_vector_points<R: io::Read + io::Seek>(
|
|||
} in extractors
|
||||
{
|
||||
let remove_from_user_provided =
|
||||
if let ExtractionAction::DocumentOperation(DocumentOperation {
|
||||
match action
|
||||
{ ExtractionAction::DocumentOperation(DocumentOperation {
|
||||
remove_from_user_provided,
|
||||
}) = action
|
||||
{
|
||||
}) => {
|
||||
remove_from_user_provided
|
||||
} else {
|
||||
} _ => {
|
||||
Default::default()
|
||||
};
|
||||
}};
|
||||
|
||||
results.push(ExtractedVectorPoints {
|
||||
manual_vectors: writer_into_reader(manual_vectors_writer)?,
|
||||
|
@ -789,11 +789,11 @@ fn embed_chunks(
|
|||
match embedder.embed_index(text_chunks, request_threads) {
|
||||
Ok(chunks) => Ok(chunks),
|
||||
Err(error) => {
|
||||
if let FaultSource::Bug = error.fault {
|
||||
match error.fault { FaultSource::Bug => {
|
||||
Err(crate::Error::InternalError(crate::InternalError::VectorEmbeddingError(
|
||||
error.into(),
|
||||
)))
|
||||
} else {
|
||||
} _ => {
|
||||
let mut msg =
|
||||
format!(r"While embedding documents for embedder `{embedder_name}`: {error}");
|
||||
|
||||
|
@ -827,7 +827,7 @@ fn embed_chunks(
|
|||
}
|
||||
|
||||
Err(crate::Error::UserError(crate::UserError::DocumentEmbeddingError(msg)))
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,13 +87,13 @@ pub fn writer_into_reader(
|
|||
/// We use memory mapping inside. So, according to the Rust community, it's unsafe.
|
||||
pub unsafe fn as_cloneable_grenad(
|
||||
reader: &grenad::Reader<BufReader<File>>,
|
||||
) -> Result<grenad::Reader<CursorClonableMmap>> {
|
||||
) -> Result<grenad::Reader<CursorClonableMmap>> { unsafe {
|
||||
let file = reader.get_ref().get_ref();
|
||||
let mmap = memmap2::Mmap::map(file)?;
|
||||
let cursor = io::Cursor::new(ClonableMmap::from(mmap));
|
||||
let reader = grenad::Reader::new(cursor)?;
|
||||
Ok(reader)
|
||||
}
|
||||
}}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct GrenadParameters {
|
||||
|
|
|
@ -367,7 +367,7 @@ where
|
|||
|
||||
match lmdb_writer_rx.clone().recv_timeout(std::time::Duration::from_millis(500)) {
|
||||
Err(status) => {
|
||||
if let Some(typed_chunks) = chunk_accumulator.pop_longest() {
|
||||
match chunk_accumulator.pop_longest() { Some(typed_chunks) => {
|
||||
let (docids, is_merged_database) =
|
||||
write_typed_chunk_into_index(self.wtxn, self.index, &settings_diff, typed_chunks, &mut modified_docids)?;
|
||||
if !docids.is_empty() {
|
||||
|
@ -387,11 +387,11 @@ where
|
|||
});
|
||||
}
|
||||
// If no more chunk remains in the chunk accumulator and the channel is disconected, break.
|
||||
} else if status == crossbeam_channel::RecvTimeoutError::Disconnected {
|
||||
} _ => if status == crossbeam_channel::RecvTimeoutError::Disconnected {
|
||||
break;
|
||||
} else {
|
||||
rayon::yield_now();
|
||||
}
|
||||
}}
|
||||
}
|
||||
Ok(result) => {
|
||||
let typed_chunk = match result? {
|
||||
|
|
|
@ -91,7 +91,7 @@ fn create_fields_mapping(
|
|||
.iter()
|
||||
// we sort by id here to ensure a deterministic mapping of the fields, that preserves
|
||||
// the original ordering.
|
||||
.sorted_by_key(|(&id, _)| id)
|
||||
.sorted_by_key(|&(&id, _)| id)
|
||||
.map(|(field, name)| match index_field_map.id(name) {
|
||||
Some(id) => Ok((*field, id)),
|
||||
None => index_field_map
|
||||
|
|
|
@ -689,14 +689,14 @@ pub(crate) fn write_typed_chunk_into_index(
|
|||
.unwrap();
|
||||
|
||||
if embeddings.embedding_count() > usize::from(u8::MAX) {
|
||||
let external_docid = if let Ok(Some(Ok(index))) = index
|
||||
let external_docid = match index
|
||||
.external_id_of(wtxn, std::iter::once(docid))
|
||||
.map(|it| it.into_iter().next())
|
||||
{
|
||||
{ Ok(Some(Ok(index))) => {
|
||||
index
|
||||
} else {
|
||||
} _ => {
|
||||
format!("internal docid={docid}")
|
||||
};
|
||||
}};
|
||||
return Err(crate::Error::UserError(crate::UserError::TooManyVectors(
|
||||
external_docid,
|
||||
embeddings.embedding_count(),
|
||||
|
|
|
@ -365,11 +365,11 @@ impl<'doc> DelAddFacetValue<'doc> {
|
|||
match kind {
|
||||
FacetKind::Number => {
|
||||
let key = (fid, value);
|
||||
if let Some(DelAdd::Deletion) = self.f64s.get(&key) {
|
||||
match self.f64s.get(&key) { Some(DelAdd::Deletion) => {
|
||||
self.f64s.remove(&key);
|
||||
} else {
|
||||
} _ => {
|
||||
self.f64s.insert(key, DelAdd::Addition);
|
||||
}
|
||||
}}
|
||||
}
|
||||
FacetKind::String => {
|
||||
if let Ok(s) = std::str::from_utf8(&value) {
|
||||
|
@ -386,11 +386,11 @@ impl<'doc> DelAddFacetValue<'doc> {
|
|||
match kind {
|
||||
FacetKind::Number => {
|
||||
let key = (fid, value);
|
||||
if let Some(DelAdd::Addition) = self.f64s.get(&key) {
|
||||
match self.f64s.get(&key) { Some(DelAdd::Addition) => {
|
||||
self.f64s.remove(&key);
|
||||
} else {
|
||||
} _ => {
|
||||
self.f64s.insert(key, DelAdd::Deletion);
|
||||
}
|
||||
}}
|
||||
}
|
||||
FacetKind::String => {
|
||||
if let Ok(s) = std::str::from_utf8(&value) {
|
||||
|
|
|
@ -95,7 +95,7 @@ pub struct FrozenGeoExtractorData<'extractor> {
|
|||
impl FrozenGeoExtractorData<'_> {
|
||||
pub fn iter_and_clear_removed(
|
||||
&mut self,
|
||||
) -> io::Result<impl IntoIterator<Item = io::Result<ExtractedGeoPoint>> + '_> {
|
||||
) -> io::Result<impl IntoIterator<Item = io::Result<ExtractedGeoPoint>> + '_ + use<'_>> {
|
||||
Ok(mem::take(&mut self.removed)
|
||||
.iter()
|
||||
.copied()
|
||||
|
@ -105,7 +105,7 @@ impl FrozenGeoExtractorData<'_> {
|
|||
|
||||
pub fn iter_and_clear_inserted(
|
||||
&mut self,
|
||||
) -> io::Result<impl IntoIterator<Item = io::Result<ExtractedGeoPoint>> + '_> {
|
||||
) -> io::Result<impl IntoIterator<Item = io::Result<ExtractedGeoPoint>> + '_ + use<'_>> {
|
||||
Ok(mem::take(&mut self.inserted)
|
||||
.iter()
|
||||
.copied()
|
||||
|
|
|
@ -111,9 +111,9 @@ impl<'extractor> Extractor<'extractor> for EmbeddingExtractor<'_, '_> {
|
|||
let prompt = chunks.prompt();
|
||||
|
||||
let old_vectors = old_vectors.vectors_for_key(embedder_name)?.unwrap();
|
||||
if let Some(new_vectors) = new_vectors.as_ref().and_then(|new_vectors| {
|
||||
match new_vectors.as_ref().and_then(|new_vectors| {
|
||||
new_vectors.vectors_for_key(embedder_name).transpose()
|
||||
}) {
|
||||
}) { Some(new_vectors) => {
|
||||
let new_vectors = new_vectors?;
|
||||
if old_vectors.regenerate != new_vectors.regenerate {
|
||||
chunks.set_regenerate(update.docid(), new_vectors.regenerate);
|
||||
|
@ -159,7 +159,7 @@ impl<'extractor> Extractor<'extractor> for EmbeddingExtractor<'_, '_> {
|
|||
)?;
|
||||
}
|
||||
}
|
||||
} else if old_vectors.regenerate {
|
||||
} _ => if old_vectors.regenerate {
|
||||
let old_rendered = prompt.render_document(
|
||||
update.external_document_id(),
|
||||
update.current(
|
||||
|
@ -188,7 +188,7 @@ impl<'extractor> Extractor<'extractor> for EmbeddingExtractor<'_, '_> {
|
|||
&unused_vectors_distribution,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
DocumentChange::Insertion(insertion) => {
|
||||
|
@ -202,9 +202,9 @@ impl<'extractor> Extractor<'extractor> for EmbeddingExtractor<'_, '_> {
|
|||
let embedder_name = chunks.embedder_name();
|
||||
let prompt = chunks.prompt();
|
||||
// if no inserted vectors, then regenerate: true + no embeddings => autogenerate
|
||||
if let Some(new_vectors) = new_vectors.as_ref().and_then(|new_vectors| {
|
||||
match new_vectors.as_ref().and_then(|new_vectors| {
|
||||
new_vectors.vectors_for_key(embedder_name).transpose()
|
||||
}) {
|
||||
}) { Some(new_vectors) => {
|
||||
let new_vectors = new_vectors?;
|
||||
chunks.set_regenerate(insertion.docid(), new_vectors.regenerate);
|
||||
if let Some(embeddings) = new_vectors.embeddings {
|
||||
|
@ -233,7 +233,7 @@ impl<'extractor> Extractor<'extractor> for EmbeddingExtractor<'_, '_> {
|
|||
&unused_vectors_distribution,
|
||||
)?;
|
||||
}
|
||||
} else {
|
||||
} _ => {
|
||||
let rendered = prompt.render_document(
|
||||
insertion.external_document_id(),
|
||||
insertion.inserted(),
|
||||
|
@ -246,7 +246,7 @@ impl<'extractor> Extractor<'extractor> for EmbeddingExtractor<'_, '_> {
|
|||
rendered,
|
||||
&unused_vectors_distribution,
|
||||
)?;
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -424,11 +424,11 @@ impl<'a, 'b, 'extractor> Chunks<'a, 'b, 'extractor> {
|
|||
Ok(())
|
||||
}
|
||||
Err(error) => {
|
||||
if let FaultSource::Bug = error.fault {
|
||||
match error.fault { FaultSource::Bug => {
|
||||
Err(crate::Error::InternalError(crate::InternalError::VectorEmbeddingError(
|
||||
error.into(),
|
||||
)))
|
||||
} else {
|
||||
} _ => {
|
||||
let mut msg = format!(
|
||||
r"While embedding documents for embedder `{embedder_name}`: {error}"
|
||||
);
|
||||
|
@ -463,7 +463,7 @@ impl<'a, 'b, 'extractor> Chunks<'a, 'b, 'extractor> {
|
|||
}
|
||||
|
||||
Err(crate::Error::UserError(crate::UserError::DocumentEmbeddingError(msg)))
|
||||
}
|
||||
}}
|
||||
}
|
||||
};
|
||||
texts.clear();
|
||||
|
|
|
@ -19,7 +19,7 @@ pub fn retrieve_or_guess_primary_key<'a>(
|
|||
// make sure that we have a declared primary key, either fetching it from the index or attempting to guess it.
|
||||
|
||||
// do we have an existing declared primary key?
|
||||
let (primary_key, has_changed) = if let Some(primary_key_from_db) = index.primary_key(rtxn)? {
|
||||
let (primary_key, has_changed) = match index.primary_key(rtxn)? { Some(primary_key_from_db) => {
|
||||
// did we request a primary key in the operation?
|
||||
match primary_key_from_op {
|
||||
// we did, and it is different from the DB one
|
||||
|
@ -30,7 +30,7 @@ pub fn retrieve_or_guess_primary_key<'a>(
|
|||
}
|
||||
_ => (primary_key_from_db, false),
|
||||
}
|
||||
} else {
|
||||
} _ => {
|
||||
// no primary key in the DB => let's set one
|
||||
// did we request a primary key in the operation?
|
||||
let primary_key = if let Some(primary_key_from_op) = primary_key_from_op {
|
||||
|
@ -76,7 +76,7 @@ pub fn retrieve_or_guess_primary_key<'a>(
|
|||
}
|
||||
};
|
||||
(primary_key, true)
|
||||
};
|
||||
}};
|
||||
|
||||
match PrimaryKey::new_or_insert(primary_key, new_fields_ids_map) {
|
||||
Ok(primary_key) => Ok(Ok((primary_key, has_changed))),
|
||||
|
|
|
@ -95,16 +95,16 @@ fn compute_word_fst(index: &Index, wtxn: &mut RwTxn) -> Result<Option<PrefixDelt
|
|||
|
||||
let (word_fst_mmap, prefix_data) = word_fst_builder.build(index, &rtxn)?;
|
||||
index.main.remap_types::<Str, Bytes>().put(wtxn, WORDS_FST_KEY, &word_fst_mmap)?;
|
||||
if let Some(PrefixData { prefixes_fst_mmap, prefix_delta }) = prefix_data {
|
||||
match prefix_data { Some(PrefixData { prefixes_fst_mmap, prefix_delta }) => {
|
||||
index.main.remap_types::<Str, Bytes>().put(
|
||||
wtxn,
|
||||
WORDS_PREFIXES_FST_KEY,
|
||||
&prefixes_fst_mmap,
|
||||
)?;
|
||||
Ok(Some(prefix_delta))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(None)
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "trace", skip_all, target = "indexing::facet_search")]
|
||||
|
|
|
@ -233,13 +233,13 @@ impl<'doc> VectorDocumentFromVersions<'doc> {
|
|||
embedders: &'doc EmbeddingConfigs,
|
||||
) -> Result<Option<Self>> {
|
||||
let document = DocumentFromVersions::new(versions);
|
||||
if let Some(vectors_field) = document.vectors_field()? {
|
||||
match document.vectors_field()? { Some(vectors_field) => {
|
||||
let vectors = RawMap::from_raw_value_and_hasher(vectors_field, FxBuildHasher, bump)
|
||||
.map_err(UserError::SerdeJson)?;
|
||||
Ok(Some(Self { external_document_id, vectors, embedders }))
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(None)
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,11 +36,11 @@ impl<'a> WordFstBuilder<'a> {
|
|||
}
|
||||
|
||||
self.word_fst_builder.register(deladd, right, &mut |bytes, deladd, is_modified| {
|
||||
if let Some(prefix_fst_builder) = &mut self.prefix_fst_builder {
|
||||
match &mut self.prefix_fst_builder { Some(prefix_fst_builder) => {
|
||||
prefix_fst_builder.insert_word(bytes, deladd, is_modified)
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(())
|
||||
}
|
||||
}}
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
|
@ -52,11 +52,11 @@ impl<'a> WordFstBuilder<'a> {
|
|||
rtxn: &heed::RoTxn,
|
||||
) -> Result<(Mmap, Option<PrefixData>)> {
|
||||
let words_fst_mmap = self.word_fst_builder.build(&mut |bytes, deladd, is_modified| {
|
||||
if let Some(prefix_fst_builder) = &mut self.prefix_fst_builder {
|
||||
match &mut self.prefix_fst_builder { Some(prefix_fst_builder) => {
|
||||
prefix_fst_builder.insert_word(bytes, deladd, is_modified)
|
||||
} else {
|
||||
} _ => {
|
||||
Ok(())
|
||||
}
|
||||
}}
|
||||
})?;
|
||||
|
||||
let prefix_data = self
|
||||
|
|
|
@ -1401,18 +1401,18 @@ impl InnerIndexSettingsDiff {
|
|||
pub fn reindex_searchable_id(&self, id: FieldId) -> Option<DelAddOperation> {
|
||||
if self.cache_reindex_searchable_without_user_defined || self.cache_exact_attributes {
|
||||
Some(DelAddOperation::DeletionAndAddition)
|
||||
} else if let Some(only_additional_fields) = &self.only_additional_fields {
|
||||
} else { match &self.only_additional_fields { Some(only_additional_fields) => {
|
||||
let additional_field = self.new.fields_ids_map.name(id).unwrap();
|
||||
if only_additional_fields.contains(additional_field) {
|
||||
Some(DelAddOperation::Addition)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
} else if self.cache_user_defined_searchables {
|
||||
} _ => if self.cache_user_defined_searchables {
|
||||
Some(DelAddOperation::DeletionAndAddition)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}}}
|
||||
}
|
||||
|
||||
/// List the faceted fields from the inner fid map.
|
||||
|
@ -1848,14 +1848,14 @@ pub fn validate_embedding_settings(
|
|||
}
|
||||
}
|
||||
|
||||
indexing_embedder = if let Setting::Set(mut embedder) = indexing_embedder {
|
||||
indexing_embedder = match indexing_embedder { Setting::Set(mut embedder) => {
|
||||
embedder.document_template = validate_prompt(
|
||||
name,
|
||||
embedder.document_template,
|
||||
embedder.document_template_max_bytes,
|
||||
)?;
|
||||
|
||||
if let Some(source) = embedder.source.set() {
|
||||
match embedder.source.set() { Some(source) => {
|
||||
let search_embedder = match embedder.search_embedder.clone() {
|
||||
Setting::Set(search_embedder) => Setting::Set(deserialize_sub_embedder(
|
||||
search_embedder,
|
||||
|
@ -1895,16 +1895,16 @@ pub fn validate_embedding_settings(
|
|||
&embedder.binary_quantized,
|
||||
&embedder.distribution,
|
||||
)?;
|
||||
} else {
|
||||
} _ => {
|
||||
return Err(UserError::MissingSourceForNested {
|
||||
embedder_name: NestingContext::Indexing.embedder_name_with_context(name),
|
||||
}
|
||||
.into());
|
||||
}
|
||||
}}
|
||||
Setting::Set(embedder)
|
||||
} else {
|
||||
} _ => {
|
||||
indexing_embedder
|
||||
};
|
||||
}};
|
||||
}
|
||||
}
|
||||
Ok(Setting::Set(EmbeddingSettings {
|
||||
|
|
|
@ -239,15 +239,15 @@ impl Embedder {
|
|||
|
||||
let model = BertModel::load(vb, &config).map_err(NewEmbedderError::load_model)?;
|
||||
|
||||
if let Some(pp) = tokenizer.get_padding_mut() {
|
||||
match tokenizer.get_padding_mut() { Some(pp) => {
|
||||
pp.strategy = tokenizers::PaddingStrategy::BatchLongest
|
||||
} else {
|
||||
} _ => {
|
||||
let pp = PaddingParams {
|
||||
strategy: tokenizers::PaddingStrategy::BatchLongest,
|
||||
..Default::default()
|
||||
};
|
||||
tokenizer.with_padding(Some(pp));
|
||||
}
|
||||
}}
|
||||
|
||||
let mut this = Self {
|
||||
model,
|
||||
|
|
|
@ -348,11 +348,11 @@ impl ArroyWrapper {
|
|||
searcher.candidates(filter);
|
||||
}
|
||||
|
||||
if let Some(mut ret) = searcher.by_item(rtxn, item)? {
|
||||
match searcher.by_item(rtxn, item)? { Some(mut ret) => {
|
||||
results.append(&mut ret);
|
||||
} else {
|
||||
} _ => {
|
||||
break;
|
||||
}
|
||||
}}
|
||||
}
|
||||
results.sort_unstable_by_key(|(_, distance)| OrderedFloat(*distance));
|
||||
Ok(results)
|
||||
|
@ -402,19 +402,19 @@ impl ArroyWrapper {
|
|||
|
||||
if self.quantized {
|
||||
for reader in self.readers(rtxn, self.quantized_db()) {
|
||||
if let Some(vec) = reader?.item_vector(rtxn, item_id)? {
|
||||
match reader?.item_vector(rtxn, item_id)? { Some(vec) => {
|
||||
vectors.push(vec);
|
||||
} else {
|
||||
} _ => {
|
||||
break;
|
||||
}
|
||||
}}
|
||||
}
|
||||
} else {
|
||||
for reader in self.readers(rtxn, self.angular_db()) {
|
||||
if let Some(vec) = reader?.item_vector(rtxn, item_id)? {
|
||||
match reader?.item_vector(rtxn, item_id)? { Some(vec) => {
|
||||
vectors.push(vec);
|
||||
} else {
|
||||
} _ => {
|
||||
break;
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
Ok(vectors)
|
||||
|
|
|
@ -150,11 +150,11 @@ impl Embedder {
|
|||
headers: options.headers,
|
||||
};
|
||||
|
||||
let dimensions = if let Some(dimensions) = options.dimensions {
|
||||
let dimensions = match options.dimensions { Some(dimensions) => {
|
||||
dimensions
|
||||
} else {
|
||||
} _ => {
|
||||
infer_dimensions(&data)?
|
||||
};
|
||||
}};
|
||||
|
||||
Ok(Self {
|
||||
data,
|
||||
|
|
|
@ -8,7 +8,7 @@ use Criterion::*;
|
|||
use crate::search::{self, EXTERNAL_DOCUMENTS_IDS};
|
||||
|
||||
macro_rules! test_distinct {
|
||||
($func:ident, $distinct:ident, $exhaustive:ident, $limit:expr, $offset:expr, $criteria:expr, $n_res:expr) => {
|
||||
($func:ident, $distinct:ident, $exhaustive:ident, $limit:expr, $offset:expr_2021, $criteria:expr_2021, $n_res:expr_2021) => {
|
||||
#[test]
|
||||
fn $func() {
|
||||
let criteria = $criteria;
|
||||
|
|
|
@ -5,7 +5,7 @@ use Criterion::*;
|
|||
use crate::search::{self, EXTERNAL_DOCUMENTS_IDS};
|
||||
|
||||
macro_rules! test_filter {
|
||||
($func:ident, $filter:expr) => {
|
||||
($func:ident, $filter:expr_2021) => {
|
||||
#[test]
|
||||
fn $func() {
|
||||
let criteria = vec![Words, Typo, Proximity, Attribute, Exactness];
|
||||
|
|
|
@ -220,11 +220,11 @@ fn execute_filter(filter: &str, document: &TestDocument) -> Option<String> {
|
|||
id = Some(document.id.clone())
|
||||
}
|
||||
} else if let Some(("asc_desc_rank", filter)) = filter.split_once('<') {
|
||||
if document.asc_desc_rank < filter.parse().unwrap() {
|
||||
if document.asc_desc_rank < filter.parse::<u32>().unwrap() {
|
||||
id = Some(document.id.clone())
|
||||
}
|
||||
} else if let Some(("asc_desc_rank", filter)) = filter.split_once('>') {
|
||||
if document.asc_desc_rank > filter.parse().unwrap() {
|
||||
if document.asc_desc_rank > filter.parse::<u32>().unwrap() {
|
||||
id = Some(document.id.clone())
|
||||
}
|
||||
} else if filter.starts_with("_geoRadius") {
|
||||
|
|
|
@ -20,7 +20,7 @@ const DISALLOW_OPTIONAL_WORDS: TermsMatchingStrategy = TermsMatchingStrategy::Al
|
|||
const ASC_DESC_CANDIDATES_THRESHOLD: usize = 1000;
|
||||
|
||||
macro_rules! test_criterion {
|
||||
($func:ident, $optional_word:ident, $criteria:expr, $sort_criteria:expr) => {
|
||||
($func:ident, $optional_word:ident, $criteria:expr_2021, $sort_criteria:expr_2021) => {
|
||||
#[test]
|
||||
fn $func() {
|
||||
let criteria = $criteria;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue