Merge pull request #14344 from swordqiu/hotfix/qj-set-pagination-order

fix: allow set pagination order
This commit is contained in:
Zexi Li
2022-05-30 23:39:37 +08:00
committed by GitHub
3 changed files with 15 additions and 5 deletions
+4
View File
@@ -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")
}
+10 -5
View File
@@ -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
}
+1
View File
@@ -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"`