diff options
author | obscuren <geffobscura@gmail.com> | 2014-11-21 01:11:31 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-11-21 01:11:31 +0800 |
commit | 12f1aea38d6f9dd9748a95b2d9ea813ae16277a7 (patch) | |
tree | bb979543f80229244e6d3ebf8ef9c21d7b6f1370 /ptrie | |
parent | b05e63c34d335e65c8c76ed9a9401b74170db617 (diff) | |
download | go-tangerine-12f1aea38d6f9dd9748a95b2d9ea813ae16277a7.tar.gz go-tangerine-12f1aea38d6f9dd9748a95b2d9ea813ae16277a7.tar.zst go-tangerine-12f1aea38d6f9dd9748a95b2d9ea813ae16277a7.zip |
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.
Diffstat (limited to 'ptrie')
-rw-r--r-- | ptrie/iterator.go | 5 | ||||
-rw-r--r-- | ptrie/iterator_test.go | 5 | ||||
-rw-r--r-- | ptrie/trie_test.go | 3 |
3 files changed, 9 insertions, 4 deletions
diff --git a/ptrie/iterator.go b/ptrie/iterator.go index c6d4f64a0..5714bdbc8 100644 --- a/ptrie/iterator.go +++ b/ptrie/iterator.go @@ -65,9 +65,9 @@ func (self *Iterator) next(node Node, key []byte) []byte { } } else { cnode := node.Value() - skey := key[len(k):] var ret []byte + skey := key[len(k):] if trie.BeginsWith(key, k) { ret = self.next(cnode, skey) } else if bytes.Compare(k, key[:len(k)]) > 0 { @@ -93,7 +93,8 @@ func (self *Iterator) key(node Node) []byte { return k } else { - return self.key(node.Value()) + k := trie.RemTerm(node.Key()) + return append(k, self.key(node.Value())...) } case *FullNode: if node.Value() != nil { diff --git a/ptrie/iterator_test.go b/ptrie/iterator_test.go index 8921bb670..acfc03d63 100644 --- a/ptrie/iterator_test.go +++ b/ptrie/iterator_test.go @@ -8,12 +8,17 @@ func TestIterator(t *testing.T) { {"do", "verb"}, {"ether", "wookiedoo"}, {"horse", "stallion"}, + {"shaman", "horse"}, + {"doge", "coin"}, + {"dog", "puppy"}, + {"somethingveryoddindeedthis is", "myothernodedata"}, } v := make(map[string]bool) for _, val := range vals { v[val.k] = false trie.UpdateString(val.k, val.v) } + trie.Commit() it := trie.Iterator() for it.Next() { diff --git a/ptrie/trie_test.go b/ptrie/trie_test.go index dfc89709d..ba50f50a5 100644 --- a/ptrie/trie_test.go +++ b/ptrie/trie_test.go @@ -122,7 +122,6 @@ func TestEmptyValues(t *testing.T) { } func TestReplication(t *testing.T) { - t.Skip() trie := NewEmpty() vals := []struct{ k, v string }{ {"do", "verb"}, @@ -138,7 +137,7 @@ func TestReplication(t *testing.T) { for _, val := range vals { trie.UpdateString(val.k, val.v) } - trie.Hash() + trie.Commit() trie2 := New(trie.roothash, trie.cache.backend) if string(trie2.GetString("horse")) != "stallion" { |