CCCPaste

heap_table.Vacuum

void Vacuum() override {
auto n = frame_manager_->FrameCount();
int64_t i = 0;
auto page_i = MakeTablePage(frame_manager_->GetFrame(i), schema_);
page_i->Vacuum();
int64_t j1 = n - 1;
auto page_j = MakeTablePage(frame_manager_->GetFrame(j1), schema_);
int32_t j2 = page_j->TupleCount();
while (i < j1) {
while (i < j1 && (j2 == -1 || !page_j->LoadTuple(j2).has_value())) {
if (j2 == -1) {
--j1;
frame_manager_->DeleteLastFrame();
page_j = MakeTablePage(frame_manager_->GetFrame(j1), schema_);
j2 = page_j->TupleCount();
} else {
--j2;
}
}
if (i >= j1) {
break;
}
auto tuple = page_j->LoadTuple(j2).value();
auto required_space = Marshaller::RequiredSpaceTuple(tuple.values, tuple.is_null, schema_);
while (i < j1 && (page_i->FreeSpace() < required_space + sizeof(TupleLocalId))) {
i++;
page_i = MakeTablePage(frame_manager_->GetFrame(i), schema_);
page_i->Vacuum();
}
if (i >= j1) {
break;
}

page_j->DeleteTuple(j2--);
page_i->AppendTuple(tuple);
}
}