diff options
author | mdecimus <mauro@stalw.art> | 2023-11-09 16:21:39 +0100 |
---|---|---|
committer | mdecimus <mauro@stalw.art> | 2023-11-09 16:21:39 +0100 |
commit | 0e25f3d12cb569d30c990a584509143d1cb2b967 (patch) | |
tree | 1d306fb625fd4f80bc7bc9194d6de5a84bf2bb40 /crates/jmap/src/email/snippet.rs | |
parent | fe5a9e8ce839737b6eb3d90042325ae3bb43a74f (diff) |
Store keys refactoring
Diffstat (limited to 'crates/jmap/src/email/snippet.rs')
-rw-r--r-- | crates/jmap/src/email/snippet.rs | 250 |
1 files changed, 122 insertions, 128 deletions
diff --git a/crates/jmap/src/email/snippet.rs b/crates/jmap/src/email/snippet.rs index 6beb2e7c..8884efb5 100644 --- a/crates/jmap/src/email/snippet.rs +++ b/crates/jmap/src/email/snippet.rs @@ -31,14 +31,7 @@ use jmap_proto::{ }; use mail_parser::{decoders::html::html_to_text, MessageParser, PartType}; use nlp::language::{stemmer::Stemmer, Language}; -use store::{ - fts::{ - builder::MAX_TOKEN_LENGTH, - search_snippet::generate_snippet, - term_index::{self, TermIndex}, - }, - BlobKind, -}; +use store::BlobKind; use crate::{auth::AccessToken, JMAP}; @@ -52,13 +45,13 @@ impl JMAP { ) -> Result<GetSearchSnippetResponse, MethodError> { let mut filter_stack = vec![]; let mut include_term = true; - let mut terms = vec![]; + //let mut terms = vec![]; let mut match_phrase = false; for cond in request.filter { match cond { Filter::Text(text) | Filter::Subject(text) | Filter::Body(text) => { - if include_term { + /*if include_term { let (text, language) = Language::detect(text, self.config.default_language); if (text.starts_with('"') && text.ends_with('"')) || (text.starts_with('\'') && text.ends_with('\'')) @@ -82,7 +75,7 @@ impl JMAP { .collect::<Vec<_>>(), ); } - } + }*/ } Filter::And | Filter::Or => { filter_stack.push(cond); @@ -114,145 +107,146 @@ impl JMAP { return Err(MethodError::RequestTooLarge); } - for email_id in email_ids { - let document_id = email_id.document_id(); - let mut snippet = SearchSnippet { - email_id, - subject: None, - preview: None, - }; - if !document_ids.contains(document_id) { - response.not_found.push(email_id); - continue; - } else if terms.is_empty() { - response.list.push(snippet); - continue; - } + /* + for email_id in email_ids { + let document_id = email_id.document_id(); + let mut snippet = SearchSnippet { + email_id, + subject: None, + preview: None, + }; + if !document_ids.contains(document_id) { + response.not_found.push(email_id); + continue; + } else if terms.is_empty() { + response.list.push(snippet); + continue; + } - // Obtain the term index and raw message - let (term_index, raw_message) = if let (Some(term_index), Some(raw_message)) = ( - self.get_term_index::<TermIndex>(account_id, Collection::Email, document_id) - .await?, - self.get_blob( - &BlobKind::LinkedMaildir { - account_id, - document_id, - }, - 0..u32::MAX, - ) - .await?, - ) { - (term_index, raw_message) - } else { - response.not_found.push(email_id); - continue; - }; + // Obtain the term index and raw message + let (term_index, raw_message) = if let (Some(term_index), Some(raw_message)) = ( + self.get_term_index::<TermIndex>(account_id, Collection::Email, document_id) + .await?, + self.get_blob( + &BlobKind::LinkedMaildir { + account_id, + document_id, + }, + 0..u32::MAX, + ) + .await?, + ) { + (term_index, raw_message) + } else { + response.not_found.push(email_id); + continue; + }; - // Parse message - let message = if let Some(message) = MessageParser::new().parse(&raw_message) { - message - } else { - response.not_found.push(email_id); - continue; - }; + // Parse message + let message = if let Some(message) = MessageParser::new().parse(&raw_message) { + message + } else { + response.not_found.push(email_id); + continue; + }; - // Build the match terms - let mut match_terms = Vec::new(); - for term in &terms { - for (word, stemmed_word) in term { - match_terms.push(term_index.get_match_term(word, stemmed_word.as_deref())); - } - } - - 'outer: for term_group in term_index - .match_terms(&match_terms, None, match_phrase, true, true) - .map_err(|err| match err { - term_index::Error::InvalidArgument => { - MethodError::UnsupportedFilter("Too many search terms.".to_string()) - } - err => { - tracing::error!( - account_id = account_id, - document_id = document_id, - reason = ?err, - "Failed to generate search snippet."); - MethodError::UnsupportedFilter( - "Failed to generate search snippet.".to_string(), - ) + // Build the match terms + let mut match_terms = Vec::new(); + for term in &terms { + for (word, stemmed_word) in term { + match_terms.push(term_index.get_match_term(word, stemmed_word.as_deref())); + } } - })? - .unwrap_or_default() - { - if term_group.part_id == 0 { - // Generate subject snippent - snippet.subject = - generate_snippet(&term_group.terms, message.subject().unwrap_or_default()); - } else { - let mut part_num = 1; - for part in &message.parts { - match &part.body { - PartType::Text(text) => { - if part_num == term_group.part_id { - snippet.preview = generate_snippet(&term_group.terms, text); - break 'outer; - } else { - part_num += 1; - } + + 'outer: for term_group in term_index + .match_terms(&match_terms, None, match_phrase, true, true) + .map_err(|err| match err { + term_index::Error::InvalidArgument => { + MethodError::UnsupportedFilter("Too many search terms.".to_string()) } - PartType::Html(html) => { - if part_num == term_group.part_id { - snippet.preview = - generate_snippet(&term_group.terms, &html_to_text(html)); - break 'outer; - } else { - part_num += 1; - } + err => { + tracing::error!( + account_id = account_id, + document_id = document_id, + reason = ?err, + "Failed to generate search snippet."); + MethodError::UnsupportedFilter( + "Failed to generate search snippet.".to_string(), + ) } - PartType::Message(message) => { - if let Some(subject) = message.subject() { - if part_num == term_group.part_id { - snippet.preview = - generate_snippet(&term_group.terms, subject); - break 'outer; - } else { - part_num += 1; + })? + .unwrap_or_default() + { + if term_group.part_id == 0 { + // Generate subject snippent + snippet.subject = + generate_snippet(&term_group.terms, message.subject().unwrap_or_default()); + } else { + let mut part_num = 1; + for part in &message.parts { + match &part.body { + PartType::Text(text) => { + if part_num == term_group.part_id { + snippet.preview = generate_snippet(&term_group.terms, text); + break 'outer; + } else { + part_num += 1; + } } - } - for sub_part in message.parts.iter().take(MAX_MESSAGE_PARTS) { - match &sub_part.body { - PartType::Text(text) => { + PartType::Html(html) => { + if part_num == term_group.part_id { + snippet.preview = + generate_snippet(&term_group.terms, &html_to_text(html)); + break 'outer; + } else { + part_num += 1; + } + } + PartType::Message(message) => { + if let Some(subject) = message.subject() { if part_num == term_group.part_id { snippet.preview = - generate_snippet(&term_group.terms, text); + generate_snippet(&term_group.terms, subject); break 'outer; } else { part_num += 1; } } - PartType::Html(html) => { - if part_num == term_group.part_id { - snippet.preview = generate_snippet( - &term_group.terms, - &html_to_text(html), - ); - break 'outer; - } else { - part_num += 1; + for sub_part in message.parts.iter().take(MAX_MESSAGE_PARTS) { + match &sub_part.body { + PartType::Text(text) => { + if part_num == term_group.part_id { + snippet.preview = + generate_snippet(&term_group.terms, text); + break 'outer; + } else { + part_num += 1; + } + } + PartType::Html(html) => { + if part_num == term_group.part_id { + snippet.preview = generate_snippet( + &term_group.terms, + &html_to_text(html), + ); + break 'outer; + } else { + part_num += 1; + } + } + _ => (), } } - _ => (), } + _ => (), } } - _ => (), } } - } - } - - response.list.push(snippet); - } + response.list.push(snippet); + } + */ Ok(response) } } |