Compare commits
2 Commits
88f8a9d537
...
2671a3b787
| Author | SHA1 | Date | |
|---|---|---|---|
| 2671a3b787 | |||
| 93073c9602 |
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -2469,7 +2469,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "letterbox"
|
name = "letterbox"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"build-info",
|
"build-info",
|
||||||
"build-info-build",
|
"build-info-build",
|
||||||
@ -2988,7 +2988,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "notmuch"
|
name = "notmuch"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools 0.10.5",
|
"itertools 0.10.5",
|
||||||
"log",
|
"log",
|
||||||
@ -3625,7 +3625,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "procmail2notmuch"
|
name = "procmail2notmuch"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
]
|
]
|
||||||
@ -4547,7 +4547,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "server"
|
name = "server"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ammonia",
|
"ammonia",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
@ -4646,7 +4646,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shared"
|
name = "shared"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"build-info",
|
"build-info",
|
||||||
"notmuch",
|
"notmuch",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "notmuch"
|
name = "notmuch"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "procmail2notmuch"
|
name = "procmail2notmuch"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "server"
|
name = "server"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
default-run = "server"
|
default-run = "server"
|
||||||
|
|
||||||
|
|||||||
@ -605,7 +605,7 @@ fn compute_offset_limit(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Default)]
|
||||||
pub struct Query {
|
pub struct Query {
|
||||||
pub unread_only: bool,
|
pub unread_only: bool,
|
||||||
pub tags: Vec<String>,
|
pub tags: Vec<String>,
|
||||||
|
|||||||
@ -57,7 +57,7 @@ impl TantivyConnection {
|
|||||||
);
|
);
|
||||||
|
|
||||||
let start_time = std::time::Instant::now();
|
let start_time = std::time::Instant::now();
|
||||||
let (searcher, _query) = self.searcher_and_query("")?;
|
let (searcher, _query) = self.searcher_and_query(&Query::default())?;
|
||||||
let docs = searcher.search(&AllQuery, &DocSetCollector)?;
|
let docs = searcher.search(&AllQuery, &DocSetCollector)?;
|
||||||
let uid = self.get_index()?.schema().get_field("uid")?;
|
let uid = self.get_index()?.schema().get_field("uid")?;
|
||||||
let t_uids: Vec<_> = docs
|
let t_uids: Vec<_> = docs
|
||||||
@ -187,7 +187,7 @@ impl TantivyConnection {
|
|||||||
}
|
}
|
||||||
fn searcher_and_query(
|
fn searcher_and_query(
|
||||||
&self,
|
&self,
|
||||||
term: &str,
|
query: &Query,
|
||||||
) -> Result<(Searcher, Box<dyn query::Query>), ServerError> {
|
) -> Result<(Searcher, Box<dyn query::Query>), ServerError> {
|
||||||
let index = self.get_index()?;
|
let index = self.get_index()?;
|
||||||
let reader = index.reader()?;
|
let reader = index.reader()?;
|
||||||
@ -197,20 +197,41 @@ impl TantivyConnection {
|
|||||||
let summary = schema.get_field("summary")?;
|
let summary = schema.get_field("summary")?;
|
||||||
let query_parser = QueryParser::for_index(&index, vec![title, summary]);
|
let query_parser = QueryParser::for_index(&index, vec![title, summary]);
|
||||||
// Tantivy uses '*' to match all docs, not empty string
|
// Tantivy uses '*' to match all docs, not empty string
|
||||||
|
let term = &query.remainder.join(" ");
|
||||||
let term = if term.is_empty() { "*" } else { term };
|
let term = if term.is_empty() { "*" } else { term };
|
||||||
|
|
||||||
info!("query_parser('{term}')");
|
info!("query_parser('{term}')");
|
||||||
let query = query_parser.parse_query(&term)?;
|
|
||||||
Ok((searcher, query))
|
let tantivy_query = query_parser.parse_query(&term)?;
|
||||||
|
|
||||||
|
let tag = self.get_index()?.schema().get_field("tag")?;
|
||||||
|
let is_read = self.get_index()?.schema().get_field("is_read")?;
|
||||||
|
let mut terms = vec![(Occur::Must, tantivy_query)];
|
||||||
|
for t in &query.tags {
|
||||||
|
let facet = Facet::from(&format!("/{t}"));
|
||||||
|
let facet_term = Term::from_facet(tag, &facet);
|
||||||
|
let facet_term_query = Box::new(TermQuery::new(facet_term, IndexRecordOption::Basic));
|
||||||
|
terms.push((Occur::Must, facet_term_query));
|
||||||
|
}
|
||||||
|
if query.unread_only {
|
||||||
|
info!("searching for unread only");
|
||||||
|
let term = Term::from_field_bool(is_read, false);
|
||||||
|
terms.push((
|
||||||
|
Occur::Must,
|
||||||
|
Box::new(TermQuery::new(term, IndexRecordOption::Basic)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let search_query = BooleanQuery::new(terms);
|
||||||
|
Ok((searcher, Box::new(search_query)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn count(&self, query: &Query) -> Result<usize, ServerError> {
|
pub async fn count(&self, query: &Query) -> Result<usize, ServerError> {
|
||||||
if !is_tantivy_query(query) {
|
if !is_tantivy_query(query) {
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
}
|
}
|
||||||
|
info!("tantivy::count {query:?}");
|
||||||
use tantivy::collector::Count;
|
use tantivy::collector::Count;
|
||||||
let term = query.remainder.join(" ");
|
let term = query.remainder.join(" ");
|
||||||
let (searcher, query) = self.searcher_and_query(&term)?;
|
let (searcher, query) = self.searcher_and_query(&query)?;
|
||||||
Ok(searcher.search(&query, &Count)?)
|
Ok(searcher.search(&query, &Count)?)
|
||||||
}
|
}
|
||||||
pub async fn search(
|
pub async fn search(
|
||||||
@ -233,27 +254,8 @@ impl TantivyConnection {
|
|||||||
limit = limit + 1;
|
limit = limit + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let term = query.remainder.join(" ");
|
let (searcher, search_query) = self.searcher_and_query(&query)?;
|
||||||
let (searcher, tantivy_query) = self.searcher_and_query(&term)?;
|
info!("Tantivy::search(query '{query:?}', off {offset}, lim {limit}, search_query {search_query:?})");
|
||||||
let tag = self.get_index()?.schema().get_field("tag")?;
|
|
||||||
let is_read = self.get_index()?.schema().get_field("is_read")?;
|
|
||||||
let mut terms = vec![(Occur::Must, tantivy_query)];
|
|
||||||
for t in &query.tags {
|
|
||||||
let facet = Facet::from(&format!("/{t}"));
|
|
||||||
let facet_term = Term::from_facet(tag, &facet);
|
|
||||||
let facet_term_query = Box::new(TermQuery::new(facet_term, IndexRecordOption::Basic));
|
|
||||||
terms.push((Occur::Must, facet_term_query));
|
|
||||||
}
|
|
||||||
if query.unread_only {
|
|
||||||
info!("searching for unread only");
|
|
||||||
let term = Term::from_field_bool(is_read, false);
|
|
||||||
terms.push((
|
|
||||||
Occur::Must,
|
|
||||||
Box::new(TermQuery::new(term, IndexRecordOption::Basic)),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
let search_query = BooleanQuery::new(terms);
|
|
||||||
info!("Tantivy::search(term '{term}', off {offset}, lim {limit}, search_query {search_query:?})");
|
|
||||||
let top_docs = searcher.search(
|
let top_docs = searcher.search(
|
||||||
&search_query,
|
&search_query,
|
||||||
&TopDocs::with_limit(limit as usize)
|
&TopDocs::with_limit(limit as usize)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "shared"
|
name = "shared"
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
version = "0.0.51"
|
version = "0.0.52"
|
||||||
name = "letterbox"
|
name = "letterbox"
|
||||||
repository = "https://github.com/seed-rs/seed-quickstart"
|
repository = "https://github.com/seed-rs/seed-quickstart"
|
||||||
authors = ["Bill Thiede <git@xinu.tv>"]
|
authors = ["Bill Thiede <git@xinu.tv>"]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user