Skip to content

Commit

Permalink
fix: add random test, fix off by one error (#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
kevmo314 authored Jan 22, 2024
1 parent 2d84074 commit 1a6008d
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
41 changes: 40 additions & 1 deletion pkg/btree/bptree.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func (t *BPTree) Insert(key ReferencedValue, value MemoryPointer) error {
p.node.Keys = append(p.node.Keys, midKey)
} else {
p.node.Keys = append(p.node.Keys[:j+1], p.node.Keys[j:]...)
p.node.Keys[j+1] = midKey
p.node.Keys[j] = midKey
}
p.node.Pointers = append(p.node.Pointers[:j+1], p.node.Pointers[j:]...)
p.node.Pointers[j] = MemoryPointer{Offset: uint64(noffset), Length: uint32(nsize)}
Expand Down Expand Up @@ -336,3 +336,42 @@ type Entry struct {
// }
// }
// }

func (t *BPTree) recursiveString(n *BPTreeNode, indent int) string {
// print the node itself
var buf bytes.Buffer
if !n.leaf() {
for i := range n.Pointers {
child, err := t.readNode(n.Pointers[i])
if err != nil {
return fmt.Sprintf("error: failed to read child node: %v", err)
}
buf.WriteString(t.recursiveString(child, indent+1))
if i < len(n.Pointers)-1 {
for i := 0; i < indent; i++ {
buf.WriteString(" ")
}
buf.WriteString(fmt.Sprintf("key %v\n", n.Keys[i]))
}
}
} else {
for i := range n.Pointers {
for i := 0; i < indent; i++ {
buf.WriteString(" ")
}
buf.WriteString(fmt.Sprintf("%v\n", n.Keys[i]))
}
}
return buf.String()
}

func (t *BPTree) String() string {
root, _, err := t.root()
if err != nil {
return fmt.Sprintf("error: failed to read root node: %v", err)
}
if root == nil {
return "empty tree"
}
return "b+ tree ---\n" + t.recursiveString(root, 0)
}
37 changes: 37 additions & 0 deletions pkg/btree/bptree_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package btree

import (
"encoding/binary"
"math/rand"
"testing"
)

Expand Down Expand Up @@ -208,6 +209,42 @@ func TestBPTree(t *testing.T) {
}
})

t.Run("random insertion test", func(t *testing.T) {
b := newSeekableBuffer()
p, err := NewPageFile(b)
if err != nil {
t.Fatal(err)
}
tree := NewBPTree(p, &testMetaPage{})
r := rand.New(rand.NewSource(12345))
for i := 0; i < 65536; i++ {
buf := make([]byte, 8)
if _, err := r.Read(buf); err != nil {
t.Fatal(err)
}
if err := tree.Insert(ReferencedValue{Value: buf}, MemoryPointer{Offset: uint64(i)}); err != nil {
t.Fatal(err)
}
}
s := rand.New(rand.NewSource(12345))
for i := 0; i < 65536; i++ {
buf := make([]byte, 8)
if _, err := s.Read(buf); err != nil {
t.Fatal(err)
}
v, found, err := tree.Find(buf)
if err != nil {
t.Fatal(err)
}
if !found {
t.Fatalf("expected to find key %d", i)
}
if v.Offset != uint64(i) {
t.Fatalf("expected value %d, got %d", i, v)
}
}
})

// t.Run("bulk insert", func(t *testing.T) {
// b := newSeekableBuffer()
// tree :=NewBPTree(b, 2)
Expand Down

0 comments on commit 1a6008d

Please sign in to comment.