@@ -9,14 +9,22 @@ import (
99 "github.com/evilmonkeyinc/jsonpath/script"
1010)
1111
12- func newFilterToken (expression string , engine script.Engine , options * option.QueryOptions ) * filterToken {
13- return & filterToken {expression : expression , engine : engine , options : options }
12+ func newFilterToken (expression string , engine script.Engine , options * option.QueryOptions ) (* filterToken , error ) {
13+ compiledExpression , err := engine .Compile (expression , options )
14+ if err != nil {
15+ return nil , err
16+ }
17+ return & filterToken {
18+ expression : expression ,
19+ compiledExpression : compiledExpression ,
20+ options : options ,
21+ }, nil
1422}
1523
1624type filterToken struct {
17- expression string
18- engine script.Engine
19- options * option.QueryOptions
25+ expression string
26+ compiledExpression script.CompiledExpression
27+ options * option.QueryOptions
2028}
2129
2230func (token * filterToken ) String () string {
@@ -69,11 +77,6 @@ func (token *filterToken) Apply(root, current interface{}, next []Token) (interf
6977 return nil , getInvalidTokenTargetNilError (token .Type (), reflect .Array , reflect .Map , reflect .Slice )
7078 }
7179
72- compiledExpression , err := token .engine .Compile (token .expression , token .options )
73- if err != nil {
74- return nil , getInvalidExpressionError (err )
75- }
76-
7780 switch objType .Kind () {
7881 case reflect .Map :
7982 keys := objVal .MapKeys ()
@@ -82,7 +85,7 @@ func (token *filterToken) Apply(root, current interface{}, next []Token) (interf
8285 for _ , kv := range keys {
8386 element := objVal .MapIndex (kv ).Interface ()
8487
85- evaluation , err := compiledExpression .Evaluate (root , element )
88+ evaluation , err := token . compiledExpression .Evaluate (root , element )
8689 if err != nil {
8790 // we ignore errors, it has failed evaluation
8891 evaluation = nil
@@ -98,7 +101,7 @@ func (token *filterToken) Apply(root, current interface{}, next []Token) (interf
98101 for i := 0 ; i < length ; i ++ {
99102 element := objVal .Index (i ).Interface ()
100103
101- evaluation , err := compiledExpression .Evaluate (root , element )
104+ evaluation , err := token . compiledExpression .Evaluate (root , element )
102105 if err != nil {
103106 // we ignore errors, it has failed evaluation
104107 evaluation = nil
0 commit comments