diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-01-11 10:10:00 +0100 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-01-11 10:10:00 +0100 |
commit | 917c32ae0b6fa3161cebdfeec748b2db0bbc1c70 (patch) | |
tree | 0b8cbd4111a44572fcd65e3396fcd3a2aabec8fa | |
parent | f4cbf665496640f4ac7cf4ac63ab2beced674978 (diff) | |
download | aerogramme-917c32ae0b6fa3161cebdfeec748b2db0bbc1c70.tar.gz aerogramme-917c32ae0b6fa3161cebdfeec748b2db0bbc1c70.zip |
MODSEQ search key first implementation
-rw-r--r-- | Cargo.lock | 4 | ||||
-rw-r--r-- | src/imap/search.rs | 18 |
2 files changed, 16 insertions, 6 deletions
@@ -1807,7 +1807,7 @@ dependencies = [ [[package]] name = "imap-codec" version = "2.0.0" -source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#990e709450ff4f8986b08d2b84e28f651b74f181" +source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#088fa93bfb4040fc4364aa6e9487fff4375429c3" dependencies = [ "abnf-core", "base64 0.21.5", @@ -1834,7 +1834,7 @@ dependencies = [ [[package]] name = "imap-types" version = "2.0.0" -source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#990e709450ff4f8986b08d2b84e28f651b74f181" +source = "git+https://github.com/superboum/imap-codec?branch=custom/aerogramme#088fa93bfb4040fc4364aa6e9487fff4375429c3" dependencies = [ "base64 0.21.5", "bounded-static", diff --git a/src/imap/search.rs b/src/imap/search.rs index c4888d0..12bad51 100644 --- a/src/imap/search.rs +++ b/src/imap/search.rs @@ -1,8 +1,8 @@ -use std::num::NonZeroU32; +use std::num::{NonZeroU32, NonZeroU64}; use anyhow::Result; use imap_codec::imap_types::core::NonEmptyVec; -use imap_codec::imap_types::search::SearchKey; +use imap_codec::imap_types::search::{SearchKey, MetadataItemSearch}; use imap_codec::imap_types::sequence::{SeqOrUid, Sequence, SequenceSet}; use crate::imap::index::MailIndex; @@ -176,6 +176,7 @@ impl<'a> Criteria<'a> { // Sequence logic maybe_seq if is_sk_seq(maybe_seq) => is_keep_seq(maybe_seq, midx).into(), maybe_flag if is_sk_flag(maybe_flag) => is_keep_flag(maybe_flag, midx).into(), + ModSeq { metadata_item , modseq } => is_keep_modseq(metadata_item, modseq, midx).into(), // All the stuff we can't evaluate yet Bcc(_) | Cc(_) | From(_) | Header(..) | SentBefore(_) | SentOn(_) | SentSince(_) @@ -210,9 +211,10 @@ impl<'a> Criteria<'a> { Not(expr) => !Criteria(expr).is_keep_on_query(mail_view), All => true, - // Reevaluating our previous logic... + //@FIXME Reevaluating our previous logic... maybe_seq if is_sk_seq(maybe_seq) => is_keep_seq(maybe_seq, &mail_view.in_idx), maybe_flag if is_sk_flag(maybe_flag) => is_keep_flag(maybe_flag, &mail_view.in_idx), + ModSeq { metadata_item , modseq } => is_keep_modseq(metadata_item, modseq, &mail_view.in_idx).into(), // Filter on mail meta Before(search_naive) => match mail_view.stored_naive_date() { @@ -318,7 +320,8 @@ fn approx_sequence_set_size(seq_set: &SequenceSet) -> u64 { } // This is wrong as sequence UID can have holes, -// as we don't know the number of messages in the mailbox also +// as we don't know the number of messages in the mailbox also +// we gave to guess fn approx_sequence_size(seq: &Sequence) -> u64 { match seq { Sequence::Single(_) => 1, @@ -458,3 +461,10 @@ fn is_keep_seq(sk: &SearchKey, midx: &MailIndex) -> bool { _ => unreachable!(), } } + +fn is_keep_modseq(filter: &Option<MetadataItemSearch>, modseq: &NonZeroU64, midx: &MailIndex) -> bool { + if filter.is_some() { + tracing::warn!(filter=?filter, "Ignoring search metadata filter as it's not supported yet"); + } + modseq <= &midx.modseq +} |