mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2026-03-20 23:07:29 +01:00
Optimize sortby in stats queries
Entire-Checkpoint: 9b5b833472e1
This commit is contained in:
@@ -676,6 +676,11 @@ func (r *queryResolver) JobsStatistics(ctx context.Context, filter []*model.JobF
|
|||||||
// Use request-scoped cache: multiple aliases with same (filter, groupBy)
|
// Use request-scoped cache: multiple aliases with same (filter, groupBy)
|
||||||
// but different sortBy/page hit the DB only once.
|
// but different sortBy/page hit the DB only once.
|
||||||
if cache := getStatsGroupCache(ctx); cache != nil {
|
if cache := getStatsGroupCache(ctx); cache != nil {
|
||||||
|
// Ensure the sort field is computed even if not in the GraphQL selection,
|
||||||
|
// because sortAndPageStats will sort by it in memory.
|
||||||
|
if sortBy != nil {
|
||||||
|
reqFields[sortByFieldName(*sortBy)] = true
|
||||||
|
}
|
||||||
key := statsCacheKey(filter, groupBy, reqFields)
|
key := statsCacheKey(filter, groupBy, reqFields)
|
||||||
var allStats []*model.JobsStatistics
|
var allStats []*model.JobsStatistics
|
||||||
allStats, err = cache.getOrCompute(key, func() ([]*model.JobsStatistics, error) {
|
allStats, err = cache.getOrCompute(key, func() ([]*model.JobsStatistics, error) {
|
||||||
|
|||||||
@@ -107,6 +107,33 @@ func sortAndPageStats(allStats []*model.JobsStatistics, sortBy *model.SortByAggr
|
|||||||
return sorted
|
return sorted
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sortByFieldName maps a SortByAggregate enum to the corresponding reqFields key.
|
||||||
|
// This ensures the DB computes the column that sortAndPageStats will sort by.
|
||||||
|
func sortByFieldName(sortBy model.SortByAggregate) string {
|
||||||
|
switch sortBy {
|
||||||
|
case model.SortByAggregateTotaljobs:
|
||||||
|
return "totalJobs"
|
||||||
|
case model.SortByAggregateTotalusers:
|
||||||
|
return "totalUsers"
|
||||||
|
case model.SortByAggregateTotalwalltime:
|
||||||
|
return "totalWalltime"
|
||||||
|
case model.SortByAggregateTotalnodes:
|
||||||
|
return "totalNodes"
|
||||||
|
case model.SortByAggregateTotalnodehours:
|
||||||
|
return "totalNodeHours"
|
||||||
|
case model.SortByAggregateTotalcores:
|
||||||
|
return "totalCores"
|
||||||
|
case model.SortByAggregateTotalcorehours:
|
||||||
|
return "totalCoreHours"
|
||||||
|
case model.SortByAggregateTotalaccs:
|
||||||
|
return "totalAccs"
|
||||||
|
case model.SortByAggregateTotalacchours:
|
||||||
|
return "totalAccHours"
|
||||||
|
default:
|
||||||
|
return "totalJobs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// statsFieldGetter returns a function that extracts the sortable int field
|
// statsFieldGetter returns a function that extracts the sortable int field
|
||||||
// from a JobsStatistics struct for the given sort key.
|
// from a JobsStatistics struct for the given sort key.
|
||||||
func statsFieldGetter(sortBy model.SortByAggregate) func(*model.JobsStatistics) int {
|
func statsFieldGetter(sortBy model.SortByAggregate) func(*model.JobsStatistics) int {
|
||||||
|
|||||||
Reference in New Issue
Block a user