From 83e94ba926425a5e3bf137786afd0f38deb4979b Mon Sep 17 00:00:00 2001 From: Aneesh Raman Date: Wed, 29 Jan 2025 15:13:44 -0500 Subject: [PATCH 1/3] [Integration] adding BP-tree to the benchmark - wip --- CMakeLists.txt | 3 +++ external/CMakeLists.txt | 17 ++++++++++++++++- src/bliss/bench_bptree.h | 34 ++++++++++++++++++++++++++++++++++ src/bliss_bench.cpp | 6 +++--- 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 src/bliss/bench_bptree.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 768a14f..4784db0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,7 @@ target_link_libraries(bliss PUBLIC skiplist pgm art + bptree ) target_include_directories(bliss PUBLIC @@ -82,6 +83,8 @@ target_compile_options(bliss PUBLIC "-fexceptions" "-fasynchronous-unwind-tables" "-march=native" + "-O3" + "-DNDEBUG" ) target_include_directories(bliss PUBLIC diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index 1c6cccf..6516bf4 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -114,4 +114,19 @@ if (NOT pgm_POPULATED) endif() add_library(pgm INTERFACE) -target_include_directories(pgm INTERFACE ${pgm_SOURCE_DIR}) \ No newline at end of file +target_include_directories(pgm INTERFACE ${pgm_SOURCE_DIR}) + +# wheatman/BP-Tree +FetchContent_Declare( + bptree + GIT_REPOSITORY https://github.com/wheatman/BP-Tree.git + GIT_TAG main +) + +FetchContent_GetProperties(bptree) +if(NOT bptree_POPULATED) + FetchContent_Populate(bptree) +endif() + +add_library(bptree INTERFACE) +target_include_directories(bptree INTERFACE ${bptree_SOURCE_DIR}) \ No newline at end of file diff --git a/src/bliss/bench_bptree.h b/src/bliss/bench_bptree.h new file mode 100644 index 0000000..9395d8e --- /dev/null +++ b/src/bliss/bench_bptree.h @@ -0,0 +1,34 @@ +#ifndef BLISS_BENCH_BTREE +#define BLISS_BENCH_BTREE + +#include +#include + +#include "bliss/bliss_index.h" +#include "spdlog/spdlog.h" + +// BP-Tree follows the tlx::btree_map implementation +namespace bliss { +template +class BlissBPTreeIndex : public BlissIndex { + public: + tlx::btree_map _index; + BlissBPTreeIndex() : _index() {}; + + void bulkload( + std::vector> values) override { + // expects the pairs to be pre-sorted before performing bulk load + this->_index.bulk_load(values.begin(), values.end()); + } + + bool get(KEY_TYPE key) override { return this->_index.exists(key); } + + void put(KEY_TYPE key, VALUE_TYPE value) override { + this->_index.insert(std::make_pair(key, value)); + } + + void end_routine() override {} +}; +} // namespace bliss + +#endif // !BLISS_BENCH_BPTREE \ No newline at end of file diff --git a/src/bliss_bench.cpp b/src/bliss_bench.cpp index 7150f6f..4020514 100644 --- a/src/bliss_bench.cpp +++ b/src/bliss_bench.cpp @@ -1,18 +1,16 @@ #include #include -#include "skip_list.h" #include -#include "include/pgm/pgm_index_dynamic.hpp" #include #include #include -#include "bliss/bench_pgm.h" #include "bliss/bench_alex.h" #include "bliss/bench_art.h" #include "bliss/bench_btree.h" #include "bliss/bench_lipp.h" +#include "bliss/bench_pgm.h" #include "bliss/bench_skiplist.h" #include "bliss/bliss_index.h" #include "bliss/util/args.h" @@ -20,6 +18,8 @@ #include "bliss/util/execute.h" #include "bliss/util/reader.h" #include "bliss/util/timer.h" +#include "include/pgm/pgm_index_dynamic.hpp" +#include "skip_list.h" using namespace bliss::utils; From bbd5ca4f881bc4546ca6d4242cf6eda11fabf7d9 Mon Sep 17 00:00:00 2001 From: Aneesh Raman Date: Wed, 29 Jan 2025 15:29:49 -0500 Subject: [PATCH 2/3] bptree tests - wip --- src/bliss/bench_bptree.h | 2 +- tests/CMakeLists.txt | 1 + tests/bliss_index_tests.h | 26 +++++++++++--------------- tests/test_bptree/CMakeLists.txt | 9 +++++++++ tests/test_bptree/bptree_tests.cpp | 7 +++++++ 5 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 tests/test_bptree/CMakeLists.txt create mode 100644 tests/test_bptree/bptree_tests.cpp diff --git a/src/bliss/bench_bptree.h b/src/bliss/bench_bptree.h index 9395d8e..1bd55f6 100644 --- a/src/bliss/bench_bptree.h +++ b/src/bliss/bench_bptree.h @@ -1,7 +1,7 @@ #ifndef BLISS_BENCH_BTREE #define BLISS_BENCH_BTREE -#include +#include #include #include "bliss/bliss_index.h" diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0999169..88ac61d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -19,3 +19,4 @@ add_subdirectory(test_lipp) add_subdirectory(test_btree) add_subdirectory(test_skiplist) add_subdirectory(test_art) +add_subdirectory(test_bptree) \ No newline at end of file diff --git a/tests/bliss_index_tests.h b/tests/bliss_index_tests.h index e11200c..d3b4b78 100644 --- a/tests/bliss_index_tests.h +++ b/tests/bliss_index_tests.h @@ -1,6 +1,5 @@ #ifndef BLISS_INDEX_TESTS_H #define BLISS_INDEX_TESTS_H -#include "include/pgm/pgm_index_dynamic.hpp" #include #include #include @@ -11,43 +10,40 @@ #include #include #include -#include -#include #include "bliss/bench_alex.h" #include "bliss/bench_art.h" +#include "bliss/bench_bptree.h" #include "bliss/bench_btree.h" #include "bliss/bench_lipp.h" -#include "bliss/bench_skiplist.h" #include "bliss/bench_pgm.h" +#include "bliss/bench_skiplist.h" #include "bliss/bliss_index.h" #include "bliss/util/args.h" #include "bliss/util/config.h" #include "bliss/util/execute.h" #include "bliss/util/reader.h" #include "bliss/util/timer.h" +#include "include/pgm/pgm_index_dynamic.hpp" using namespace bliss::utils; using key_type = unsigned long; using value_type = unsigned long; -class BlissIndexTest : public testing::Test -{ - protected: +class BlissIndexTest : public testing::Test { + protected: std::unique_ptr> index; - std::string indexes[6] = {"alex", "lipp", "btree", "skiplist", "pgm", "art"}; + std::string indexes[6] = {"alex", "lipp", "btree", + "skiplist", "pgm", "art"}; int num_keys = 100000; - void SetUp() - { - } + void SetUp() {} - void GenerateData(std::vector &data, int num_keys, bool sorted = true) - { - for (int i = 0; i < num_keys; i++) - { + void GenerateData(std::vector &data, int num_keys, + bool sorted = true) { + for (int i = 0; i < num_keys; i++) { data.push_back(i); } if (!sorted) { diff --git a/tests/test_bptree/CMakeLists.txt b/tests/test_bptree/CMakeLists.txt new file mode 100644 index 0000000..b44a9ac --- /dev/null +++ b/tests/test_bptree/CMakeLists.txt @@ -0,0 +1,9 @@ +get_filename_component(EXEC ${CMAKE_CURRENT_SOURCE_DIR} NAME) +file(GLOB_RECURSE CPP_TESTS "*_tests.cpp") +add_executable(${EXEC} ${CPP_TESTS}) +target_link_libraries(${EXEC} PRIVATE +bliss +bliss_test_infra +GTest::gtest_main) +include(GoogleTest) +gtest_discover_tests(${EXEC}) \ No newline at end of file diff --git a/tests/test_bptree/bptree_tests.cpp b/tests/test_bptree/bptree_tests.cpp new file mode 100644 index 0000000..8d1e79d --- /dev/null +++ b/tests/test_bptree/bptree_tests.cpp @@ -0,0 +1,7 @@ +#include "bliss_index_tests.h" + +class BPTreeTest : public BlissIndexTest {}; + +TEST_F(BPTreeTest, TestBPTree_Sorted) { + index.reset(new bliss::BlissBPTreeIndex()); +} \ No newline at end of file From 17131fa81465c73a822658c77b81269209c8fe68 Mon Sep 17 00:00:00 2001 From: Aneesh Raman Date: Mon, 10 Feb 2025 17:27:54 -0500 Subject: [PATCH 3/3] integrating bptree - wip --- src/bliss/bench_bptree.h | 4 ++-- tests/bliss_index_tests.h | 4 ++-- tests/test_bptree/bptree_tests.cpp | 10 ++++++++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/bliss/bench_bptree.h b/src/bliss/bench_bptree.h index 1bd55f6..31de7c5 100644 --- a/src/bliss/bench_bptree.h +++ b/src/bliss/bench_bptree.h @@ -1,11 +1,11 @@ #ifndef BLISS_BENCH_BTREE #define BLISS_BENCH_BTREE -#include +#include "tlx-leafds/container/btree_map.hpp" #include #include "bliss/bliss_index.h" -#include "spdlog/spdlog.h" +#include "spdlog/spdlog.h" // BP-Tree follows the tlx::btree_map implementation namespace bliss { diff --git a/tests/bliss_index_tests.h b/tests/bliss_index_tests.h index d3b4b78..3a8c783 100644 --- a/tests/bliss_index_tests.h +++ b/tests/bliss_index_tests.h @@ -34,8 +34,8 @@ using value_type = unsigned long; class BlissIndexTest : public testing::Test { protected: std::unique_ptr> index; - std::string indexes[6] = {"alex", "lipp", "btree", - "skiplist", "pgm", "art"}; + std::string indexes[7] = {"alex", "lipp", "btree", "skiplist", + "pgm", "art", "bptree"}; int num_keys = 100000; diff --git a/tests/test_bptree/bptree_tests.cpp b/tests/test_bptree/bptree_tests.cpp index 8d1e79d..f20113f 100644 --- a/tests/test_bptree/bptree_tests.cpp +++ b/tests/test_bptree/bptree_tests.cpp @@ -4,4 +4,14 @@ class BPTreeTest : public BlissIndexTest {}; TEST_F(BPTreeTest, TestBPTree_Sorted) { index.reset(new bliss::BlissBPTreeIndex()); + std::vector data; + GenerateData(data, num_keys); + + auto insert_start = data.begin(); + auto insert_end = data.end(); + executor::execute_inserts(*index, insert_start, insert_end); + + for (auto key : data) { + EXPECT_TRUE(index->get(key)); + } } \ No newline at end of file