2017-11-09 17:42:32 -05:00
|
|
|
package db
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2018-09-05 17:08:51 +04:00
|
|
|
"os"
|
2017-11-09 17:42:32 -05:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2017-12-17 13:11:28 -08:00
|
|
|
// Empty iterator for empty db.
|
2017-11-09 17:42:32 -05:00
|
|
|
func TestPrefixIteratorNoMatchNil(t *testing.T) {
|
2018-04-03 12:23:28 +02:00
|
|
|
for backend := range backends {
|
2017-11-09 17:42:32 -05:00
|
|
|
t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
|
2018-09-05 17:08:51 +04:00
|
|
|
db, dir := newTempDB(t, backend)
|
|
|
|
defer os.RemoveAll(dir)
|
2017-11-09 17:42:32 -05:00
|
|
|
itr := IteratePrefix(db, []byte("2"))
|
|
|
|
|
|
|
|
checkInvalid(t, itr)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-17 13:11:28 -08:00
|
|
|
// Empty iterator for db populated after iterator created.
|
2017-11-09 17:42:32 -05:00
|
|
|
func TestPrefixIteratorNoMatch1(t *testing.T) {
|
2018-04-03 12:23:28 +02:00
|
|
|
for backend := range backends {
|
2019-05-06 13:42:21 +04:00
|
|
|
if backend == BoltDBBackend {
|
|
|
|
t.Log("bolt does not support concurrent writes while iterating")
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2017-11-09 17:42:32 -05:00
|
|
|
t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
|
2018-09-05 17:08:51 +04:00
|
|
|
db, dir := newTempDB(t, backend)
|
|
|
|
defer os.RemoveAll(dir)
|
2017-11-09 17:42:32 -05:00
|
|
|
itr := IteratePrefix(db, []byte("2"))
|
|
|
|
db.SetSync(bz("1"), bz("value_1"))
|
|
|
|
|
|
|
|
checkInvalid(t, itr)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-17 13:11:28 -08:00
|
|
|
// Empty iterator for prefix starting after db entry.
|
2017-12-13 22:28:37 -05:00
|
|
|
func TestPrefixIteratorNoMatch2(t *testing.T) {
|
2018-04-03 12:23:28 +02:00
|
|
|
for backend := range backends {
|
2017-11-09 17:42:32 -05:00
|
|
|
t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
|
2018-09-05 17:08:51 +04:00
|
|
|
db, dir := newTempDB(t, backend)
|
|
|
|
defer os.RemoveAll(dir)
|
2017-11-09 17:42:32 -05:00
|
|
|
db.SetSync(bz("3"), bz("value_3"))
|
2017-12-12 20:38:03 -05:00
|
|
|
itr := IteratePrefix(db, []byte("4"))
|
2017-11-09 17:42:32 -05:00
|
|
|
|
|
|
|
checkInvalid(t, itr)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-17 13:11:28 -08:00
|
|
|
// Iterator with single val for db with single val, starting from that val.
|
2017-12-13 22:28:37 -05:00
|
|
|
func TestPrefixIteratorMatch1(t *testing.T) {
|
2018-04-03 12:23:28 +02:00
|
|
|
for backend := range backends {
|
2017-11-09 17:42:32 -05:00
|
|
|
t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
|
2018-09-05 17:08:51 +04:00
|
|
|
db, dir := newTempDB(t, backend)
|
|
|
|
defer os.RemoveAll(dir)
|
2017-12-13 22:28:37 -05:00
|
|
|
db.SetSync(bz("2"), bz("value_2"))
|
|
|
|
itr := IteratePrefix(db, bz("2"))
|
2017-11-09 17:42:32 -05:00
|
|
|
|
|
|
|
checkValid(t, itr, true)
|
2017-12-13 22:28:37 -05:00
|
|
|
checkItem(t, itr, bz("2"), bz("value_2"))
|
2017-11-09 17:42:32 -05:00
|
|
|
checkNext(t, itr, false)
|
|
|
|
|
|
|
|
// Once invalid...
|
|
|
|
checkInvalid(t, itr)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-17 13:11:28 -08:00
|
|
|
// Iterator with prefix iterates over everything with same prefix.
|
2017-12-13 22:28:37 -05:00
|
|
|
func TestPrefixIteratorMatches1N(t *testing.T) {
|
2018-04-03 12:23:28 +02:00
|
|
|
for backend := range backends {
|
2017-11-09 17:42:32 -05:00
|
|
|
t.Run(fmt.Sprintf("Prefix w/ backend %s", backend), func(t *testing.T) {
|
2018-09-05 17:08:51 +04:00
|
|
|
db, dir := newTempDB(t, backend)
|
|
|
|
defer os.RemoveAll(dir)
|
2017-11-09 17:42:32 -05:00
|
|
|
|
2017-12-13 22:28:37 -05:00
|
|
|
// prefixed
|
2017-11-09 17:42:32 -05:00
|
|
|
db.SetSync(bz("a/1"), bz("value_1"))
|
|
|
|
db.SetSync(bz("a/3"), bz("value_3"))
|
2017-12-13 22:28:37 -05:00
|
|
|
|
|
|
|
// not
|
|
|
|
db.SetSync(bz("b/3"), bz("value_3"))
|
|
|
|
db.SetSync(bz("a-3"), bz("value_3"))
|
|
|
|
db.SetSync(bz("a.3"), bz("value_3"))
|
|
|
|
db.SetSync(bz("abcdefg"), bz("value_3"))
|
|
|
|
itr := IteratePrefix(db, bz("a/"))
|
2017-11-09 17:42:32 -05:00
|
|
|
|
|
|
|
checkValid(t, itr, true)
|
|
|
|
checkItem(t, itr, bz("a/1"), bz("value_1"))
|
|
|
|
checkNext(t, itr, true)
|
|
|
|
checkItem(t, itr, bz("a/3"), bz("value_3"))
|
|
|
|
|
|
|
|
// Bad!
|
|
|
|
checkNext(t, itr, false)
|
|
|
|
|
2017-12-13 22:28:37 -05:00
|
|
|
//Once invalid...
|
2017-11-09 17:42:32 -05:00
|
|
|
checkInvalid(t, itr)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|