Skip to content

Commit f4603f8

Browse files
committed
IMAP: Map header searches to indexed fields
1 parent 8b2c1f1 commit f4603f8

1 file changed

Lines changed: 47 additions & 20 deletions

File tree

crates/imap/src/op/search.rs

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -468,27 +468,54 @@ impl<T: SessionStream> SessionData<T> {
468468
}
469469
Filter::Header(header, value) => {
470470
if let Some(header) = HeaderName::parse(header) {
471-
let op = if matches!(
472-
header,
473-
HeaderName::MessageId
474-
| HeaderName::InReplyTo
475-
| HeaderName::References
476-
| HeaderName::ResentMessageId
477-
) || value.is_empty()
478-
{
479-
SearchOperator::Equal
480-
} else {
481-
SearchOperator::Contains
482-
};
471+
match header {
472+
HeaderName::Subject => {
473+
filters.push(SearchFilter::has_text_detect(
474+
EmailSearchField::Subject,
475+
value,
476+
self.server.core.jmap.default_language,
477+
));
478+
}
479+
header @ (HeaderName::From
480+
| HeaderName::To
481+
| HeaderName::Cc
482+
| HeaderName::Bcc) => {
483+
filters.push(SearchFilter::has_text(
484+
match header {
485+
HeaderName::From => EmailSearchField::From,
486+
HeaderName::To => EmailSearchField::To,
487+
HeaderName::Cc => EmailSearchField::Cc,
488+
HeaderName::Bcc => EmailSearchField::Bcc,
489+
_ => unreachable!(),
490+
},
491+
value,
492+
Language::None,
493+
));
494+
}
495+
header => {
496+
let op = if matches!(
497+
header,
498+
HeaderName::MessageId
499+
| HeaderName::InReplyTo
500+
| HeaderName::References
501+
| HeaderName::ResentMessageId
502+
) || value.is_empty()
503+
{
504+
SearchOperator::Equal
505+
} else {
506+
SearchOperator::Contains
507+
};
483508

484-
filters.push(SearchFilter::cond(
485-
EmailSearchField::Headers,
486-
op,
487-
SearchValue::KeyValues(
488-
VecMap::with_capacity(1)
489-
.with_append(header.as_str().to_lowercase(), value),
490-
),
491-
));
509+
filters.push(SearchFilter::cond(
510+
EmailSearchField::Headers,
511+
op,
512+
SearchValue::KeyValues(
513+
VecMap::with_capacity(1)
514+
.with_append(header.as_str().to_lowercase(), value),
515+
),
516+
));
517+
}
518+
}
492519
}
493520
}
494521
Filter::Subject(text) => {

0 commit comments

Comments
 (0)