-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathexpeval.go
50 lines (42 loc) · 970 Bytes
/
expeval.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package stats
import (
"github.com/antonmedv/expr"
"github.com/antonmedv/expr/vm"
)
type ExpEval struct {
program *vm.Program
}
type ExpEvalEnv struct {
Query string
QueryTime float64
LockTime float64
RowsSent uint64
RowsExamined uint64
RowsAffected uint64
BytesSent uint64
}
func NewExpEval(input string) (*ExpEval, error) {
program, err := expr.Compile(input, expr.Env(&ExpEvalEnv{}), expr.AsBool())
if err != nil {
return nil, err
}
return &ExpEval{
program: program,
}, nil
}
func (ee *ExpEval) Run(metrics *QueryMetrics) (bool, error) {
env := &ExpEvalEnv{
Query: metrics.Query,
QueryTime: metrics.QueryTime,
LockTime: metrics.LockTime,
RowsSent: metrics.RowsSent,
RowsExamined: metrics.RowsExamined,
RowsAffected: metrics.RowsAffected,
BytesSent: metrics.BytesSent,
}
output, err := expr.Run(ee.program, env)
if err != nil {
return false, err
}
return output.(bool), nil
}