Fix cargo clippy errors

Dont apply clippy for tests for now

Fix clippy warnings of filter-parser package

parent 8352febd646ec4bcf56a44161e5c4dce0e55111f
author unvalley <38400669+unvalley@users.noreply.github.com> 1666325847 +0900
committer unvalley <kirohi.code@gmail.com> 1666791316 +0900

Update .github/workflows/rust.yml

Co-authored-by: Clémentine Urquizar - curqui <clementine@meilisearch.com>

Allow clippy lint too_many_argments

Allow clippy lint needless_collect

Allow clippy lint too_many_arguments and type_complexity

Fix for clippy warnings comparison_chains

Fix for clippy warnings vec_init_then_push

Allow clippy lint should_implement_trait

Allow clippy lint drop_non_drop

Fix lifetime clipy warnings in filter-paprser

Execute cargo fmt

Fix clippy remaining warnings

Fix clippy remaining warnings again and allow lint on each place
This commit is contained in:
unvalley 2022-10-14 23:44:10 +09:00
parent 811f156031
commit c7322f704c
19 changed files with 40 additions and 37 deletions

View File

@ -65,7 +65,6 @@ jobs:
uses: actions-rs/cargo@v1 uses: actions-rs/cargo@v1
with: with:
command: clippy command: clippy
args: --all-targets
fmt: fmt:
name: Run Rustfmt name: Run Rustfmt

View File

@ -48,17 +48,14 @@ pub fn parse_condition(input: Span) -> IResult<FilterCondition> {
pub fn parse_exists(input: Span) -> IResult<FilterCondition> { pub fn parse_exists(input: Span) -> IResult<FilterCondition> {
let (input, key) = terminated(parse_value, tag("EXISTS"))(input)?; 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" /// exist = value "NOT" WS+ "EXISTS"
pub fn parse_not_exists(input: Span) -> IResult<FilterCondition> { pub fn parse_not_exists(input: Span) -> IResult<FilterCondition> {
let (input, key) = parse_value(input)?; let (input, key) = parse_value(input)?;
let (input, _) = tuple((tag("NOT"), multispace1, tag("EXISTS")))(input)?; let (input, _) = tuple((tag("NOT"), multispace1, tag("EXISTS")))(input)?;
Ok(( Ok((input, FilterCondition::Not(Box::new(FilterCondition::Condition { fid: key, op: Exists }))))
input,
FilterCondition::Not(Box::new(FilterCondition::Condition { fid: key.into(), op: Exists })),
))
} }
/// to = value value "TO" WS+ value /// to = value value "TO" WS+ value

View File

@ -168,7 +168,7 @@ fn ws<'a, O>(inner: impl FnMut(Span<'a>) -> IResult<O>) -> impl FnMut(Span<'a>)
} }
/// value_list = (value ("," value)* ","?)? /// value_list = (value ("," value)* ","?)?
fn parse_value_list<'a>(input: Span<'a>) -> IResult<Vec<Token<'a>>> { fn parse_value_list(input: Span) -> IResult<Vec<Token>> {
let (input, first_value) = opt(parse_value)(input)?; let (input, first_value) = opt(parse_value)(input)?;
if let Some(first_value) = first_value { if let Some(first_value) = first_value {
let value_list_el_parser = preceded(ws(tag(",")), parse_value); let value_list_el_parser = preceded(ws(tag(",")), parse_value);
@ -335,17 +335,17 @@ fn parse_error_reserved_keyword(input: Span) -> IResult<FilterCondition> {
Ok(result) => Ok(result), Ok(result) => Ok(result),
Err(nom::Err::Error(inner) | nom::Err::Failure(inner)) => match inner.kind() { Err(nom::Err::Error(inner) | nom::Err::Failure(inner)) => match inner.kind() {
ErrorKind::ExpectedValue(ExpectedValueKind::ReservedKeyword) => { 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) => { Err(e) => Err(e),
return 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<FilterCondition> { fn parse_primary(input: Span, depth: usize) -> IResult<FilterCondition> {
if depth > MAX_FILTER_DEPTH { if depth > MAX_FILTER_DEPTH {
return Err(nom::Err::Error(Error::new_from_kind(input, ErrorKind::DepthLimitReached))); return Err(nom::Err::Error(Error::new_from_kind(input, ErrorKind::DepthLimitReached)));

View File

@ -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+ /// value = WS* ( word | singleQuoted | doubleQuoted) WS+
pub fn parse_value<'a>(input: Span<'a>) -> IResult<Token<'a>> { pub fn parse_value(input: Span) -> IResult<Token> {
// to get better diagnostic message we are going to strip the left whitespaces from the input right now // 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)?; let (input, _) = take_while(char::is_whitespace)(input)?;

View File

@ -1,6 +1,4 @@
#![cfg_attr(all(test, fuzzing), feature(no_coverage))] #![cfg_attr(all(test, fuzzing), feature(no_coverage))]
#![allow(clippy::reversed_empty_ranges)]
#![allow(clippy::too_many_arguments)]
#[macro_use] #[macro_use]
pub mod documents; pub mod documents;

View File

@ -242,6 +242,7 @@ fn iterative_facet_number_ordered_iter<'t>(
// The itertools GroupBy iterator doesn't provide an owned version, we are therefore // The itertools GroupBy iterator doesn't provide an owned version, we are therefore
// required to collect the result into an owned collection (a Vec). // required to collect the result into an owned collection (a Vec).
// https://github.com/rust-itertools/itertools/issues/499 // https://github.com/rust-itertools/itertools/issues/499
#[allow(clippy::needless_collect)]
let vec: Vec<_> = iter let vec: Vec<_> = iter
.group_by(|(_, v)| *v) .group_by(|(_, v)| *v)
.into_iter() .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 // The itertools GroupBy iterator doesn't provide an owned version, we are therefore
// required to collect the result into an owned collection (a Vec). // required to collect the result into an owned collection (a Vec).
// https://github.com/rust-itertools/itertools/issues/499 // https://github.com/rust-itertools/itertools/issues/499
#[allow(clippy::needless_collect)]
let vec: Vec<_> = iter let vec: Vec<_> = iter
.group_by(|(_, v)| *v) .group_by(|(_, v)| *v)
.into_iter() .into_iter()

View File

@ -179,6 +179,7 @@ impl<'t> Criterion for Attribute<'t> {
/// QueryPositionIterator is an Iterator over positions of a Query, /// QueryPositionIterator is an Iterator over positions of a Query,
/// It contains iterators over words positions. /// It contains iterators over words positions.
struct QueryPositionIterator<'t> { struct QueryPositionIterator<'t> {
#[allow(clippy::type_complexity)]
inner: inner:
Vec<Peekable<Box<dyn Iterator<Item = heed::Result<((&'t str, u32), RoaringBitmap)>> + 't>>>, Vec<Peekable<Box<dyn Iterator<Item = heed::Result<((&'t str, u32), RoaringBitmap)>> + 't>>>,
} }

View File

@ -96,6 +96,7 @@ pub trait Context<'c> {
&self, &self,
docid: DocumentId, docid: DocumentId,
) -> heed::Result<HashMap<String, RoaringBitmap>>; ) -> heed::Result<HashMap<String, RoaringBitmap>>;
#[allow(clippy::type_complexity)]
fn word_position_iterator( fn word_position_iterator(
&self, &self,
word: &str, word: &str,
@ -610,11 +611,7 @@ fn query_pair_proximity_docids(
} }
(QueryKind::Exact { word: left, .. }, QueryKind::Tolerant { typo, word: right }) => { (QueryKind::Exact { word: left, .. }, QueryKind::Tolerant { typo, word: right }) => {
let r_words = word_derivations(right, prefix, *typo, ctx.words_fst(), wdcache)?; 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_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 }, QueryKind::Tolerant { typo: l_typo, word: left },

View File

@ -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] { fn facet_values_prefix_key(distinct: FieldId, id: DocumentId) -> [u8; FID_SIZE + DOCID_SIZE] {
concat_arrays!(distinct.to_be_bytes(), id.to_be_bytes()) concat_arrays!(distinct.to_be_bytes(), id.to_be_bytes())
} }

View File

@ -100,10 +100,10 @@ impl<'a> Filter<'a> {
} }
} }
if ors.len() > 1 { match ors.len() {
ands.push(FilterCondition::Or(ors)); 1 => ands.push(ors.pop().unwrap()),
} else if ors.len() == 1 { n if n > 1 => ands.push(FilterCondition::Or(ors)),
ands.push(ors.pop().unwrap()); _ => (),
} }
} }
Either::Right(rule) => { Either::Right(rule) => {
@ -128,6 +128,7 @@ impl<'a> Filter<'a> {
Ok(Some(Self { condition: and })) Ok(Some(Self { condition: and }))
} }
#[allow(clippy::should_implement_trait)]
pub fn from_str(expression: &'a str) -> Result<Option<Self>> { pub fn from_str(expression: &'a str) -> Result<Option<Self>> {
let condition = match FilterCondition::parse(expression) { let condition = match FilterCondition::parse(expression) {
Ok(Some(fc)) => Ok(fc), Ok(Some(fc)) => Ok(fc),

View File

@ -125,10 +125,7 @@ impl<'t, A: AsRef<[u8]>> Matcher<'t, '_, A> {
words_positions: &mut impl Iterator<Item = (usize, usize, &'a Token<'a>)>, words_positions: &mut impl Iterator<Item = (usize, usize, &'a Token<'a>)>,
matches: &mut Vec<Match>, matches: &mut Vec<Match>,
) -> bool { ) -> bool {
let mut potential_matches = Vec::new(); let mut potential_matches = vec![(token_position, word_position, partial.char_len())];
// Add first match to potential matches.
potential_matches.push((token_position, word_position, partial.char_len()));
for (token_position, word_position, word) in words_positions { for (token_position, word_position, word) in words_positions {
partial = match partial.match_token(word) { partial = match partial.match_token(word) {

View File

@ -21,6 +21,7 @@ impl AvailableDocumentsIds {
let iter = match last_id.checked_add(1) { let iter = match last_id.checked_add(1) {
Some(id) => id..=u32::max_value(), Some(id) => id..=u32::max_value(),
#[allow(clippy::reversed_empty_ranges)]
None => 1..=0, // empty range iterator None => 1..=0, // empty range iterator
}; };

View File

@ -51,6 +51,7 @@ pub fn extract_geo_points<R: io::Read + io::Seek>(
) )
.map_err(|lng| GeoError::BadLongitude { document_id: document_id(), value: lng })?; .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()]; let bytes: [u8; 16] = concat_arrays![lat.to_ne_bytes(), lng.to_ne_bytes()];
writer.insert(docid_bytes, bytes)?; writer.insert(docid_bytes, bytes)?;
} else if lat.is_none() && lng.is_some() { } else if lat.is_none() && lng.is_some() {

View File

@ -33,6 +33,7 @@ use crate::{FieldId, Result};
/// Extract data for each databases from obkv documents in parallel. /// Extract data for each databases from obkv documents in parallel.
/// Send data in grenad file over provided Sender. /// Send data in grenad file over provided Sender.
#[allow(clippy::too_many_arguments)]
pub(crate) fn data_from_obkv_documents( pub(crate) fn data_from_obkv_documents(
original_obkv_chunks: impl Iterator<Item = Result<grenad::Reader<File>>> + Send, original_obkv_chunks: impl Iterator<Item = Result<grenad::Reader<File>>> + Send,
flattened_obkv_chunks: impl Iterator<Item = Result<grenad::Reader<File>>> + Send, flattened_obkv_chunks: impl Iterator<Item = Result<grenad::Reader<File>>> + Send,
@ -53,6 +54,7 @@ pub(crate) fn data_from_obkv_documents(
}) })
.collect::<Result<()>>()?; .collect::<Result<()>>()?;
#[allow(clippy::type_complexity)]
let result: Result<(Vec<_>, (Vec<_>, (Vec<_>, Vec<_>)))> = flattened_obkv_chunks let result: Result<(Vec<_>, (Vec<_>, (Vec<_>, Vec<_>)))> = flattened_obkv_chunks
.par_bridge() .par_bridge()
.map(|flattened_obkv_chunks| { .map(|flattened_obkv_chunks| {
@ -217,6 +219,8 @@ fn send_original_documents_data(
/// - docid_fid_facet_numbers /// - docid_fid_facet_numbers
/// - docid_fid_facet_strings /// - docid_fid_facet_strings
/// - docid_fid_facet_exists /// - docid_fid_facet_exists
#[allow(clippy::too_many_arguments)]
#[allow(clippy::type_complexity)]
fn send_and_extract_flattened_documents_data( fn send_and_extract_flattened_documents_data(
flattened_documents_chunk: Result<grenad::Reader<File>>, flattened_documents_chunk: Result<grenad::Reader<File>>,
indexer: GrenadParameters, indexer: GrenadParameters,

View File

@ -598,6 +598,7 @@ where
} }
/// Run the word prefix docids update operation. /// Run the word prefix docids update operation.
#[allow(clippy::too_many_arguments)]
fn execute_word_prefix_docids( fn execute_word_prefix_docids(
txn: &mut heed::RwTxn, txn: &mut heed::RwTxn,
reader: grenad::Reader<Cursor<ClonableMmap>>, reader: grenad::Reader<Cursor<ClonableMmap>>,

View File

@ -12,6 +12,7 @@ use crate::update::prefix_word_pairs::{
}; };
use crate::{CboRoaringBitmapCodec, Result, U8StrStrCodec, UncheckedU8StrStrCodec}; use crate::{CboRoaringBitmapCodec, Result, U8StrStrCodec, UncheckedU8StrStrCodec};
#[allow(clippy::too_many_arguments)]
#[logging_timer::time] #[logging_timer::time]
pub fn index_prefix_word_database( pub fn index_prefix_word_database(
wtxn: &mut heed::RwTxn, wtxn: &mut heed::RwTxn,
@ -38,8 +39,7 @@ pub fn index_prefix_word_database(
for proximity in 1..max_proximity { for proximity in 1..max_proximity {
for prefix in common_prefixes.iter() { for prefix in common_prefixes.iter() {
let mut prefix_key = vec![]; let mut prefix_key = vec![proximity];
prefix_key.push(proximity);
prefix_key.extend_from_slice(prefix.as_bytes()); prefix_key.extend_from_slice(prefix.as_bytes());
let mut cursor = new_word_pair_proximity_docids.clone().into_prefix_iter(prefix_key)?; let mut cursor = new_word_pair_proximity_docids.clone().into_prefix_iter(prefix_key)?;
// This is the core of the algorithm // This is the core of the algorithm
@ -84,8 +84,7 @@ pub fn index_prefix_word_database(
for proximity in 1..max_proximity { for proximity in 1..max_proximity {
for prefix in new_prefixes.iter() { for prefix in new_prefixes.iter() {
let mut prefix_key = vec![]; let mut prefix_key = vec![proximity];
prefix_key.push(proximity);
prefix_key.extend_from_slice(prefix.as_bytes()); prefix_key.extend_from_slice(prefix.as_bytes());
let mut db_iter = word_pair_proximity_docids let mut db_iter = word_pair_proximity_docids
.as_polymorph() .as_polymorph()

View File

@ -176,6 +176,7 @@ use crate::update::prefix_word_pairs::{
}; };
use crate::{CboRoaringBitmapCodec, Result, U8StrStrCodec, UncheckedU8StrStrCodec}; use crate::{CboRoaringBitmapCodec, Result, U8StrStrCodec, UncheckedU8StrStrCodec};
#[allow(clippy::too_many_arguments)]
#[logging_timer::time] #[logging_timer::time]
pub fn index_word_prefix_database( pub fn index_word_prefix_database(
wtxn: &mut heed::RwTxn, 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 { struct PrefixAndProximityBatch {
proximity: u8, proximity: u8,
word1: Vec<u8>, word1: Vec<u8>,
#[allow(clippy::type_complexity)]
batch: Vec<(Vec<u8>, Vec<Cow<'static, [u8]>>)>, batch: Vec<(Vec<u8>, Vec<Cow<'static, [u8]>>)>,
} }

View File

@ -200,12 +200,14 @@ test_criterion!(
#[test] #[test]
fn criteria_mixup() { fn criteria_mixup() {
use Criterion::*; use Criterion::*;
let index = search::setup_search_index_with_criteria(&[Words, let index = search::setup_search_index_with_criteria(&[
Words,
Attribute, Attribute,
Desc(S("asc_desc_rank")), Desc(S("asc_desc_rank")),
Exactness, Exactness,
Proximity, Proximity,
Typo]); Typo,
]);
#[rustfmt::skip] #[rustfmt::skip]
let criteria_mix = { let criteria_mix = {