diff --git a/pkg/cloudcommon/db/statusinfrasresource.go b/pkg/cloudcommon/db/statusinfrasresource.go index 088bad15b1..90957a03ac 100644 --- a/pkg/cloudcommon/db/statusinfrasresource.go +++ b/pkg/cloudcommon/db/statusinfrasresource.go @@ -16,6 +16,7 @@ package db import ( "context" + "database/sql" "yunion.io/x/jsonutils" "yunion.io/x/pkg/errors" @@ -155,6 +156,27 @@ func (manager *SStatusInfrasResourceBaseManager) QueryDistinctExtraField(q *sqlc return q, httperrors.ErrNotFound } +func (manager *SStatusInfrasResourceBaseManager) CustomizedTotalCount(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, totalQ *sqlchemy.SQuery) (int, jsonutils.JSONObject, error) { + results := struct { + apis.TotalCountBase + StatusInfo []apis.StatusStatisticStatusInfo + }{} + + err := totalQ.First(&results.TotalCountBase) + if err != nil && errors.Cause(err) != sql.ErrNoRows { + return -1, nil, errors.Wrapf(err, "First") + } + + totalSQ := totalQ.ResetFields().SubQuery() + statQ := totalSQ.Query(totalSQ.Field("status"), sqlchemy.COUNT("total_count", totalSQ.Field("id"))) + statQ = statQ.GroupBy(totalSQ.Field("status")) + err = statQ.All(&results.StatusInfo) + if err != nil { + return -1, nil, errors.Wrapf(err, "status query") + } + return results.Count, jsonutils.Marshal(results), nil +} + func (manager *SStatusInfrasResourceBaseManager) FetchCustomizeColumns( ctx context.Context, userCred mcclient.TokenCredential,