in c++/src/ColumnPrinter.cc [227:298]
std::unique_ptr<ColumnPrinter> createColumnPrinter(std::string& buffer, const Type* type,
ColumnPrinter::Param param) {
std::unique_ptr<ColumnPrinter> result;
if (type == nullptr) {
result = std::make_unique<VoidColumnPrinter>(buffer, param);
} else {
switch (static_cast<int64_t>(type->getKind())) {
case BOOLEAN:
result = std::make_unique<BooleanColumnPrinter>(buffer, param);
break;
case BYTE:
case SHORT:
case INT:
case LONG:
result = std::make_unique<LongColumnPrinter>(buffer, param);
break;
case FLOAT:
case DOUBLE:
result = std::make_unique<DoubleColumnPrinter>(buffer, *type, param);
break;
case STRING:
case VARCHAR:
case CHAR:
result = std::make_unique<StringColumnPrinter>(buffer, param);
break;
case BINARY:
result = std::make_unique<BinaryColumnPrinter>(buffer, param);
break;
case TIMESTAMP:
case TIMESTAMP_INSTANT:
result = std::make_unique<TimestampColumnPrinter>(buffer, param);
break;
case LIST:
result = std::make_unique<ListColumnPrinter>(buffer, *type, param);
break;
case MAP:
result = std::make_unique<MapColumnPrinter>(buffer, *type, param);
break;
case STRUCT:
result = std::make_unique<StructColumnPrinter>(buffer, *type, param);
break;
case DECIMAL:
if (type->getPrecision() == 0 || type->getPrecision() > 18) {
result = std::make_unique<Decimal128ColumnPrinter>(buffer, param);
} else {
result = std::make_unique<Decimal64ColumnPrinter>(buffer, param);
}
break;
case DATE:
result = std::make_unique<DateColumnPrinter>(buffer, param);
break;
case UNION:
result = std::make_unique<UnionColumnPrinter>(buffer, *type, param);
break;
default:
throw std::logic_error("unknown batch type");
}
}
return result;
}