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); } }