github.com/go-graphite/carbonapi@v0.17.0/expr/functions/sortByName/function.go (about) 1 package sortByName 2 3 import ( 4 "context" 5 "sort" 6 7 "github.com/go-graphite/carbonapi/expr/helper" 8 "github.com/go-graphite/carbonapi/expr/interfaces" 9 "github.com/go-graphite/carbonapi/expr/types" 10 "github.com/go-graphite/carbonapi/pkg/parser" 11 ) 12 13 type sortByName struct{} 14 15 func GetOrder() interfaces.Order { 16 return interfaces.Any 17 } 18 19 func New(configFile string) []interfaces.FunctionMetadata { 20 res := make([]interfaces.FunctionMetadata, 0) 21 f := &sortByName{} 22 functions := []string{"sortByName"} 23 for _, n := range functions { 24 res = append(res, interfaces.FunctionMetadata{Name: n, F: f}) 25 } 26 return res 27 } 28 29 // sortByName(seriesList, natural=false) 30 func (f *sortByName) Do(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { 31 original, err := helper.GetSeriesArg(ctx, eval, e.Arg(0), from, until, values) 32 if err != nil { 33 return nil, err 34 } 35 36 isNatSort, err := e.GetBoolNamedOrPosArgDefault("natural", 1, false) 37 if err != nil { 38 return nil, err 39 } 40 41 isReverseSort, err := e.GetBoolNamedOrPosArgDefault("reverse", 2, false) 42 if err != nil { 43 return nil, err 44 } 45 46 arg := make([]*types.MetricData, len(original)) 47 copy(arg, original) 48 var dataToSort sort.Interface 49 if isNatSort { 50 dataToSort = helper.ByNameNatural(arg) 51 } else { 52 dataToSort = helper.ByName(arg) 53 } 54 55 if isReverseSort { 56 dataToSort = sort.Reverse(dataToSort) 57 } 58 59 sort.Sort(dataToSort) 60 return arg, nil 61 } 62 63 // Description is auto-generated description, based on output of https://github.com/graphite-project/graphite-web 64 func (f *sortByName) Description() map[string]types.FunctionDescription { 65 return map[string]types.FunctionDescription{ 66 "sortByName": { 67 Description: "Takes one metric or a wildcard seriesList.\nSorts the list of metrics by the metric name using either alphabetical order or natural sorting.\nNatural sorting allows names containing numbers to be sorted more naturally, e.g:\n- Alphabetical sorting: server1, server11, server12, server2\n- Natural sorting: server1, server2, server11, server12", 68 Function: "sortByName(seriesList, natural=False, reverse=False)", 69 Group: "Sorting", 70 Module: "graphite.render.functions", 71 Name: "sortByName", 72 Params: []types.FunctionParam{ 73 { 74 Name: "seriesList", 75 Required: true, 76 Type: types.SeriesList, 77 }, 78 { 79 Default: types.NewSuggestion(false), 80 Name: "natural", 81 Type: types.Boolean, 82 }, 83 { 84 Default: types.NewSuggestion(false), 85 Name: "reverse", 86 Type: types.Boolean, 87 }, 88 }, 89 }, 90 } 91 }