in cpp/src/parquet/encoder.cc [1710:1811]
std::unique_ptr<Encoder> MakeEncoder(Type::type type_num, Encoding::type encoding,
bool use_dictionary, const ColumnDescriptor* descr,
MemoryPool* pool) {
if (use_dictionary) {
switch (type_num) {
case Type::INT32:
return std::make_unique<DictEncoderImpl<Int32Type>>(descr, pool);
case Type::INT64:
return std::make_unique<DictEncoderImpl<Int64Type>>(descr, pool);
case Type::INT96:
return std::make_unique<DictEncoderImpl<Int96Type>>(descr, pool);
case Type::FLOAT:
return std::make_unique<DictEncoderImpl<FloatType>>(descr, pool);
case Type::DOUBLE:
return std::make_unique<DictEncoderImpl<DoubleType>>(descr, pool);
case Type::BYTE_ARRAY:
return std::make_unique<DictEncoderImpl<ByteArrayType>>(descr, pool);
case Type::FIXED_LEN_BYTE_ARRAY:
return std::make_unique<DictEncoderImpl<FLBAType>>(descr, pool);
default:
DCHECK(false) << "Encoder not implemented";
break;
}
} else if (encoding == Encoding::PLAIN) {
switch (type_num) {
case Type::BOOLEAN:
return std::make_unique<PlainEncoder<BooleanType>>(descr, pool);
case Type::INT32:
return std::make_unique<PlainEncoder<Int32Type>>(descr, pool);
case Type::INT64:
return std::make_unique<PlainEncoder<Int64Type>>(descr, pool);
case Type::INT96:
return std::make_unique<PlainEncoder<Int96Type>>(descr, pool);
case Type::FLOAT:
return std::make_unique<PlainEncoder<FloatType>>(descr, pool);
case Type::DOUBLE:
return std::make_unique<PlainEncoder<DoubleType>>(descr, pool);
case Type::BYTE_ARRAY:
return std::make_unique<PlainEncoder<ByteArrayType>>(descr, pool);
case Type::FIXED_LEN_BYTE_ARRAY:
return std::make_unique<PlainEncoder<FLBAType>>(descr, pool);
default:
DCHECK(false) << "Encoder not implemented";
break;
}
} else if (encoding == Encoding::BYTE_STREAM_SPLIT) {
switch (type_num) {
case Type::INT32:
return std::make_unique<ByteStreamSplitEncoder<Int32Type>>(descr, pool);
case Type::INT64:
return std::make_unique<ByteStreamSplitEncoder<Int64Type>>(descr, pool);
case Type::FLOAT:
return std::make_unique<ByteStreamSplitEncoder<FloatType>>(descr, pool);
case Type::DOUBLE:
return std::make_unique<ByteStreamSplitEncoder<DoubleType>>(descr, pool);
case Type::FIXED_LEN_BYTE_ARRAY:
return std::make_unique<ByteStreamSplitEncoder<FLBAType>>(descr, pool);
default:
throw ParquetException(
"BYTE_STREAM_SPLIT only supports FLOAT, DOUBLE, INT32, INT64 "
"and FIXED_LEN_BYTE_ARRAY");
}
} else if (encoding == Encoding::DELTA_BINARY_PACKED) {
switch (type_num) {
case Type::INT32:
return std::make_unique<DeltaBitPackEncoder<Int32Type>>(descr, pool);
case Type::INT64:
return std::make_unique<DeltaBitPackEncoder<Int64Type>>(descr, pool);
default:
throw ParquetException(
"DELTA_BINARY_PACKED encoder only supports INT32 and INT64");
}
} else if (encoding == Encoding::DELTA_LENGTH_BYTE_ARRAY) {
switch (type_num) {
case Type::BYTE_ARRAY:
return std::make_unique<DeltaLengthByteArrayEncoder>(descr, pool);
default:
throw ParquetException("DELTA_LENGTH_BYTE_ARRAY only supports BYTE_ARRAY");
}
} else if (encoding == Encoding::RLE) {
switch (type_num) {
case Type::BOOLEAN:
return std::make_unique<RleBooleanEncoder>(descr, pool);
default:
throw ParquetException("RLE only supports BOOLEAN");
}
} else if (encoding == Encoding::DELTA_BYTE_ARRAY) {
switch (type_num) {
case Type::BYTE_ARRAY:
return std::make_unique<DeltaByteArrayEncoder<ByteArrayType>>(descr, pool);
case Type::FIXED_LEN_BYTE_ARRAY:
return std::make_unique<DeltaByteArrayEncoder<FLBAType>>(descr, pool);
default:
throw ParquetException(
"DELTA_BYTE_ARRAY only supports BYTE_ARRAY and FIXED_LEN_BYTE_ARRAY");
}
} else {
ParquetException::NYI("Selected encoding is not supported");
}
DCHECK(false) << "Should not be able to reach this code";
return nullptr;
}