Skip to content

Commit 27e265b

Browse files
committed
improve sorting
Signed-off-by: Tim Ramlot <42113979+inteon@users.noreply.github.com>
1 parent b2387ea commit 27e265b

File tree

4 files changed

+19
-31
lines changed

4 files changed

+19
-31
lines changed

fieldpath/element.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -226,27 +226,19 @@ func KeyByFields(nameValues ...interface{}) *value.FieldList {
226226
// PathElementSet is a set of path elements.
227227
// TODO: serialize as a list.
228228
type PathElementSet struct {
229-
members sortedPathElements
229+
members []PathElement
230230
}
231231

232232
func MakePathElementSet(size int) PathElementSet {
233233
return PathElementSet{
234-
members: make(sortedPathElements, 0, size),
234+
members: make([]PathElement, 0, size),
235235
}
236236
}
237237

238-
type sortedPathElements []PathElement
239-
240-
// Implement the sort interface; this would permit bulk creation, which would
241-
// be faster than doing it one at a time via Insert.
242-
func (spe sortedPathElements) Len() int { return len(spe) }
243-
func (spe sortedPathElements) Less(i, j int) bool { return spe[i].Less(spe[j]) }
244-
func (spe sortedPathElements) Swap(i, j int) { spe[i], spe[j] = spe[j], spe[i] }
245-
246238
// Copy returns a copy of the PathElementSet.
247239
// This is not a full deep copy as any contained value.Value is not copied.
248240
func (s PathElementSet) Copy() PathElementSet {
249-
out := make(sortedPathElements, len(s.members))
241+
out := make([]PathElement, len(s.members))
250242
for i := range s.members {
251243
out[i] = s.members[i].Copy()
252244
}

fieldpath/serialize.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package fieldpath
1919
import (
2020
"fmt"
2121
"io"
22-
"sort"
22+
"slices"
2323
"sync"
2424

2525
"github.com/go-json-experiment/json"
@@ -225,8 +225,12 @@ func (s *setContentsV1) readIterV1(parser *jsontext.Decoder) (children *Set, isM
225225

226226
// Sort the members and children
227227
if children != nil {
228-
sort.Sort(children.Members.members)
229-
sort.Sort(children.Children.members)
228+
slices.SortFunc(children.Members.members, func(a, b PathElement) int {
229+
return a.Compare(b)
230+
})
231+
slices.SortFunc(children.Children.members, func(a, b setNode) int {
232+
return a.pathElement.Compare(b.pathElement)
233+
})
230234
}
231235

232236
if children == nil {

fieldpath/set.go

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func (s *Set) RecursiveDifference(s2 *Set) *Set {
131131
// "a" if it's a named fields but not "a.b" if it's a map.
132132
func (s *Set) EnsureNamedFieldsAreMembers(sc *schema.Schema, tr schema.TypeRef) *Set {
133133
members := PathElementSet{
134-
members: make(sortedPathElements, 0, s.Members.Size()+len(s.Children.members)),
134+
members: make([]PathElement, 0, s.Members.Size()+len(s.Children.members)),
135135
}
136136
atom, _ := sc.Resolve(tr)
137137
members.members = append(members.members, s.Members.members...)
@@ -463,21 +463,13 @@ type setNode struct {
463463

464464
// SetNodeMap is a map of PathElement to subset.
465465
type SetNodeMap struct {
466-
members sortedSetNode
466+
members []setNode
467467
}
468468

469-
type sortedSetNode []setNode
470-
471-
// Implement the sort interface; this would permit bulk creation, which would
472-
// be faster than doing it one at a time via Insert.
473-
func (s sortedSetNode) Len() int { return len(s) }
474-
func (s sortedSetNode) Less(i, j int) bool { return s[i].pathElement.Less(s[j].pathElement) }
475-
func (s sortedSetNode) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
476-
477469
// Copy returns a copy of the SetNodeMap.
478470
// This is not a full deep copy as any contained value.Value is not copied.
479471
func (s *SetNodeMap) Copy() SetNodeMap {
480-
out := make(sortedSetNode, len(s.members))
472+
out := make([]setNode, len(s.members))
481473
for i, v := range s.members {
482474
out[i] = setNode{pathElement: v.pathElement.Copy(), set: v.set.Copy()}
483475
}
@@ -677,7 +669,7 @@ func (s *SetNodeMap) RecursiveDifference(s2 *Set) *SetNodeMap {
677669

678670
// EnsureNamedFieldsAreMembers returns a set that contains all the named fields along with the leaves.
679671
func (s *SetNodeMap) EnsureNamedFieldsAreMembers(sc *schema.Schema, tr schema.TypeRef) *SetNodeMap {
680-
out := make(sortedSetNode, 0, s.Size())
672+
out := make([]setNode, 0, s.Size())
681673
atom, _ := sc.Resolve(tr)
682674
for _, member := range s.members {
683675
tr := schema.TypeRef{}
@@ -706,7 +698,7 @@ func (s *SetNodeMap) FilterIncludeMatches(pattern *SetMatcher) *SetNodeMap {
706698
return s
707699
}
708700

709-
var out sortedSetNode
701+
var out []setNode
710702
for _, member := range s.members {
711703
for _, c := range pattern.members {
712704
if c.Path.Wildcard || c.Path.PathElement.Equals(member.pathElement) {
@@ -754,7 +746,7 @@ func (s *SetNodeMap) iteratePrefix(prefix Path, f func(Path)) {
754746
// only setNodes with leaf PathElements.
755747
func (s *SetNodeMap) Leaves() *SetNodeMap {
756748
out := &SetNodeMap{}
757-
out.members = make(sortedSetNode, len(s.members))
749+
out.members = make([]setNode, len(s.members))
758750
for i, n := range s.members {
759751
out.members[i] = setNode{
760752
pathElement: n.pathElement,

value/fields.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package value
1919
import (
2020
"fmt"
2121
"io"
22-
"sort"
22+
"slices"
2323
"strings"
2424

2525
"github.com/go-json-experiment/json"
@@ -168,8 +168,8 @@ func (f FieldList) Sort() {
168168
}
169169
return
170170
}
171-
sort.SliceStable(f, func(i, j int) bool {
172-
return f[i].Name < f[j].Name
171+
slices.SortStableFunc(f, func(a, b Field) int {
172+
return strings.Compare(a.Name, b.Name)
173173
})
174174
}
175175

0 commit comments

Comments
 (0)