@@ -111,12 +111,74 @@ Environment.prototype.slice = function(segment, expression, object, path) {
111111 }
112112} ;
113113
114- Environment . prototype . match = function ( segment , _v , _vname ) {
115- try {
116- var $ = this . jsonObject ;
117- return _v && eval ( segment . replace ( / @ / g, "_v" ) ) ;
118- }
119- catch ( e ) {
120- throw new SyntaxError ( "jsonPath: " + e . message + ": " + segment . replace ( / @ / g, "_v" ) . replace ( / \^ / g, "_a" ) ) ;
121- }
114+ Environment . prototype . match = function ( expression , object , _vname ) {
115+ if ( object === null ) return object ;
116+
117+ if ( / [ > = < ] / . test ( expression ) )
118+ return this . compareValue ( expression , object ) ;
119+ else if ( / [ - + * \/ ] / . test ( expression ) )
120+ return this . computeValue ( expression , object ) ;
121+ else if ( / \. / . test ( expression ) )
122+ return this . getProperty ( expression , object ) ;
123+ else
124+ throw new SyntaxError ( "jsonPath: invalid query syntax: " + expression ) ;
125+ } ;
126+
127+ Environment . prototype . compareValue = function ( expression , object ) {
128+ return this . operate ( object , expression , '>=<' ) ;
129+ } ;
130+
131+ Environment . prototype . getProperty = function ( expression , object ) {
132+ var parts = expression . match ( / \. ( [ ^ \s ] + ) / ) ;
133+ var rhs ;
134+ try {
135+ rhs = JSON . parse ( '"' + parts [ 1 ] + '"' ) ;
136+ }
137+ catch ( e ) {
138+ throw new SyntaxError ( "jsonPath: invalid property name: " + parts [ 1 ] ) ;
139+ }
140+ return object [ rhs ] ;
141+ } ;
142+
143+ Environment . prototype . getValue = function ( expression ) {
144+ try {
145+ return JSON . parse ( expression ) ;
146+ }
147+ catch ( e ) {
148+ throw new SyntaxError ( "jsonPath: invalid right-hand-side value: " + expression ) ;
149+ }
150+ } ;
151+
152+ Environment . prototype . computeValue = function ( expression , object ) {
153+ return this . operate ( object , expression , '-+*/' ) ;
154+ } ;
155+
156+ Environment . prototype . operate = function ( object , expression , operators ) {
157+ var regex = new RegExp ( "([^\(\)" + operators + "]+)([" + operators + "]+)([^\(\)]+)" ) ;
158+ var parts = expression . match ( regex ) ;
159+ var lhs = this . getProperty ( parts [ 1 ] , object ) ;
160+ var rhs = this . getValue ( parts [ 3 ] ) ;
161+
162+ switch ( parts [ 2 ] ) {
163+ case '==' :
164+ return lhs == rhs ;
165+ case '>=' :
166+ return lhs >= rhs ;
167+ case '<=' :
168+ return lhs <= rhs ;
169+ case '>' :
170+ return lhs > rhs ;
171+ case '<' :
172+ return lhs < rhs ;
173+ case '-' :
174+ return lhs - rhs ;
175+ case '+' :
176+ return lhs + rhs ;
177+ case '*' :
178+ return lhs * rhs ;
179+ case '/' :
180+ return lhs / rhs ;
181+ default :
182+ throw new SyntaxError ( "jsonPath: invalid query syntax: " + expression ) ;
183+ }
122184} ;
0 commit comments