kriszyp / lmdb-js

Simple, efficient, ultra-fast, scalable data store wrapper for LMDB
Other
484 stars 39 forks source link

Reverse values-iterator ignores `start` option. #86

Closed yurko7 closed 2 years ago

yurko7 commented 2 years ago

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()

lmdb-store - v1.6.6 node - v14.15.0

kriszyp commented 2 years ago

Thank you for the reports, committed fixes, but will do some more testing before publishing.

kriszyp commented 2 years ago

Should be fixed in v1.6.7.

yurko7 commented 2 years ago

Thank you for super-fast fix 🙂 Really appreciate it! 👍