diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index e1e09211a..e640ee1ef 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -65,7 +65,6 @@ jobs: uses: actions-rs/cargo@v1 with: command: clippy - args: --all-targets fmt: name: Run Rustfmt diff --git a/filter-parser/src/condition.rs b/filter-parser/src/condition.rs index e967bd074..735ffec0e 100644 --- a/filter-parser/src/condition.rs +++ b/filter-parser/src/condition.rs @@ -48,17 +48,14 @@ pub fn parse_condition(input: Span) -> IResult { pub fn parse_exists(input: Span) -> IResult { let (input, key) = terminated(parse_value, tag("EXISTS"))(input)?; - Ok((input, FilterCondition::Condition { fid: key.into(), op: Exists })) + Ok((input, FilterCondition::Condition { fid: key, op: Exists })) } /// exist = value "NOT" WS+ "EXISTS" pub fn parse_not_exists(input: Span) -> IResult { let (input, key) = parse_value(input)?; let (input, _) = tuple((tag("NOT"), multispace1, tag("EXISTS")))(input)?; - Ok(( - input, - FilterCondition::Not(Box::new(FilterCondition::Condition { fid: key.into(), op: Exists })), - )) + Ok((input, FilterCondition::Not(Box::new(FilterCondition::Condition { fid: key, op: Exists })))) } /// to = value value "TO" WS+ value diff --git a/filter-parser/src/lib.rs b/filter-parser/src/lib.rs index 33025e6e9..9a3e0f1f8 100644 --- a/filter-parser/src/lib.rs +++ b/filter-parser/src/lib.rs @@ -168,7 +168,7 @@ fn ws<'a, O>(inner: impl FnMut(Span<'a>) -> IResult) -> impl FnMut(Span<'a>) } /// value_list = (value ("," value)* ","?)? -fn parse_value_list<'a>(input: Span<'a>) -> IResult>> { +fn parse_value_list(input: Span) -> IResult> { let (input, first_value) = opt(parse_value)(input)?; if let Some(first_value) = first_value { let value_list_el_parser = preceded(ws(tag(",")), parse_value); @@ -335,17 +335,17 @@ fn parse_error_reserved_keyword(input: Span) -> IResult { Ok(result) => Ok(result), Err(nom::Err::Error(inner) | nom::Err::Failure(inner)) => match inner.kind() { ErrorKind::ExpectedValue(ExpectedValueKind::ReservedKeyword) => { - return Err(nom::Err::Failure(inner)); + Err(nom::Err::Failure(inner)) } - _ => return Err(nom::Err::Error(inner)), + _ => Err(nom::Err::Error(inner)), }, - Err(e) => { - return Err(e); - } + Err(e) => Err(e), } } -/// primary = (WS* "(" WS* expression WS* ")" WS*) | geoRadius | condition | exists | not_exists | to +/** +primary = (WS* "(" WS* expression WS* ")" WS*) | geoRadius | condition | exists | not_exists | to +*/ fn parse_primary(input: Span, depth: usize) -> IResult { if depth > MAX_FILTER_DEPTH { return Err(nom::Err::Error(Error::new_from_kind(input, ErrorKind::DepthLimitReached))); diff --git a/filter-parser/src/value.rs b/filter-parser/src/value.rs index d015018c1..73ef61480 100644 --- a/filter-parser/src/value.rs +++ b/filter-parser/src/value.rs @@ -78,7 +78,7 @@ pub fn word_exact<'a, 'b: 'a>(tag: &'b str) -> impl Fn(Span<'a>) -> IResult<'a, } /// value = WS* ( word | singleQuoted | doubleQuoted) WS+ -pub fn parse_value<'a>(input: Span<'a>) -> IResult> { +pub fn parse_value(input: Span) -> IResult { // to get better diagnostic message we are going to strip the left whitespaces from the input right now let (input, _) = take_while(char::is_whitespace)(input)?; diff --git a/milli/src/lib.rs b/milli/src/lib.rs index 28f048b8a..c33aae9eb 100644 --- a/milli/src/lib.rs +++ b/milli/src/lib.rs @@ -1,6 +1,4 @@ #![cfg_attr(all(test, fuzzing), feature(no_coverage))] -#![allow(clippy::reversed_empty_ranges)] -#![allow(clippy::too_many_arguments)] #[macro_use] pub mod documents; diff --git a/milli/src/search/criteria/asc_desc.rs b/milli/src/search/criteria/asc_desc.rs index 92c73709b..fbcf1d3fe 100644 --- a/milli/src/search/criteria/asc_desc.rs +++ b/milli/src/search/criteria/asc_desc.rs @@ -242,6 +242,7 @@ fn iterative_facet_number_ordered_iter<'t>( // The itertools GroupBy iterator doesn't provide an owned version, we are therefore // required to collect the result into an owned collection (a Vec). // https://github.com/rust-itertools/itertools/issues/499 + #[allow(clippy::needless_collect)] let vec: Vec<_> = iter .group_by(|(_, v)| *v) .into_iter() @@ -284,6 +285,7 @@ fn iterative_facet_string_ordered_iter<'t>( // The itertools GroupBy iterator doesn't provide an owned version, we are therefore // required to collect the result into an owned collection (a Vec). // https://github.com/rust-itertools/itertools/issues/499 + #[allow(clippy::needless_collect)] let vec: Vec<_> = iter .group_by(|(_, v)| *v) .into_iter() diff --git a/milli/src/search/criteria/attribute.rs b/milli/src/search/criteria/attribute.rs index 7e55a1038..4d2437027 100644 --- a/milli/src/search/criteria/attribute.rs +++ b/milli/src/search/criteria/attribute.rs @@ -179,6 +179,7 @@ impl<'t> Criterion for Attribute<'t> { /// QueryPositionIterator is an Iterator over positions of a Query, /// It contains iterators over words positions. struct QueryPositionIterator<'t> { + #[allow(clippy::type_complexity)] inner: Vec> + 't>>>, } diff --git a/milli/src/search/criteria/mod.rs b/milli/src/search/criteria/mod.rs index ab1823779..09d0908e1 100644 --- a/milli/src/search/criteria/mod.rs +++ b/milli/src/search/criteria/mod.rs @@ -96,6 +96,7 @@ pub trait Context<'c> { &self, docid: DocumentId, ) -> heed::Result>; + #[allow(clippy::type_complexity)] fn word_position_iterator( &self, word: &str, @@ -610,11 +611,7 @@ fn query_pair_proximity_docids( } (QueryKind::Exact { word: left, .. }, QueryKind::Tolerant { typo, word: right }) => { let r_words = word_derivations(right, prefix, *typo, ctx.words_fst(), wdcache)?; -<<<<<<< HEAD all_word_pair_overall_proximity_docids(ctx, &[(left, 0)], r_words, proximity) -======= - all_word_pair_proximity_docids(ctx, &[(left, 0)], r_words, proximity) ->>>>>>> 08fe530b (Execute cargo clippy --fix) } ( QueryKind::Tolerant { typo: l_typo, word: left }, diff --git a/milli/src/search/distinct/facet_distinct.rs b/milli/src/search/distinct/facet_distinct.rs index 1725346be..3ed683823 100644 --- a/milli/src/search/distinct/facet_distinct.rs +++ b/milli/src/search/distinct/facet_distinct.rs @@ -123,6 +123,7 @@ impl<'a> FacetDistinctIter<'a> { } } +#[allow(clippy::drop_non_drop)] fn facet_values_prefix_key(distinct: FieldId, id: DocumentId) -> [u8; FID_SIZE + DOCID_SIZE] { concat_arrays!(distinct.to_be_bytes(), id.to_be_bytes()) } diff --git a/milli/src/search/facet/filter.rs b/milli/src/search/facet/filter.rs index 1dc01566e..40986fea0 100644 --- a/milli/src/search/facet/filter.rs +++ b/milli/src/search/facet/filter.rs @@ -100,10 +100,10 @@ impl<'a> Filter<'a> { } } - if ors.len() > 1 { - ands.push(FilterCondition::Or(ors)); - } else if ors.len() == 1 { - ands.push(ors.pop().unwrap()); + match ors.len() { + 1 => ands.push(ors.pop().unwrap()), + n if n > 1 => ands.push(FilterCondition::Or(ors)), + _ => (), } } Either::Right(rule) => { @@ -128,6 +128,7 @@ impl<'a> Filter<'a> { Ok(Some(Self { condition: and })) } + #[allow(clippy::should_implement_trait)] pub fn from_str(expression: &'a str) -> Result> { let condition = match FilterCondition::parse(expression) { Ok(Some(fc)) => Ok(fc), diff --git a/milli/src/search/matches/mod.rs b/milli/src/search/matches/mod.rs index b76ddef99..ec47f848d 100644 --- a/milli/src/search/matches/mod.rs +++ b/milli/src/search/matches/mod.rs @@ -125,10 +125,7 @@ impl<'t, A: AsRef<[u8]>> Matcher<'t, '_, A> { words_positions: &mut impl Iterator)>, matches: &mut Vec, ) -> bool { - let mut potential_matches = Vec::new(); - - // Add first match to potential matches. - potential_matches.push((token_position, word_position, partial.char_len())); + let mut potential_matches = vec![(token_position, word_position, partial.char_len())]; for (token_position, word_position, word) in words_positions { partial = match partial.match_token(word) { diff --git a/milli/src/snapshot_tests.rs b/milli/src/snapshot_tests.rs index d3fbfc285..46972deba 100644 --- a/milli/src/snapshot_tests.rs +++ b/milli/src/snapshot_tests.rs @@ -314,7 +314,7 @@ pub fn snap_field_id_docid_facet_strings(index: &Index) -> String { pub fn snap_documents_ids(index: &Index) -> String { let rtxn = index.read_txn().unwrap(); let documents_ids = index.documents_ids(&rtxn).unwrap(); - + display_bitmap(&documents_ids) } pub fn snap_stop_words(index: &Index) -> String { @@ -326,7 +326,7 @@ pub fn snap_stop_words(index: &Index) -> String { pub fn snap_soft_deleted_documents_ids(index: &Index) -> String { let rtxn = index.read_txn().unwrap(); let soft_deleted_documents_ids = index.soft_deleted_documents_ids(&rtxn).unwrap(); - + display_bitmap(&soft_deleted_documents_ids) } pub fn snap_field_distributions(index: &Index) -> String { @@ -350,7 +350,7 @@ pub fn snap_fields_ids_map(index: &Index) -> String { pub fn snap_geo_faceted_documents_ids(index: &Index) -> String { let rtxn = index.read_txn().unwrap(); let geo_faceted_documents_ids = index.geo_faceted_documents_ids(&rtxn).unwrap(); - + display_bitmap(&geo_faceted_documents_ids) } pub fn snap_external_documents_ids(index: &Index) -> String { diff --git a/milli/src/update/available_documents_ids.rs b/milli/src/update/available_documents_ids.rs index 3e4ec5600..784bee5a7 100644 --- a/milli/src/update/available_documents_ids.rs +++ b/milli/src/update/available_documents_ids.rs @@ -21,6 +21,7 @@ impl AvailableDocumentsIds { let iter = match last_id.checked_add(1) { Some(id) => id..=u32::max_value(), + #[allow(clippy::reversed_empty_ranges)] None => 1..=0, // empty range iterator }; diff --git a/milli/src/update/index_documents/extract/extract_geo_points.rs b/milli/src/update/index_documents/extract/extract_geo_points.rs index c75b60c60..55044e712 100644 --- a/milli/src/update/index_documents/extract/extract_geo_points.rs +++ b/milli/src/update/index_documents/extract/extract_geo_points.rs @@ -51,6 +51,7 @@ pub fn extract_geo_points( ) .map_err(|lng| GeoError::BadLongitude { document_id: document_id(), value: lng })?; + #[allow(clippy::drop_non_drop)] let bytes: [u8; 16] = concat_arrays![lat.to_ne_bytes(), lng.to_ne_bytes()]; writer.insert(docid_bytes, bytes)?; } else if lat.is_none() && lng.is_some() { diff --git a/milli/src/update/index_documents/extract/mod.rs b/milli/src/update/index_documents/extract/mod.rs index c0f12e9ee..e696ed44b 100644 --- a/milli/src/update/index_documents/extract/mod.rs +++ b/milli/src/update/index_documents/extract/mod.rs @@ -33,6 +33,7 @@ use crate::{FieldId, Result}; /// Extract data for each databases from obkv documents in parallel. /// Send data in grenad file over provided Sender. +#[allow(clippy::too_many_arguments)] pub(crate) fn data_from_obkv_documents( original_obkv_chunks: impl Iterator>> + Send, flattened_obkv_chunks: impl Iterator>> + Send, @@ -53,6 +54,7 @@ pub(crate) fn data_from_obkv_documents( }) .collect::>()?; + #[allow(clippy::type_complexity)] let result: Result<(Vec<_>, (Vec<_>, (Vec<_>, Vec<_>)))> = flattened_obkv_chunks .par_bridge() .map(|flattened_obkv_chunks| { @@ -217,6 +219,8 @@ fn send_original_documents_data( /// - docid_fid_facet_numbers /// - docid_fid_facet_strings /// - docid_fid_facet_exists +#[allow(clippy::too_many_arguments)] +#[allow(clippy::type_complexity)] fn send_and_extract_flattened_documents_data( flattened_documents_chunk: Result>, indexer: GrenadParameters, diff --git a/milli/src/update/index_documents/mod.rs b/milli/src/update/index_documents/mod.rs index 468a8c56f..e9f5c2d38 100644 --- a/milli/src/update/index_documents/mod.rs +++ b/milli/src/update/index_documents/mod.rs @@ -598,6 +598,7 @@ where } /// Run the word prefix docids update operation. +#[allow(clippy::too_many_arguments)] fn execute_word_prefix_docids( txn: &mut heed::RwTxn, reader: grenad::Reader>, diff --git a/milli/src/update/prefix_word_pairs/prefix_word.rs b/milli/src/update/prefix_word_pairs/prefix_word.rs index 952e02558..60e2e554e 100644 --- a/milli/src/update/prefix_word_pairs/prefix_word.rs +++ b/milli/src/update/prefix_word_pairs/prefix_word.rs @@ -12,6 +12,7 @@ use crate::update::prefix_word_pairs::{ }; use crate::{CboRoaringBitmapCodec, Result, U8StrStrCodec, UncheckedU8StrStrCodec}; +#[allow(clippy::too_many_arguments)] #[logging_timer::time] pub fn index_prefix_word_database( wtxn: &mut heed::RwTxn, @@ -38,8 +39,7 @@ pub fn index_prefix_word_database( for proximity in 1..max_proximity { for prefix in common_prefixes.iter() { - let mut prefix_key = vec![]; - prefix_key.push(proximity); + let mut prefix_key = vec![proximity]; prefix_key.extend_from_slice(prefix.as_bytes()); let mut cursor = new_word_pair_proximity_docids.clone().into_prefix_iter(prefix_key)?; // This is the core of the algorithm @@ -84,8 +84,7 @@ pub fn index_prefix_word_database( for proximity in 1..max_proximity { for prefix in new_prefixes.iter() { - let mut prefix_key = vec![]; - prefix_key.push(proximity); + let mut prefix_key = vec![proximity]; prefix_key.extend_from_slice(prefix.as_bytes()); let mut db_iter = word_pair_proximity_docids .as_polymorph() diff --git a/milli/src/update/prefix_word_pairs/word_prefix.rs b/milli/src/update/prefix_word_pairs/word_prefix.rs index 62d4d4c03..71a2a2915 100644 --- a/milli/src/update/prefix_word_pairs/word_prefix.rs +++ b/milli/src/update/prefix_word_pairs/word_prefix.rs @@ -176,6 +176,7 @@ use crate::update::prefix_word_pairs::{ }; use crate::{CboRoaringBitmapCodec, Result, U8StrStrCodec, UncheckedU8StrStrCodec}; +#[allow(clippy::too_many_arguments)] #[logging_timer::time] pub fn index_word_prefix_database( wtxn: &mut heed::RwTxn, @@ -385,6 +386,7 @@ can be inserted into the database in sorted order. When it is flushed, it calls struct PrefixAndProximityBatch { proximity: u8, word1: Vec, + #[allow(clippy::type_complexity)] batch: Vec<(Vec, Vec>)>, } diff --git a/milli/tests/search/query_criteria.rs b/milli/tests/search/query_criteria.rs index 3007a83ea..d4aa859a4 100644 --- a/milli/tests/search/query_criteria.rs +++ b/milli/tests/search/query_criteria.rs @@ -200,12 +200,14 @@ test_criterion!( #[test] fn criteria_mixup() { use Criterion::*; - let index = search::setup_search_index_with_criteria(&[Words, + let index = search::setup_search_index_with_criteria(&[ + Words, Attribute, Desc(S("asc_desc_rank")), Exactness, Proximity, - Typo]); + Typo, + ]); #[rustfmt::skip] let criteria_mix = {