1
0
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:
Eric Promislow
2025-04-24 14:57:32 -07:00
parent c7104c1c82
commit be967a0f4f
5 changed files with 149 additions and 134 deletions

View File

@@ -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{}

View File

@@ -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{