void PointerCalculator::remove(const pos_list_t& pl) { std::unordered_set<pos_t> tmp(pl.begin(), pl.end()); const auto& end = tmp.cend(); auto res = std::remove_if(std::begin(*pos_list), std::end(*pos_list),[&tmp, &end](const pos_t& p){ return tmp.count(p) != 0u; }); (*pos_list).erase(res, pos_list->end()); }
// This method iterates of the pos list and validates each position void Store::validatePositions(pos_list_t& pos, tx::transaction_cid_t last_commit_id, tx::transaction_id_t tid) const { // Make sure we captured all rows assert(_cidBeginVector.size() == size() && _cidEndVector.size() == size() && _tidVector.size() == size()); // Pos is nullptr, we should circumvent auto end = std::remove_if(std::begin(pos), std::end(pos), [&](const pos_t& v){ return !isVisibleForTransaction(v, last_commit_id, tid); } ); if (end != pos.end()) pos.erase(end, pos.end()); }
inline std::vector<uint8_t> vb_encode(pos_list_t &numbers) { std::vector<uint8_t> bytestream; //std::vector<uint32_t>::iterator itr = numbers.begin(); pos_list_t::iterator itr = numbers.begin(); //std::vector<uint32_t>::iterator itr_end = numbers.end(); pos_list_t::iterator itr_end = numbers.end(); int prev_doc_id = 0; int doc_id_gap; int num_postings = 0; int i = 0; for (; itr != itr_end; ++itr) { if (num_postings == 0) { ++i; doc_id_gap = *itr - prev_doc_id; prev_doc_id = *itr; vb_encode_num(doc_id_gap, bytestream); num_postings = *(++itr); vb_encode_num(num_postings, bytestream); } else { int prev_pos = 0; while (itr != itr_end) { vb_encode_num(*itr-prev_pos, bytestream); prev_pos = *itr; if (--num_postings > 0) { ++itr; } else { break; } } } } return bytestream; }