in c++/src/ColumnWriter.cc [2874:2949]
std::unique_ptr<ColumnWriter> buildWriter(const Type& type, const StreamsFactory& factory,
const WriterOptions& options) {
switch (static_cast<int64_t>(type.getKind())) {
case STRUCT:
return std::make_unique<StructColumnWriter>(type, factory, options);
case SHORT:
if (options.getUseTightNumericVector()) {
return std::make_unique<IntegerColumnWriter<ShortVectorBatch>>(type, factory, options);
}
return std::make_unique<IntegerColumnWriter<LongVectorBatch>>(type, factory, options);
case INT:
if (options.getUseTightNumericVector()) {
return std::make_unique<IntegerColumnWriter<IntVectorBatch>>(type, factory, options);
}
return std::make_unique<IntegerColumnWriter<LongVectorBatch>>(type, factory, options);
case LONG:
return std::make_unique<IntegerColumnWriter<LongVectorBatch>>(type, factory, options);
case BYTE:
if (options.getUseTightNumericVector()) {
return std::make_unique<ByteColumnWriter<ByteVectorBatch>>(type, factory, options);
}
return std::make_unique<ByteColumnWriter<LongVectorBatch>>(type, factory, options);
case BOOLEAN:
if (options.getUseTightNumericVector()) {
return std::make_unique<BooleanColumnWriter<ByteVectorBatch>>(type, factory, options);
}
return std::make_unique<BooleanColumnWriter<LongVectorBatch>>(type, factory, options);
case DOUBLE:
return std::make_unique<FloatingColumnWriter<double, DoubleVectorBatch>>(type, factory,
options, false);
case FLOAT:
if (options.getUseTightNumericVector()) {
return std::make_unique<FloatingColumnWriter<float, FloatVectorBatch>>(type, factory,
options, true);
}
return std::make_unique<FloatingColumnWriter<double, DoubleVectorBatch>>(type, factory,
options, true);
case BINARY:
return std::make_unique<BinaryColumnWriter>(type, factory, options);
case STRING:
return std::make_unique<StringColumnWriter>(type, factory, options);
case CHAR:
return std::make_unique<CharColumnWriter>(type, factory, options);
case VARCHAR:
return std::make_unique<VarCharColumnWriter>(type, factory, options);
case DATE:
return std::make_unique<DateColumnWriter>(type, factory, options);
case TIMESTAMP:
return std::make_unique<TimestampColumnWriter>(type, factory, options, false);
case TIMESTAMP_INSTANT:
return std::make_unique<TimestampColumnWriter>(type, factory, options, true);
case DECIMAL:
if (type.getPrecision() <= Decimal64ColumnWriter::MAX_PRECISION_64) {
if (options.getFileVersion() == FileVersion::UNSTABLE_PRE_2_0()) {
return std::make_unique<Decimal64ColumnWriterV2>(type, factory, options);
}
return std::make_unique<Decimal64ColumnWriter>(type, factory, options);
} else if (type.getPrecision() <= Decimal64ColumnWriter::MAX_PRECISION_128) {
return std::make_unique<Decimal128ColumnWriter>(type, factory, options);
} else {
throw NotImplementedYet(
"Decimal precision more than 38 is not "
"supported");
}
case LIST:
return std::make_unique<ListColumnWriter>(type, factory, options);
case MAP:
return std::make_unique<MapColumnWriter>(type, factory, options);
case UNION:
return std::make_unique<UnionColumnWriter>(type, factory, options);
default:
throw NotImplementedYet(
"Type is not supported yet for creating "
"ColumnWriter.");
}
}