/
sort.go
33 lines (30 loc) · 901 Bytes
/
sort.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package table
import (
"github.com/influxdata/flux"
"github.com/influxdata/flux/internal/execute/groupkey"
)
// Sort will read a TableIterator and produce another TableIterator
// where the keys are sorted.
//
// This method will buffer all of the data since it needs to ensure
// all of the tables are read to avoid any deadlocks. Be careful
// using this method in performance sensitive areas.
func Sort(tables flux.TableIterator) (flux.TableIterator, error) {
groups := groupkey.NewLookup()
if err := tables.Do(func(table flux.Table) error {
buffered, err := Copy(table)
if err != nil {
return err
}
groups.Set(buffered.Key(), buffered)
return nil
}); err != nil {
return nil, err
}
var buffered []flux.Table
groups.Range(func(_ flux.GroupKey, value interface{}) error {
buffered = append(buffered, value.(flux.Table))
return nil
})
return Iterator(buffered), nil
}