Skip to content

Commit

Permalink
ARROW-13222: [C++] Trim unnecessary cases
Browse files Browse the repository at this point in the history
  • Loading branch information
lidavidm committed Aug 3, 2021
1 parent eb74adf commit 2e9777c
Showing 1 changed file with 8 additions and 77 deletions.
85 changes: 8 additions & 77 deletions cpp/src/arrow/compute/kernels/scalar_if_else.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1395,9 +1395,8 @@ struct CaseWhenFunctor<NullType> {
}
};

template <typename CopyArray>
static Status ExecVarWidthScalarCaseWhen(KernelContext* ctx, const ExecBatch& batch,
Datum* out, CopyArray copy_array) {
Datum* out) {
const auto& conds = checked_cast<const StructScalar&>(*batch.values[0].scalar());
Datum result;
for (size_t i = 0; i < batch.values.size() - 1; i++) {
Expand Down Expand Up @@ -1428,9 +1427,7 @@ static Status ExecVarWidthScalarCaseWhen(KernelContext* ctx, const ExecBatch& ba
ctx->memory_pool()));
*output = *array->data();
} else {
// Copy offsets/data
const ArrayData& source = *result.array();
RETURN_NOT_OK(copy_array(ctx, source, output));
*output = *result.array();
}
return Status::OK();
}
Expand Down Expand Up @@ -1500,37 +1497,11 @@ struct CaseWhenFunctor<Type, enable_if_base_binary<Type>> {
return Status::Invalid("cond struct must not have outer nulls");
}
if (batch[0].is_scalar()) {
return ExecScalar(ctx, batch, out);
return ExecVarWidthScalarCaseWhen(ctx, batch, out);
}
return ExecArray(ctx, batch, out);
}

static Status ExecScalar(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthScalarCaseWhen(
ctx, batch, out,
[](KernelContext* ctx, const ArrayData& source, ArrayData* output) {
output->length = source.length;
output->SetNullCount(source.null_count);
if (source.MayHaveNulls()) {
ARROW_ASSIGN_OR_RAISE(
output->buffers[0],
arrow::internal::CopyBitmap(ctx->memory_pool(), source.buffers[0]->data(),
source.offset, source.length));
}
ARROW_ASSIGN_OR_RAISE(output->buffers[1],
ctx->Allocate(sizeof(offset_type) * (source.length + 1)));
const offset_type* in_offsets = source.GetValues<offset_type>(1);
offset_type* out_offsets = output->GetMutableValues<offset_type>(1);
std::transform(in_offsets, in_offsets + source.length + 1, out_offsets,
[&](offset_type offset) { return offset - in_offsets[0]; });
auto data_length = out_offsets[output->length] - out_offsets[0];
ARROW_ASSIGN_OR_RAISE(output->buffers[2], ctx->Allocate(data_length));
std::memcpy(output->buffers[2]->mutable_data(),
source.buffers[2]->data() + in_offsets[0], data_length);
return Status::OK();
});
}

static Status ExecArray(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthArrayCaseWhen(
ctx, batch, out,
Expand Down Expand Up @@ -1832,19 +1803,11 @@ struct CaseWhenFunctor<Type, enable_if_var_size_list<Type>> {
return Status::Invalid("cond struct must not have outer nulls");
}
if (batch[0].is_scalar()) {
return ExecScalar(ctx, batch, out);
return ExecVarWidthScalarCaseWhen(ctx, batch, out);
}
return ExecArray(ctx, batch, out);
}

static Status ExecScalar(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthScalarCaseWhen(
ctx, batch, out,
[](KernelContext* ctx, const ArrayData& source, ArrayData* output) {
*output = source;
return Status::OK();
});
}
static Status ExecArray(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
const auto& ty = checked_cast<const Type&>(*out->type());
ArrayAppenderFunc array_appender;
Expand Down Expand Up @@ -1890,19 +1853,11 @@ struct CaseWhenFunctor<MapType> {
return Status::Invalid("cond struct must not have outer nulls");
}
if (batch[0].is_scalar()) {
return ExecScalar(ctx, batch, out);
return ExecVarWidthScalarCaseWhen(ctx, batch, out);
}
return ExecArray(ctx, batch, out);
}

static Status ExecScalar(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthScalarCaseWhen(
ctx, batch, out,
[](KernelContext* ctx, const ArrayData& source, ArrayData* output) {
*output = source;
return Status::OK();
});
}
static Status ExecArray(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
ArrayAppenderFunc array_appender;
RETURN_NOT_OK(GetValueAppenders(*out->type(), &array_appender));
Expand All @@ -1929,19 +1884,11 @@ struct CaseWhenFunctor<StructType> {
return Status::Invalid("cond struct must not have outer nulls");
}
if (batch[0].is_scalar()) {
return ExecScalar(ctx, batch, out);
return ExecVarWidthScalarCaseWhen(ctx, batch, out);
}
return ExecArray(ctx, batch, out);
}

static Status ExecScalar(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthScalarCaseWhen(
ctx, batch, out,
[](KernelContext* ctx, const ArrayData& source, ArrayData* output) {
*output = source;
return Status::OK();
});
}
static Status ExecArray(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
ArrayAppenderFunc array_appender;
RETURN_NOT_OK(GetValueAppenders(*out->type(), &array_appender));
Expand All @@ -1968,19 +1915,11 @@ struct CaseWhenFunctor<FixedSizeListType> {
return Status::Invalid("cond struct must not have outer nulls");
}
if (batch[0].is_scalar()) {
return ExecScalar(ctx, batch, out);
return ExecVarWidthScalarCaseWhen(ctx, batch, out);
}
return ExecArray(ctx, batch, out);
}

static Status ExecScalar(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthScalarCaseWhen(
ctx, batch, out,
[](KernelContext* ctx, const ArrayData& source, ArrayData* output) {
*output = source;
return Status::OK();
});
}
static Status ExecArray(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
const auto& ty = checked_cast<const FixedSizeListType&>(*out->type());
const int64_t width = ty.list_size();
Expand Down Expand Up @@ -2014,19 +1953,11 @@ struct CaseWhenFunctor<Type, enable_if_union<Type>> {
return Status::Invalid("cond struct must not have outer nulls");
}
if (batch[0].is_scalar()) {
return ExecScalar(ctx, batch, out);
return ExecVarWidthScalarCaseWhen(ctx, batch, out);
}
return ExecArray(ctx, batch, out);
}

static Status ExecScalar(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
return ExecVarWidthScalarCaseWhen(
ctx, batch, out,
[](KernelContext* ctx, const ArrayData& source, ArrayData* output) {
*output = source;
return Status::OK();
});
}
static Status ExecArray(KernelContext* ctx, const ExecBatch& batch, Datum* out) {
ArrayAppenderFunc array_appender;
RETURN_NOT_OK(GetValueAppenders(*out->type(), &array_appender));
Expand Down

0 comments on commit 2e9777c

Please sign in to comment.