Skip to content

Commit 064ba89

Browse files
committed
Global cache was killing queries
1 parent 5beab17 commit 064ba89

File tree

4 files changed

+77
-64
lines changed

4 files changed

+77
-64
lines changed

lib/environment.js

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
var Expression = require('./expression');
22

3-
var cache = {};
4-
53
var Environment = module.exports = function(jsonObject, expression, options) {
64
this.jsonObject = jsonObject;
75
this.expression = this.normalize(expression);
@@ -15,18 +13,15 @@ Environment.prototype.execute = function() {
1513
};
1614

1715
Environment.prototype.normalize = function(expression) {
18-
if(cache[expression]) {
19-
return cache[expression];
20-
}
21-
22-
var subx = [];
23-
ret = expression.replace(/[\['](\??\(.*?\))[\]']/g, function($0,$1){return "[#"+(subx.push($1)-1)+"]";})
24-
.replace(/'?\.'?|\['?/g, ";")
25-
.replace(/;;;|;;/g, ";..;")
26-
.replace(/;$|'?\]|'$/g, "")
27-
.replace(/#([0-9]+)/g, function($0,$1){return subx[$1];});
28-
cache[expression] = ret;
29-
return ret.replace(/^\$;/,"");
16+
var subx = [];
17+
var ret = expression.replace(/[\['](\??\(.*?\))[\]']/g, function($0,$1) {
18+
return "[#"+(subx.push($1)-1)+"]";
19+
}).
20+
replace(/'?\.'?|\['?/g, ";").
21+
replace(/;;;|;;/g, ";..;").
22+
replace(/;$|'?\]|'$/g, "").
23+
replace(/#([0-9]+)/g, function(str, digits){ return subx[digits]; });
24+
return ret.replace(/^\$;/,"");
3025
};
3126

3227
Environment.prototype.asPath = function(path) {
@@ -75,7 +70,8 @@ Environment.prototype.trace = function(expression, object, path) {
7570
}
7671
else if (/^\?\(.*?\)$/.test(segment)) { // [?(newExpression)]
7772
this.walk(object, function(property) {
78-
if (self.match(segment.replace(/^\?\((.*?)\)$/,"$1"), object[property], property))
73+
var newerExpression = segment.replace(/^\?\((.*?)\)$/,"$1");
74+
if (self.match(newerExpression, object[property]))
7975
self.trace(property + ";" + newExpression, object, path);
8076
});
8177
}
@@ -89,7 +85,8 @@ Environment.prototype.trace = function(expression, object, path) {
8985
Environment.prototype.walk = function(object, callback) {
9086
if (object instanceof Array) {
9187
for (var index = 0, n = object.length; index < n; index++)
92-
callback(index);
88+
if(index in object)
89+
callback(index);
9390
}
9491
else if (typeof object === "object") {
9592
for (var property in object)
@@ -114,7 +111,7 @@ Environment.prototype.slice = function(segment, expression, object, path) {
114111
};
115112

116113
Environment.prototype.match = function(expression, object, _vname) {
117-
if(object === null) return object;
114+
if(!object) return object;
118115

119116
return Expression.execute(expression, object);
120117
};

test/expression-test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ vows.describe('Expression').addBatch({
4040
var obj = { one: { five: 6 } };
4141
assert.isFalse(Expression.execute('@.one.two==6', obj));
4242
},
43+
'matches expressions with spaces': function() {
44+
var obj = { one: 2 };
45+
assert.isTrue(Expression.execute('?(@.one == 2)', obj));
46+
},
4347

4448
'throws a syntax error for invalid statements': function() {
4549
assert.throws(function() {

test/fixtures/bing.json

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -169,53 +169,53 @@
169169
"fulfiller":"KAY",
170170
"price":491,"nonRefundable":false,"cabin":"Coach"},"journeyId":"3",
171171
"journey":{"carrier":"CO",
172-
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"ref":"19"},{"ref":"22"}]}},{"pricing":{"signature":"A6tT8o3xQqjRVMhxbd7URweluAZoD7deyHK9O4M1LwHcxnpdbsB96SrqIakyLYC5OHCSDmoR1FsfXZWbkFNTwcmHdY9rAFisL.CvLJtC-n8K.3cFfezASx9cmrxgqkhHUHv2knfnuu.mHTKSx8.G5yVQ0KFG2TWLiVv1inEYXyiLgfKDIOKEkPqJ4IQSQpd1qTDhhLwOit1zRVwflrhsU0Q-jnE-egKu28kANVySDYWk4.sis2ECv3hVWs9TaMyQBMAJBngNIXMWpZIZ7812l23107XuGCvEpp0bVcLcHyOZ9doCUNgdXrnzxrSABuNhXY68so-wJ3sag37gVNSu9D74Gsweg8YcUeXD0MnJQFuUihLOU0zuqqzqejNoigEwZbM1NQjCh4IrMMW8qel69u1sMuHEgksTG-PXKUYPPQiV4V8HIR9-b2kVHAKLirGKvHJqgguh-XRIwe2Fji8dO1IK3gQZeioO-fiZLCsuZ6uSlco3SvDFkmj.rRAvxugorQ__",
173-
"purveyor":"KAY",
174-
"purveyorDisplayNameOverride":"CheapTickets.com",
175-
"fulfiller":"KAY",
176-
"price":498,"nonRefundable":false,"cabin":"Coach"},"journeyId":"3",
177-
"journey":{"carrier":"CO",
178-
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"ref":"19"},{"ref":"22"}]}},{"pricing":{"signature":"AxPbBE-9v3EqO78ESZ9K3gQ-elolNV6ZJWYydZFhllORWAb--rQyJiLDg137xoZiPKxCPMqvAj5VhKZPAsGL4ALvcS6.GBQAWJzMsFdyyGCuk3xsqyxatLJ53RJoZ4WcltQmenF65uGM9tye1Vf7m8ZIxUqibcXTOMDEPgDdLGeIE6I0hWmohVpvxyBT0dZUjnc2eGb7IOTYuKYGAS6KQQbCotuJKH59mUEdX20xyPl2xFrCSvtRyGdUKEXuv44YLA-wf8ilY1w1jwc36Qg7p2z8gyRTSZ7-1Vpal8CGL-r6GZgcipM1hkXS8QxahODitNr3v3EJLDLvTTOjzqNQ0CUAH22nZKvT9TO5F6EVoApLmcREXaJ7NvORP0C2-COLLkyrBMPcHZ1MawVCZpWtZmmoxBFYdBW5ncw7CGfdrmsRnu80pC5..CU5K07BppLlup5CQFOjP76eW3gUHZHxzC2fcStd9xMhuVtxJJpsaM-S",
179-
"purveyor":"KAY",
180-
"purveyorDisplayNameOverride":"United",
181-
"fulfiller":"KAY",
182-
"price":491,"nonRefundable":false,"cabin":"Coach"},"journeyId":"4",
183-
"journey":{"carrier":"UA",
184-
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"id":"25",
185-
"carrier":"UA",
186-
"depInt":2,"arrInt":3,"duration":459,"redeye":false,"shortConnection":false,"longConnection":false,"depOrder":29916,"arrOrder":30195,"legs":[{"id":"26/0",
187-
"orig":"LAN",
188-
"dest":"ORD",
189-
"dep":"2011-10-28T06:00",
190-
"arr":"2011-10-28T05:54",
191-
"duration":54,"carrier":"UA",
192-
"flight":"6138"},{"id":"27/0",
193-
"orig":"ORD",
194-
"dest":"PDX",
195-
"dep":"2011-10-28T08:23",
196-
"arr":"2011-10-28T10:39",
197-
"duration":256,"carrier":"UA",
198-
"flight":"795"}],"connections":[{"duration":149,"short":false,"long":false}]},{"id":"28",
199-
"carrier":"UA",
200-
"depInt":2,"arrInt":4,"duration":331,"redeye":false,"shortConnection":false,"longConnection":false,"depOrder":32878,"arrOrder":33389,"legs":[{"id":"29/0",
201-
"orig":"PDX",
202-
"dest":"ORD",
203-
"dep":"2011-10-30T07:22",
204-
"arr":"2011-10-30T13:10",
205-
"duration":228,"carrier":"UA",
206-
"flight":"705"},{"ref":"6/0"}],"connections":[{"duration":50,"short":false,"long":false}]}]}},{"pricing":{"signature":"A6tT8o3xQqjRVMhxbd7URwfEHWhlrDUUdCTzlPsx1OY1vzyL9tgZiCRV2HnA5VFbPfBdXNyW0P44sThtE8ozTo9Ioex89zi6HH6mAptvK45OaTfUnvnB47-oA-KepaqcjS5GWI3NT6gU2vJPsMwrdDRQ0KFG2TWLiVv1inEYXyiLgfKDIOKEkPqJ4IQSQpd1qTDhhLwOit1zRVwflrhsU0Q37MbGPiCsODOdaD6eYM4Y6jkYrKdYd8wJ6xSKYw4GgLLxid7j8g44PR6PuCIXSgMsFdejuJLpnH3aJwFYuQPdj05iLiibtpMOoxRsbpBFLKnQTdVG2ZU-JTpcbgZoWaZQaW4N5dA09cuQ1ItUzvIWI1k3wyXDIAdu7ZdiH719SVBZnP12Qngkzf8usexbtR6ArZt71g5T5Mfo9-yDL37OqrkgOmMqF7RbjvUAy-H70YKNkA5fZidFlz7agD5pxlTrwccPYKDVklGZBlj4mu0lgDOaymcgmDoEip5WVdBxsA__",
207-
"purveyor":"KAY",
208-
"purveyorDisplayNameOverride":"CheapTickets.com",
209-
"fulfiller":"KAY",
210-
"price":498,"nonRefundable":false,"cabin":"Coach"},"journeyId":"4",
211-
"journey":{"carrier":"UA",
212-
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"ref":"25"},{"ref":"28"}]}},{"pricing":{"signature":"A6tT8o3xQqjRVMhxbd7URwd6aZxWS9fZZHJOnPTcA1c8vzyL9tgZiCRV2HnA5VFbPfBdXNyW0P44sThtE8ozTo8sodRl6pBndkxJrFa69iWSQpyQK8cwJjuGqVrivaOARRuGUpuGr0gPTqlcdgSW1ERQ0KFG2TWLiVv1inEYXyiLgfKDIOKEkPqJ4IQSQpd1qTDhhLwOit1zRVwflrhsU0Q37MbGPiCsODOdaD6eYM4Y7.UGYyNLvJ5TlSnympxEj6Fhjtl48QXXxru-O4zSNvQXs0tox0SQOS8i3C03rL4J.Crgkl5FQhlzdBxpjAQ33WAPDnEEJ166RtkqQZ3OmG26f4rIOUYj9d-3z9t3OkfL9Owow5cETCVj1XhAm7L211BZnP12Qngkzf8usexbtR7emhtk2dEx.gTX0e0tlG4kx4qpbVPZaISorrif.Ktz7j-hHQhc2byxebSyK8HHoR4sKyNCjb158H5v.HLzgMnM",
213-
"purveyor":"KAY",
214-
"purveyorDisplayNameOverride":"Orbitz",
215-
"fulfiller":"KAY",
216-
"price":491,"nonRefundable":false,"cabin":"Coach"},"journeyId":"5",
217-
"journey":{"carrier":"CO",
218-
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"id":"30",
172+
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"ref":"19"},{"ref":"22"}]}},{"pricing":{"signature":"A6tT8o3xQqjRVMhxbd7URweluAZoD7deyHK9O4M1LwHcxnpdbsB96SrqIakyLYC5OHCSDmoR1FsfXZWbkFNTwcmHdY9rAFisL.CvLJtC-n8K.3cFfezASx9cmrxgqkhHUHv2knfnuu.mHTKSx8.G5yVQ0KFG2TWLiVv1inEYXyiLgfKDIOKEkPqJ4IQSQpd1qTDhhLwOit1zRVwflrhsU0Q-jnE-egKu28kANVySDYWk4.sis2ECv3hVWs9TaMyQBMAJBngNIXMWpZIZ7812l23107XuGCvEpp0bVcLcHyOZ9doCUNgdXrnzxrSABuNhXY68so-wJ3sag37gVNSu9D74Gsweg8YcUeXD0MnJQFuUihLOU0zuqqzqejNoigEwZbM1NQjCh4IrMMW8qel69u1sMuHEgksTG-PXKUYPPQiV4V8HIR9-b2kVHAKLirGKvHJqgguh-XRIwe2Fji8dO1IK3gQZeioO-fiZLCsuZ6uSlco3SvDFkmj.rRAvxugorQ__",
173+
"purveyor":"KAY",
174+
"purveyorDisplayNameOverride":"CheapTickets.com",
175+
"fulfiller":"KAY",
176+
"price":498,"nonRefundable":false,"cabin":"Coach"},"journeyId":"3",
177+
"journey":{"carrier":"CO",
178+
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"ref":"19"},{"ref":"22"}]}},{"pricing":{"signature":"AxPbBE-9v3EqO78ESZ9K3gQ-elolNV6ZJWYydZFhllORWAb--rQyJiLDg137xoZiPKxCPMqvAj5VhKZPAsGL4ALvcS6.GBQAWJzMsFdyyGCuk3xsqyxatLJ53RJoZ4WcltQmenF65uGM9tye1Vf7m8ZIxUqibcXTOMDEPgDdLGeIE6I0hWmohVpvxyBT0dZUjnc2eGb7IOTYuKYGAS6KQQbCotuJKH59mUEdX20xyPl2xFrCSvtRyGdUKEXuv44YLA-wf8ilY1w1jwc36Qg7p2z8gyRTSZ7-1Vpal8CGL-r6GZgcipM1hkXS8QxahODitNr3v3EJLDLvTTOjzqNQ0CUAH22nZKvT9TO5F6EVoApLmcREXaJ7NvORP0C2-COLLkyrBMPcHZ1MawVCZpWtZmmoxBFYdBW5ncw7CGfdrmsRnu80pC5..CU5K07BppLlup5CQFOjP76eW3gUHZHxzC2fcStd9xMhuVtxJJpsaM-S",
179+
"purveyor":"KAY",
180+
"purveyorDisplayNameOverride":"United",
181+
"fulfiller":"KAY",
182+
"price":491,"nonRefundable":false,"cabin":"Coach"},"journeyId":"4",
183+
"journey":{"carrier":"UA",
184+
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"id":"25",
185+
"carrier":"UA",
186+
"depInt":2,"arrInt":3,"duration":459,"redeye":false,"shortConnection":false,"longConnection":false,"depOrder":29916,"arrOrder":30195,"legs":[{"id":"26/0",
187+
"orig":"LAN",
188+
"dest":"ORD",
189+
"dep":"2011-10-28T06:00",
190+
"arr":"2011-10-28T05:54",
191+
"duration":54,"carrier":"UA",
192+
"flight":"6138"},{"id":"27/0",
193+
"orig":"ORD",
194+
"dest":"PDX",
195+
"dep":"2011-10-28T08:23",
196+
"arr":"2011-10-28T10:39",
197+
"duration":256,"carrier":"UA",
198+
"flight":"795"}],"connections":[{"duration":149,"short":false,"long":false}]},{"id":"28",
199+
"carrier":"UA",
200+
"depInt":2,"arrInt":4,"duration":331,"redeye":false,"shortConnection":false,"longConnection":false,"depOrder":32878,"arrOrder":33389,"legs":[{"id":"29/0",
201+
"orig":"PDX",
202+
"dest":"ORD",
203+
"dep":"2011-10-30T07:22",
204+
"arr":"2011-10-30T13:10",
205+
"duration":228,"carrier":"UA",
206+
"flight":"705"},{"ref":"6/0"}],"connections":[{"duration":50,"short":false,"long":false}]}]}},{"pricing":{"signature":"A6tT8o3xQqjRVMhxbd7URwfEHWhlrDUUdCTzlPsx1OY1vzyL9tgZiCRV2HnA5VFbPfBdXNyW0P44sThtE8ozTo9Ioex89zi6HH6mAptvK45OaTfUnvnB47-oA-KepaqcjS5GWI3NT6gU2vJPsMwrdDRQ0KFG2TWLiVv1inEYXyiLgfKDIOKEkPqJ4IQSQpd1qTDhhLwOit1zRVwflrhsU0Q37MbGPiCsODOdaD6eYM4Y6jkYrKdYd8wJ6xSKYw4GgLLxid7j8g44PR6PuCIXSgMsFdejuJLpnH3aJwFYuQPdj05iLiibtpMOoxRsbpBFLKnQTdVG2ZU-JTpcbgZoWaZQaW4N5dA09cuQ1ItUzvIWI1k3wyXDIAdu7ZdiH719SVBZnP12Qngkzf8usexbtR6ArZt71g5T5Mfo9-yDL37OqrkgOmMqF7RbjvUAy-H70YKNkA5fZidFlz7agD5pxlTrwccPYKDVklGZBlj4mu0lgDOaymcgmDoEip5WVdBxsA__",
207+
"purveyor":"KAY",
208+
"purveyorDisplayNameOverride":"CheapTickets.com",
209+
"fulfiller":"KAY",
210+
"price":498,"nonRefundable":false,"cabin":"Coach"},"journeyId":"4",
211+
"journey":{"carrier":"UA",
212+
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"ref":"25"},{"ref":"28"}]}},{"pricing":{"signature":"A6tT8o3xQqjRVMhxbd7URwd6aZxWS9fZZHJOnPTcA1c8vzyL9tgZiCRV2HnA5VFbPfBdXNyW0P44sThtE8ozTo8sodRl6pBndkxJrFa69iWSQpyQK8cwJjuGqVrivaOARRuGUpuGr0gPTqlcdgSW1ERQ0KFG2TWLiVv1inEYXyiLgfKDIOKEkPqJ4IQSQpd1qTDhhLwOit1zRVwflrhsU0Q37MbGPiCsODOdaD6eYM4Y7.UGYyNLvJ5TlSnympxEj6Fhjtl48QXXxru-O4zSNvQXs0tox0SQOS8i3C03rL4J.Crgkl5FQhlzdBxpjAQ33WAPDnEEJ166RtkqQZ3OmG26f4rIOUYj9d-3z9t3OkfL9Owow5cETCVj1XhAm7L211BZnP12Qngkzf8usexbtR7emhtk2dEx.gTX0e0tlG4kx4qpbVPZaISorrif.Ktz7j-hHQhc2byxebSyK8HHoR4sKyNCjb158H5v.HLzgMnM",
213+
"purveyor":"KAY",
214+
"purveyorDisplayNameOverride":"Orbitz",
215+
"fulfiller":"KAY",
216+
"price":491,"nonRefundable":false,"cabin":"Coach"},"journeyId":"5",
217+
"journey":{"carrier":"CO",
218+
"redeye":false,"shortConnection":false,"longConnection":false,"stops":1,"stages":[{"id":"30",
219219
"carrier":"CO",
220220
"depInt":2,"arrInt":3,"duration":459,"redeye":false,"shortConnection":false,"longConnection":false,"depOrder":29916,"arrOrder":30195,"legs":[{"id":"31/0",
221221
"orig":"LAN",

test/jsonpath-test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,5 +212,17 @@ vows.describe('JSONPath').addBatch({
212212

213213
assert.deepEqual(jsonpath(obj[0], '$.quotes[?(@.pricing.signature == "A6tT8o3xQqjRVMhxbd7URwf2rj53c5Jjl88UXYblt5ZgyfxY.7eepx2sh3ZLMAO-RQKS8aatkf7aDxGybFSHXIfaxmSXlepOVwSjaZAMQx2Vn0kVawxAqk-fy9C1X1MfYSAmVBR1c05iblSMFrysgRVwIQ4UNr0daD7sfPUJbfqF2lwKG2aBab41sQ3LfZC2P4or9Fjxs0zwreDp3PBfGLT8RLqnrYaonWfqqA.HFbA4ScgOFU3YsUD36CSod1cu1aMhtbccJD9ZvTP5g6hXLMYq4XXQT4zwgAx3zp7kjEm2x.epFpYZ2MQ8yYrvN4e6R2BbN0jPfWV1QWirpfSh2IKUzsCV3b3b-FK1BTKYlQCzzXoZRUGu8uxg--pzE11wMBKyMF12OavJpx4TXdey56gLDXLVdYUvFbzswfv2YlxQ7k6cNugvO8WgZbaJmQbalCJ.9gnN0sBfryrTRC79lEaLOjsPiOCTnIyDcECDuf-C")].journey.stages[*]'), expected);
214214
},
215+
216+
'matches $.quotes[*].journey.stages[?(@.id == 123)]': function() {
217+
var obj = JSON.parse(fs.readFileSync('test/fixtures/bing.json'));
218+
assert.equal(jsonpath(obj[0], '$.quotes[*].journey.stages[?(@.id == 7)]')[0].id, 7);
219+
assert.equal(jsonpath(obj[0], '$.quotes[*].journey.stages[?(@.id == 13)]')[0].id, 13);
220+
},
221+
222+
'matches $..stages[?(@.id == 123)]': function() {
223+
var obj = JSON.parse(fs.readFileSync('test/fixtures/bing.json'));
224+
assert.equal(jsonpath(obj[0], '$..stages[?(@.id == 7)]')[0].id, 7);
225+
assert.equal(jsonpath(obj[0], '$..stages[?(@.id == 13)]')[0].id, 13);
226+
}
215227
}
216228
}).export(module);

0 commit comments

Comments
 (0)