From 7984cb6859c8e61af0990352e09c805d8d546feb Mon Sep 17 00:00:00 2001 From: Carson Farmer Date: Fri, 13 Dec 2019 11:48:54 -0800 Subject: [PATCH 1/3] feat: optimise prefix search Signed-off-by: Carson Farmer --- src/index.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/index.js b/src/index.js index 70a397f..b510c7c 100644 --- a/src/index.js +++ b/src/index.js @@ -105,12 +105,23 @@ class LevelDatastore { values = !q.keysOnly } + let opts = { + keys: true, + values: values, + keyAsBuffer: true + } + + // Let the db do the prefix matching + if (q.prefix != null) { + const prefix = q.prefix.toString() + // Match keys greater than or equal to `prefix` and + opts.gte = prefix + // less than `prefix` + \xFF (hex escape sequence) + opts.lt = prefix + '\xFF' + } + let it = levelIteratorToIterator( - this.db.db.iterator({ - keys: true, - values: values, - keyAsBuffer: true - }) + this.db.db.iterator(opts) ) it = map(it, ({ key, value }) => { @@ -121,10 +132,6 @@ class LevelDatastore { return res }) - if (q.prefix != null) { - it = filter(it, e => e.key.toString().startsWith(q.prefix)) - } - if (Array.isArray(q.filters)) { it = q.filters.reduce((it, f) => filter(it, f), it) } From 0d4e6fb56d11bf668e49a0db158d642a6a0252f0 Mon Sep 17 00:00:00 2001 From: Carson Farmer Date: Fri, 13 Dec 2019 12:00:20 -0800 Subject: [PATCH 2/3] style: fix linter issue Signed-off-by: Carson Farmer --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index b510c7c..ed0a2a0 100644 --- a/src/index.js +++ b/src/index.js @@ -105,7 +105,7 @@ class LevelDatastore { values = !q.keysOnly } - let opts = { + const opts = { keys: true, values: values, keyAsBuffer: true From a18813df46f69964df23c9f8d4c883aa0cf4f6c9 Mon Sep 17 00:00:00 2001 From: Carson Farmer Date: Mon, 16 Dec 2019 09:38:47 -0800 Subject: [PATCH 3/3] chore: remove avoid reaching into internal db Signed-off-by: Carson Farmer --- src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index ed0a2a0..a3760f7 100644 --- a/src/index.js +++ b/src/index.js @@ -121,7 +121,7 @@ class LevelDatastore { } let it = levelIteratorToIterator( - this.db.db.iterator(opts) + this.db.iterator(opts) ) it = map(it, ({ key, value }) => {