Skip to content
This repository was archived by the owner on Mar 23, 2023. It is now read-only.

Commit 39ba735

Browse files
authored
feat: split .query into .query and .queryKeys (#70)
Applies changes from ipfs/interface-datastore/pull/87
1 parent 5aa1202 commit 39ba735

File tree

4 files changed

+68
-32
lines changed

4 files changed

+68
-32
lines changed

.aegir.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const esbuild = {
1010
/** @type {import('aegir').PartialOptions} */
1111
module.exports = {
1212
build: {
13-
bundlesizeMax: '65KB'
13+
bundlesizeMax: '67KB'
1414
},
1515
test: {
1616
browser: {

package.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@
4242
},
4343
"homepage": "https://github.com/ipfs/js-datastore-level#readme",
4444
"dependencies": {
45-
"datastore-core": "^3.0.0",
46-
"interface-datastore": "^3.0.6",
45+
"datastore-core": "^4.0.0",
46+
"interface-datastore": "^4.0.0",
47+
"it-filter": "^1.0.2",
48+
"it-map": "^1.0.5",
49+
"it-take": "^1.0.1",
4750
"level": "^6.0.1"
4851
},
4952
"devDependencies": {

src/index.js

+60-27
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@
33
const {
44
Key, Errors, Adapter,
55
utils: {
6-
filter, map, take, sortAll
6+
sortAll
77
}
88
} = require('interface-datastore')
9+
const filter = require('it-filter')
10+
const map = require('it-map')
11+
const take = require('it-take')
912

1013
/**
1114
* @typedef {import('interface-datastore').Datastore} Datastore
1215
* @typedef {import('interface-datastore').Pair} Pair
1316
* @typedef {import('interface-datastore').Batch} Batch
1417
* @typedef {import('interface-datastore').Query} Query
18+
* @typedef {import('interface-datastore').KeyQuery} KeyQuery
1519
* @typedef {import('interface-datastore').Options} QueryOptions
1620
*/
1721

@@ -159,41 +163,42 @@ class LevelDatastore extends Adapter {
159163

160164
/**
161165
* @param {Query} q
162-
* @returns {AsyncIterable<Pair>}
163166
*/
164167
query (q) {
165-
let values = true
166-
if (q.keysOnly != null) {
167-
values = !q.keysOnly
168+
let it = this._query({
169+
values: true,
170+
prefix: q.prefix
171+
})
172+
173+
if (Array.isArray(q.filters)) {
174+
it = q.filters.reduce((it, f) => filter(it, f), it)
168175
}
169176

170-
const opts = {
171-
keys: true,
172-
values: values,
173-
keyAsBuffer: true
177+
if (Array.isArray(q.orders)) {
178+
it = q.orders.reduce((it, f) => sortAll(it, f), it)
174179
}
175180

176-
// Let the db do the prefix matching
177-
if (q.prefix != null) {
178-
const prefix = q.prefix.toString()
179-
// Match keys greater than or equal to `prefix` and
180-
// @ts-ignore
181-
opts.gte = prefix
182-
// less than `prefix` + \xFF (hex escape sequence)
183-
// @ts-ignore
184-
opts.lt = prefix + '\xFF'
181+
const { offset, limit } = q
182+
if (offset) {
183+
let i = 0
184+
it = filter(it, () => i++ >= offset)
185185
}
186186

187-
let it = levelIteratorToIterator(
188-
this.db.iterator(opts)
189-
)
187+
if (limit) {
188+
it = take(it, limit)
189+
}
190190

191-
it = map(it, ({ key, value }) => {
192-
if (values) {
193-
return { key, value }
194-
}
195-
return /** @type {Pair} */({ key })
196-
})
191+
return it
192+
}
193+
194+
/**
195+
* @param {KeyQuery} q
196+
*/
197+
queryKeys (q) {
198+
let it = map(this._query({
199+
values: false,
200+
prefix: q.prefix
201+
}), ({ key }) => key)
197202

198203
if (Array.isArray(q.filters)) {
199204
it = q.filters.reduce((it, f) => filter(it, f), it)
@@ -202,6 +207,7 @@ class LevelDatastore extends Adapter {
202207
if (Array.isArray(q.orders)) {
203208
it = q.orders.reduce((it, f) => sortAll(it, f), it)
204209
}
210+
205211
const { offset, limit } = q
206212
if (offset) {
207213
let i = 0
@@ -214,6 +220,33 @@ class LevelDatastore extends Adapter {
214220

215221
return it
216222
}
223+
224+
/**
225+
* @param {object} opts
226+
* @param {boolean} opts.values
227+
* @param {string} [opts.prefix]
228+
* @returns {AsyncIterable<Pair>}
229+
*/
230+
_query (opts) {
231+
const iteratorOpts = {
232+
keys: true,
233+
keyAsBuffer: true,
234+
values: opts.values
235+
}
236+
237+
// Let the db do the prefix matching
238+
if (opts.prefix != null) {
239+
const prefix = opts.prefix.toString()
240+
// Match keys greater than or equal to `prefix` and
241+
// @ts-ignore
242+
iteratorOpts.gte = prefix
243+
// less than `prefix` + \xFF (hex escape sequence)
244+
// @ts-ignore
245+
iteratorOpts.lt = prefix + '\xFF'
246+
}
247+
248+
return levelIteratorToIterator(this.db.iterator(iteratorOpts))
249+
}
217250
}
218251

219252
/**

tsconfig.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"extends": "./node_modules/aegir/src/config/tsconfig.aegir.json",
2+
"extends": "aegir/src/config/tsconfig.aegir.json",
33
"compilerOptions": {
44
"outDir": "dist"
55
},
66
"include": [
7-
"test", // remove this line if you don't want to type-check tests
7+
"test",
88
"src"
99
]
1010
}

0 commit comments

Comments
 (0)