From bc62d1bb8151f3eae0825ddc81d84d57b1587d8a Mon Sep 17 00:00:00 2001 From: "1808837298@qq.com" <1808837298@qq.com> Date: Wed, 12 Feb 2025 19:19:13 +0800 Subject: [PATCH] refactor: Optimize log retrieval with separate channel name fetching (fix #751) - Remove inline channel join in log queries - Implement separate channel name lookup for logs - Improve performance by fetching channel names in a single query - Ensure channel names are correctly associated with logs --- model/log.go | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/model/log.go b/model/log.go index d050fb6a..82278c60 100644 --- a/model/log.go +++ b/model/log.go @@ -133,9 +133,6 @@ func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName tx = LOG_DB.Where("logs.type = ?", logType) } - tx = tx.Joins("LEFT JOIN channels ON logs.channel_id = channels.id") - tx = tx.Select("logs.*, channels.name as channel_name") - if modelName != "" { tx = tx.Where("logs.model_name like ?", modelName) } @@ -165,6 +162,30 @@ func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName if err != nil { return nil, 0, err } + + channelIds := make([]int, 0) + channelMap := make(map[int]string) + for _, log := range logs { + if log.ChannelId != 0 { + channelIds = append(channelIds, log.ChannelId) + } + } + if len(channelIds) > 0 { + var channels []struct { + Id int `gorm:"column:id"` + Name string `gorm:"column:name"` + } + if err = DB.Table("channels").Select("id, name").Where("id IN ?", channelIds).Find(&channels).Error; err != nil { + return logs, total, err + } + for _, channel := range channels { + channelMap[channel.Id] = channel.Name + } + for i := range logs { + logs[i].ChannelName = channelMap[logs[i].ChannelId] + } + } + return logs, total, err } @@ -176,9 +197,6 @@ func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int tx = LOG_DB.Where("logs.user_id = ? and logs.type = ?", userId, logType) } - tx = tx.Joins("LEFT JOIN channels ON logs.channel_id = channels.id") - tx = tx.Select("logs.*, channels.name as channel_name") - if modelName != "" { tx = tx.Where("logs.model_name like ?", modelName) } @@ -199,6 +217,10 @@ func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int return nil, 0, err } err = tx.Order("logs.id desc").Limit(num).Offset(startIdx).Find(&logs).Error + if err != nil { + return nil, 0, err + } + formatUserLogs(logs) return logs, total, err }