in r/src/array_to_vector.cpp [1208:1356]
std::shared_ptr<Converter> Converter::Make(
const std::shared_ptr<ChunkedArray>& chunked_array) {
const auto& type = chunked_array->type();
switch (type->id()) {
// direct support
case Type::INT32:
return std::make_shared<arrow::r::Converter_Int<arrow::Int32Type>>(chunked_array);
case Type::DOUBLE:
return std::make_shared<arrow::r::Converter_Double<arrow::DoubleType>>(
chunked_array);
// need to handle 1-bit case
case Type::BOOL:
return std::make_shared<arrow::r::Converter_Boolean>(chunked_array);
case Type::BINARY:
return std::make_shared<arrow::r::Converter_Binary<arrow::BinaryArray>>(
chunked_array);
case Type::LARGE_BINARY:
return std::make_shared<arrow::r::Converter_Binary<arrow::LargeBinaryArray>>(
chunked_array);
case Type::FIXED_SIZE_BINARY:
return std::make_shared<arrow::r::Converter_FixedSizeBinary>(
chunked_array, checked_cast<const FixedSizeBinaryType&>(*type).byte_width());
// handle memory dense strings
case Type::STRING:
return std::make_shared<arrow::r::Converter_String<arrow::StringArray>>(
chunked_array);
case Type::LARGE_STRING:
return std::make_shared<arrow::r::Converter_String<arrow::LargeStringArray>>(
chunked_array);
case Type::DICTIONARY:
return std::make_shared<arrow::r::Converter_Dictionary>(chunked_array);
case Type::DATE32:
return std::make_shared<arrow::r::Converter_Date32>(chunked_array);
case Type::DATE64:
return std::make_shared<arrow::r::Converter_Date64>(chunked_array);
// promotions to integer vector
case Type::INT8:
return std::make_shared<arrow::r::Converter_Int<arrow::Int8Type>>(chunked_array);
case Type::UINT8:
return std::make_shared<arrow::r::Converter_Int<arrow::UInt8Type>>(chunked_array);
case Type::INT16:
return std::make_shared<arrow::r::Converter_Int<arrow::Int16Type>>(chunked_array);
case Type::UINT16:
return std::make_shared<arrow::r::Converter_Int<arrow::UInt16Type>>(chunked_array);
// promotions to numeric vector, if they don't fit into int32
case Type::UINT32:
if (ArraysCanFitInteger(chunked_array->chunks())) {
return std::make_shared<arrow::r::Converter_Int<arrow::UInt32Type>>(
chunked_array);
} else {
return std::make_shared<arrow::r::Converter_Double<arrow::UInt32Type>>(
chunked_array);
}
case Type::UINT64:
if (ArraysCanFitInteger(chunked_array->chunks())) {
return std::make_shared<arrow::r::Converter_Int<arrow::UInt64Type>>(
chunked_array);
} else {
return std::make_shared<arrow::r::Converter_Double<arrow::UInt64Type>>(
chunked_array);
}
case Type::HALF_FLOAT:
return std::make_shared<arrow::r::Converter_Double<arrow::HalfFloatType>>(
chunked_array);
case Type::FLOAT:
return std::make_shared<arrow::r::Converter_Double<arrow::FloatType>>(
chunked_array);
// time32 and time64
case Type::TIME32:
return std::make_shared<arrow::r::Converter_Time<int32_t>>(chunked_array);
case Type::TIME64:
return std::make_shared<arrow::r::Converter_Time<int64_t>>(chunked_array);
case Type::DURATION:
return std::make_shared<arrow::r::Converter_Duration<int64_t>>(chunked_array);
case Type::TIMESTAMP:
return std::make_shared<arrow::r::Converter_Timestamp<int64_t>>(chunked_array);
case Type::INT64:
// Prefer integer if it fits, unless option arrow.int64_downcast is `false`
if (GetBoolOption("arrow.int64_downcast", true) &&
ArraysCanFitInteger(chunked_array->chunks())) {
return std::make_shared<arrow::r::Converter_Int<arrow::Int64Type>>(chunked_array);
} else {
return std::make_shared<arrow::r::Converter_Int64>(chunked_array);
}
case Type::DECIMAL128:
return std::make_shared<arrow::r::Converter_Decimal<Decimal128Type>>(chunked_array);
case Type::DECIMAL256:
return std::make_shared<arrow::r::Converter_Decimal<Decimal256Type>>(chunked_array);
// nested
case Type::STRUCT:
return std::make_shared<arrow::r::Converter_Struct>(chunked_array);
case Type::LIST:
return std::make_shared<arrow::r::Converter_List<arrow::ListArray>>(
chunked_array, checked_cast<const arrow::ListType*>(type.get())->value_type());
case Type::LARGE_LIST:
return std::make_shared<arrow::r::Converter_List<arrow::LargeListArray>>(
chunked_array,
checked_cast<const arrow::LargeListType*>(type.get())->value_type());
case Type::FIXED_SIZE_LIST:
return std::make_shared<arrow::r::Converter_FixedSizeList>(
chunked_array,
checked_cast<const arrow::FixedSizeListType&>(*type).value_type(),
checked_cast<const arrow::FixedSizeListType&>(*type).list_size());
case Type::MAP:
return std::make_shared<arrow::r::Converter_List<arrow::MapArray>>(
chunked_array, checked_cast<const arrow::MapType&>(*type).value_type());
case Type::NA:
return std::make_shared<arrow::r::Converter_Null>(chunked_array);
case Type::EXTENSION:
return std::make_shared<arrow::r::Converter_Extension>(chunked_array);
default:
break;
}
cpp11::stop("cannot handle Array of type <%s>", type->name().c_str());
}