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

Reply via email to