void FlatVector::copyValuesAndNulls()

in velox/vector/FlatVector-inl.h [137:212]


void FlatVector<T>::copyValuesAndNulls(
    const BaseVector* source,
    const SelectivityVector& rows,
    const vector_size_t* toSourceRow) {
  source = source->loadedVector();
  VELOX_CHECK(
      BaseVector::compatibleKind(BaseVector::typeKind(), source->typeKind()));
  VELOX_CHECK_GE(BaseVector::length_, rows.end());
  SelectivityIterator iter(rows);
  vector_size_t row;
  const uint64_t* sourceNulls = source->rawNulls();
  uint64_t* rawNulls = const_cast<uint64_t*>(BaseVector::rawNulls_);
  if (source->mayHaveNulls()) {
    rawNulls = BaseVector::mutableRawNulls();
  }
  if (source->encoding() == VectorEncoding::Simple::FLAT) {
    auto flat = source->asUnchecked<FlatVector<T>>();
    auto* sourceValues =
        source->typeKind() != TypeKind::UNKNOWN ? flat->rawValues() : nullptr;
    if (toSourceRow) {
      while (iter.next(row)) {
        auto sourceRow = toSourceRow[row];
        if (sourceValues) {
          rawValues_[row] = sourceValues[sourceRow];
        }
        if (rawNulls) {
          bits::setNull(
              rawNulls,
              row,
              sourceNulls && bits::isBitNull(sourceNulls, sourceRow));
        }
      }
    } else {
      VELOX_CHECK_GE(source->size(), rows.end());
      while (iter.next(row)) {
        if (sourceValues) {
          rawValues_[row] = sourceValues[row];
        }
        if (rawNulls) {
          bits::setNull(
              rawNulls, row, sourceNulls && bits::isBitNull(sourceNulls, row));
        }
      }
    }
  } else if (source->isConstantEncoding()) {
    if (source->isNullAt(0)) {
      BaseVector::addNulls(nullptr, rows);
      return;
    }
    auto constant = source->asUnchecked<ConstantVector<T>>();
    T value = constant->valueAt(0);
    while (iter.next(row)) {
      rawValues_[row] = value;
    }
    if (rawNulls) {
      bits::orBits(rawNulls, rows.asRange().bits(), rows.begin(), rows.end());
    }
  } else {
    auto sourceVector = source->typeKind() != TypeKind::UNKNOWN
        ? source->asUnchecked<SimpleVector<T>>()
        : nullptr;
    while (iter.next(row)) {
      auto sourceRow = toSourceRow ? toSourceRow[row] : row;
      if (!source->isNullAt(sourceRow)) {
        if (sourceVector) {
          rawValues_[row] = sourceVector->valueAt(sourceRow);
        }
        if (rawNulls) {
          bits::clearNull(rawNulls, row);
        }
      } else {
        bits::setNull(rawNulls, row);
      }
    }
  }
}