From 9013a4258b8da02ba5fd5b8d53397132978ab3b7 Mon Sep 17 00:00:00 2001 From: ioito Date: Wed, 31 Jul 2019 20:02:52 +0800 Subject: [PATCH] hotfix: change params from order_by_cache=asc|desc to order_by=cache & order=asc|desc --- cmd/climc/shell/secgroups.go | 10 +------ pkg/compute/models/secgroups.go | 46 +++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/cmd/climc/shell/secgroups.go b/cmd/climc/shell/secgroups.go index 00d1b5ce23..6005ed9e3a 100644 --- a/cmd/climc/shell/secgroups.go +++ b/cmd/climc/shell/secgroups.go @@ -26,9 +26,7 @@ import ( func init() { type SecGroupsListOptions struct { - Equals string `help:"Secgroup ID or Name, filter secgroups whose rules equals the specified one"` - OrderByCache string `help:"Order by cache count" choices:"desc|asc"` - OrderByGuest string `help:"Order by guest count" choices:"desc|asc"` + Equals string `help:"Secgroup ID or Name, filter secgroups whose rules equals the specified one"` options.BaseListOptions } @@ -45,12 +43,6 @@ func init() { if len(args.Equals) > 0 { params.Add(jsonutils.NewString(args.Equals), "equals") } - if len(args.OrderByCache) > 0 { - params.Add(jsonutils.NewString(args.OrderByCache), "order_by_cache") - } - if len(args.OrderByGuest) > 0 { - params.Add(jsonutils.NewString(args.OrderByGuest), "order_by_guest") - } result, err := modules.SecGroups.List(s, params) if err != nil { return err diff --git a/pkg/compute/models/secgroups.go b/pkg/compute/models/secgroups.go index 22b3179872..c810dfb3c6 100644 --- a/pkg/compute/models/secgroups.go +++ b/pkg/compute/models/secgroups.go @@ -92,8 +92,16 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql q = q.In("id", secgroupIds) } + return q, nil +} + +func (manager *SSecurityGroupManager) OrderByExtraFields(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) { + q, err := manager.SVirtualResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query) + if err != nil { + return nil, err + } orderByCache, _ := query.GetString("order_by_cache") - if orderByCache == "asc" || orderByCache == "desc" { + if sqlchemy.SQL_ORDER_ASC.Equals(orderByCache) || sqlchemy.SQL_ORDER_DESC.Equals(orderByCache) { caches := SecurityGroupCacheManager.Query().SubQuery() cacheQ := caches.Query( caches.Field("secgroup_id"), @@ -101,29 +109,35 @@ func (manager *SSecurityGroupManager) ListItemFilter(ctx context.Context, q *sql ) cacheSQ := cacheQ.GroupBy(caches.Field("secgroup_id")).SubQuery() q = q.LeftJoin(cacheSQ, sqlchemy.Equals(q.Field("id"), cacheSQ.Field("secgroup_id"))) - switch orderByCache { - case "asc": + if sqlchemy.SQL_ORDER_ASC.Equals(orderByCache) { q = q.Asc(cacheSQ.Field("cache_cnt")) - case "desc": + } else { q = q.Desc(cacheSQ.Field("cache_cnt")) } } - orderByGuest, _ := query.GetString("order_by_guest") - if orderByGuest == "asc" || orderByGuest == "desc" { + if sqlchemy.SQL_ORDER_ASC.Equals(orderByGuest) || sqlchemy.SQL_ORDER_DESC.Equals(orderByGuest) { guests := GuestManager.Query().SubQuery() - guestQ := guests.Query( - guests.Field("secgrp_id"), - sqlchemy.COUNT("guest_cnt"), + guestsecgroups := GuestsecgroupManager.Query().SubQuery() + q1 := guests.Query(guests.Field("id").Label("guest_id"), + guests.Field("secgrp_id").Label("secgroup_id")) + q2 := guestsecgroups.Query(guestsecgroups.Field("guest_id"), + guestsecgroups.Field("secgroup_id")) + uq := sqlchemy.Union(q1, q2) + uQ := uq.Query( + uq.Field("secgroup_id"), + sqlchemy.COUNT("guest_cnt", uq.Field("guest_id")), ) - guestSQ := guestQ.GroupBy(guests.Field("secgrp_id")).SubQuery() - q = q.LeftJoin(guestSQ, sqlchemy.Equals(q.Field("id"), guestSQ.Field("secgrp_id"))) - switch orderByGuest { - case "asc": - q = q.Asc(guestSQ.Field("guest_cnt")) - case "desc": - q = q.Desc(guestSQ.Field("guest_cnt")) + sq := uQ.GroupBy(uq.Field("secgroup_id")).SubQuery() + + q = q.LeftJoin(sq, sqlchemy.Equals(q.Field("id"), sq.Field("secgroup_id"))) + + if sqlchemy.SQL_ORDER_ASC.Equals(orderByGuest) { + q = q.Asc(sq.Field("guest_cnt")) + } else { + q = q.Desc(sq.Field("guest_cnt")) } + } return q, nil