use rusqlite::Connection;
use crate::data::store::search_endpoints;
use crate::services::embedding_service::embed;
pub fn search_operations(
conn: &Connection,
query: &str,
limit: usize,
) -> anyhow::Result<serde_json::Value> {
warn_if_semantic_endpoints_incomplete(conn);
let query_embedding = embed(query)?;
let results = search_endpoints(conn, &query_embedding, limit)?;
Ok(serde_json::to_value(results)?)
}
fn warn_if_semantic_endpoints_incomplete(conn: &Connection) {
let counts: rusqlite::Result<(i64, i64)> = conn.query_row(
"SELECT (SELECT COUNT(*) FROM endpoints), (SELECT COUNT(*) FROM semantic_endpoints)",
[],
|row| Ok((row.get(0)?, row.get(1)?)),
);
if let Ok((endpoints_count, semantic_count)) = counts
&& semantic_count < endpoints_count
{
tracing::warn!(
endpoints_count,
semantic_count,
"semantic_endpoints is missing rows relative to endpoints; search results may be \
incomplete — run the populate-embeddings binary to backfill"
);
}
}