in cpp-ch/local-engine/Storages/ch_parquet/arrow/encoding.cc [3219:3290]
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::FLOAT:
return std::make_unique<ByteStreamSplitEncoder<FloatType>>(descr, pool);
case Type::DOUBLE:
return std::make_unique<ByteStreamSplitEncoder<DoubleType>>(descr, pool);
default:
throw ParquetException("BYTE_STREAM_SPLIT only supports FLOAT and DOUBLE");
break;
}
} 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");
break;
}
} else {
ParquetException::NYI("Selected encoding is not supported");
}
DCHECK(false) << "Should not be able to reach this code";
return nullptr;
}