Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment