feat: Phase 8.5 — ConversationSummary 查询优化,支持 SQL 聚合获取消息统计

This commit is contained in:
hhs
2026-06-14 17:58:42 +08:00
parent 7b745018c5
commit c3a32ce276
3 changed files with 77 additions and 6 deletions

View File

@@ -118,3 +118,46 @@ func (r *PgMessageRepository) GetMessageCount(ctx context.Context, sessionID str
}
return count, nil
}
func (r *PgMessageRepository) GetSessionMessageStats(ctx context.Context, sessionIDs []string) (map[string]SessionMessageStats, error) {
if len(sessionIDs) == 0 {
return map[string]SessionMessageStats{}, nil
}
rows, err := r.pool.Query(ctx,
`WITH stats AS (
SELECT session_id, COUNT(*) AS cnt
FROM messages
WHERE session_id = ANY($1)
GROUP BY session_id
),
last_msg AS (
SELECT DISTINCT ON (session_id) session_id, content
FROM messages
WHERE session_id = ANY($1)
ORDER BY session_id, id DESC
)
SELECT s.session_id, s.cnt, COALESCE(lm.content, '')
FROM stats s
LEFT JOIN last_msg lm ON lm.session_id = s.session_id`,
sessionIDs,
)
if err != nil {
return nil, err
}
defer rows.Close()
result := make(map[string]SessionMessageStats)
for rows.Next() {
var sid string
var stats SessionMessageStats
if err := rows.Scan(&sid, &stats.MessageCount, &stats.LastMessage); err != nil {
return nil, err
}
result[sid] = stats
}
if err := rows.Err(); err != nil {
return nil, err
}
return result, nil
}