milesgranger commented on code in PR #14106: URL: https://github.com/apache/arrow/pull/14106#discussion_r972937826
########## cpp/src/arrow/compute/kernels/scalar_cast_numeric.cc: ########## @@ -769,6 +770,36 @@ std::vector<std::shared_ptr<CastFunction>> GetNumericCasts() { return functions; } + +Status CastToExtension(KernelContext* ctx, const ExecSpan& batch, ExecResult* out) { + const CastOptions& options = checked_cast<const CastState*>(ctx->state())->options; + DCHECK(batch[0].is_array()); + std::shared_ptr<Array> array = batch[0].array.ToArray(); + std::shared_ptr<Array> result; + + auto out_ty = GetExtensionType("arrow.py_integer_type")->storage_type(); + RETURN_NOT_OK(Cast(*array, out_ty, options, + ctx->exec_context()) + .Value(&result)); + + ExtensionArray extension(options.to_type.GetSharedPtr(), result); + out->value = std::move(extension.data()); + return Status::OK(); +} Review Comment: I can make it work by templating `GetCastToExtension` and `CastToExtension` then adding the kernel as such: ```cpp template <typename StorageType> std::shared_ptr<CastFunction> GetCastToExtension(std::string name) { auto func = std::make_shared<CastFunction>(std::move(name), Type::EXTENSION); DCHECK_OK(func->AddKernel(Type::INT64, {InputType(Type::INT64)}, kOutputTargetType, CastToExtension<StorageType>)); return func; } std::vector<std::shared_ptr<CastFunction>> GetExtensionCasts() { auto func = GetCastToExtension<Int64Type>("cast_extension"); return {func}; } ``` Where the templated type is the possible storage types of the extension type. Maybe there is a more slick way to accomplish it, especially since the extension name is in the registry, as demonstrated by the hard-coded impl; but will continue with this for now. :) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org