diff --git a/README.md b/README.md index 2815448..7d2638a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ The libraries tested are: | [json-query](https://www.npmjs.com/package/json-query) | [![npm](https://img.shields.io/npm/dw/json-query.svg)](https://www.npmjs.com/package/json-query) | ![GitHub last commit](https://img.shields.io/github/last-commit/mmckegg/json-query.svg) | | [jsonpath-plus](https://www.npmjs.com/package/jsonpath-plus) | [![npm](https://img.shields.io/npm/dw/jsonpath-plus.svg)](https://www.npmjs.com/package/jsonpath-plus) | ![GitHub last commit](https://img.shields.io/github/last-commit/s3u/JSONPath.svg) | | [jsonpath](https://www.npmjs.com/package/jsonpath) | [![npm](https://img.shields.io/npm/dw/jsonpath.svg)](https://www.npmjs.com/package/jsonpath) | ![GitHub last commit](https://img.shields.io/github/last-commit/dchester/jsonpath.svg) | +| [json-power-query](https://www.npmjs.com/package/json-power-query) | [![npm](https://img.shields.io/npm/dw/json-power-query.svg)](https://www.npmjs.com/package/json-power-query) | ![GitHub last commit](https://img.shields.io/github/last-commit/TotalTechGeek/json-power-query.svg) | | [JSONStream](https://www.npmjs.com/package/JSONStream) | [![npm](https://img.shields.io/npm/dw/JSONStream.svg)](https://www.npmjs.com/package/JSONStream) | ![GitHub last commit](https://img.shields.io/github/last-commit/dominictarr/JSONStream.svg) | | [oboe](https://www.npmjs.com/package/oboe) | [![npm](https://img.shields.io/npm/dw/oboe.svg)](https://www.npmjs.com/package/oboe) | ![GitHub last commit](https://img.shields.io/github/last-commit/jimhigson/oboe.js.svg) | | [map-filter-reduce](https://www.npmjs.com/package/map-filter-reduce) | [![npm](https://img.shields.io/npm/dw/map-filter-reduce.svg)](https://www.npmjs.com/package/map-filter-reduce) | ![GitHub last commit](https://img.shields.io/github/last-commit/dominictarr/map-filter-reduce.svg) | @@ -34,13 +35,13 @@ The performance test runs three queries on each of the libraries. All three quer ### Results -Ran using Macbook Pro, 2.2 GHz Intel Core i7, 16 GB 2400 MHz DDR4 +Ran using a 4.0 GHz Intel Core i7-4790k, 16 GB 1600 MHz DDR3 ``` $ npm run perf -> perf-json-querying@1.0.0 perf /Users/andrew/Code/scratchwork/perf-json-querying -> node --max-old-space-size=4096 src +> perf-json-querying@1.0.0 perf C:\Users\Jesse\Documents\Projects\json-querying-performance-testing +> node --max-old-space-size=4096 --expose-gc src smallCityLots 49998 items. mediumCityLots 99998 items. @@ -48,44 +49,52 @@ largeCityLots 206560 items. smallCityLots: - json-query: - - shallow took 0.0176 seconds. - - deep took 0.0502 seconds. - - conditional took 0.0408 seconds. + - shallow took 0.0087 seconds. + - deep took 0.0136 seconds. + - conditional took 0.0213 seconds. - jsonpath-plus: - - shallow took 0.4146 seconds. - - deep took 0.4239 seconds. - - conditional took 0.326 seconds. + - shallow took 0.3832 seconds. + - deep took 0.3916 seconds. + - conditional took 0.3685 seconds. - jsonpath: - - shallow took 1.1165 seconds. - - deep took 4.4373 seconds. - - conditional took 0.1387 seconds. + - shallow took 0.9513 seconds. + - deep took 5.5776 seconds. + - conditional took 0.04 seconds. +- json-power-query: + - shallow took 0.0053 seconds. + - deep took 0.0057 seconds. + - conditional took 0.0077 seconds. - JSONStream: - - shallow took 20.5 seconds. - - deep took 23.5372 seconds. + - shallow took 2.2002 seconds. + - deep took 2.2644 seconds. - oboe: - - shallow took 25.0891 seconds. - - deep took 32.5883 seconds. + - shallow took 2.7596 seconds. + - deep took 2.8447 seconds. - map-filter-reduce: mediumCityLots: - json-query: - - shallow took 0.0489 seconds. - - deep took 0.0732 seconds. - - conditional took 0.0488 seconds. + - shallow took 0.016 seconds. + - deep took 0.0309 seconds. + - conditional took 0.0255 seconds. - jsonpath-plus: - - shallow took 0.8285 seconds. - - deep took 0.8567 seconds. - - conditional took 0.6074 seconds. + - shallow took 0.7571 seconds. + - deep took 0.8095 seconds. + - conditional took 0.6889 seconds. - jsonpath: - - shallow took 2.2047 seconds. - - deep took 37.187 seconds. - - conditional took 0.2852 seconds. + - shallow took 1.9249 seconds. + - deep took 20.8872 seconds. + - conditional took 0.0761 seconds. +- json-power-query: + - shallow took 0.0075 seconds. + - deep took 0.01 seconds. + - conditional took 0.0087 seconds. - JSONStream: - - shallow took 199.4793 seconds. - - deep took 5.0332 seconds. + - shallow took 4.5227 seconds. + - deep took 4.6853 seconds. - oboe: - - shallow took 27.819 seconds. - - deep took 77.9259 seconds. + - shallow took 5.7411 seconds. + - deep took 5.9309 seconds. - map-filter-reduce: largeCityLots: @@ -94,19 +103,23 @@ json-query shallow failed, RangeError: Maximum call stack size exceeded. json-query deep failed, RangeError: Maximum call stack size exceeded. json-query conditional failed, RangeError: Maximum call stack size exceeded. - jsonpath-plus: - - shallow took 2.3345 seconds. - - deep took 2.472 seconds. - - conditional took 3.1351 seconds. + - shallow took 1.9852 seconds. + - deep took 2.0817 seconds. + - conditional took 1.5008 seconds. - jsonpath: - - shallow took 8.509 seconds. - - deep took 252.9623 seconds. - - conditional took 0.7586 seconds. + - shallow took 5.4554 seconds. + - deep took 88.787 seconds. + - conditional took 0.15 seconds. +- json-power-query: + - shallow took 0.0109 seconds. + - deep took 0.0127 seconds. + - conditional took 0.0143 seconds. - JSONStream: - - shallow took 54.8295 seconds. - - deep took 146.2962 seconds. + - shallow took 12.8073 seconds. + - deep took 13.0806 seconds. - oboe: - - shallow took 148.8824 seconds. - - deep took 216.7555 seconds. + - shallow took 16.3094 seconds. + - deep took 17.728 seconds. - map-filter-reduce: @@ -117,22 +130,24 @@ smallCityLots ┌───────────────────┬───────────────────┬───────────────────┬───────────────────┐ │ (index) │ shallow │ deep │ conditional │ ├───────────────────┼───────────────────┼───────────────────┼───────────────────┤ -│ json-query │ 0.0176 │ 0.0502 │ 0.0408 │ -│ jsonpath-plus │ 0.4146 │ 0.4239 │ 0.326 │ -│ jsonpath │ 1.1165 │ 4.4373 │ 0.1387 │ -│ JSONStream │ 20.5 │ 23.5372 │ 'not possible' │ -│ oboe │ 25.0891 │ 32.5883 │ 'not possible' │ +│ json-query │ 0.0087 │ 0.0136 │ 0.0213 │ +│ jsonpath-plus │ 0.3832 │ 0.3916 │ 0.3685 │ +│ jsonpath │ 0.9513 │ 5.5776 │ 0.04 │ +│ json-power-query │ 0.0053 │ 0.0057 │ 0.0077 │ +│ JSONStream │ 2.2002 │ 2.2644 │ 'not possible' │ +│ oboe │ 2.7596 │ 2.8447 │ 'not possible' │ │ map-filter-reduce │ 'not implemented' │ 'not implemented' │ 'not implemented' │ └───────────────────┴───────────────────┴───────────────────┴───────────────────┘ mediumCityLots ┌───────────────────┬───────────────────┬───────────────────┬───────────────────┐ │ (index) │ shallow │ deep │ conditional │ ├───────────────────┼───────────────────┼───────────────────┼───────────────────┤ -│ json-query │ 0.0489 │ 0.0732 │ 0.0488 │ -│ jsonpath-plus │ 0.8285 │ 0.8567 │ 0.6074 │ -│ jsonpath │ 2.2047 │ 37.187 │ 0.2852 │ -│ JSONStream │ 199.4793 │ 5.0332 │ 'not possible' │ -│ oboe │ 27.819 │ 77.9259 │ 'not possible' │ +│ json-query │ 0.016 │ 0.0309 │ 0.0255 │ +│ jsonpath-plus │ 0.7571 │ 0.8095 │ 0.6889 │ +│ jsonpath │ 1.9249 │ 20.8872 │ 0.0761 │ +│ json-power-query │ 0.0075 │ 0.01 │ 0.0087 │ +│ JSONStream │ 4.5227 │ 4.6853 │ 'not possible' │ +│ oboe │ 5.7411 │ 5.9309 │ 'not possible' │ │ map-filter-reduce │ 'not implemented' │ 'not implemented' │ 'not implemented' │ └───────────────────┴───────────────────┴───────────────────┴───────────────────┘ largeCityLots @@ -140,10 +155,11 @@ largeCityLots │ (index) │ shallow │ deep │ conditional │ ├───────────────────┼───────────────────┼───────────────────┼───────────────────┤ │ json-query │ 'failed' │ 'failed' │ 'failed' │ -│ jsonpath-plus │ 2.3345 │ 2.472 │ 3.1351 │ -│ jsonpath │ 8.509 │ 252.9623 │ 0.7586 │ -│ JSONStream │ 54.8295 │ 146.2962 │ 'not possible' │ -│ oboe │ 148.8824 │ 216.7555 │ 'not possible' │ +│ jsonpath-plus │ 1.9852 │ 2.0817 │ 1.5008 │ +│ jsonpath │ 5.4554 │ 88.787 │ 0.15 │ +│ json-power-query │ 0.0109 │ 0.0127 │ 0.0143 │ +│ JSONStream │ 12.8073 │ 13.0806 │ 'not possible' │ +│ oboe │ 16.3094 │ 17.728 │ 'not possible' │ │ map-filter-reduce │ 'not implemented' │ 'not implemented' │ 'not implemented' │ └───────────────────┴───────────────────┴───────────────────┴───────────────────┘ ``` diff --git a/package-lock.json b/package-lock.json index 16c2866..af457e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,11 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "JSONSelect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz", - "integrity": "sha1-oI7cxn6z/L6Z7WMIVTRKDPKCu40=" - }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -37,16 +32,6 @@ "concat-map": "0.0.1" } }, - "cjson": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.2.1.tgz", - "integrity": "sha1-c82KrWXZ4VBfmvF0TTt5wVJ2gqU=" - }, - "colors": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=" - }, "compare-at-paths": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/compare-at-paths/-/compare-at-paths-1.0.0.tgz", @@ -85,11 +70,6 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, - "ebnf-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/ebnf-parser/-/ebnf-parser-0.1.10.tgz", - "integrity": "sha1-zR9rpHfFY4xAyX7ZtXLbW6tdgzE=" - }, "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", @@ -114,19 +94,21 @@ } }, "escodegen": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.21.tgz", - "integrity": "sha1-U9ZSz6EDA4gnlFilJmxf/HCcY8M=", - "requires": { - "esprima": "~1.0.2", - "estraverse": "~0.0.4", - "source-map": ">= 0.1.2" + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" } } }, @@ -136,14 +118,14 @@ "integrity": "sha1-dqD9Zvz+FU/SkmZ9wmQBl1CxZXs=" }, "estraverse": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-0.0.4.tgz", - "integrity": "sha1-AaCTLf7ldGhKWYr1pnw7+bZCjbI=" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "fast-levenshtein": { "version": "2.0.6", @@ -239,35 +221,17 @@ "has-symbols": "^1.0.0" } }, - "jison": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/jison/-/jison-0.4.13.tgz", - "integrity": "sha1-kEFwfWIkE2f1iDRTK58ZwsNvrHg=", - "requires": { - "JSONSelect": "0.4.0", - "cjson": "~0.2.1", - "ebnf-parser": "~0.1.9", - "escodegen": "0.0.21", - "esprima": "1.0.x", - "jison-lex": "0.2.x", - "lex-parser": "~0.1.3", - "nomnom": "1.5.2" - }, - "dependencies": { - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" - } - } + "json-logic-engine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/json-logic-engine/-/json-logic-engine-1.1.2.tgz", + "integrity": "sha512-+ZADyOylLJO6P+hZDn5hgWcgAvaClRvGcDkBEyhSlnPHpsgWYU/ZxIA6YwB/08wzXWw8uJu6yNmyU8jfZN7bkg==" }, - "jison-lex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jison-lex/-/jison-lex-0.2.1.tgz", - "integrity": "sha1-rEuBXozOUTLrErXfz+jXB7iETf4=", + "json-power-query": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/json-power-query/-/json-power-query-1.1.0.tgz", + "integrity": "sha512-NpumP2F17BK1cYHURjYw9iFuTvKmqiGuVq208JSfDinnsxAqRIJVrk2lAbtfiPZr5a0hGmtBAmwfoCNQCFR1DA==", "requires": { - "lex-parser": "0.1.x", - "nomnom": "1.5.2" + "json-logic-engine": "^1.1.2" } }, "json-query": { @@ -281,20 +245,19 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "jsonpath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.0.1.tgz", - "integrity": "sha512-HY5kSg82LHIs0r0h9gYBwpNc1w1qGY0qJ7al01W1bJltsN2lp+mjjA/a79gXWuvD6Xf8oPkD2d5uKMZQXTGzqA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", "requires": { "esprima": "1.2.2", - "jison": "0.4.13", "static-eval": "2.0.2", - "underscore": "1.7.0" + "underscore": "1.12.1" } }, "jsonpath-plus": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.18.1.tgz", - "integrity": "sha512-4yQiuV641HROc4z9YGvnsr8yAdmzbu8JjdAen8WfiXsXewKvTG4ie2bSygF2maek9PcbtROmS6aLQs31BD+oNQ==" + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", + "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==" }, "levn": { "version": "0.3.0", @@ -305,11 +268,6 @@ "type-check": "~0.3.2" } }, - "lex-parser": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/lex-parser/-/lex-parser-0.1.4.tgz", - "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA=" - }, "libnested": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/libnested/-/libnested-1.4.1.tgz", @@ -341,22 +299,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, - "nomnom": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.5.2.tgz", - "integrity": "sha1-9DRUSKhTz71cDSYyDyR3qwUm/i8=", - "requires": { - "colors": "0.5.x", - "underscore": "1.1.x" - }, - "dependencies": { - "underscore": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz", - "integrity": "sha1-QLq4S60Z0jAJbo1u9ii/8FXYPbA=" - } - } - }, "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", @@ -368,9 +310,9 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "oboe": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.4.tgz", - "integrity": "sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", "requires": { "http-https": "^1.0.0" } @@ -384,16 +326,16 @@ } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "word-wrap": "~1.2.3" } }, "path-is-absolute": { @@ -431,14 +373,14 @@ } }, "pull-stream": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.11.tgz", - "integrity": "sha512-43brwtqO0OSltctKbW1mgzzKH4TNE8egkW+Y4BFzlDWiG2Ayl7VKr4SeuoKacfgPfUWcSwcPlHsf40BEqNR32A==" + "version": "3.6.14", + "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.6.14.tgz", + "integrity": "sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==" }, "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -462,20 +404,20 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "optional": true }, "split2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", - "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "requires": { "readable-stream": "^3.0.0" } @@ -486,36 +428,6 @@ "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", "requires": { "escodegen": "^1.8.1" - }, - "dependencies": { - "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", - "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true - } } }, "string.prototype.trim": { @@ -529,11 +441,11 @@ } }, "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "tape": { @@ -575,19 +487,19 @@ "integrity": "sha1-yIgvobsQksBgBal/NO9chQjjZk4=" }, "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wrappy": { "version": "1.0.2", diff --git a/package.json b/package.json index be1883e..c01426e 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,20 @@ "description": "", "main": "index.js", "scripts": { - "perf": "node --max-old-space-size=4096 src" + "perf": "node --max-old-space-size=4096 --expose-gc src" }, "keywords": [], "author": "Andrew Kaiser", "license": "MIT", "dependencies": { "JSONStream": "^1.3.5", + "json-power-query": "^1.1.0", "json-query": "^2.2.2", - "jsonpath": "^1.0.1", - "jsonpath-plus": "^0.18.1", + "jsonpath": "^1.1.1", + "jsonpath-plus": "^5.0.7", "map-filter-reduce": "^3.2.2", - "oboe": "^2.1.4", - "pull-stream": "^3.6.11", - "split2": "^3.1.1" + "oboe": "^2.1.5", + "pull-stream": "^3.6.14", + "split2": "^3.2.2" } } diff --git a/src/index.js b/src/index.js index 23c5275..8b1e38e 100644 --- a/src/index.js +++ b/src/index.js @@ -6,7 +6,8 @@ const performanceClasses = { jsonpath: require('./queriers/jsonpath'), JSONStream: require('./queriers/JSONStream'), oboe: require('./queriers/oboe'), - 'map-filter-reduce': require('./queriers/map-filter-reduce') + 'map-filter-reduce': require('./queriers/map-filter-reduce'), + 'json-power-query': require('./queriers/json-power-query') } const datasets = { smallCityLots: { @@ -54,6 +55,7 @@ const perf = (perfClasses, datasets) => async ( for (const method of testMethods) { try { await accessClass.setup() + global.gc() const start = performance.now() const result = await accessClass[method]() const stop = performance.now() @@ -114,6 +116,7 @@ const testLibraries = [ 'json-query', 'jsonpath-plus', 'jsonpath', + 'json-power-query', 'JSONStream', 'oboe', 'map-filter-reduce' diff --git a/src/queriers/json-power-query.js b/src/queriers/json-power-query.js new file mode 100644 index 0000000..7094162 --- /dev/null +++ b/src/queriers/json-power-query.js @@ -0,0 +1,22 @@ +const { queryBuilder } = require('json-power-query') +const CityLotsORM = require('./base-class') + + + +class JsonPowerQueryCity extends CityLotsORM { + execute(query) { + const f = queryBuilder(query) + return f(this.data) + } + shallow() { + return this.execute('$.features.*.properties') + } + deep() { + return this.execute('$.features.*.properties.BLOCK_NUM') + } + conditional() { + return this.execute(`$.features.[?(@.properties.STREET === 'UNKNOWN')].properties.BLOCK_NUM`) + } +} + +module.exports = JsonPowerQueryCity \ No newline at end of file