mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 14:19:49 +08:00
Merge pull request #9899 from yousong/feature/yousong-vpc-order-count
feat(vpcs): list: add order_by_network_count
This commit is contained in:
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user