From 79f6d288884f216a3e94a7fd444b7713b09bb94c Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Sun, 29 May 2022 23:52:15 +0800 Subject: [PATCH] fix: allow set pagination order --- cmd/climc/shell/events/events.go | 4 ++++ pkg/cloudcommon/db/db_dispatcher.go | 15 ++++++++++----- pkg/mcclient/options/base.go | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cmd/climc/shell/events/events.go b/cmd/climc/shell/events/events.go index 1cee9eb3c7..e0e4b2000b 100644 --- a/cmd/climc/shell/events/events.go +++ b/cmd/climc/shell/events/events.go @@ -41,6 +41,7 @@ type BaseEventListOptions struct { OwnerDomainIds []string `help:"filter by owner domain ids"` PagingMarker string `help:"marker for pagination"` + PagingOrder string `help:"pagination order" choices:"DESC|ASC"` Filter []string `help:"Filters"` } @@ -121,6 +122,9 @@ func DoEventList(man modulebase.ResourceManager, s *mcclient.ClientSession, args if len(args.PagingMarker) > 0 { params.Add(jsonutils.NewString(args.PagingMarker), "paging_marker") } + if len(args.PagingOrder) > 0 { + params.Add(jsonutils.NewString(args.PagingOrder), "paging_order") + } if len(args.Filter) > 0 { params.Add(jsonutils.NewStringArray(args.Filter), "filter") } diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 9b8050573f..f16f48d0f9 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -519,6 +519,8 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok limit, _ := query.Int("limit") offset, _ := query.Int("offset") pagingMarker, _ := query.GetString("paging_marker") + pagingOrderStr, _ := query.GetString("paging_order") + pagingOrder := sqlchemy.QueryOrderType(strings.ToUpper(pagingOrderStr)) var ( q *sqlchemy.SQuery @@ -559,6 +561,9 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok if limit <= 0 { limit = int64(pagingConf.DefaultLimit) } + if pagingOrder != sqlchemy.SQL_ORDER_ASC && pagingOrder != sqlchemy.SQL_ORDER_DESC { + pagingOrder = pagingConf.Order + } } splitable := manager.GetSplitTable() @@ -584,7 +589,7 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok markers := decodePagingMarker(pagingMarker) for markerIdx, marker := range markers { if markerIdx < len(pagingConf.MarkerFields) { - if pagingConf.Order == sqlchemy.SQL_ORDER_ASC { + if pagingOrder == sqlchemy.SQL_ORDER_ASC { subq = subq.GE(pagingConf.MarkerFields[markerIdx], marker) } else { subq = subq.LE(pagingConf.MarkerFields[markerIdx], marker) @@ -593,7 +598,7 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok } } for _, f := range pagingConf.MarkerFields { - if pagingConf.Order == sqlchemy.SQL_ORDER_ASC { + if pagingOrder == sqlchemy.SQL_ORDER_ASC { subq = subq.Asc(f) } else { subq = subq.Desc(f) @@ -653,7 +658,7 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok // orders defined in pagingConf should have the highest priority if pagingConf != nil { for _, f := range pagingConf.MarkerFields { - if pagingConf.Order == sqlchemy.SQL_ORDER_ASC { + if pagingOrder == sqlchemy.SQL_ORDER_ASC { q = q.Asc(f) } else { q = q.Desc(f) @@ -729,7 +734,7 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok markers := decodePagingMarker(pagingMarker) for markerIdx, marker := range markers { if markerIdx < len(pagingConf.MarkerFields) { - if pagingConf.Order == sqlchemy.SQL_ORDER_ASC { + if pagingOrder == sqlchemy.SQL_ORDER_ASC { q = q.GE(pagingConf.MarkerFields[markerIdx], marker) } else { q = q.LE(pagingConf.MarkerFields[markerIdx], marker) @@ -754,7 +759,7 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok Data: retList, Limit: int(limit), NextMarker: nextMarker, MarkerField: strings.Join(pagingConf.MarkerFields, ","), - MarkerOrder: string(pagingConf.Order), + MarkerOrder: string(pagingOrder), } return &retResult, nil } diff --git a/pkg/mcclient/options/base.go b/pkg/mcclient/options/base.go index 61fee2e366..9db743b0a5 100644 --- a/pkg/mcclient/options/base.go +++ b/pkg/mcclient/options/base.go @@ -247,6 +247,7 @@ type BaseListOptions struct { IsManaged *bool `help:"List objects managed by external providers" token:"managed" json:"is_managed"` PagingMarker string `help:"Marker for pagination" json:"paging_marker"` + PagingOrder string `help:"paging order" choices:"DESC|ASC"` OrderByTag string `help:"Order results by tag values, composed by a tag key and order, e.g user:部门:ASC"`