diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2023-11-07 13:35:54 -0500 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2023-11-07 13:35:54 -0500 |
| commit | 9e1c1b1b930031896851b1ed4a15152508327d73 (patch) | |
| tree | df6b43e48277ba9cdd8d677054180be55c071040 | |
| parent | a2fe4b1616a1b2318f70e842382818ee44aea9e6 (diff) | |
| download | dynamic-extension-9e1c1b1b930031896851b1ed4a15152508327d73.tar.gz | |
Converted WIRS to the new interface
| -rw-r--r-- | include/query/wirs.h | 240 | ||||
| -rw-r--r-- | include/shard/AugBTree.h (renamed from include/shard/WIRS.h) | 351 | ||||
| -rw-r--r-- | tests/augbtree_tests.cpp (renamed from tests/wirs_tests.cpp) | 67 |
3 files changed, 338 insertions, 320 deletions
diff --git a/include/query/wirs.h b/include/query/wirs.h new file mode 100644 index 0000000..1113b1d --- /dev/null +++ b/include/query/wirs.h @@ -0,0 +1,240 @@ +/* + * include/query/wirs.h + * + * Copyright (C) 2023 Douglas B. Rumbaugh <drumbaugh@psu.edu> + * + * All rights reserved. Published under the Modified BSD License. + * + */ +#pragma once + +#include "framework/interface/Record.h" +#include "framework/interface/Shard.h" +#include "framework/structure/MutableBuffer.h" +#include "psu-ds/Alias.h" + +namespace de { namespace wirs { + +template <WeightedRecordInterface R> +struct Parms { + decltype(R::key) lower_bound; + decltype(R::key) upper_bound; + size_t sample_size; + gsl_rng *rng; +}; + +template <WeightedRecordInterface R> +struct State { + decltype(R::weight) total_weight; + std::vector<void*> nodes; + psudb::Alias* top_level_alias; + size_t sample_size; + + State() { + total_weight = 0; + top_level_alias = nullptr; + } + + ~State() { + if (top_level_alias) delete top_level_alias; + } +}; + +template <RecordInterface R> +struct BufferState { + size_t cutoff; + psudb::Alias* alias; + std::vector<Wrapped<R>> records; + decltype(R::weight) max_weight; + size_t sample_size; + decltype(R::weight) total_weight; + + ~BufferState() { + delete alias; + } +}; + +template <ShardInterface S, RecordInterface R, bool Rejection=true> +class Query { +public: + constexpr static bool EARLY_ABORT=false; + constexpr static bool SKIP_DELETE_FILTER=false; + + static void *get_query_state(S *shard, void *parms) { + auto res = new State<R>(); + decltype(R::key) lower_key = ((Parms<R> *) parms)->lower_bound; + decltype(R::key) upper_key = ((Parms<R> *) parms)->upper_bound; + + std::vector<decltype(R::weight)> weights; + res->total_weight = shard->find_covering_nodes(lower_key, upper_key, res->nodes, weights); + + std::vector<double> normalized_weights; + for (auto weight : weights) { + normalized_weights.emplace_back(weight / res->total_weight); + } + + res->top_level_alias = new psudb::Alias(normalized_weights); + res->sample_size = 0; + + return res; + } + + static void* get_buffer_query_state(MutableBuffer<R> *buffer, void *parms) { + BufferState<R> *state = new BufferState<R>(); + auto parameters = (Parms<R>*) parms; + + if constexpr (Rejection) { + state->cutoff = buffer->get_record_count() - 1; + state->max_weight = buffer->get_max_weight(); + state->total_weight = buffer->get_total_weight(); + state->sample_size = 0; + return state; + } + + std::vector<decltype(R::weight)> weights; + + state->cutoff = buffer->get_record_count() - 1; + decltype(R::weight) total_weight = 0; + + for (size_t i = 0; i <= state->cutoff; i++) { + auto rec = buffer->get_data() + i; + + if (rec->rec.key >= parameters->lower_bound && rec->rec.key <= parameters->upper_bound && !rec->is_tombstone() && !rec->is_deleted()) { + weights.push_back(rec->rec.weight); + state->records.push_back(*rec); + total_weight += rec->rec.weight; + } + } + + std::vector<double> normalized_weights; + for (size_t i = 0; i < weights.size(); i++) { + normalized_weights.push_back(weights[i] / total_weight); + } + + state->total_weight = total_weight; + state->alias = new psudb::Alias(normalized_weights); + state->sample_size = 0; + + return state; + } + + static void process_query_states(void *query_parms, std::vector<void*> &shard_states, std::vector<void*> &buffer_states) { + auto p = (Parms<R> *) query_parms; + + std::vector<size_t> shard_sample_sizes(shard_states.size()+buffer_states.size(), 0); + size_t buffer_sz = 0; + + std::vector<decltype(R::weight)> weights; + + decltype(R::weight) total_weight = 0; + for (auto &s : buffer_states) { + auto bs = (BufferState<R> *) s; + total_weight += bs->total_weight; + weights.push_back(bs->total_weight); + } + + for (auto &s : shard_states) { + auto state = (State<R> *) s; + total_weight += state->total_weight; + weights.push_back(state->total_weight); + } + + std::vector<double> normalized_weights; + for (auto w : weights) { + normalized_weights.push_back((double) w / (double) total_weight); + } + + auto shard_alias = psudb::Alias(normalized_weights); + for (size_t i=0; i<p->sample_size; i++) { + auto idx = shard_alias.get(p->rng); + + if (idx < buffer_states.size()) { + auto state = (BufferState<R> *) buffer_states[idx]; + state->sample_size++; + } else { + auto state = (State<R> *) shard_states[idx - buffer_states.size()]; + state->sample_size++; + } + } + } + + static std::vector<Wrapped<R>> query(S *shard, void *q_state, void *parms) { + auto lower_key = ((Parms<R> *) parms)->lower_bound; + auto upper_key = ((Parms<R> *) parms)->upper_bound; + auto rng = ((Parms<R> *) parms)->rng; + + auto state = (State<R> *) q_state; + auto sample_size = state->sample_size; + + std::vector<Wrapped<R>> result_set; + + if (sample_size == 0) { + return result_set; + } + size_t cnt = 0; + size_t attempts = 0; + + for (size_t i=0; i<sample_size; i++) { + auto rec = shard->get_weighted_sample(lower_key, upper_key, + state->nodes[state->top_level_alias->get(rng)], + rng); + if (rec) { + result_set.emplace_back(*rec); + } + } + + return result_set; + } + + static std::vector<Wrapped<R>> buffer_query(MutableBuffer<R> *buffer, void *state, void *parms) { + auto st = (BufferState<R> *) state; + auto p = (Parms<R> *) parms; + + std::vector<Wrapped<R>> result; + result.reserve(st->sample_size); + + if constexpr (Rejection) { + for (size_t i=0; i<st->sample_size; i++) { + auto idx = gsl_rng_uniform_int(p->rng, st->cutoff); + auto rec = buffer->get_data() + idx; + + auto test = gsl_rng_uniform(p->rng) * st->max_weight; + + if (test <= rec->rec.weight && rec->rec.key >= p->lower_bound && rec->rec.key <= p->upper_bound) { + result.emplace_back(*rec); + } + } + return result; + } + + for (size_t i=0; i<st->sample_size; i++) { + auto idx = st->alias->get(p->rng); + result.emplace_back(st->records[idx]); + } + + return result; + } + + static std::vector<R> merge(std::vector<std::vector<Wrapped<R>>> &results, void *parms) { + std::vector<R> output; + + for (size_t i=0; i<results.size(); i++) { + for (size_t j=0; j<results[i].size(); j++) { + output.emplace_back(results[i][j].rec); + } + } + + return output; + } + + static void delete_query_state(void *state) { + auto s = (State<R> *) state; + delete s; + } + + static void delete_buffer_query_state(void *state) { + auto s = (BufferState<R> *) state; + delete s; + } +}; +}} diff --git a/include/shard/WIRS.h b/include/shard/AugBTree.h index bf29325..e32ec64 100644 --- a/include/shard/WIRS.h +++ b/include/shard/AugBTree.h @@ -1,5 +1,5 @@ /* - * include/shard/WIRS.h + * include/shard/AugBTree.h * * Copyright (C) 2023 Dong Xie <dongx@psu.edu> * Douglas B. Rumbaugh <drumbaugh@psu.edu> @@ -35,73 +35,23 @@ namespace de { thread_local size_t wirs_cancelations = 0; template <WeightedRecordInterface R> -struct wirs_query_parms { - decltype(R::key) lower_bound; - decltype(R::key) upper_bound; - size_t sample_size; - gsl_rng *rng; -}; - -template <WeightedRecordInterface R, bool Rejection> -class WIRSQuery; - -template <WeightedRecordInterface R> -struct wirs_node { - struct wirs_node<R> *left, *right; +struct AugBTreeNode { + struct AugBTreeNode<R> *left, *right; decltype(R::key) low, high; decltype(R::weight) weight; Alias* alias; }; template <WeightedRecordInterface R> -struct WIRSState { - decltype(R::weight) total_weight; - std::vector<wirs_node<R>*> nodes; - Alias* top_level_alias; - size_t sample_size; - - WIRSState() { - total_weight = 0; - top_level_alias = nullptr; - } - - ~WIRSState() { - if (top_level_alias) delete top_level_alias; - } -}; - -template <WeightedRecordInterface R> -struct WIRSBufferState { - size_t cutoff; - Alias* alias; - std::vector<Wrapped<R>> records; - decltype(R::weight) max_weight; - size_t sample_size; - decltype(R::weight) total_weight; - - ~WIRSBufferState() { - delete alias; - } - -}; - -template <WeightedRecordInterface R> -class WIRS { +class AugBTree { private: - typedef decltype(R::key) K; typedef decltype(R::value) V; typedef decltype(R::weight) W; public: - - // FIXME: there has to be a better way to do this - friend class WIRSQuery<R, true>; - friend class WIRSQuery<R, false>; - - WIRS(MutableBuffer<R>* buffer) + AugBTree(MutableBuffer<R>* buffer) : m_reccnt(0), m_tombstone_cnt(0), m_total_weight(0), m_root(nullptr) { - m_alloc_size = (buffer->get_record_count() * sizeof(Wrapped<R>)) + (CACHELINE_SIZE - (buffer->get_record_count() * sizeof(Wrapped<R>)) % CACHELINE_SIZE); assert(m_alloc_size % CACHELINE_SIZE == 0); m_data = (Wrapped<R>*)std::aligned_alloc(CACHELINE_SIZE, m_alloc_size); @@ -148,7 +98,7 @@ public: } } - WIRS(WIRS** shards, size_t len) + AugBTree(AugBTree** shards, size_t len) : m_reccnt(0), m_tombstone_cnt(0), m_total_weight(0), m_root(nullptr) { std::vector<Cursor<Wrapped<R>>> cursors; cursors.reserve(len); @@ -208,7 +158,7 @@ public: } } - ~WIRS() { + ~AugBTree() { if (m_data) free(m_data); for (size_t i=0; i<m_alias.size(); i++) { if (m_alias[i]) delete m_alias[i]; @@ -257,15 +207,13 @@ public: size_t get_memory_usage() { - return m_alloc_size + m_node_cnt * sizeof(wirs_node<Wrapped<R>>); + return m_alloc_size + m_node_cnt * sizeof(AugBTreeNode<Wrapped<R>>); } size_t get_aux_memory_usage() { return 0; } -private: - size_t get_lower_bound(const K& key) const { size_t min = 0; size_t max = m_reccnt - 1; @@ -284,13 +232,60 @@ private: return min; } - bool covered_by(struct wirs_node<R>* node, const K& lower_key, const K& upper_key) { + W find_covering_nodes(K lower_key, K upper_key, std::vector<void *> &nodes, std::vector<W> &weights) { + W total_weight = 0; + + /* Simulate a stack to unfold recursion. */ + struct AugBTreeNode<R>* st[64] = {0}; + st[0] = m_root; + size_t top = 1; + while(top > 0) { + auto now = st[--top]; + if (covered_by(now, lower_key, upper_key) || + (now->left == nullptr && now->right == nullptr && intersects(now, lower_key, upper_key))) { + nodes.emplace_back(now); + weights.emplace_back(now->weight); + total_weight += now->weight; + } else { + if (now->left && intersects(now->left, lower_key, upper_key)) st[top++] = now->left; + if (now->right && intersects(now->right, lower_key, upper_key)) st[top++] = now->right; + } + } + + + return total_weight; + } + + Wrapped<R> *get_weighted_sample(K lower_key, K upper_key, void *internal_node, gsl_rng *rng) { + /* k -> sampling: three levels. 1. select a node -> select a fat point -> select a record. */ + + /* first level */ + auto node = (AugBTreeNode<R>*) internal_node; + + /* second level */ + auto fat_point = node->low + node->alias->get(rng); + + /* third level */ + size_t rec_offset = fat_point * m_group_size + m_alias[fat_point]->get(rng); + auto record = m_data + rec_offset; + + /* bounds rejection */ + if (lower_key > record->rec.key || upper_key < record->rec.key) { + return nullptr; + } + + return record; + } + +private: + + bool covered_by(struct AugBTreeNode<R>* node, const K& lower_key, const K& upper_key) { auto low_index = node->low * m_group_size; auto high_index = std::min((node->high + 1) * m_group_size - 1, m_reccnt - 1); return lower_key < m_data[low_index].rec.key && m_data[high_index].rec.key < upper_key; } - bool intersects(struct wirs_node<R>* node, const K& lower_key, const K& upper_key) { + bool intersects(struct AugBTreeNode<R>* node, const K& lower_key, const K& upper_key) { auto low_index = node->low * m_group_size; auto high_index = std::min((node->high + 1) * m_group_size - 1, m_reccnt - 1); return lower_key < m_data[high_index].rec.key && m_data[low_index].rec.key < upper_key; @@ -327,12 +322,12 @@ private: assert(weights.size() == n_groups); - m_root = construct_wirs_node(weights, 0, n_groups-1); + m_root = construct_AugBTreeNode(weights, 0, n_groups-1); } - struct wirs_node<R>* construct_wirs_node(const std::vector<W>& weights, size_t low, size_t high) { + struct AugBTreeNode<R>* construct_AugBTreeNode(const std::vector<W>& weights, size_t low, size_t high) { if (low == high) { - return new wirs_node<R>{nullptr, nullptr, low, high, weights[low], new Alias({1.0})}; + return new AugBTreeNode<R>{nullptr, nullptr, low, high, weights[low], new Alias({1.0})}; } else if (low > high) return nullptr; std::vector<double> node_weights; @@ -348,12 +343,12 @@ private: m_node_cnt += 1; size_t mid = (low + high) / 2; - return new wirs_node<R>{construct_wirs_node(weights, low, mid), - construct_wirs_node(weights, mid + 1, high), + return new AugBTreeNode<R>{construct_AugBTreeNode(weights, low, mid), + construct_AugBTreeNode(weights, mid + 1, high), low, high, sum, new Alias(node_weights)}; } - void free_tree(struct wirs_node<R>* node) { + void free_tree(struct AugBTreeNode<R>* node) { if (node) { delete node->alias; free_tree(node->left); @@ -364,7 +359,7 @@ private: Wrapped<R>* m_data; std::vector<Alias *> m_alias; - wirs_node<R>* m_root; + AugBTreeNode<R>* m_root; W m_total_weight; size_t m_reccnt; size_t m_tombstone_cnt; @@ -373,222 +368,4 @@ private: size_t m_node_cnt; BloomFilter<R> *m_bf; }; - - -template <WeightedRecordInterface R, bool Rejection=true> -class WIRSQuery { -public: - - constexpr static bool EARLY_ABORT=false; - constexpr static bool SKIP_DELETE_FILTER=false; - - static void *get_query_state(WIRS<R> *wirs, void *parms) { - auto res = new WIRSState<R>(); - decltype(R::key) lower_key = ((wirs_query_parms<R> *) parms)->lower_bound; - decltype(R::key) upper_key = ((wirs_query_parms<R> *) parms)->upper_bound; - - // Simulate a stack to unfold recursion. - double total_weight = 0.0; - struct wirs_node<R>* st[64] = {0}; - st[0] = wirs->m_root; - size_t top = 1; - while(top > 0) { - auto now = st[--top]; - if (wirs->covered_by(now, lower_key, upper_key) || - (now->left == nullptr && now->right == nullptr && wirs->intersects(now, lower_key, upper_key))) { - res->nodes.emplace_back(now); - total_weight += now->weight; - } else { - if (now->left && wirs->intersects(now->left, lower_key, upper_key)) st[top++] = now->left; - if (now->right && wirs->intersects(now->right, lower_key, upper_key)) st[top++] = now->right; - } - } - - std::vector<double> weights; - for (const auto& node: res->nodes) { - weights.emplace_back(node->weight / total_weight); - } - res->total_weight = total_weight; - res->top_level_alias = new Alias(weights); - res->sample_size = 0; - - return res; - } - - static void* get_buffer_query_state(MutableBuffer<R> *buffer, void *parms) { - WIRSBufferState<R> *state = new WIRSBufferState<R>(); - auto parameters = (wirs_query_parms<R>*) parms; - if constexpr (Rejection) { - state->cutoff = buffer->get_record_count() - 1; - state->max_weight = buffer->get_max_weight(); - state->total_weight = buffer->get_total_weight(); - state->sample_size = 0; - return state; - } - - std::vector<double> weights; - - state->cutoff = buffer->get_record_count() - 1; - double total_weight = 0.0; - - for (size_t i = 0; i <= state->cutoff; i++) { - auto rec = buffer->get_data() + i; - - if (rec->rec.key >= parameters->lower_bound && rec->rec.key <= parameters->upper_bound && !rec->is_tombstone() && !rec->is_deleted()) { - weights.push_back(rec->rec.weight); - state->records.push_back(*rec); - total_weight += rec->rec.weight; - } - } - - for (size_t i = 0; i < weights.size(); i++) { - weights[i] = weights[i] / total_weight; - } - - state->total_weight = total_weight; - state->alias = new Alias(weights); - state->sample_size = 0; - - return state; - } - - static void process_query_states(void *query_parms, std::vector<void*> &shard_states, std::vector<void*> &buff_states) { - // FIXME: need to redo for the buffer vector interface - auto p = (wirs_query_parms<R> *) query_parms; - - std::vector<size_t> shard_sample_sizes(shard_states.size()+1, 0); - size_t buffer_sz = 0; - - decltype(R::weight) total_weight = 0; - std::vector<decltype(R::weight)> weights; - for (auto &s : buff_states) { - auto state = (WIRSBufferState<R> *) s; - total_weight += state->total_weight; - weights.push_back(state->total_weight); - } - - for (auto &s : shard_states) { - auto state = (WIRSState<R> *) s; - total_weight += state->total_weight; - weights.push_back(state->total_weight); - } - - std::vector<double> normalized_weights; - for (auto w : weights) { - normalized_weights.push_back((double) w / (double) total_weight); - } - - auto shard_alias = Alias(normalized_weights); - for (size_t i=0; i<p->sample_size; i++) { - auto idx = shard_alias.get(p->rng); - if (idx == 0) { - buffer_sz++; - } else { - shard_sample_sizes[idx - 1]++; - } - } - - for (size_t i=0; i<shard_states.size(); i++) { - auto state = (WIRSState<R> *) shard_states[i]; - state->sample_size = shard_sample_sizes[i+1]; - } - } - - - - static std::vector<Wrapped<R>> query(WIRS<R> *wirs, void *q_state, void *parms) { - auto lower_key = ((wirs_query_parms<R> *) parms)->lower_bound; - auto upper_key = ((wirs_query_parms<R> *) parms)->upper_bound; - auto rng = ((wirs_query_parms<R> *) parms)->rng; - - auto state = (WIRSState<R> *) q_state; - auto sample_size = state->sample_size; - - std::vector<Wrapped<R>> result_set; - - if (sample_size == 0) { - return result_set; - } - // k -> sampling: three levels. 1. select a node -> select a fat point -> select a record. - size_t cnt = 0; - size_t attempts = 0; - do { - ++attempts; - // first level.... - auto node = state->nodes[state->top_level_alias->get(rng)]; - // second level... - auto fat_point = node->low + node->alias->get(rng); - // third level... - size_t rec_offset = fat_point * wirs->m_group_size + wirs->m_alias[fat_point]->get(rng); - auto record = wirs->m_data + rec_offset; - - // bounds rejection - if (lower_key > record->rec.key || upper_key < record->rec.key) { - continue; - } - - result_set.emplace_back(*record); - cnt++; - } while (attempts < sample_size); - - return result_set; - } - - static std::vector<Wrapped<R>> buffer_query(MutableBuffer<R> *buffer, void *state, void *parms) { - auto st = (WIRSBufferState<R> *) state; - auto p = (wirs_query_parms<R> *) parms; - - std::vector<Wrapped<R>> result; - result.reserve(st->sample_size); - - if constexpr (Rejection) { - for (size_t i=0; i<st->sample_size; i++) { - auto idx = gsl_rng_uniform_int(p->rng, st->cutoff); - auto rec = buffer->get_data() + idx; - - auto test = gsl_rng_uniform(p->rng) * st->max_weight; - - if (test <= rec->rec.weight && rec->rec.key >= p->lower_bound && rec->rec.key <= p->upper_bound) { - result.emplace_back(*rec); - } - } - return result; - } - - for (size_t i=0; i<st->sample_size; i++) { - auto idx = st->alias->get(p->rng); - result.emplace_back(st->records[idx]); - } - - return result; - } - - static std::vector<R> merge(std::vector<std::vector<Wrapped<R>>> &results, void *parms) { - std::vector<R> output; - - for (size_t i=0; i<results.size(); i++) { - for (size_t j=0; j<results[i].size(); j++) { - output.emplace_back(results[i][j].rec); - } - } - - return output; - } - - static void delete_query_state(void *state) { - auto s = (WIRSState<R> *) state; - delete s; - } - - static void delete_buffer_query_state(void *state) { - auto s = (WIRSBufferState<R> *) state; - delete s; - } - - - //{q.get_buffer_query_state(p, p)}; - //{q.buffer_query(p, p)}; - -}; - } diff --git a/tests/wirs_tests.cpp b/tests/augbtree_tests.cpp index a72f950..878af82 100644 --- a/tests/wirs_tests.cpp +++ b/tests/augbtree_tests.cpp @@ -1,7 +1,7 @@ /* * tests/wirs_tests.cpp * - * Unit tests for WIRS (Augmented B+Tree) shard + * Unit tests for AugBTree (Augmented B+Tree) shard * * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu> * Dong Xie <dongx@psu.edu> @@ -10,14 +10,15 @@ * */ -#include "shard/WIRS.h" +#include "shard/AugBTree.h" +#include "query/wirs.h" #include "testing.h" #include <check.h> using namespace de; -typedef WIRS<WRec> Shard; +typedef AugBTree<WRec> Shard; START_TEST(t_mbuffer_init) { @@ -183,15 +184,15 @@ START_TEST(t_wirs_query) size_t k = 1000; size_t cnt[3] = {0}; - wirs_query_parms<WRec> parms = {lower_key, upper_key, k}; + wirs::Parms<WRec> parms = {lower_key, upper_key, k}; parms.rng = gsl_rng_alloc(gsl_rng_mt19937); size_t total_samples = 0; for (size_t i=0; i<1000; i++) { - auto state = WIRSQuery<WRec>::get_query_state(shard, &parms); - ((WIRSState<WRec> *) state)->sample_size = k; - auto result = WIRSQuery<WRec>::query(shard, state, &parms); + auto state = wirs::Query<Shard, WRec>::get_query_state(shard, &parms); + ((wirs::State<WRec> *) state)->sample_size = k; + auto result = wirs::Query<Shard, WRec>::query(shard, state, &parms); total_samples += result.size(); @@ -199,7 +200,7 @@ START_TEST(t_wirs_query) cnt[result[j].rec.key - 1]++; } - WIRSQuery<WRec>::delete_query_state(state); + wirs::Query<Shard, WRec>::delete_query_state(state); } ck_assert(roughly_equal(cnt[0], (double) total_samples/4.0, total_samples, .05)); @@ -226,25 +227,25 @@ START_TEST(t_wirs_query_merge) size_t k = 1000; size_t cnt[3] = {0}; - wirs_query_parms<WRec> parms = {lower_key, upper_key, k}; + wirs::Parms<WRec> parms = {lower_key, upper_key, k}; parms.rng = gsl_rng_alloc(gsl_rng_mt19937); std::vector<std::vector<Wrapped<WRec>>> results(2); for (size_t i=0; i<1000; i++) { - auto state1 = WIRSQuery<WRec>::get_query_state(shard, &parms); - ((WIRSState<WRec> *) state1)->sample_size = k; - results[0] = WIRSQuery<WRec>::query(shard, state1, &parms); + auto state1 = wirs::Query<Shard, WRec>::get_query_state(shard, &parms); + ((wirs::State<WRec> *) state1)->sample_size = k; + results[0] = wirs::Query<Shard, WRec>::query(shard, state1, &parms); - auto state2 = WIRSQuery<WRec>::get_query_state(shard, &parms); - ((WIRSState<WRec> *) state2)->sample_size = k; - results[1] = WIRSQuery<WRec>::query(shard, state2, &parms); + auto state2 = wirs::Query<Shard, WRec>::get_query_state(shard, &parms); + ((wirs::State<WRec> *) state2)->sample_size = k; + results[1] = wirs::Query<Shard, WRec>::query(shard, state2, &parms); - WIRSQuery<WRec>::delete_query_state(state1); - WIRSQuery<WRec>::delete_query_state(state2); + wirs::Query<Shard, WRec>::delete_query_state(state1); + wirs::Query<Shard, WRec>::delete_query_state(state2); } - auto merged = WIRSQuery<WRec>::merge(results, nullptr); + auto merged = wirs::Query<Shard, WRec>::merge(results, nullptr); ck_assert_int_eq(merged.size(), 2*k); for (size_t i=0; i<merged.size(); i++) { @@ -270,15 +271,15 @@ START_TEST(t_wirs_buffer_query_scan) size_t k = 1000; size_t cnt[3] = {0}; - wirs_query_parms<WRec> parms = {lower_key, upper_key, k}; + wirs::Parms<WRec> parms = {lower_key, upper_key, k}; parms.rng = gsl_rng_alloc(gsl_rng_mt19937); size_t total_samples = 0; for (size_t i=0; i<1000; i++) { - auto state = WIRSQuery<WRec, false>::get_buffer_query_state(buffer, &parms); - ((WIRSBufferState<WRec> *) state)->sample_size = k; - auto result = WIRSQuery<WRec, false>::buffer_query(buffer, state, &parms); + auto state = wirs::Query<Shard, WRec, false>::get_buffer_query_state(buffer, &parms); + ((wirs::BufferState<WRec> *) state)->sample_size = k; + auto result = wirs::Query<Shard, WRec, false>::buffer_query(buffer, state, &parms); total_samples += result.size(); @@ -286,7 +287,7 @@ START_TEST(t_wirs_buffer_query_scan) cnt[result[j].rec.key - 1]++; } - WIRSQuery<WRec, false>::delete_buffer_query_state(state); + wirs::Query<Shard, WRec, false>::delete_buffer_query_state(state); } ck_assert(roughly_equal(cnt[0], (double) total_samples/4.0, total_samples, .05)); @@ -310,15 +311,15 @@ START_TEST(t_wirs_buffer_query_rejection) size_t k = 1000; size_t cnt[3] = {0}; - wirs_query_parms<WRec> parms = {lower_key, upper_key, k}; + wirs::Parms<WRec> parms = {lower_key, upper_key, k}; parms.rng = gsl_rng_alloc(gsl_rng_mt19937); size_t total_samples = 0; for (size_t i=0; i<1000; i++) { - auto state = WIRSQuery<WRec>::get_buffer_query_state(buffer, &parms); - ((WIRSBufferState<WRec> *) state)->sample_size = k; - auto result = WIRSQuery<WRec>::buffer_query(buffer, state, &parms); + auto state = wirs::Query<Shard, WRec>::get_buffer_query_state(buffer, &parms); + ((wirs::BufferState<WRec> *) state)->sample_size = k; + auto result = wirs::Query<Shard, WRec>::buffer_query(buffer, state, &parms); total_samples += result.size(); @@ -326,7 +327,7 @@ START_TEST(t_wirs_buffer_query_rejection) cnt[result[j].rec.key - 1]++; } - WIRSQuery<WRec>::delete_buffer_query_state(state); + wirs::Query<Shard, WRec>::delete_buffer_query_state(state); } ck_assert(roughly_equal(cnt[0], (double) total_samples/4.0, total_samples, .05)); @@ -341,27 +342,27 @@ END_TEST Suite *unit_testing() { - Suite *unit = suite_create("WIRS Shard Unit Testing"); + Suite *unit = suite_create("AugBTree Shard Unit Testing"); - TCase *create = tcase_create("de::WIRS constructor Testing"); + TCase *create = tcase_create("de::AugBTree constructor Testing"); tcase_add_test(create, t_mbuffer_init); tcase_add_test(create, t_wirs_init); tcase_set_timeout(create, 100); suite_add_tcase(unit, create); - TCase *tombstone = tcase_create("de:WIRS::tombstone cancellation Testing"); + TCase *tombstone = tcase_create("de:AugBTree::tombstone cancellation Testing"); tcase_add_test(tombstone, t_full_cancelation); suite_add_tcase(unit, tombstone); - TCase *lookup = tcase_create("de:WIRS:point_lookup Testing"); + TCase *lookup = tcase_create("de:AugBTree:point_lookup Testing"); tcase_add_test(lookup, t_point_lookup); tcase_add_test(lookup, t_point_lookup_miss); suite_add_tcase(unit, lookup); - TCase *sampling = tcase_create("de:WIRS::WIRSQuery Testing"); + TCase *sampling = tcase_create("de:AugBTree::AugBTreeQuery Testing"); tcase_add_test(sampling, t_wirs_query); tcase_add_test(sampling, t_wirs_query_merge); tcase_add_test(sampling, t_wirs_buffer_query_rejection); |