From f0fe7525010b81fd61d55d5301c96c19bcdd75a2 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 20 Apr 2021 16:51:59 +0800 Subject: [PATCH] fix(region): vm list order by disk size --- pkg/apis/compute/guests.go | 4 ++-- pkg/compute/models/guests.go | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index 9ebc876176..009398f3af 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -62,9 +62,9 @@ type ServerListInput struct { // enum: linux,windows,vmware OsType []string `json:"os_type"` - // 对列表结果按照磁盘进行排序 + // 对列表结果按照磁盘大小进行排序 // enum: asc,desc - // OrderByDisk string `json:"order_by_disk"` + OrderByDisk string `json:"order_by_disk"` // 根据ip查找机器 IpAddr string `json:"ip_addr"` diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 8ef59105c4..eb27a345c6 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -590,15 +590,20 @@ func (manager *SGuestManager) OrderByExtraFields(ctx context.Context, q *sqlchem return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields") } } - //fields = manager.SDiskResourceBaseManager.GetOrderByFields(query.DiskFilterListInput) - //if db.NeedOrderQuery(fields) { - // diskQ := GuestdiskManager.Query("guest_id", "disk_id").SubQuery() - // q = q.LeftJoin(diskQ, sqlchemy.Equals(q.Field("id"), diskQ.Field("guest_id"))).Distinct() - // q, err = manager.SDiskResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.DiskFilterListInput) - // if err != nil { - // return nil, errors.Wrap(err, "SDiskResourceBaseManager.OrderByExtraFields") - // } - //} + + if db.NeedOrderQuery([]string{query.OrderByDisk}) { + guestdisks := GuestdiskManager.Query().SubQuery() + disks := DiskManager.Query().SubQuery() + guestdiskQ := guestdisks.Query( + guestdisks.Field("guest_id"), + sqlchemy.SUM("disks_size", disks.Field("disk_size")), + ) + guestdiskQ = guestdiskQ.LeftJoin(disks, sqlchemy.Equals(guestdiskQ.Field("disk_id"), disks.Field("id"))) + guestdiskSQ := guestdiskQ.GroupBy(guestdiskQ.Field("guest_id")).SubQuery() + + q = q.LeftJoin(guestdiskSQ, sqlchemy.Equals(q.Field("id"), guestdiskSQ.Field("guest_id"))) + db.OrderByFields(q, []string{query.OrderByDisk}, []sqlchemy.IQueryField{guestdiskSQ.Field("disks_size")}) + } return q, nil }