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  }