std::unique_ptr buildSelectedType()

in c++/src/TypeImpl.cc [495:571]


  std::unique_ptr<Type> buildSelectedType(const Type* fileType, const std::vector<bool>& selected) {
    if (fileType == nullptr || !selected[fileType->getColumnId()]) {
      return nullptr;
    }

    std::unique_ptr<TypeImpl> result;
    switch (static_cast<int>(fileType->getKind())) {
      case BOOLEAN:
      case BYTE:
      case SHORT:
      case INT:
      case LONG:
      case FLOAT:
      case DOUBLE:
      case STRING:
      case BINARY:
      case TIMESTAMP:
      case TIMESTAMP_INSTANT:
      case DATE:
        result = std::make_unique<TypeImpl>(fileType->getKind());
        break;

      case DECIMAL:
        result = std::make_unique<TypeImpl>(fileType->getKind(), fileType->getPrecision(),
                                            fileType->getScale());
        break;

      case VARCHAR:
      case CHAR:
        result = std::make_unique<TypeImpl>(fileType->getKind(), fileType->getMaximumLength());
        break;

      case LIST:
        result = std::make_unique<TypeImpl>(fileType->getKind());
        result->addChildType(buildSelectedType(fileType->getSubtype(0), selected));
        break;

      case MAP:
        result = std::make_unique<TypeImpl>(fileType->getKind());
        result->addChildType(buildSelectedType(fileType->getSubtype(0), selected));
        result->addChildType(buildSelectedType(fileType->getSubtype(1), selected));
        break;

      case STRUCT: {
        result = std::make_unique<TypeImpl>(fileType->getKind());
        for (uint64_t child = 0; child < fileType->getSubtypeCount(); ++child) {
          std::unique_ptr<Type> childType =
              buildSelectedType(fileType->getSubtype(child), selected);
          if (childType.get() != nullptr) {
            result->addStructField(fileType->getFieldName(child), std::move(childType));
          }
        }
        break;
      }

      case UNION: {
        result = std::make_unique<TypeImpl>(fileType->getKind());
        for (uint64_t child = 0; child < fileType->getSubtypeCount(); ++child) {
          std::unique_ptr<Type> childType =
              buildSelectedType(fileType->getSubtype(child), selected);
          if (childType.get() != nullptr) {
            result->addUnionChild(std::move(childType));
          }
        }
        break;
      }

      default:
        throw NotImplementedYet("Unknown type kind");
    }
    result->setIds(fileType->getColumnId(), fileType->getMaximumColumnId());
    for (auto& key : fileType->getAttributeKeys()) {
      const auto& value = fileType->getAttributeValue(key);
      result->setAttribute(key, value);
    }
    return result;
  }