IMAP: Map header searches to indexed fields

This commit is contained in:
mdecimus
2026-01-10 09:34:18 -03:00
parent 8b2c1f14a5
commit f4603f8aaf

View File

@@ -468,27 +468,54 @@ impl<T: SessionStream> SessionData<T> {
} }
Filter::Header(header, value) => { Filter::Header(header, value) => {
if let Some(header) = HeaderName::parse(header) { if let Some(header) = HeaderName::parse(header) {
let op = if matches!( match header {
header, HeaderName::Subject => {
HeaderName::MessageId filters.push(SearchFilter::has_text_detect(
| HeaderName::InReplyTo EmailSearchField::Subject,
| HeaderName::References value,
| HeaderName::ResentMessageId self.server.core.jmap.default_language,
) || value.is_empty() ));
{ }
SearchOperator::Equal header @ (HeaderName::From
} else { | HeaderName::To
SearchOperator::Contains | HeaderName::Cc
}; | HeaderName::Bcc) => {
filters.push(SearchFilter::has_text(
match header {
HeaderName::From => EmailSearchField::From,
HeaderName::To => EmailSearchField::To,
HeaderName::Cc => EmailSearchField::Cc,
HeaderName::Bcc => EmailSearchField::Bcc,
_ => unreachable!(),
},
value,
Language::None,
));
}
header => {
let op = if matches!(
header,
HeaderName::MessageId
| HeaderName::InReplyTo
| HeaderName::References
| HeaderName::ResentMessageId
) || value.is_empty()
{
SearchOperator::Equal
} else {
SearchOperator::Contains
};
filters.push(SearchFilter::cond( filters.push(SearchFilter::cond(
EmailSearchField::Headers, EmailSearchField::Headers,
op, op,
SearchValue::KeyValues( SearchValue::KeyValues(
VecMap::with_capacity(1) VecMap::with_capacity(1)
.with_append(header.as_str().to_lowercase(), value), .with_append(header.as_str().to_lowercase(), value),
), ),
)); ));
}
}
} }
} }
Filter::Subject(text) => { Filter::Subject(text) => {