diff --git a/expr/expr.go b/expr/expr.go index bc0b57c3c..ee61b03bb 100644 --- a/expr/expr.go +++ b/expr/expr.go @@ -114,7 +114,7 @@ func (eval Evaluator) Fetch(ctx context.Context, exprs []parser.Expr, from, unti // Eval evaluates expressions. func (eval Evaluator) Eval(ctx context.Context, exp parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) (results []*types.MetricData, err error) { - rewritten, targets, err := eval.RewriteExpr(ctx, exp, from, until, values) + rewritten, targets, err := RewriteExpr(ctx, eval, exp, from, until, values) if err != nil { return nil, err } @@ -136,11 +136,19 @@ func (eval Evaluator) Eval(ctx context.Context, exp parser.Expr, from, until int } return results, nil } - return eval.EvalExpr(ctx, exp, from, until, values) + return EvalExpr(ctx, eval, exp, from, until, values) +} + +// NewEvaluator create evaluator with limiter and zipper +func NewEvaluator(limiter limiter.SimpleLimiter, zipper zipper.CarbonZipper) (*Evaluator, error) { + if zipper == nil { + return nil, ErrZipperNotInit + } + return &Evaluator{limiter: limiter, zipper: zipper}, nil } // EvalExpr is the main expression Evaluator. -func (eval Evaluator) EvalExpr(ctx context.Context, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { +func EvalExpr(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, error) { if e.IsName() { return values[parser.MetricRequest{Metric: e.Target(), From: from, Until: until}], nil } else if e.IsConst() { @@ -198,7 +206,7 @@ func (eval Evaluator) EvalExpr(ctx context.Context, e parser.Expr, from, until i // applyByNode(foo*, 1, "%") -> (true, ["foo1", "foo2"], nil) // sumSeries(foo) -> (false, nil, nil) // Assumes that applyByNode only appears as the outermost function. -func (eval Evaluator) RewriteExpr(ctx context.Context, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) (bool, []string, error) { +func RewriteExpr(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) (bool, []string, error) { if e.IsFunc() { metadata.FunctionMD.RLock() f, ok := metadata.FunctionMD.RewriteFunctions[e.Target()] @@ -210,14 +218,6 @@ func (eval Evaluator) RewriteExpr(ctx context.Context, e parser.Expr, from, unti return false, nil, nil } -// NewEvaluator create evaluator with limiter and zipper -func NewEvaluator(limiter limiter.SimpleLimiter, zipper zipper.CarbonZipper) (*Evaluator, error) { - if zipper == nil { - return nil, ErrZipperNotInit - } - return &Evaluator{limiter: limiter, zipper: zipper}, nil -} - // FetchAndEvalExp fetch data and evaluates expressions func FetchAndEvalExp(ctx context.Context, eval interfaces.Evaluator, e parser.Expr, from, until int64, values map[parser.MetricRequest][]*types.MetricData) ([]*types.MetricData, merry.Error) { targetValues, err := eval.Fetch(ctx, []parser.Expr{e}, from, until, values) diff --git a/expr/expr_test.go b/expr/expr_test.go index 3e660c7db..09b5acf88 100644 --- a/expr/expr_test.go +++ b/expr/expr_test.go @@ -207,7 +207,7 @@ func TestEvalExpr(t *testing.T) { eval, err := NewEvaluator(nil, th.NewTestZipper(nil)) if err == nil { - _, err = eval.EvalExpr(context.Background(), exp, request.From, request.Until, metricMap) + _, err = EvalExpr(context.Background(), eval, exp, request.From, request.Until, metricMap) } if err != nil { t.Errorf("error='%v'", err) @@ -465,7 +465,7 @@ func TestRewriteExpr(t *testing.T) { t.Run(tt.name, func(t *testing.T) { eval, err := NewEvaluator(nil, th.NewTestZipper(nil)) if err == nil { - rewritten, newTargets, err := eval.RewriteExpr(context.Background(), tt.e, 0, 1, tt.m) + rewritten, newTargets, err := RewriteExpr(context.Background(), eval, tt.e, 0, 1, tt.m) if err != nil { t.Errorf("failed to rewrite %v: %+v", tt.name, err) @@ -522,7 +522,7 @@ func TestEvalCustomFromUntil(t *testing.T) { exp, _, _ := parser.ParseExpr(tt.target) eval, err := NewEvaluator(nil, th.NewTestZipper(nil)) if err == nil { - g, err := eval.EvalExpr(context.Background(), exp, tt.from, tt.until, tt.m) + g, err := EvalExpr(context.Background(), eval, exp, tt.from, tt.until, tt.m) if err != nil { t.Errorf("failed to eval %v: %s", tt.name, err) return