use anyhow::{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) => Ok(Some(
SessionQuery::parse(&q).map_err(|e| anyhow!(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()
})
}