mirror of
https://github.com/rancher/steve.git
synced 2025-09-21 03:19:20 +00:00
Fix the ListOptions sort field.
Instead of making it a single array-ish field, convert it into a true array of Sort Directives. Easier to read, less bending backwards.
This commit is contained in:
@@ -50,15 +50,6 @@ var mapK8sOpToRancherOp = map[selection.Operator]sqltypes.Op{
|
||||
selection.GreaterThan: sqltypes.Gt,
|
||||
}
|
||||
|
||||
// ListOptions represents the query parameters that may be included in a list request.
|
||||
type ListOptions struct {
|
||||
ChunkSize int
|
||||
Resume string
|
||||
Filters []sqltypes.OrFilter
|
||||
Sort sqltypes.Sort
|
||||
Pagination sqltypes.Pagination
|
||||
}
|
||||
|
||||
type Cache interface {
|
||||
// ListByOptions returns objects according to the specified list options and partitions.
|
||||
// Specifically:
|
||||
@@ -118,9 +109,9 @@ func ParseQuery(apiOp *types.APIRequest, namespaceCache Cache) (sqltypes.ListOpt
|
||||
}
|
||||
opts.Filters = filterOpts
|
||||
|
||||
sortOpts := sqltypes.Sort{}
|
||||
sortKeys := q.Get(sortParam)
|
||||
if sortKeys != "" {
|
||||
sortList := *sqltypes.NewSortList()
|
||||
sortParts := strings.Split(sortKeys, ",")
|
||||
for _, sortPart := range sortParts {
|
||||
field := sortPart
|
||||
@@ -131,13 +122,16 @@ func ParseQuery(apiOp *types.APIRequest, namespaceCache Cache) (sqltypes.ListOpt
|
||||
field = field[1:]
|
||||
}
|
||||
if len(field) > 0 {
|
||||
sortOpts.Fields = append(sortOpts.Fields, queryhelper.SafeSplit(field))
|
||||
sortOpts.Orders = append(sortOpts.Orders, sortOrder)
|
||||
sortDirective := sqltypes.Sort{
|
||||
Fields: queryhelper.SafeSplit(field),
|
||||
Order: sortOrder,
|
||||
}
|
||||
sortList.SortDirectives = append(sortList.SortDirectives, sortDirective)
|
||||
}
|
||||
}
|
||||
}
|
||||
opts.SortList = sortList
|
||||
}
|
||||
opts.Sort = sortOpts
|
||||
|
||||
var err error
|
||||
pagination := sqltypes.Pagination{}
|
||||
|
@@ -744,10 +744,13 @@ func TestParseQuery(t *testing.T) {
|
||||
},
|
||||
expectedLO: sqltypes.ListOptions{
|
||||
ChunkSize: defaultLimit,
|
||||
Sort: sqltypes.Sort{
|
||||
Fields: [][]string{
|
||||
{"metadata", "name"}},
|
||||
Orders: []sqltypes.SortOrder{sqltypes.ASC},
|
||||
SortList: sqltypes.SortList{
|
||||
SortDirectives: []sqltypes.Sort{
|
||||
{
|
||||
Fields: []string{"metadata", "name"},
|
||||
Order: sqltypes.ASC,
|
||||
},
|
||||
},
|
||||
},
|
||||
Filters: make([]sqltypes.OrFilter, 0),
|
||||
Pagination: sqltypes.Pagination{
|
||||
@@ -765,9 +768,13 @@ func TestParseQuery(t *testing.T) {
|
||||
},
|
||||
expectedLO: sqltypes.ListOptions{
|
||||
ChunkSize: defaultLimit,
|
||||
Sort: sqltypes.Sort{
|
||||
Fields: [][]string{{"metadata", "name"}},
|
||||
Orders: []sqltypes.SortOrder{sqltypes.DESC},
|
||||
SortList: sqltypes.SortList{
|
||||
SortDirectives: []sqltypes.Sort{
|
||||
{
|
||||
Fields: []string{"metadata", "name"},
|
||||
Order: sqltypes.DESC,
|
||||
},
|
||||
},
|
||||
},
|
||||
Filters: make([]sqltypes.OrFilter, 0),
|
||||
Pagination: sqltypes.Pagination{
|
||||
@@ -785,14 +792,16 @@ func TestParseQuery(t *testing.T) {
|
||||
},
|
||||
expectedLO: sqltypes.ListOptions{
|
||||
ChunkSize: defaultLimit,
|
||||
Sort: sqltypes.Sort{
|
||||
Fields: [][]string{
|
||||
{"metadata", "name"},
|
||||
{"spec", "something"},
|
||||
},
|
||||
Orders: []sqltypes.SortOrder{
|
||||
sqltypes.DESC,
|
||||
sqltypes.ASC,
|
||||
SortList: sqltypes.SortList{
|
||||
SortDirectives: []sqltypes.Sort{
|
||||
{
|
||||
Fields: []string{"metadata", "name"},
|
||||
Order: sqltypes.DESC,
|
||||
},
|
||||
{
|
||||
Fields: []string{"spec", "something"},
|
||||
Order: sqltypes.ASC,
|
||||
},
|
||||
},
|
||||
},
|
||||
Filters: make([]sqltypes.OrFilter, 0),
|
||||
@@ -811,12 +820,25 @@ func TestParseQuery(t *testing.T) {
|
||||
},
|
||||
expectedLO: sqltypes.ListOptions{
|
||||
ChunkSize: defaultLimit,
|
||||
Sort: sqltypes.Sort{
|
||||
Fields: [][]string{{"metadata", "labels", "beef.cattle.io/snort"},
|
||||
{"metadata", "labels", "steer"},
|
||||
{"metadata", "labels", "bossie.cattle.io/moo"},
|
||||
{"spec", "something"}},
|
||||
Orders: []sqltypes.SortOrder{sqltypes.DESC, sqltypes.ASC, sqltypes.ASC, sqltypes.ASC},
|
||||
SortList: sqltypes.SortList{
|
||||
SortDirectives: []sqltypes.Sort{
|
||||
{
|
||||
Fields: []string{"metadata", "labels", "beef.cattle.io/snort"},
|
||||
Order: sqltypes.DESC,
|
||||
},
|
||||
{
|
||||
Fields: []string{"metadata", "labels", "steer"},
|
||||
Order: sqltypes.ASC,
|
||||
},
|
||||
{
|
||||
Fields: []string{"metadata", "labels", "bossie.cattle.io/moo"},
|
||||
Order: sqltypes.ASC,
|
||||
},
|
||||
{
|
||||
Fields: []string{"spec", "something"},
|
||||
Order: sqltypes.ASC,
|
||||
},
|
||||
},
|
||||
},
|
||||
Filters: make([]sqltypes.OrFilter, 0),
|
||||
Pagination: sqltypes.Pagination{
|
||||
|
Reference in New Issue
Block a user