fix: optimize mindspace category counts

This commit is contained in:
john
2026-06-29 22:43:22 +08:00
parent 4fcb48395e
commit dff0308ccb
2 changed files with 24 additions and 16 deletions
+22 -14
View File
@@ -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);
+2 -2
View File
@@ -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 () => {