TupleIdSequence* TupleStorageSubBlock::getMatchesForPredicate(const Predicate *pred) const { TupleIdSequence *matches = new TupleIdSequence(); tuple_id max_tid = getMaxTupleID(); if (pred == NULL) { if (isPacked()) { for (tuple_id tid = 0; tid <= max_tid; ++tid) { matches->append(tid); } } else { for (tuple_id tid = 0; tid <= max_tid; ++tid) { if (hasTupleWithID(tid)) { matches->append(tid); } } } } else { if (isPacked()) { for (tuple_id tid = 0; tid <= max_tid; ++tid) { if (pred->matchesForSingleTuple(*this, tid)) { matches->append(tid); } } } else { for (tuple_id tid = 0; tid <= max_tid; ++tid) { if (hasTupleWithID(tid) && (pred->matchesForSingleTuple(*this, tid))) { matches->append(tid); } } } } return matches; }
bool CompressedPackedRowStoreTupleStorageSubBlock::deleteTuple(const tuple_id tuple) { DEBUG_ASSERT(hasTupleWithID(tuple)); if (tuple == *static_cast<const tuple_id*>(sub_block_memory_) - 1) { --(*static_cast<tuple_id*>(sub_block_memory_)); return false; } else { // Shift subsequent tuples forward. memmove(static_cast<char*>(tuple_storage_) + tuple * tuple_length_bytes_, static_cast<const char*>(tuple_storage_) + (tuple + 1) * tuple_length_bytes_, (*static_cast<const tuple_id*>(sub_block_memory_) - tuple - 1) * tuple_length_bytes_); --(*static_cast<tuple_id*>(sub_block_memory_)); return true; } }
TupleIdSequence* TupleStorageSubBlock::getExistenceMap() const { const tuple_id max_tid = getMaxTupleID(); TupleIdSequence *existing_tuples = new TupleIdSequence(max_tid + 1); if (isPacked()) { existing_tuples->setRange(0, max_tid + 1, true); } else { for (tuple_id tid = 0; tid <= max_tid; ++tid) { if (hasTupleWithID(tid)) { existing_tuples->set(tid, true); } } } return existing_tuples; }
tuple_id TupleStorageSubBlock::numTuples() const { if (isEmpty()) { return 0; } else if (isPacked()) { return getMaxTupleID() + 1; } else { // WARNING: This branch is O(N). Subclasses should override wherever possible. tuple_id count = 0; for (tuple_id tid = 0; tid <= getMaxTupleID(); ++tid) { if (hasTupleWithID(tid)) { ++count; } } // Should have at least one tuple, otherwise isEmpty() would have been true. DEBUG_ASSERT(count > 0); return count; } }
OrderedTupleIdSequence* TupleStorageSubBlock::getExistenceList() const { const tuple_id max_tid = getMaxTupleID(); OrderedTupleIdSequence *existence_list = new OrderedTupleIdSequence(); existence_list->reserve(numTuples()); if (isPacked()) { for (tuple_id tid = 0; tid <= max_tid; ++tid) { existence_list->emplace_back(tid); } } else { for (tuple_id tid = 0; tid <= max_tid; ++tid) { if (hasTupleWithID(tid)) { existence_list->emplace_back(tid); } } } return existence_list; }
std::uint32_t CompressedPackedRowStoreTupleStorageSubBlock::compressedGetCode( const tuple_id tid, const attribute_id attr_id) const { DEBUG_ASSERT(hasTupleWithID(tid)); DEBUG_ASSERT((dictionary_coded_attributes_[attr_id]) || (truncated_attributes_[attr_id])); const void *code_location = static_cast<const char*>(tuple_storage_) + tid * tuple_length_bytes_ + attribute_offsets_[attr_id]; switch (compression_info_.attribute_size(attr_id)) { case 1: return *static_cast<const uint8_t*>(code_location); case 2: return *static_cast<const uint16_t*>(code_location); case 4: return *static_cast<const uint32_t*>(code_location); default: FATAL_ERROR("Unexpected byte-length (not 1, 2, or 4) for compressed " "attribute ID " << attr_id << " in CompressedPackedRowStoreTupleStorageSubBlock::getCode()"); } }