diff --git a/cpp/src/arrow/compute/compute-test.cc b/cpp/src/arrow/compute/compute-test.cc index 58a991c60f2..fa408ae40cd 100644 --- a/cpp/src/arrow/compute/compute-test.cc +++ b/cpp/src/arrow/compute/compute-test.cc @@ -697,7 +697,7 @@ TEST_F(TestCast, PreallocatedMemory) { out_data->buffers.push_back(out_values); Datum out(out_data); - ASSERT_OK(kernel->Call(&this->ctx_, *arr->data(), &out)); + ASSERT_OK(kernel->Call(&this->ctx_, Datum(arr), &out)); // Buffer address unchanged ASSERT_EQ(out_values.get(), out_data->buffers[1].get()); diff --git a/cpp/src/arrow/compute/kernel.h b/cpp/src/arrow/compute/kernel.h index 0037245d610..7ff506ca0cf 100644 --- a/cpp/src/arrow/compute/kernel.h +++ b/cpp/src/arrow/compute/kernel.h @@ -131,7 +131,7 @@ struct ARROW_EXPORT Datum { /// \brief An array-valued function of a single input argument class ARROW_EXPORT UnaryKernel : public OpKernel { public: - virtual Status Call(FunctionContext* ctx, const ArrayData& input, Datum* out) = 0; + virtual Status Call(FunctionContext* ctx, const Datum& input, Datum* out) = 0; }; } // namespace compute diff --git a/cpp/src/arrow/compute/kernels/cast.cc b/cpp/src/arrow/compute/kernels/cast.cc index c866054eadd..d595d2ea507 100644 --- a/cpp/src/arrow/compute/kernels/cast.cc +++ b/cpp/src/arrow/compute/kernels/cast.cc @@ -740,20 +740,23 @@ class CastKernel : public UnaryKernel { can_pre_allocate_values_(can_pre_allocate_values), out_type_(out_type) {} - Status Call(FunctionContext* ctx, const ArrayData& input, Datum* out) override { + Status Call(FunctionContext* ctx, const Datum& input, Datum* out) override { + DCHECK_EQ(Datum::ARRAY, input.kind()); + + const ArrayData& in_data = *input.array(); ArrayData* result; if (out->kind() == Datum::NONE) { - out->value = std::make_shared(out_type_, input.length); + out->value = std::make_shared(out_type_, in_data.length); } result = out->array().get(); if (!is_zero_copy_) { RETURN_NOT_OK( - AllocateIfNotPreallocated(ctx, input, can_pre_allocate_values_, result)); + AllocateIfNotPreallocated(ctx, in_data, can_pre_allocate_values_, result)); } - func_(ctx, options_, input, result); + func_(ctx, options_, in_data, result); RETURN_IF_ERROR(ctx); return Status::OK(); diff --git a/cpp/src/arrow/compute/kernels/hash.cc b/cpp/src/arrow/compute/kernels/hash.cc index 3af41609fef..95f03993215 100644 --- a/cpp/src/arrow/compute/kernels/hash.cc +++ b/cpp/src/arrow/compute/kernels/hash.cc @@ -658,8 +658,9 @@ class HashKernelImpl : public HashKernel { explicit HashKernelImpl(std::unique_ptr hasher) : hasher_(std::move(hasher)) {} - Status Call(FunctionContext* ctx, const ArrayData& input, Datum* out) override { - RETURN_NOT_OK(Append(ctx, input)); + Status Call(FunctionContext* ctx, const Datum& input, Datum* out) override { + DCHECK_EQ(Datum::ARRAY, input.kind()); + RETURN_NOT_OK(Append(ctx, *input.array())); return Flush(out); } diff --git a/cpp/src/arrow/compute/kernels/util-internal.cc b/cpp/src/arrow/compute/kernels/util-internal.cc index df68637e088..28428bfcba6 100644 --- a/cpp/src/arrow/compute/kernels/util-internal.cc +++ b/cpp/src/arrow/compute/kernels/util-internal.cc @@ -34,13 +34,13 @@ Status InvokeUnaryArrayKernel(FunctionContext* ctx, UnaryKernel* kernel, const Datum& value, std::vector* outputs) { if (value.kind() == Datum::ARRAY) { Datum output; - RETURN_NOT_OK(kernel->Call(ctx, *value.array(), &output)); + RETURN_NOT_OK(kernel->Call(ctx, value, &output)); outputs->push_back(output); } else if (value.kind() == Datum::CHUNKED_ARRAY) { const ChunkedArray& array = *value.chunked_array(); for (int i = 0; i < array.num_chunks(); i++) { Datum output; - RETURN_NOT_OK(kernel->Call(ctx, *(array.chunk(i)->data()), &output)); + RETURN_NOT_OK(kernel->Call(ctx, Datum(array.chunk(i)), &output)); outputs->push_back(output); } } else {