in velox/type/Variant.cpp [305:392]
folly::dynamic variant::serialize() const {
folly::dynamic variantObj = folly::dynamic::object;
variantObj["type"] = std::string(
VELOX_STATIC_FIELD_DYNAMIC_DISPATCH_ALL(TypeTraits, name, kind_));
auto& objValue = variantObj["value"];
if (isNull()) {
objValue = nullptr;
return variantObj;
}
switch (kind_) {
case TypeKind::MAP: {
auto& map = value<TypeKind::MAP>();
objValue = velox::ISerializable::serialize(map);
break;
}
case TypeKind::ROW: {
auto& row = value<TypeKind::ROW>();
folly::dynamic arr = folly::dynamic::array;
for (auto& v : row) {
arr.push_back(v.serialize());
}
objValue = std::move(arr);
break;
}
case TypeKind::ARRAY: {
auto& row = value<TypeKind::ARRAY>();
folly::dynamic arr = folly::dynamic::array;
for (auto& v : row) {
arr.push_back(v.serialize());
}
objValue = std::move(arr);
break;
}
case TypeKind::VARBINARY: {
auto& str = value<TypeKind::VARBINARY>();
objValue = encoding::Base64::encode(str);
break;
}
case TypeKind::TINYINT: {
objValue = value<TypeKind::TINYINT>();
break;
}
case TypeKind::SMALLINT: {
objValue = value<TypeKind::SMALLINT>();
break;
}
case TypeKind::INTEGER: {
objValue = value<TypeKind::INTEGER>();
break;
}
case TypeKind::BIGINT: {
objValue = value<TypeKind::BIGINT>();
break;
}
case TypeKind::BOOLEAN: {
objValue = value<TypeKind::BOOLEAN>();
break;
}
case TypeKind::REAL: {
objValue = value<TypeKind::REAL>();
break;
}
case TypeKind::DOUBLE: {
objValue = value<TypeKind::DOUBLE>();
break;
}
case TypeKind::VARCHAR: {
objValue = value<TypeKind::VARCHAR>();
break;
}
case TypeKind::DATE:
case TypeKind::TIMESTAMP:
case TypeKind::INVALID:
VELOX_NYI();
case TypeKind::OPAQUE:
VELOX_NYI(
"Opaque types serialization is potentially possible but not implemented yet");
default:
VELOX_NYI();
}
return variantObj;
}