Skip to content

Commit e63b959

Browse files
committed
Node
1 parent 3f741ba commit e63b959

11 files changed

Lines changed: 326 additions & 177 deletions

File tree

secretary/btree.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,3 +313,9 @@ func (tree *BTree) BFSCompactBatchTraversal() []*Node {
313313

314314
return compactBatch
315315
}
316+
317+
func (tree *BTree) Erase() {
318+
tree.root = nil
319+
tree.NodeSeq = 0
320+
tree.NumNodeSeq = 0
321+
}

secretary/btree_test.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import (
99
)
1010

1111
func TestBTreeSerialization(t *testing.T) {
12-
s, originalTree := dummySecretary(t, 10)
12+
s := dummySecretary(t)
13+
tree := dummyTree(t, s, 10)
1314

14-
serializedData, err := binstruct.Serialize(originalTree)
15+
serializedData, err := binstruct.Serialize(tree)
1516
if err != nil {
1617
t.Fatalf("Serialization failed: %v", err)
1718
}
@@ -26,7 +27,7 @@ func TestBTreeSerialization(t *testing.T) {
2627
t.Fatalf("Deserialization failed: %v", err)
2728
}
2829

29-
eq, err := binstruct.Compare(originalTree, &deserializedTree)
30+
eq, err := binstruct.Compare(tree, &deserializedTree)
3031
if !eq || err != nil {
3132
t.Fatalf("\nShould be Equal\n")
3233
}
@@ -71,7 +72,8 @@ func TestBtreeInvalid(t *testing.T) {
7172
}
7273

7374
func TestBtreeSaveReadHeader(t *testing.T) {
74-
s, tree := dummySecretary(t, 10)
75+
s := dummySecretary(t)
76+
tree := dummyTree(t, s, 10)
7577

7678
err := tree.SaveHeader()
7779
if err != nil {
@@ -98,7 +100,8 @@ func TestBtreeSaveReadHeader(t *testing.T) {
98100
}
99101

100102
func TestBTreeHeight(t *testing.T) {
101-
s, tree := dummySecretary(t, 4)
103+
s := dummySecretary(t)
104+
tree := dummyTree(t, s, 4)
102105

103106
var keySeq uint64 = 0
104107

@@ -129,7 +132,7 @@ func TestBTreeHeight(t *testing.T) {
129132
}
130133

131134
func TestBTreeClose(t *testing.T) {
132-
s, _ := dummySecretary(t, 4)
135+
s := dummySecretary(t)
133136

134137
err := s.PagerShutdown()
135138
if err != nil {

secretary/go.mod

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ require (
1111
)
1212

1313
require (
14-
github.com/cespare/xxhash/v2 v2.3.0 // indirect
15-
github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect
16-
github.com/dustin/go-humanize v1.0.1 // indirect
17-
github.com/pkg/errors v0.9.1 // indirect
1814
github.com/stretchr/testify v1.10.0 // indirect
1915
golang.org/x/sys v0.30.0 // indirect
2016
golang.org/x/text v0.14.0 // indirect

secretary/go.sum

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,17 @@ buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.5-2025030720450
22
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.5-20250307204501-0409229c3780.1/go.mod h1:eOqrCVUfhh7SLo00urDe/XhJHljj0dWMZirS0aX7cmc=
33
connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
44
connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
5-
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
6-
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
75
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
86
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9-
github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I=
10-
github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4=
11-
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
12-
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
137
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
148
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
15-
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
16-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
179
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1810
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1911
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
2012
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
2113
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
2214
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
23-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
24-
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
15+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
2516
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
2617
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
2718
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=

secretary/node.go

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ func (tree *BTree) NodeVerify(node *Node) error {
3636
return ErrorKeysGTEOrder
3737
}
3838
if node != tree.root && len(node.Keys) < int(tree.minNumKeys) {
39-
fmt.Println(node.NodeID, utils.ArrayToStrings(node.Keys), tree.minNumKeys)
4039
return ErrorKeysLTOrder
4140
}
4241

@@ -352,46 +351,52 @@ func areRecordsSorted(records []*Record) bool {
352351
return true // Sorted
353352
}
354353

354+
func equiDivision(len int, max int) []int {
355+
numGroup := len / max
356+
if (len % max) != 0 {
357+
numGroup++
358+
}
359+
extraKeys := len % numGroup
360+
ends := make([]int, numGroup)
361+
for i := 0; i < numGroup; i++ {
362+
ends[i] = (len - extraKeys) / numGroup
363+
if i < extraKeys {
364+
ends[i]++
365+
}
366+
}
367+
// fmt.Println("ends", ends)
368+
return ends
369+
}
370+
355371
// SortedRecordSet: set sorted records into the B+ Tree efficiently
356372
func (tree *BTree) SortedRecordSet(sortedRecords []*Record) error {
357373
if !areRecordsSorted(sortedRecords) || len(sortedRecords) == 0 {
358374
return ErrorRecordsNotSorted
359375
}
360376

361-
o := len(sortedRecords) % (int(tree.Order-1) * int(tree.Order-1))
362-
leafNodes := tree.buildSortedLeafNodes(sortedRecords[:len(sortedRecords)-o])
363-
377+
leafNodes := tree.buildSortedLeafNodes(sortedRecords)
364378
tree.root = tree.buildInternalNodes(leafNodes)
365379

366-
// for _, r := range sortedRecords[len(sortedRecords)-o:] {
367-
// err := tree.Set(r.Key, r.Value)
368-
// if err != nil {
369-
// log.Fatal(err, r.Key)
370-
// }
371-
// }
372-
373-
// leafNodes := tree.buildSortedLeafNodes(sortedRecords)
374-
// tree.root = tree.buildInternalNodes(leafNodes)
375-
376380
return nil
377381
}
378382

379383
func (tree *BTree) buildSortedLeafNodes(sortedRecords []*Record) []*Node {
380-
// Step 1: Create leaf nodes
381384
leafNodes := []*Node{}
382-
for i := 0; i < len(sortedRecords); i += int(tree.Order) - 1 {
383-
end := i + int(tree.Order) - 1
384-
if end > len(sortedRecords) {
385-
end = len(sortedRecords)
386-
}
385+
386+
// fmt.Println("---", len(sortedRecords))
387+
ends := equiDivision(len(sortedRecords), int(tree.Order-1))
388+
389+
end := 0
390+
for i := 0; i < len(ends); i++ {
391+
start := end
392+
end = start + ends[i]
387393

388394
leaf := tree.createLeafNode()
389-
for j := i; j < end; j++ {
395+
for j := start; j < end; j++ {
390396
leaf.Keys = append(leaf.Keys, sortedRecords[j].Key)
391397
leaf.records = append(leaf.records, sortedRecords[j])
392398
}
393399

394-
// Link leaf nodes
395400
if len(leafNodes) > 0 {
396401
leafNodes[len(leafNodes)-1].next = leaf
397402
leaf.prev = leafNodes[len(leafNodes)-1]
@@ -409,30 +414,14 @@ func (tree *BTree) buildInternalNodes(children []*Node) *Node {
409414
return children[0] // Root node
410415
}
411416

412-
internalNodes := []*Node{}
417+
ends := equiDivision(len(children), int(tree.Order))
413418

414-
// group cant have less than 2 and more than tree.Order, there has to be 1 key atleast
415-
// Order 4 Keys : 3 Children : 1 : [1]
416-
// Order 4 Keys : 5 Children : 2 : [2]
417-
// Order 4 Keys : 8 Children : 3 : [3]
418-
// Order 4 Keys : 12 Children : 4 : [4]
419-
// Order 4 Keys : 14 Children : 5 : [3,2]
420-
// Order 4 Keys : 16 Children : 6 : [4,2]
421-
// Order 4 Keys : 20 Children : 7 : [4,3]
422-
// Order 4 Keys : 24 Children : 8 : [4,4]
423-
// Order 4 Keys : 26 Children : 9 : [4,3,2]
424-
425-
for start := 0; start < len(children); {
426-
var end int
427-
if (len(children)-start)%int(tree.Order) == 1 {
428-
end = start + int(tree.Order) - 1
429-
} else {
430-
end = start + int(tree.Order)
431-
}
419+
internalNodes := []*Node{}
432420

433-
if end > len(children) {
434-
end = len(children)
435-
}
421+
end := 0
422+
for i := 0; i < len(ends); i++ {
423+
start := end
424+
end = start + ends[i]
436425

437426
// Create an internal node from this chunk of children
438427
node := tree.createInternalNode(children[start:end])
@@ -449,12 +438,6 @@ func (tree *BTree) buildInternalNodes(children []*Node) *Node {
449438
}
450439

451440
internalNodes = append(internalNodes, node)
452-
453-
if (len(children)-start)%int(tree.Order) == 1 {
454-
start += int(tree.Order) - 1
455-
} else {
456-
start += int(tree.Order)
457-
}
458441
}
459442

460443
return tree.buildInternalNodes(internalNodes)

0 commit comments

Comments
 (0)