didedoshka

heap_table.Vacuum

Oct 1st, 2025
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.19 KB | None | 0 0
  1.   void Vacuum() override {
  2.     auto n = frame_manager_->FrameCount();
  3.     int64_t i = 0;
  4.     auto page_i = MakeTablePage(frame_manager_->GetFrame(i), schema_);
  5.     page_i->Vacuum();
  6.     int64_t j1 = n - 1;
  7.     auto page_j = MakeTablePage(frame_manager_->GetFrame(j1), schema_);
  8.     int32_t j2 = page_j->TupleCount();
  9.     while (i < j1) {
  10.       while (i < j1 && (j2 == -1 || !page_j->LoadTuple(j2).has_value())) {
  11.         if (j2 == -1) {
  12.           --j1;
  13.           frame_manager_->DeleteLastFrame();
  14.           page_j = MakeTablePage(frame_manager_->GetFrame(j1), schema_);
  15.           j2 = page_j->TupleCount();
  16.         } else {
  17.           --j2;
  18.         }
  19.       }
  20.       if (i >= j1) {
  21.         break;
  22.       }
  23.       auto tuple = page_j->LoadTuple(j2).value();
  24.       auto required_space = Marshaller::RequiredSpaceTuple(tuple.values, tuple.is_null, schema_);
  25.       while (i < j1 && (page_i->FreeSpace() < required_space + sizeof(TupleLocalId))) {
  26.         i++;
  27.         page_i = MakeTablePage(frame_manager_->GetFrame(i), schema_);
  28.         page_i->Vacuum();
  29.       }
  30.       if (i >= j1) {
  31.         break;
  32.       }
  33.  
  34.       page_j->DeleteTuple(j2--);
  35.       page_i->AppendTuple(tuple);
  36.     }
  37.   }
  38.  
Advertisement
Add Comment
Please, Sign In to add comment