diff --git a/public/admin/assets/js/stats.js b/public/admin/assets/js/stats.js index e9ad3f6..f116205 100644 --- a/public/admin/assets/js/stats.js +++ b/public/admin/assets/js/stats.js @@ -11,7 +11,7 @@ async function loadStatsPage() { .map(r => `${escapeHtml(r.source)}${r.n.toLocaleString()}`).join(""); document.getElementById("statusTable").innerHTML = data.byStatus - .map(r => `${badgeHtml(r.status === "null" ? null : r.status)}${r.n.toLocaleString()}`).join(""); + .map(r => `${escapeHtml(r.status)}${r.n.toLocaleString()}`).join(""); document.getElementById("rate-ingested").textContent = (data.ingestedPerHour || 0).toLocaleString(); document.getElementById("rate-content").textContent = (data.contentPerHour || 0).toLocaleString(); diff --git a/public/admin/pages/stats.html b/public/admin/pages/stats.html index af9bfb3..8b74f41 100644 --- a/public/admin/pages/stats.html +++ b/public/admin/pages/stats.html @@ -4,10 +4,10 @@ Duriin Admin — Stats - - - - + + + + @@ -60,7 +60,7 @@
-
By content status
+
By archive readiness
@@ -74,7 +74,7 @@
- - + + diff --git a/src/adminStatsWorker.js b/src/adminStatsWorker.js index 5c6fe7c..7d33925 100644 --- a/src/adminStatsWorker.js +++ b/src/adminStatsWorker.js @@ -5,20 +5,23 @@ try { const db = new Database(workerData.databasePath, { readonly: true, fileMustExist: true }); const counts = db.prepare(` SELECT - (SELECT COUNT(*) FROM articles) AS total, + COALESCE((SELECT seq FROM sqlite_sequence WHERE name='articles'), 0) AS total, (SELECT COUNT(*) FROM article_embedding_meta) AS withContent, (SELECT COUNT(*) FROM article_embedding_meta) AS withEmbedding, - (SELECT COUNT(*) FROM events) AS eventCount, + COALESCE((SELECT seq FROM sqlite_sequence WHERE name='events'), 0) AS eventCount, (SELECT COUNT(*) FROM articles WHERE ingested_at >= datetime('now', '-1 hour')) AS ingestedPerHour, (SELECT COUNT(*) FROM article_embedding_meta WHERE embedded_at >= datetime('now', '-1 hour')) AS contentPerHour `).get(); const bySource = db.prepare(` SELECT source, COUNT(*) AS n FROM articles GROUP BY source ORDER BY n DESC `).all(); - const byStatus = db.prepare(` - SELECT COALESCE(content_status, 'null') AS status, COUNT(*) AS n - FROM articles GROUP BY content_status ORDER BY n DESC - `).all(); + // Avoid scanning the 3.7 GB article table for legacy content-status values. + // Readiness is the useful operational distinction and is available from the + // compact embedding metadata table. + const byStatus = [ + { status: 'ready', n: counts.withEmbedding }, + { status: 'unprocessed', n: Math.max(0, counts.total - counts.withEmbedding) }, + ]; let embeddingsPerHour = 0; try { embeddingsPerHour = db.prepare(`
StatusCount