github.com/go-graphite/carbonapi@v0.17.0/expr/functions/timeShiftByMetric/misc.go (about) 1 package timeShiftByMetric 2 3 import ( 4 "sort" 5 "strconv" 6 7 "github.com/ansel1/merry" 8 9 "github.com/go-graphite/carbonapi/expr/types" 10 ) 11 12 var ( 13 errSeriesLengthMismatch = merry.Errorf("bad data: length of Values for series differs from others") 14 errTooFewDatasets = merry.Errorf("bad data: too few data sets") 15 errLessThan2Marks = merry.Errorf("bad data: could not find 2 marks") 16 errEmptySeries = merry.Errorf("bad data: empty series") 17 ) 18 19 type callParams struct { 20 marks []*types.MetricData 21 metrics []*types.MetricData 22 versionRank int 23 pointsQty int 24 stepTime int64 25 } 26 27 type versionInfo struct { 28 mark string 29 position int 30 versionMajor int 31 versionMinor int 32 } 33 34 type versionInfos []versionInfo 35 36 // HighestVersions returns slice of markVersionInfo 37 // containing the highest version for each major version 38 func (data versionInfos) HighestVersions() versionInfos { 39 qty := 0 40 result := make(versionInfos, 0, len(data)) 41 42 sort.Sort(sort.Reverse(data)) 43 for _, current := range data { 44 if qty == 0 || result[qty-1].versionMajor != current.versionMajor { 45 result = append(result, current) 46 qty++ 47 } 48 } 49 50 return result 51 } 52 53 func (data versionInfos) Len() int { 54 return len(data) 55 } 56 57 func (data versionInfos) Less(i, j int) bool { 58 if data[i].versionMajor == data[j].versionMajor { 59 return data[i].versionMinor < data[j].versionMinor 60 } else { 61 return data[i].versionMajor < data[j].versionMajor 62 } 63 } 64 65 func (data versionInfos) Swap(i, j int) { 66 data[i], data[j] = data[j], data[i] 67 } 68 69 // mustAtoi is like strconv.Atoi, but causes panic in case of error 70 func mustAtoi(s string) int { 71 if result, err := strconv.Atoi(s); err != nil { 72 panic(err) 73 } else { 74 return result 75 } 76 }