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;
}