use crate::util::usage;
use anyhow::Result;
use cv_core::query::{FieldId, SessionQuery};
use std::collections::HashSet;
pub(crate) use cv_core::query::{filter_refs, matches_full, TextSets};
pub(crate) fn build(query: Option<String>) -> Result<Option<SessionQuery>> {
match query {
Some(q) => match SessionQuery::parse(&q) {
Ok(parsed) => Ok(Some(parsed)),
Err(e) => usage(e.replace("`cv query`", "`cv schema`")),
},
None => Ok(None),
}
}
pub(crate) fn text_sets(query: &SessionQuery) -> TextSets {
if query.needles(FieldId::Text).is_empty() {
return TextSets::empty();
}
if !cv_search::default_tantivy_dir().exists() {
eprintln!("cv query: text: needs a full-text index — run `cv index` (treating text: as no match)");
return TextSets::resolve(query, |_| HashSet::new());
}
TextSets::resolve(query, |n| {
cv_search::text_search(None, n, 100_000)
.map(|hits| hits.into_iter().map(|h| h.id).collect())
.unwrap_or_default()
})
}