Fixed iterator for short nodes.

In some cases the iterator didn't properly return the correct key
because it didn't append fields to the reverse lookup.
This commit is contained in:
obscuren 2014-11-20 18:11:31 +01:00
parent b05e63c34d
commit 12f1aea38d
3 changed files with 9 additions and 4 deletions

View File

@ -65,9 +65,9 @@ func (self *Iterator) next(node Node, key []byte) []byte {
} }
} else { } else {
cnode := node.Value() cnode := node.Value()
skey := key[len(k):]
var ret []byte var ret []byte
skey := key[len(k):]
if trie.BeginsWith(key, k) { if trie.BeginsWith(key, k) {
ret = self.next(cnode, skey) ret = self.next(cnode, skey)
} else if bytes.Compare(k, key[:len(k)]) > 0 { } else if bytes.Compare(k, key[:len(k)]) > 0 {
@ -93,7 +93,8 @@ func (self *Iterator) key(node Node) []byte {
return k return k
} else { } else {
return self.key(node.Value()) k := trie.RemTerm(node.Key())
return append(k, self.key(node.Value())...)
} }
case *FullNode: case *FullNode:
if node.Value() != nil { if node.Value() != nil {

View File

@ -8,12 +8,17 @@ func TestIterator(t *testing.T) {
{"do", "verb"}, {"do", "verb"},
{"ether", "wookiedoo"}, {"ether", "wookiedoo"},
{"horse", "stallion"}, {"horse", "stallion"},
{"shaman", "horse"},
{"doge", "coin"},
{"dog", "puppy"},
{"somethingveryoddindeedthis is", "myothernodedata"},
} }
v := make(map[string]bool) v := make(map[string]bool)
for _, val := range vals { for _, val := range vals {
v[val.k] = false v[val.k] = false
trie.UpdateString(val.k, val.v) trie.UpdateString(val.k, val.v)
} }
trie.Commit()
it := trie.Iterator() it := trie.Iterator()
for it.Next() { for it.Next() {

View File

@ -122,7 +122,6 @@ func TestEmptyValues(t *testing.T) {
} }
func TestReplication(t *testing.T) { func TestReplication(t *testing.T) {
t.Skip()
trie := NewEmpty() trie := NewEmpty()
vals := []struct{ k, v string }{ vals := []struct{ k, v string }{
{"do", "verb"}, {"do", "verb"},
@ -138,7 +137,7 @@ func TestReplication(t *testing.T) {
for _, val := range vals { for _, val := range vals {
trie.UpdateString(val.k, val.v) trie.UpdateString(val.k, val.v)
} }
trie.Hash() trie.Commit()
trie2 := New(trie.roothash, trie.cache.backend) trie2 := New(trie.roothash, trie.cache.backend)
if string(trie2.GetString("horse")) != "stallion" { if string(trie2.GetString("horse")) != "stallion" {