zanmato1984 commented on code in PR #47377:
URL: https://github.com/apache/arrow/pull/47377#discussion_r2626319215
##########
cpp/src/arrow/compute/exec.cc:
##########
@@ -811,19 +878,46 @@ class ScalarExecutor : public
KernelExecutorImpl<ScalarKernel> {
}
}
- Datum WrapResults(const std::vector<Datum>& inputs,
- const std::vector<Datum>& outputs) override {
- // If execution yielded multiple chunks (because large arrays were split
- // based on the ExecContext parameters, then the result is a ChunkedArray
- if (HaveChunkedArray(inputs) || outputs.size() > 1) {
- return ToChunkedArray(outputs, output_type_);
- } else {
- // Outputs have just one element
- return outputs[0];
+ // Execute a single batch with a selection vector "densely" for a kernel
that doesn't
+ // support selective execution. "Densely" here means that we first gather
the rows
+ // indicated by the selection vector into a contiguous ExecBatch, execute
that, and
+ // then scatter the result back to the original row positions.
+ Status ExecuteSelectiveDense(const ExecBatch& batch, ExecListener* listener)
{
+ DCHECK(batch.selection_vector && !kernel_->selective_exec);
+
+ if (CheckIfAllScalar(batch)) {
+ // For all-scalar batch, we can skip the gather/scatter steps as if
there is no
+ // selection vector - the result is a scalar anyway.
+ ExecBatch input = batch;
+ input.selection_vector = nullptr;
+ return ExecuteBatch(input, listener);
}
+
+ std::vector<Datum> values(batch.num_values());
+ for (int i = 0; i < batch.num_values(); ++i) {
+ if (batch[i].is_scalar()) {
+ // XXX: Skip gather for scalars since it is not currently supported by
Take.
+ values[i] = batch[i];
+ continue;
Review Comment:
Done.
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]