From 0e9a7b2372fec39317e67a7607007a968fa840ba Mon Sep 17 00:00:00 2001 From: happyZYM Date: Mon, 29 Apr 2024 16:01:50 +0000 Subject: [PATCH] initial try --- test/bpt_basic_test.cpp | 63 +++++++++++------------ test/oj_test_interface_for_bpt.cpp | 82 ++++++++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 36 deletions(-) diff --git a/test/bpt_basic_test.cpp b/test/bpt_basic_test.cpp index 8f4079e..1a13abd 100644 --- a/test/bpt_basic_test.cpp +++ b/test/bpt_basic_test.cpp @@ -777,7 +777,7 @@ TEST(RemoveTest, RM_1) { TEST(RemoveTest, RM_2) { const unsigned int RndSeed = testing::GTEST_FLAG(random_seed); - std::mt19937 rnd(RndSeed); + std::mt19937 rnd(1); const int str_len = 800; typedef bpt_basic_test::FixLengthString KeyType; fprintf(stderr, "sizeof(std::pair)=%lu\n", @@ -785,8 +785,8 @@ TEST(RemoveTest, RM_2) { const std::string db_file_name = "/tmp/bpt16.db"; remove(db_file_name.c_str()); std::vector> entries; - const int max_keys = 25; - const int keys_num_to_remove = 20; + const int max_keys = 700; + const int keys_num_to_remove = 699; for (int i = 1; i <= max_keys; i++) { KeyType key; for (size_t j = 0; j < str_len; j++) key.data[j] = 'a' + rnd() % 26; @@ -864,34 +864,31 @@ TEST(RemoveTest, RM_2) { } delete bpm; delete dm; - // dm = new DiskManager(db_file_name.c_str()); - // bpm = new BufferPoolManager(20, 3, dm); - // { - // BPlusTreeIndexer> bpt(bpm); - // ASSERT_EQ(bpt.Size(), entries.size()); - // for (int i = 0; i < entries.size(); i++) { - // ASSERT_EQ(bpt.Get(entries[i].first), entries[i].second); - // } - // sort(entries.begin(), entries.end()); - // for (int i = 0; i < entries.size(); i++) { - // ASSERT_EQ(bpt.Get(entries[i].first), entries[i].second); - // } - // auto it_std = entries.begin(); - // auto it_bpt_tmp = bpt.lower_bound_const(entries[6].first); - // ASSERT_EQ(it_bpt_tmp.GetValue(), entries[6].second); - // ASSERT_EQ(it_bpt_tmp.GetKey(), entries[6].first); - // auto it_bpt = bpt.lower_bound_const(entries[0].first); - // for (int i = 0; i < entries.size(); i++) { - // fprintf(stderr, "i=%d checking key[%d]=%s value[%d]=%d\n", i, i, it_std->first.data, i, it_std->second); - // ASSERT_TRUE(!(it_bpt == bpt.end_const())); - // ASSERT_EQ(it_bpt.GetKey(), it_std->first); - // ASSERT_EQ(it_bpt.GetValue(), it_std->second); - // ++it_bpt; - // it_std++; - // } - // ASSERT_TRUE(it_bpt == bpt.end_const()); - // ASSERT_EQ(bpt.Size(), entries.size()); - // } - // delete bpm; - // delete dm; + dm = new DiskManager(db_file_name.c_str()); + bpm = new BufferPoolManager(20, 3, dm); + { + BPlusTreeIndexer> bpt(bpm); + ASSERT_EQ(bpt.Size(), entries.size()); + for (int i = 0; i < entries.size(); i++) { + ASSERT_EQ(bpt.Get(entries[i].first), entries[i].second); + } + sort(entries.begin(), entries.end()); + for (int i = 0; i < entries.size(); i++) { + ASSERT_EQ(bpt.Get(entries[i].first), entries[i].second); + } + auto it_std = entries.begin(); + auto it_bpt = bpt.lower_bound_const(entries[0].first); + for (int i = 0; i < entries.size(); i++) { + fprintf(stderr, "i=%d checking key[%d]=%s value[%d]=%d\n", i, i, it_std->first.data, i, it_std->second); + ASSERT_TRUE(!(it_bpt == bpt.end_const())); + ASSERT_EQ(it_bpt.GetKey(), it_std->first); + ASSERT_EQ(it_bpt.GetValue(), it_std->second); + ++it_bpt; + it_std++; + } + ASSERT_TRUE(it_bpt == bpt.end_const()); + ASSERT_EQ(bpt.Size(), entries.size()); + } + delete bpm; + delete dm; } \ No newline at end of file diff --git a/test/oj_test_interface_for_bpt.cpp b/test/oj_test_interface_for_bpt.cpp index 4370393..a1e6442 100644 --- a/test/oj_test_interface_for_bpt.cpp +++ b/test/oj_test_interface_for_bpt.cpp @@ -1,5 +1,81 @@ -#include "bpt/disk_manager.h" -int main() -{ +#include +#include +#include +#include +#include +#include "bpt/bpt.hpp" +#include "bpt/buffer_pool_manager.h" +typedef uint64_t hash_t; +inline hash_t Hash(std::string str) noexcept { + constexpr static char salt1[10] = "mL;]-=eT"; + constexpr static char salt2[10] = "9B(str.c_str() + i); + ret ^= *reinterpret_cast(inner_salt + (i & 15)); + ret += 0x9e3779b97f4a7c15; + ret = (ret ^ (ret >> 30)) * 0xbf58476d1ce4e5b9; + ret = (ret ^ (ret >> 27)) * 0x94d049bb133111eb; + ret ^= ret >> 31; + } + for (; i < str.length(); ++i) { + ret ^= str[i]; + ret ^= inner_salt[i & 15]; + ret += 0x9e3779b97f4a7c15; + ret = (ret ^ (ret >> 30)) * 0xbf58476d1ce4e5b9; + ret = (ret ^ (ret >> 27)) * 0x94d049bb133111eb; + ret ^= ret >> 31; + } + return ret; +} +typedef std::pair ValType; +const int kIntMin = std::numeric_limits::min(); +int main() { + DiskManager *disk_manager = new DiskManager("data.db"); + BufferPoolManager *buffer_pool_manager = new BufferPoolManager(100, 10, disk_manager); + { + BPlusTreeIndexer> bpt(buffer_pool_manager); + int n; + std::ios::sync_with_stdio(false); + std::cin.tie(nullptr); + std::cout.tie(nullptr); + std::string op, index; + int val; + std::cin >> n; + while (n-- > 0) { + std::cin >> op; + if (op[0] == 'i') { + std::cin >> index >> val; + hash_t hsh = Hash(index); + bpt.Put({hsh, val}, 1); + } else if (op[0] == 'd') { + std::cin >> index >> val; + hash_t hsh = Hash(index); + bpt.Remove({hsh, val}); + } else if (op[0] == 'f') { + std::cin >> index; + hash_t hsh = Hash(index); + ValType marker = {hsh, kIntMin}; + auto it = bpt.lower_bound_const(marker); + bool has_value = false; + while (true) { + if (it == bpt.end_const()) break; + if (it.GetKey().first != hsh) break; + has_value = true; + std::cout << it.GetKey().second << ' '; + ++it; + } + if (!has_value) std::cout << "null"; + std::cout << '\n'; + } else + throw std::runtime_error("Invalid operation"); + } + } + delete buffer_pool_manager; + delete disk_manager; return 0; } \ No newline at end of file