rows age sort bust. Fix #536
parent
67c0702bf2
commit
1a6ff3bfa3
|
|
@ -4,8 +4,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
|
"k8s.io/apimachinery/pkg/util/duration"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -139,19 +141,31 @@ func (rr RowEvents) FindIndex(id string) (int, bool) {
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rr RowEvents) isAgeCol(col int) bool {
|
||||||
|
var age bool
|
||||||
|
if len(rr) == 0 {
|
||||||
|
return age
|
||||||
|
}
|
||||||
|
return col == len(rr[0].Row.Fields)-1
|
||||||
|
}
|
||||||
|
|
||||||
// Sort rows based on column index and order.
|
// Sort rows based on column index and order.
|
||||||
func (rr RowEvents) Sort(ns string, col int, asc bool) {
|
func (rr RowEvents) Sort(ns string, col int, asc bool) {
|
||||||
t := RowEventSorter{NS: ns, Events: rr, Index: col, Asc: asc}
|
t := RowEventSorter{NS: ns, Events: rr, Index: col, Asc: asc}
|
||||||
sort.Sort(t)
|
sort.Sort(t)
|
||||||
|
|
||||||
|
ageCol := rr.isAgeCol(col)
|
||||||
gg, kk := map[string][]string{}, make(StringSet, 0, len(rr))
|
gg, kk := map[string][]string{}, make(StringSet, 0, len(rr))
|
||||||
for _, e := range rr {
|
for _, r := range rr {
|
||||||
g := e.Row.Fields[col]
|
g := r.Row.Fields[col]
|
||||||
|
if ageCol {
|
||||||
|
g = toAgeDuration(g)
|
||||||
|
}
|
||||||
kk = kk.Add(g)
|
kk = kk.Add(g)
|
||||||
if ss, ok := gg[g]; ok {
|
if ss, ok := gg[g]; ok {
|
||||||
gg[g] = append(ss, e.Row.ID)
|
gg[g] = append(ss, r.Row.ID)
|
||||||
} else {
|
} else {
|
||||||
gg[g] = []string{e.Row.ID}
|
gg[g] = []string{r.Row.ID}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,6 +178,14 @@ func (rr RowEvents) Sort(ns string, col int, asc bool) {
|
||||||
sort.Sort(s)
|
sort.Sort(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func toAgeDuration(dur string) string {
|
||||||
|
d, err := time.ParseDuration(dur)
|
||||||
|
if err != nil {
|
||||||
|
return "n/a"
|
||||||
|
}
|
||||||
|
return duration.HumanDuration(d)
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// RowEventSorter sorts row events by a given colon.
|
// RowEventSorter sorts row events by a given colon.
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,26 @@ func TestSort(t *testing.T) {
|
||||||
{Row: render.Row{ID: "C", Fields: render.Fields{"10", "2", "3"}}},
|
{Row: render.Row{ID: "C", Fields: render.Fields{"10", "2", "3"}}},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"id_preserve": {
|
||||||
|
re: render.RowEvents{
|
||||||
|
{Row: render.Row{ID: "ns1/B", Fields: render.Fields{"B", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns1/A", Fields: render.Fields{"A", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns1/C", Fields: render.Fields{"C", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns2/B", Fields: render.Fields{"B", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns2/A", Fields: render.Fields{"A", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns2/C", Fields: render.Fields{"C", "2", "3"}}},
|
||||||
|
},
|
||||||
|
col: 1,
|
||||||
|
asc: true,
|
||||||
|
e: render.RowEvents{
|
||||||
|
{Row: render.Row{ID: "ns1/A", Fields: render.Fields{"A", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns1/B", Fields: render.Fields{"B", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns1/C", Fields: render.Fields{"C", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns2/A", Fields: render.Fields{"A", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns2/B", Fields: render.Fields{"B", "2", "3"}}},
|
||||||
|
{Row: render.Row{ID: "ns2/C", Fields: render.Fields{"C", "2", "3"}}},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for k := range uu {
|
for k := range uu {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue