-
Notifications
You must be signed in to change notification settings - Fork 57
/
frame_sorter.go
54 lines (48 loc) · 1.18 KB
/
frame_sorter.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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package experimental
import "github.com/grafana/grafana-plugin-sdk-go/data"
// NewFrameSorter returns a new frameSorter.
func NewFrameSorter(frame *data.Frame, sortField *data.Field) FrameSorter {
return FrameSorter{frame, sortField}
}
// FrameSorter sorts a DataFrame by field.
type FrameSorter struct {
frame *data.Frame
sortField *data.Field
}
func (fs FrameSorter) Len() int { return fs.frame.Rows() }
func (fs FrameSorter) Swap(i, j int) {
for _, field := range fs.frame.Fields {
valA := field.At(i)
valB := field.At(j)
field.Set(j, valA)
field.Set(i, valB)
}
}
func (fs FrameSorter) Less(i, j int) bool {
switch kind := fs.sortField.Type(); kind {
case data.FieldTypeString:
valA := fs.sortField.At(i).(string)
valB := fs.sortField.At(j).(string)
return valA < valB
case data.FieldTypeNullableString:
valA := fs.sortField.At(i).(*string)
valB := fs.sortField.At(j).(*string)
if valA == nil {
return false
}
if valB == nil {
return true
}
return *valA < *valB
default:
valA, err := fs.sortField.FloatAt(i)
if err != nil {
return false
}
valB, err := fs.sortField.FloatAt(j)
if err != nil {
return true
}
return valA < valB
}
}