Skip to content
This repository was archived by the owner on Aug 23, 2023. It is now read-only.

Commit 08b8c11

Browse files
committed
PR changes
1 parent 4b907e1 commit 08b8c11

File tree

3 files changed

+15
-8
lines changed

3 files changed

+15
-8
lines changed

docs/graphite.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Here are the currently included functions:
4949
| rangeOfSeries(seriesList) series | | Stable |
5050
| removeAbovePercentile(seriesList, n) seriesList | | Stable |
5151
| removeBelowPercentile(seriesList, n) seriesList | | Stable |
52-
| scale(seriesLists, num) series | | Stable |
52+
| scale(seriesList, num) series | | Stable |
5353
| scaleToSeconds(seriesList, seconds) series | | Stable |
5454
| stddevSeries(seriesList) series | | Stable |
5555
| sumSeries(seriesLists) series | sum | Stable |

expr/func_removeabovebelowpercentile.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package expr
22

33
import (
4-
"errors"
54
"fmt"
65
"math"
76
"sort"
@@ -27,7 +26,7 @@ func (s *FuncRemoveAboveBelowPercentile) Signature() ([]Arg, []Arg) {
2726

2827
return []Arg{
2928
ArgSeriesList{val: &s.in},
30-
ArgFloat{key: "n", val: &s.n},
29+
ArgFloat{key: "n", val: &s.n, validator: []Validator{NonNegativePercent}},
3130
}, []Arg{ArgSeriesList{}}
3231
}
3332

@@ -41,16 +40,14 @@ func (s *FuncRemoveAboveBelowPercentile) Exec(cache map[Req][]models.Series) ([]
4140
return nil, err
4241
}
4342

44-
if s.n <= 0 {
45-
return nil, errors.New("The requested percent is required to be greater than 0")
46-
}
47-
4843
if len(series) == 0 {
4944
return series, nil
5045
}
5146

5247
var output []models.Series
53-
sortedDatapointVals := make([]float64, 0, len(series[0].Datapoints)) //reuse float64 slice
48+
49+
// will be reused for each getPercentileValue call
50+
sortedDatapointVals := make([]float64, 0, len(series[0].Datapoints))
5451
for _, serie := range series {
5552
if s.above {
5653
serie.Target = fmt.Sprintf("removeAbovePercentile(%s, %g)", serie.Target, s.n)
@@ -90,6 +87,8 @@ func (s *FuncRemoveAboveBelowPercentile) Exec(cache map[Req][]models.Series) ([]
9087
return output, nil
9188
}
9289

90+
// sortedDatapointVals is an empty slice to be used for sorting datapoints.
91+
// n must be > 0. if n > 100, the largest value is returned.
9392
func getPercentileValue(datapoints []schema.Point, n float64, sortedDatapointVals []float64) float64 {
9493
sortedDatapointVals = sortedDatapointVals[:0]
9594
for _, p := range datapoints {

expr/validator.go

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
var ErrIntPositive = errors.New("integer must be positive")
1111
var ErrInvalidAggFunc = errors.New("Invalid aggregation func")
12+
var ErrNonNegativePercent = errors.New("The requested percent is required to be greater than 0")
1213

1314
// Validator is a function to validate an input
1415
type Validator func(e *expr) error
@@ -36,3 +37,10 @@ func IsIntervalString(e *expr) error {
3637
_, err := dur.ParseDuration(e.str)
3738
return err
3839
}
40+
41+
func NonNegativePercent(e *expr) error {
42+
if e.float < 0 || e.int < 0 {
43+
return ErrNonNegativePercent
44+
}
45+
return nil
46+
}

0 commit comments

Comments
 (0)