From dff0308ccbe711531d200801a45b9de2b8bfecf6 Mon Sep 17 00:00:00 2001 From: john Date: Mon, 29 Jun 2026 22:43:22 +0800 Subject: [PATCH] fix: optimize mindspace category counts --- mindspace.mjs | 36 ++++++++++++++++++++++-------------- mindspace.test.mjs | 4 ++-- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/mindspace.mjs b/mindspace.mjs index b5559e3..a2d1b10 100644 --- a/mindspace.mjs +++ b/mindspace.mjs @@ -180,24 +180,32 @@ export function createMindSpaceService(pool, options = {}) { `SELECT c.id, c.category_code, c.category_name, c.visibility_policy, c.ai_access_policy, c.publish_policy, c.is_system, c.sort_order, CASE - WHEN c.category_code = 'draft' THEN COUNT(DISTINCT p.id) - WHEN c.category_code = 'public' THEN COUNT(DISTINCT pr.page_id) - ELSE COUNT(DISTINCT a.id) + WHEN c.category_code = 'draft' THEN COALESCE(pc.item_count, 0) + WHEN c.category_code = 'public' THEN COALESCE(pub.item_count, 0) + ELSE COALESCE(ac.item_count, 0) END AS item_count FROM h5_space_categories c - LEFT JOIN h5_assets a - ON a.category_id = c.id - AND a.user_id = c.user_id - AND a.status <> 'deleted' - LEFT JOIN h5_page_records p - ON p.category_id = c.id AND p.user_id = c.user_id AND p.status <> 'deleted' - LEFT JOIN h5_publish_records pr - ON pr.user_id = c.user_id AND pr.status = 'online' + LEFT JOIN ( + SELECT category_id, user_id, COUNT(*) AS item_count + FROM h5_assets + WHERE user_id = ? AND status <> 'deleted' AND source_type = 'upload' + GROUP BY category_id, user_id + ) ac ON ac.category_id = c.id AND ac.user_id = c.user_id + LEFT JOIN ( + SELECT category_id, user_id, COUNT(*) AS item_count + FROM h5_page_records + WHERE user_id = ? AND status <> 'deleted' + GROUP BY category_id, user_id + ) pc ON pc.category_id = c.id AND pc.user_id = c.user_id + LEFT JOIN ( + SELECT user_id, COUNT(DISTINCT page_id) AS item_count + FROM h5_publish_records + WHERE user_id = ? AND status = 'online' + GROUP BY user_id + ) pub ON pub.user_id = c.user_id WHERE c.user_id = ? AND c.space_id = ? - GROUP BY c.id, c.category_code, c.category_name, c.visibility_policy, - c.ai_access_policy, c.publish_policy, c.is_system, c.sort_order ORDER BY c.sort_order, c.category_name`, - [userId, row.id], + [userId, userId, userId, userId, row.id], ); const quotaBytes = asNumber(row.quota_bytes); diff --git a/mindspace.test.mjs b/mindspace.test.mjs index 3bbee28..c05179c 100644 --- a/mindspace.test.mjs +++ b/mindspace.test.mjs @@ -105,8 +105,8 @@ test('getSpace scopes space and categories to the authenticated user', async () assert.equal(space.quota.availableBytes, 5 * 1024 * 1024 - 3072); assert.equal(space.categories[0].code, 'private'); assert.deepEqual(calls[0].params, ['user-1']); - assert.deepEqual(calls[1].params, ['user-1', 'space-1']); - assert.doesNotMatch(calls[1].sql, /source_type\s*=\s*'upload'/); + assert.deepEqual(calls[1].params, ['user-1', 'user-1', 'user-1', 'user-1', 'space-1']); + assert.match(calls[1].sql, /source_type\s*=\s*'upload'/); }); test('getSpace includes schedule snapshot when schedule service is available', async () => {