getValues reverse iterator of dupSort DB ignores start option and always iterates from last value, while forward iterator works fine. getRange works as expected with both forward and reverse iterators.
import * as lmdb from "lmdb-store"
import _ from "lodash"
import assert from "assert"
const dbFile = "./lm.db"
const db = lmdb.open({path: dbFile, name: "db"})
const dupDb = db.openDB({name: "dup", dupSort: true, encoding: "ordered-binary"})
await dupDb.transactionAsync(() => {
for (let i = 0; i < 10; i++) {
db.put(i,`value ${i}`)
dupDb.put("key", i)
}
})
const forward = {start: 5, end: 9}
assert(_.isEqual(db.getRange(forward).map(e => e.key).asArray, [5, 6, 7, 8])) // Works fine
assert(_.isEqual(dupDb.getValues("key", forward).asArray, [5, 6, 7, 8])) // Works fine
const reverse = {start: 5, end: 1, reverse: true}
assert(_.isEqual(db.getRange(reverse).map(e => e.key).asArray, [5, 4, 3, 2])) // Works fine
assert(_.isEqual(dupDb.getValues("key", reverse).asArray, [9, 8, 7, 6, 5, 4, 3, 2])) // Start value is ignored :(
db.close()
getValues
reverse iterator of dupSort DB ignoresstart
option and always iterates from last value, while forward iterator works fine.getRange
works as expected with both forward and reverse iterators.lmdb-store - v1.6.6 node - v14.15.0