Skip to content

Commit d43cefd

Browse files
more changes for test file and function namings
1 parent 21a013c commit d43cefd

File tree

4 files changed

+133
-141
lines changed

4 files changed

+133
-141
lines changed

trie/iterator.go

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ type nodeIterator struct {
148148
pool []*nodeIteratorState // local pool for iterator states
149149

150150
// Fields for subtree iteration
151-
prefix []byte // Prefix for subtree iteration (nil for full trie)
152-
stop []byte // Stop boundary for subtree iteration (nil for full trie)
151+
startKey []byte // Start key for subtree iteration (nil for full trie)
152+
stopKey []byte // Stop key for subtree iteration (nil for full trie)
153153
}
154154

155155
// errIteratorEnd is stored in nodeIterator.err when iteration is done.
@@ -303,23 +303,23 @@ func (it *nodeIterator) Next(descend bool) bool {
303303

304304
// Check if we're still within the subtree boundaries
305305
// Note: path is already hex-encoded by the iterator
306-
if it.prefix != nil && len(path) > 0 {
307-
prefixHex := keybytesToHex(it.prefix)
308-
// Remove terminator from prefix hex if present
309-
if hasTerm(prefixHex) {
310-
prefixHex = prefixHex[:len(prefixHex)-1]
306+
if it.startKey != nil && len(path) > 0 {
307+
startKeyHex := keybytesToHex(it.startKey)
308+
// Remove terminator from startKey hex if present
309+
if hasTerm(startKeyHex) {
310+
startKeyHex = startKeyHex[:len(startKeyHex)-1]
311311
}
312-
if !bytes.HasPrefix(path, prefixHex) {
312+
if !bytes.HasPrefix(path, startKeyHex) {
313313
it.err = errIteratorEnd
314314
return false
315315
}
316316
}
317-
if it.stop != nil && len(path) > 0 {
318-
stopHex := keybytesToHex(it.stop)
319-
if hasTerm(stopHex) {
320-
stopHex = stopHex[:len(stopHex)-1]
317+
if it.stopKey != nil && len(path) > 0 {
318+
stopKeyHex := keybytesToHex(it.stopKey)
319+
if hasTerm(stopKeyHex) {
320+
stopKeyHex = stopKeyHex[:len(stopKeyHex)-1]
321321
}
322-
if bytes.Compare(path, stopHex) >= 0 {
322+
if bytes.Compare(path, stopKeyHex) >= 0 {
323323
it.err = errIteratorEnd
324324
return false
325325
}
@@ -867,25 +867,25 @@ func (it *unionIterator) Error() error {
867867
}
868868

869869
// NewSubtreeIterator creates an iterator that only traverses nodes within a subtree
870-
// defined by the given prefix and stopping point. The prefix defines where iteration
871-
// starts, and stop defines where it ends (exclusive).
872-
func NewSubtreeIterator(trie *Trie, prefix []byte, stop []byte) NodeIterator {
870+
// defined by the given startKey and stopKey. The startKey defines where iteration
871+
// starts, and stopKey defines where it ends (exclusive).
872+
func NewSubtreeIterator(trie *Trie, startKey, stopKey []byte) NodeIterator {
873873
if trie.Hash() == types.EmptyRootHash {
874874
return &nodeIterator{
875-
trie: trie,
876-
err: errIteratorEnd,
877-
prefix: prefix,
878-
stop: stop,
875+
trie: trie,
876+
err: errIteratorEnd,
877+
startKey: startKey,
878+
stopKey: stopKey,
879879
}
880880
}
881881
it := &nodeIterator{
882-
trie: trie,
883-
prefix: prefix,
884-
stop: stop,
882+
trie: trie,
883+
startKey: startKey,
884+
stopKey: stopKey,
885885
}
886-
// Seek to the starting position if prefix is provided
887-
if prefix != nil && len(prefix) > 0 {
888-
it.err = it.seek(prefix)
886+
// Seek to the starting position if startKey is provided
887+
if startKey != nil && len(startKey) > 0 {
888+
it.err = it.seek(startKey)
889889
} else {
890890
state, err := it.init()
891891
if err != nil {

trie/iterator_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,112 @@ func TestSubtreeIterator(t *testing.T) {
676676
}
677677
}
678678

679+
func TestPrefixIterator(t *testing.T) {
680+
// Create a new trie
681+
trie := NewEmpty(newTestDatabase(rawdb.NewMemoryDatabase(), rawdb.HashScheme))
682+
683+
// Insert test data
684+
testData := map[string]string{
685+
"key1": "value1",
686+
"key2": "value2",
687+
"key10": "value10",
688+
"key11": "value11",
689+
"different": "value_different",
690+
}
691+
692+
for key, value := range testData {
693+
trie.Update([]byte(key), []byte(value))
694+
}
695+
696+
// Test prefix iteration for "key1" prefix
697+
prefix := []byte("key1")
698+
iter, err := trie.NodeIteratorWithPrefix(prefix)
699+
if err != nil {
700+
t.Fatalf("Failed to create prefix iterator: %v", err)
701+
}
702+
703+
var foundKeys [][]byte
704+
for iter.Next(true) {
705+
if iter.Leaf() {
706+
foundKeys = append(foundKeys, iter.LeafKey())
707+
}
708+
}
709+
710+
if err := iter.Error(); err != nil {
711+
t.Fatalf("Iterator error: %v", err)
712+
}
713+
714+
// Verify only keys starting with "key1" were found
715+
expectedCount := 3 // "key1", "key10", "key11"
716+
if len(foundKeys) != expectedCount {
717+
t.Errorf("Expected %d keys, found %d", expectedCount, len(foundKeys))
718+
}
719+
720+
for _, key := range foundKeys {
721+
keyStr := string(key)
722+
if !bytes.HasPrefix(key, prefix) {
723+
t.Errorf("Found key %s doesn't have prefix %s", keyStr, string(prefix))
724+
}
725+
}
726+
}
727+
728+
func TestPrefixIteratorVsFullIterator(t *testing.T) {
729+
// Create a new trie with more structured data
730+
trie := NewEmpty(newTestDatabase(rawdb.NewMemoryDatabase(), rawdb.HashScheme))
731+
732+
// Insert structured test data
733+
testData := map[string]string{
734+
"aaa": "value_aaa",
735+
"aab": "value_aab",
736+
"aba": "value_aba",
737+
"bbb": "value_bbb",
738+
}
739+
740+
for key, value := range testData {
741+
trie.Update([]byte(key), []byte(value))
742+
}
743+
744+
// Test that prefix iterator stops at boundary
745+
prefix := []byte("aa")
746+
prefixIter, err := trie.NodeIteratorWithPrefix(prefix)
747+
if err != nil {
748+
t.Fatalf("Failed to create prefix iterator: %v", err)
749+
}
750+
751+
var prefixKeys [][]byte
752+
for prefixIter.Next(true) {
753+
if prefixIter.Leaf() {
754+
prefixKeys = append(prefixKeys, prefixIter.LeafKey())
755+
}
756+
}
757+
758+
// Should only find "aaa" and "aab", not "aba" or "bbb"
759+
if len(prefixKeys) != 2 {
760+
t.Errorf("Expected 2 keys with prefix 'aa', found %d", len(prefixKeys))
761+
}
762+
763+
// Verify no keys outside prefix were found
764+
for _, key := range prefixKeys {
765+
if !bytes.HasPrefix(key, prefix) {
766+
t.Errorf("Prefix iterator returned key %s outside prefix %s", string(key), string(prefix))
767+
}
768+
}
769+
}
770+
771+
func TestEmptyPrefixIterator(t *testing.T) {
772+
// Test with empty trie
773+
trie := NewEmpty(newTestDatabase(rawdb.NewMemoryDatabase(), rawdb.HashScheme))
774+
775+
iter, err := trie.NodeIteratorWithPrefix([]byte("nonexistent"))
776+
if err != nil {
777+
t.Fatalf("Failed to create iterator: %v", err)
778+
}
779+
780+
if iter.Next(true) {
781+
t.Error("Expected no results from empty trie")
782+
}
783+
}
784+
679785
func BenchmarkIterator(b *testing.B) {
680786
diskDb, srcDb, tr, _ := makeTestTrie(rawdb.HashScheme)
681787
root := tr.Hash()

trie/prefix_iterator_test.go

Lines changed: 0 additions & 114 deletions
This file was deleted.

trie/trie.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (t *Trie) NodeIteratorWithPrefix(prefix []byte) (NodeIterator, error) {
141141
if t.committed {
142142
return nil, ErrCommitted
143143
}
144-
// Use NewSubtreeIterator with just a prefix and no stop boundary
144+
// Use NewSubtreeIterator with just a startKey and no stopKey boundary
145145
return NewSubtreeIterator(t, prefix, nil), nil
146146
}
147147

0 commit comments

Comments
 (0)