void MaterializingScan::executePlanOperation() {
  const auto& in = input.getTable(0);
  auto result = std::dynamic_pointer_cast<Table<>>(in->copy_structure(nullptr, true, in->size(), false));

  if (_num_samples == 0) {
    result->resize(in->size());
    for (size_t row = 0; row < in->size(); row++) {
      result->copyRowFrom(in, row, row, false, false /*_use_memcpy*/);
    }
  } else {
    result->resize(_num_samples);
    for (size_t row = 0; row < _samples.size(); row++) {
      result->copyRowFrom(input.getTable(0), _samples[row], row, _copy_values, false /*_use_memcpy*/);
    }
  }

  addResult(result);
}
void SimpleTableScan::executeMaterialized() {
  auto tbl = input.getTable(0);
  auto result_table = tbl->copy_structure_modifiable();
  size_t target_row = 0;

  size_t row = _ofDelta ? checked_pointer_cast<const storage::Store>(tbl)->deltaOffset() : 0;
  for (size_t input_size = tbl->size(); row < input_size; ++row) {
    if ((*_comparator)(row)) {
      // TODO materializing result set will make the allocation the boundary
      result_table->resize(target_row + 1);
      result_table->copyRowFrom(input.getTable(0), row, target_row++, true /* Copy Value*/, false /* Use Memcpy */);
    }
  }
  addResult(result_table);
}