From dd31e841b90a8dbfe937ebdce18d1da227e82c23 Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Fri, 2 Jun 2023 11:13:58 +0530 Subject: [PATCH] Optimize methods. --- src/numeric_range_trie.cpp | 55 +++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/src/numeric_range_trie.cpp b/src/numeric_range_trie.cpp index d5f93e36..6ee805d0 100644 --- a/src/numeric_range_trie.cpp +++ b/src/numeric_range_trie.cpp @@ -1,3 +1,4 @@ +#include #include "numeric_range_trie_test.h" #include "array_utils.h" @@ -302,15 +303,25 @@ void NumericTrie::Node::search_less_than(const int32_t& value, uint32_t*& ids, u std::vector matches; search_less_than_helper(value, level, matches); + std::vector consolidated_ids; for (auto const& match: matches) { - uint32_t* out = nullptr; auto const& m_seq_ids = match->seq_ids.uncompress(); - ids_length = ArrayUtils::or_scalar(m_seq_ids, match->seq_ids.getLength(), ids, ids_length, &out); + for (uint32_t i = 0; i < match->seq_ids.getLength(); i++) { + consolidated_ids.push_back(m_seq_ids[i]); + } delete [] m_seq_ids; - delete [] ids; - ids = out; } + + gfx::timsort(consolidated_ids.begin(), consolidated_ids.end()); + consolidated_ids.erase(unique(consolidated_ids.begin(), consolidated_ids.end()), consolidated_ids.end()); + + uint32_t* out = nullptr; + ids_length = ArrayUtils::or_scalar(&consolidated_ids[0], consolidated_ids.size(), + ids, ids_length, &out); + + delete [] ids; + ids = out; } void NumericTrie::Node::search_less_than_helper(const int32_t& value, char& level, std::vector& matches) { @@ -342,15 +353,25 @@ void NumericTrie::Node::search_range(const int32_t& low, const int32_t& high, ui std::vector matches; search_range_helper(low, high, matches); + std::vector consolidated_ids; for (auto const& match: matches) { - uint32_t* out = nullptr; auto const& m_seq_ids = match->seq_ids.uncompress(); - ids_length = ArrayUtils::or_scalar(m_seq_ids, match->seq_ids.getLength(), ids, ids_length, &out); + for (uint32_t i = 0; i < match->seq_ids.getLength(); i++) { + consolidated_ids.push_back(m_seq_ids[i]); + } delete [] m_seq_ids; - delete [] ids; - ids = out; } + + gfx::timsort(consolidated_ids.begin(), consolidated_ids.end()); + consolidated_ids.erase(unique(consolidated_ids.begin(), consolidated_ids.end()), consolidated_ids.end()); + + uint32_t* out = nullptr; + ids_length = ArrayUtils::or_scalar(&consolidated_ids[0], consolidated_ids.size(), + ids, ids_length, &out); + + delete [] ids; + ids = out; } void NumericTrie::Node::search_range_helper(const int32_t& low, const int32_t& high, @@ -408,15 +429,25 @@ void NumericTrie::Node::search_greater_than(const int32_t& value, uint32_t*& ids std::vector matches; search_greater_than_helper(value, level, matches); + std::vector consolidated_ids; for (auto const& match: matches) { - uint32_t* out = nullptr; auto const& m_seq_ids = match->seq_ids.uncompress(); - ids_length = ArrayUtils::or_scalar(m_seq_ids, match->seq_ids.getLength(), ids, ids_length, &out); + for (uint32_t i = 0; i < match->seq_ids.getLength(); i++) { + consolidated_ids.push_back(m_seq_ids[i]); + } delete [] m_seq_ids; - delete [] ids; - ids = out; } + + gfx::timsort(consolidated_ids.begin(), consolidated_ids.end()); + consolidated_ids.erase(unique(consolidated_ids.begin(), consolidated_ids.end()), consolidated_ids.end()); + + uint32_t* out = nullptr; + ids_length = ArrayUtils::or_scalar(&consolidated_ids[0], consolidated_ids.size(), + ids, ids_length, &out); + + delete [] ids; + ids = out; } void NumericTrie::Node::search_greater_than_helper(const int32_t& value, char& level, std::vector& matches) {