From a487c34b4a7d081a6649008e9ebe27ad0a1aaaae Mon Sep 17 00:00:00 2001 From: chirst Date: Thu, 27 Jun 2024 18:44:30 -0600 Subject: [PATCH] high amount of rows --- db/db_test.go | 3 +-- kv/kv.go | 3 +++ kv/kv_test.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/db/db_test.go b/db/db_test.go index e0b6d4c..f299d7d 100644 --- a/db/db_test.go +++ b/db/db_test.go @@ -66,7 +66,7 @@ func TestExecute(t *testing.T) { if createRes.Err != nil { t.Fatal(createRes.Err.Error()) } - expectedTotal := 5000 + expectedTotal := 100_000 for i := 0; i < expectedTotal; i += 1 { insertSql := "INSERT INTO test (junk) VALUES ('asdf')" insertRes := db.Execute(insertSql) @@ -84,6 +84,5 @@ func TestExecute(t *testing.T) { if gotT := len(selectRes.ResultRows) - 1; expectedTotal != gotT { t.Fatalf("expected %d got %d", expectedTotal, gotT) } - }) } diff --git a/kv/kv.go b/kv/kv.go index 5e657eb..68b2ec9 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -138,6 +138,7 @@ func (kv *KV) splitPage(page *pager.Page) (left, right *pager.Page) { hasParent, _ := page.GetParentPageNumber() _, parentLeftPageNumber := page.GetLeftPageNumber() _, parentRightPageNumber := page.GetRightPageNumber() + parentType := page.GetType() entries := page.GetEntries() // If it is splitting the root page should make two new nodes so the // root can keep the same page number. Otherwise will only need to split @@ -148,9 +149,11 @@ func (kv *KV) splitPage(page *pager.Page) (left, right *pager.Page) { } leftEntries := entries[:len(entries)/2] leftPage.SetEntries(leftEntries) + leftPage.SetType(parentType) rightPage := kv.pager.NewPage() rightEntries := entries[len(entries)/2:] rightPage.SetEntries(rightEntries) + rightPage.SetType(parentType) // Set relative left page's right page if parentLeftPageNumber != 0 { kv.pager.GetPage(parentLeftPageNumber).SetRightPageNumber(leftPage.GetNumber()) diff --git a/kv/kv_test.go b/kv/kv_test.go index 2e52516..20dcf64 100644 --- a/kv/kv_test.go +++ b/kv/kv_test.go @@ -58,4 +58,79 @@ func TestKv(t *testing.T) { t.Errorf("expected value %v got %v", rv, res) } }) + + t.Run("test bulk insert and get", func(t *testing.T) { + kv, _ := New(true) + amount := 500_000 + kv.BeginWriteTransaction() + for i := 1; i <= amount; i += 1 { + k, err := EncodeKey(i) + if err != nil { + t.Fatal(err.Error()) + } + v, err := Encode([]any{i}) + if err != nil { + t.Fatal(err.Error()) + } + err = kv.Set(1, k, v) + if err != nil { + t.Fatal(err.Error()) + } + } + kv.EndWriteTransaction() + + midProbe := amount / 2 + mpk, err := EncodeKey(midProbe) + if err != nil { + t.Fatal(err.Error()) + } + mr, _, err := kv.Get(1, mpk) + if err != nil { + t.Fatal(err.Error()) + } + mrv, err := Decode(mr) + if err != nil { + t.Fatal(err.Error()) + } + mrvi := mrv[0].(int) + if mrvi != midProbe { + t.Fatalf("want mid to be %d got %d", midProbe, mrv) + } + + leftProbe := 1 + lpk, err := EncodeKey(leftProbe) + if err != nil { + t.Fatal(err.Error()) + } + lr, _, err := kv.Get(1, lpk) + if err != nil { + t.Fatal(err.Error()) + } + lrv, err := Decode(lr) + if err != nil { + t.Fatal(err.Error()) + } + lrvi := lrv[0].(int) + if lrvi != leftProbe { + t.Fatalf("want left to be %d got %d", leftProbe, lrv) + } + + rightProbe := amount + rpk, err := EncodeKey(rightProbe) + if err != nil { + t.Fatal(err.Error()) + } + rr, _, err := kv.Get(1, rpk) + if err != nil { + t.Fatal(err.Error()) + } + rrv, err := Decode(rr) + if err != nil { + t.Fatal(err.Error()) + } + rrvi := rrv[0].(int) + if rrvi != rightProbe { + t.Fatalf("want right to be %d got %d", rightProbe, rrv) + } + }) }