IMAP: Map header searches to indexed fields
This commit is contained in:
@@ -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) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user