perf: cdr/ue/kpi查询列表数据排序改为程序内处理,加快sql查询速度
This commit is contained in:
@@ -2,6 +2,7 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -91,26 +92,64 @@ func (r CDREvent) SelectByPage(neType string, query map[string]string) ([]model.
|
|||||||
|
|
||||||
// 分页
|
// 分页
|
||||||
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
|
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
|
||||||
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
|
if pageNum == 0 && pageSize > int(total) {
|
||||||
|
pageSize = int(total)
|
||||||
// 排序
|
|
||||||
if v, ok := query["sortField"]; ok && v != "" {
|
|
||||||
sortSql := v
|
|
||||||
if o, ok := query["sortOrder"]; ok && o != "" {
|
|
||||||
if o == "desc" {
|
|
||||||
sortSql += " desc "
|
|
||||||
} else {
|
|
||||||
sortSql += " asc "
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tx = tx.Order(sortSql)
|
|
||||||
}
|
}
|
||||||
|
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
|
||||||
|
|
||||||
// 查询数据
|
// 查询数据
|
||||||
if err := tx.Find(&rows).Error; err != nil {
|
if err := tx.Find(&rows).Error; err != nil {
|
||||||
logger.Errorf("query err => %v", err)
|
logger.Errorf("query err => %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 排序
|
||||||
|
if v, ok := query["sortField"]; ok && v != "" {
|
||||||
|
sortField := v
|
||||||
|
sortOrder := "asc"
|
||||||
|
if o, ok := query["sortOrder"]; ok && o != "" {
|
||||||
|
if o == "desc" {
|
||||||
|
sortOrder = "desc"
|
||||||
|
} else {
|
||||||
|
sortOrder = "asc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort.SliceStable(rows, func(i, j int) bool {
|
||||||
|
// 支持的排序字段映射
|
||||||
|
fieldGetters := map[string]func(*model.CDREvent) any{
|
||||||
|
"id": func(row *model.CDREvent) any { return row.ID },
|
||||||
|
"timestamp": func(row *model.CDREvent) any { return row.Timestamp },
|
||||||
|
// 可添加更多支持的字段
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取字段 getter 函数
|
||||||
|
getter, ok := fieldGetters[sortField]
|
||||||
|
if !ok {
|
||||||
|
// 非法字段,使用默认排序(id升序)
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取比较值
|
||||||
|
valI, valJ := getter(&rows[i]), getter(&rows[j])
|
||||||
|
|
||||||
|
// 根据字段类型进行比较
|
||||||
|
switch v := valI.(type) {
|
||||||
|
case int64:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(int64)
|
||||||
|
}
|
||||||
|
return v < valJ.(int64)
|
||||||
|
case string:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(string)
|
||||||
|
}
|
||||||
|
return v < valJ.(string)
|
||||||
|
default:
|
||||||
|
// 不支持的字段类型,使用默认排序
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return rows, total
|
return rows, total
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -37,19 +38,52 @@ func (r KpiCReport) SelectKPI(query model.KPICQuery) []model.KpiCReport {
|
|||||||
if query.EndTime != 0 {
|
if query.EndTime != 0 {
|
||||||
tx = tx.Where("created_at <= ?", query.EndTime)
|
tx = tx.Where("created_at <= ?", query.EndTime)
|
||||||
}
|
}
|
||||||
// 排序
|
|
||||||
if query.SortField == "" || query.SortField == "timeGroup" {
|
|
||||||
query.SortField = "created_at"
|
|
||||||
}
|
|
||||||
if query.SortOrder == "" {
|
|
||||||
query.SortOrder = "desc"
|
|
||||||
}
|
|
||||||
tx = tx.Order(fmt.Sprintf("%s %s", query.SortField, query.SortOrder))
|
|
||||||
// 查询数据
|
// 查询数据
|
||||||
if err := tx.Find(&rows).Error; err != nil {
|
if err := tx.Find(&rows).Error; err != nil {
|
||||||
logger.Errorf("query find err => %v", err.Error())
|
logger.Errorf("query find err => %v", err.Error())
|
||||||
return rows
|
return rows
|
||||||
}
|
}
|
||||||
|
// 排序
|
||||||
|
if query.SortField != "" {
|
||||||
|
sortField := query.SortField
|
||||||
|
sortOrder := query.SortOrder
|
||||||
|
sort.SliceStable(rows, func(i, j int) bool {
|
||||||
|
// 支持的排序字段映射
|
||||||
|
fieldGetters := map[string]func(*model.KpiCReport) any{
|
||||||
|
"id": func(row *model.KpiCReport) any { return row.ID },
|
||||||
|
"timeGroup": func(row *model.KpiCReport) any { return row.CreatedAt },
|
||||||
|
"createdAt": func(row *model.KpiCReport) any { return row.CreatedAt },
|
||||||
|
// 可添加更多支持的字段
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取字段 getter 函数
|
||||||
|
getter, ok := fieldGetters[sortField]
|
||||||
|
if !ok {
|
||||||
|
// 非法字段,使用默认排序(id升序)
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取比较值
|
||||||
|
valI, valJ := getter(&rows[i]), getter(&rows[j])
|
||||||
|
|
||||||
|
// 根据字段类型进行比较
|
||||||
|
switch v := valI.(type) {
|
||||||
|
case int64:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(int64)
|
||||||
|
}
|
||||||
|
return v < valJ.(int64)
|
||||||
|
case string:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(string)
|
||||||
|
}
|
||||||
|
return v < valJ.(string)
|
||||||
|
default:
|
||||||
|
// 不支持的字段类型,使用默认排序
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
return rows
|
return rows
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -37,19 +38,52 @@ func (r KpiReport) SelectKPI(query model.KPIQuery) []model.KpiReport {
|
|||||||
if query.EndTime != 0 {
|
if query.EndTime != 0 {
|
||||||
tx = tx.Where("created_at <= ?", query.EndTime)
|
tx = tx.Where("created_at <= ?", query.EndTime)
|
||||||
}
|
}
|
||||||
// 排序
|
|
||||||
if query.SortField == "" || query.SortField == "timeGroup" {
|
|
||||||
query.SortField = "created_at"
|
|
||||||
}
|
|
||||||
if query.SortOrder == "" {
|
|
||||||
query.SortOrder = "desc"
|
|
||||||
}
|
|
||||||
tx = tx.Order(fmt.Sprintf("%s %s", query.SortField, query.SortOrder))
|
|
||||||
// 查询数据
|
// 查询数据
|
||||||
if err := tx.Find(&rows).Error; err != nil {
|
if err := tx.Find(&rows).Error; err != nil {
|
||||||
logger.Errorf("query find err => %v", err.Error())
|
logger.Errorf("query find err => %v", err.Error())
|
||||||
return rows
|
return rows
|
||||||
}
|
}
|
||||||
|
// 排序
|
||||||
|
if query.SortField != "" {
|
||||||
|
sortField := query.SortField
|
||||||
|
sortOrder := query.SortOrder
|
||||||
|
sort.SliceStable(rows, func(i, j int) bool {
|
||||||
|
// 支持的排序字段映射
|
||||||
|
fieldGetters := map[string]func(*model.KpiReport) any{
|
||||||
|
"id": func(row *model.KpiReport) any { return row.ID },
|
||||||
|
"timeGroup": func(row *model.KpiReport) any { return row.CreatedAt },
|
||||||
|
"createdAt": func(row *model.KpiReport) any { return row.CreatedAt },
|
||||||
|
// 可添加更多支持的字段
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取字段 getter 函数
|
||||||
|
getter, ok := fieldGetters[sortField]
|
||||||
|
if !ok {
|
||||||
|
// 非法字段,使用默认排序(id升序)
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取比较值
|
||||||
|
valI, valJ := getter(&rows[i]), getter(&rows[j])
|
||||||
|
|
||||||
|
// 根据字段类型进行比较
|
||||||
|
switch v := valI.(type) {
|
||||||
|
case int64:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(int64)
|
||||||
|
}
|
||||||
|
return v < valJ.(int64)
|
||||||
|
case string:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(string)
|
||||||
|
}
|
||||||
|
return v < valJ.(string)
|
||||||
|
default:
|
||||||
|
// 不支持的字段类型,使用默认排序
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
return rows
|
return rows
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package repository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -58,24 +59,59 @@ func (r UEEvent) SelectByPage(neType string, query map[string]string) ([]model.U
|
|||||||
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
|
pageNum, pageSize := db.PageNumSize(query["pageNum"], query["pageSize"])
|
||||||
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
|
tx = tx.Offset(int(pageNum * pageSize)).Limit(int(pageSize))
|
||||||
|
|
||||||
// 排序
|
|
||||||
if v, ok := query["sortField"]; ok && v != "" {
|
|
||||||
sortSql := v
|
|
||||||
if o, ok := query["sortOrder"]; ok && o != "" {
|
|
||||||
if o == "desc" {
|
|
||||||
sortSql += " desc "
|
|
||||||
} else {
|
|
||||||
sortSql += " asc "
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tx = tx.Order(sortSql)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询数据
|
// 查询数据
|
||||||
if err := tx.Find(&rows).Error; err != nil {
|
if err := tx.Find(&rows).Error; err != nil {
|
||||||
logger.Errorf("query err => %v", err)
|
logger.Errorf("query err => %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 排序
|
||||||
|
if v, ok := query["sortField"]; ok && v != "" {
|
||||||
|
sortField := v
|
||||||
|
sortOrder := "asc"
|
||||||
|
if o, ok := query["sortOrder"]; ok && o != "" {
|
||||||
|
if o == "desc" {
|
||||||
|
sortOrder = "desc"
|
||||||
|
} else {
|
||||||
|
sortOrder = "asc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort.SliceStable(rows, func(i, j int) bool {
|
||||||
|
// 支持的排序字段映射
|
||||||
|
fieldGetters := map[string]func(*model.UEEvent) any{
|
||||||
|
"id": func(row *model.UEEvent) any { return row.ID },
|
||||||
|
"timestamp": func(row *model.UEEvent) any { return row.CreatedAt },
|
||||||
|
"createdAt": func(row *model.UEEvent) any { return row.CreatedAt },
|
||||||
|
// 可添加更多支持的字段
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取字段 getter 函数
|
||||||
|
getter, ok := fieldGetters[sortField]
|
||||||
|
if !ok {
|
||||||
|
// 非法字段,使用默认排序(id升序)
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取比较值
|
||||||
|
valI, valJ := getter(&rows[i]), getter(&rows[j])
|
||||||
|
|
||||||
|
// 根据字段类型进行比较
|
||||||
|
switch v := valI.(type) {
|
||||||
|
case int64:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(int64)
|
||||||
|
}
|
||||||
|
return v < valJ.(int64)
|
||||||
|
case string:
|
||||||
|
if sortOrder == "desc" {
|
||||||
|
return v > valJ.(string)
|
||||||
|
}
|
||||||
|
return v < valJ.(string)
|
||||||
|
default:
|
||||||
|
// 不支持的字段类型,使用默认排序
|
||||||
|
return rows[i].ID < rows[j].ID
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
return rows, total
|
return rows, total
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user