use crate::facts::FactsDb;
use crate::{Options, Result};
#[derive(Debug, Clone, serde::Serialize)]
pub struct SummaryRow {
pub metric: String,
pub value: i64,
}
#[tracing::instrument(name = "summary", skip_all, fields(min_revs = opts.min_revs))]
pub fn run_summary(db: &FactsDb, opts: &Options) -> Result<Vec<SummaryRow>> {
let sql = if opts.code_maat_compat {
"
SELECT 'number-of-commits' AS metric, COUNT(*) AS value FROM commits
UNION ALL
SELECT 'number-of-entities', COUNT(DISTINCT path) FROM changes -- code-maat counts distinct changed paths, not tree-sitter entities
UNION ALL
SELECT 'number-of-entities-changed', COUNT(*) FROM changes
UNION ALL
SELECT 'number-of-authors', COUNT(DISTINCT canonical_author) FROM commits;
"
.to_string()
} else {
let human_aliases = crate::analyses::query::HUMAN_ALIASES_CTE;
format!(
"
WITH {human_aliases}
SELECT 'commits' AS metric, COUNT(*) AS value FROM commits
UNION ALL
SELECT 'changes', COUNT(*) FROM changes
UNION ALL
SELECT 'entities', COUNT(*) FROM entities
UNION ALL
SELECT 'authors', COUNT(DISTINCT co.canonical_author)
FROM commits co
JOIN human_aliases ha
ON ha.raw_name = co.author_name AND ha.raw_email = co.author_email;
"
)
};
crate::analyses::query::explain_if_requested(db, &sql, [], "summary", opts)?;
crate::analyses::query::query_map_collect(db, &sql, [], "summary", |r| {
Ok(SummaryRow {
metric: r.get::<_, String>(0)?,
value: r.get::<_, i64>(1)?,
})
})
}