From 95a5af1c1db842736bc0ae0b651b39055d7a151f Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Thu, 14 Jan 2021 19:16:43 +0800 Subject: [PATCH] feat(vpcs): list: add order_by_network_count --- pkg/apis/compute/vpcs_const.go | 2 ++ pkg/compute/models/vpcs.go | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/pkg/apis/compute/vpcs_const.go b/pkg/apis/compute/vpcs_const.go index e676e62f6d..83c5b313ee 100644 --- a/pkg/apis/compute/vpcs_const.go +++ b/pkg/apis/compute/vpcs_const.go @@ -70,6 +70,8 @@ type VpcListInput struct { // CIDR地址段 // example: 192.168.222.0/24 CidrBlock []string `json:"cidr_block"` + + OrderByNetworkCount string `json:"order_by_network_count"` } const ( diff --git a/pkg/compute/models/vpcs.go b/pkg/compute/models/vpcs.go index b02d25370b..885906cddc 100644 --- a/pkg/compute/models/vpcs.go +++ b/pkg/compute/models/vpcs.go @@ -1225,6 +1225,43 @@ func (manager *SVpcManager) OrderByExtraFields( if err != nil { return nil, errors.Wrap(err, "SGlobalVpcResourceBaseManager.OrderByExtraFields") } + + if db.NeedOrderQuery([]string{query.OrderByNetworkCount}) { + var ( + wireq = WireManager.Query().SubQuery() + netq = NetworkManager.Query().SubQuery() + vpcq = VpcManager.Query().SubQuery() + ) + countq := vpcq.Query( + vpcq.Field("id"), + sqlchemy.COUNT("network_count", netq.Field("id")), + ) + countq = countq.Join(wireq, sqlchemy.OR( + sqlchemy.Equals(countq.Field("id"), wireq.Field("vpc_id")), + sqlchemy.AND( + sqlchemy.Equals(countq.Field("id"), api.DEFAULT_VPC_ID), + sqlchemy.IsNullOrEmpty(wireq.Field("vpc_id")), + ), + )) + countq = countq.Join(netq, sqlchemy.Equals( + netq.Field("wire_id"), wireq.Field("id"), + )) + countq = countq.GroupBy(vpcq.Field("id")) + countSubq := countq.SubQuery() + q = q.LeftJoin(countSubq, sqlchemy.Equals( + q.Field("id"), countSubq.Field("id"), + )) + q.AppendField(q.QueryFields()...) + q = q.AppendField(countSubq.Field("network_count")) + q = db.OrderByFields(q, + []string{ + query.OrderByNetworkCount, + }, + []sqlchemy.IQueryField{ + countSubq.Field("network_count"), + }, + ) + } return q, nil }