This repository has been archived on 2026-06-21. You can view files and clone it, but cannot push or open issues or pull requests.
Files
MetaLab/internal/service/trends_service.go
Victor_Jay 95e1728c6e feat: GetTrends 趋势查询并行化 (errgroup)
- 使用 golang.org/x/sync/errgroup 将 4 个独立 DB 查询并行执行
- Energy/Comments/Likes/Favorites 趋势查询不再串行阻塞
- golang.org/x/sync 由 indirect 改为 direct 依赖
2026-06-02 19:37:43 +08:00

82 lines
1.9 KiB
Go

package service
import (
"fmt"
"golang.org/x/sync/errgroup"
)
// TrendResult 趋势返回结构
type TrendResult struct {
Energy []TrendPoint `json:"energy"`
Comments []TrendPoint `json:"comments"`
Likes []TrendPoint `json:"likes"`
Favorites []TrendPoint `json:"favorites"`
}
// TrendsService Studio 趋势分析服务
type TrendsService struct {
energyRepo EnergyTrendStore
commentRepo CommentTrendStore
likeRepo LikeTrendStore
favoriteRepo FavoriteTrendStore
}
// NewTrendsService 构造函数
func NewTrendsService(energyRepo EnergyTrendStore, commentRepo CommentTrendStore, likeRepo LikeTrendStore, favoriteRepo FavoriteTrendStore) *TrendsService {
return &TrendsService{
energyRepo: energyRepo,
commentRepo: commentRepo,
likeRepo: likeRepo,
favoriteRepo: favoriteRepo,
}
}
// GetTrends 获取指定时间范围的趋势数据(并行查询四项趋势)
func (s *TrendsService) GetTrends(userID uint, since string) (*TrendResult, error) {
result := &TrendResult{}
g := new(errgroup.Group)
g.Go(func() error {
var err error
result.Energy, err = s.energyRepo.AggregateEnergyByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询赋能趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Comments, err = s.commentRepo.AggregateCommentsByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询评论趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Likes, err = s.likeRepo.AggregateLikesByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询点赞趋势: %w", err)
}
return nil
})
g.Go(func() error {
var err error
result.Favorites, err = s.favoriteRepo.AggregateFavoritesByAuthor(userID, since)
if err != nil {
return fmt.Errorf("查询收藏趋势: %w", err)
}
return nil
})
if err := g.Wait(); err != nil {
return nil, err
}
return result, nil
}