diff --git a/src/conf/accounts.rs b/src/conf/accounts.rs index 23e73e9c..5da3f4ca 100644 --- a/src/conf/accounts.rs +++ b/src/conf/accounts.rs @@ -1606,10 +1606,11 @@ impl Account { mailbox_hash: MailboxHash, ) -> ResultFuture> { use melib::parsec::Parser; + use melib::search::QueryTrait; let query = melib::search::query().parse(search_term)?.1; match self.settings.conf.search_backend { #[cfg(feature = "sqlite3")] - crate::conf::SearchBackend::Sqlite3 => crate::sqlite3::search(search_term, _sort), + crate::conf::SearchBackend::Sqlite3 => crate::sqlite3::search(&query, _sort), crate::conf::SearchBackend::None => { if self.backend_capabilities.supports_search { self.backend @@ -1619,27 +1620,11 @@ impl Account { } else { let mut ret = SmallVec::new(); let envelopes = self.collection.envelopes.read().unwrap(); - for &env_hash in self.collection.get_mailbox(mailbox_hash).iter() { - let envelope = &envelopes[&env_hash]; - if envelope.subject().contains(&search_term) { - ret.push(env_hash); - continue; - } - if envelope.field_from_to_string().contains(&search_term) { - ret.push(env_hash); - continue; - } - let op = if let Ok(op) = self.operation(env_hash) { - op - } else { - continue; - }; - let body = envelope.body(op)?; - let decoded = decode_rec(&body, None); - let body_text = String::from_utf8_lossy(&decoded); - if body_text.contains(&search_term) { - ret.push(env_hash); + if let Some(envelope) = envelopes.get(&env_hash) { + if envelope.is_match(&query) { + ret.push(env_hash); + } } } Ok(Box::pin(async { Ok(ret) })) diff --git a/src/sqlite3.rs b/src/sqlite3.rs index b0cc3013..d08dc682 100644 --- a/src/sqlite3.rs +++ b/src/sqlite3.rs @@ -21,10 +21,9 @@ /*! Use an sqlite3 database for fast searching. */ -use crate::melib::parsec::Parser; use crate::melib::ResultIntoMeliError; use melib::search::{ - escape_double_quote, query, + escape_double_quote, Query::{self, *}, }; use melib::{ @@ -338,7 +337,7 @@ pub fn index(context: &mut crate::state::Context, account_index: usize) -> Resul } pub fn search( - term: &str, + query: &Query, (sort_field, sort_order): (SortField, SortOrder), ) -> ResultFuture> { let db_path = melib_sqlite3::db_path(DB_NAME)?; @@ -364,7 +363,7 @@ pub fn search( .prepare( debug!(format!( "SELECT hash FROM envelopes WHERE {} ORDER BY {} {};", - query_to_sql(&query().parse(term)?.1), + query_to_sql(&query), sort_field, sort_order )) @@ -496,6 +495,8 @@ pub fn query_to_sql(q: &Query) -> String { #[test] fn test_query_to_sql() { + use melib::parsec::Parser; + use melib::search::query; assert_eq!( "(subject LIKE \"%test%\" ) AND (body_text LIKE \"%i%\" ) ", &query_to_sql(&query().parse_complete("subject: test and i").unwrap().1)