This is an automated email from the ASF dual-hosted git repository.

felipecrv pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 62ee67616d GH-42116: [C++] Support list-view typed arrays in 
array_take and array_filter (#42117)
62ee67616d is described below

commit 62ee67616d793d1a1df5e8ca7807e29381adaba9
Author: Felipe Oliveira Carvalho <[email protected]>
AuthorDate: Thu Jun 27 11:24:08 2024 -0300

    GH-42116: [C++] Support list-view typed arrays in array_take and 
array_filter (#42117)
    
    ### Rationale for this change
    
    Completing the type coverage in array_take and array_filter.
    
    ### What changes are included in this PR?
    
    Add support for `ListView` and `LargeListView` in `"array_take"`, 
`"array_filter"` and all the functions that indirectly rely on these to do 
their thing.
    
    ### Are these changes tested?
    
    New test cases were added.
    * GitHub Issue: #42116
    
    Authored-by: Felipe Oliveira Carvalho <[email protected]>
    Signed-off-by: Felipe Oliveira Carvalho <[email protected]>
---
 cpp/src/arrow/compute/kernels/vector_selection.cc  |  36 ++---
 .../kernels/vector_selection_filter_internal.cc    |   4 +
 .../compute/kernels/vector_selection_internal.cc   |  74 +++++++++
 .../compute/kernels/vector_selection_internal.h    |   4 +
 .../kernels/vector_selection_take_internal.cc      |   2 +
 .../arrow/compute/kernels/vector_selection_test.cc | 178 +++++++++++++--------
 6 files changed, 207 insertions(+), 91 deletions(-)

diff --git a/cpp/src/arrow/compute/kernels/vector_selection.cc 
b/cpp/src/arrow/compute/kernels/vector_selection.cc
index 64c3db204c..b265673e23 100644
--- a/cpp/src/arrow/compute/kernels/vector_selection.cc
+++ b/cpp/src/arrow/compute/kernels/vector_selection.cc
@@ -68,12 +68,10 @@ using TakeState = OptionsWrapper<TakeOptions>;
 // ----------------------------------------------------------------------
 // DropNull Implementation
 
-Result<std::shared_ptr<arrow::BooleanArray>> GetDropNullFilter(const Array& 
values,
-                                                               MemoryPool* 
memory_pool) {
-  auto bitmap_buffer = values.null_bitmap();
-  std::shared_ptr<arrow::BooleanArray> out_array = 
std::make_shared<BooleanArray>(
-      values.length(), bitmap_buffer, nullptr, 0, values.offset());
-  return out_array;
+std::shared_ptr<arrow::BooleanArray> MakeDropNullFilter(const Array& values) {
+  auto& bitmap_buffer = values.null_bitmap();
+  return std::make_shared<BooleanArray>(values.length(), bitmap_buffer, 
nullptr, 0,
+                                        values.offset());
 }
 
 Result<Datum> DropNullArray(const std::shared_ptr<Array>& values, ExecContext* 
ctx) {
@@ -86,8 +84,7 @@ Result<Datum> DropNullArray(const std::shared_ptr<Array>& 
values, ExecContext* c
   if (values->type()->id() == Type::type::NA) {
     return std::make_shared<NullArray>(0);
   }
-  ARROW_ASSIGN_OR_RAISE(auto drop_null_filter,
-                        GetDropNullFilter(*values, ctx->memory_pool()));
+  auto drop_null_filter = Datum{MakeDropNullFilter(*values)};
   return Filter(values, drop_null_filter, FilterOptions::Defaults(), ctx);
 }
 
@@ -185,19 +182,16 @@ class DropNullMetaFunction : public MetaFunction {
   Result<Datum> ExecuteImpl(const std::vector<Datum>& args,
                             const FunctionOptions* options,
                             ExecContext* ctx) const override {
-    switch (args[0].kind()) {
-      case Datum::ARRAY: {
-        return DropNullArray(args[0].make_array(), ctx);
-      } break;
-      case Datum::CHUNKED_ARRAY: {
-        return DropNullChunkedArray(args[0].chunked_array(), ctx);
-      } break;
-      case Datum::RECORD_BATCH: {
-        return DropNullRecordBatch(args[0].record_batch(), ctx);
-      } break;
-      case Datum::TABLE: {
-        return DropNullTable(args[0].table(), ctx);
-      } break;
+    auto& values = args[0];
+    switch (values.kind()) {
+      case Datum::ARRAY:
+        return DropNullArray(values.make_array(), ctx);
+      case Datum::CHUNKED_ARRAY:
+        return DropNullChunkedArray(values.chunked_array(), ctx);
+      case Datum::RECORD_BATCH:
+        return DropNullRecordBatch(values.record_batch(), ctx);
+      case Datum::TABLE:
+        return DropNullTable(values.table(), ctx);
       default:
         break;
     }
diff --git a/cpp/src/arrow/compute/kernels/vector_selection_filter_internal.cc 
b/cpp/src/arrow/compute/kernels/vector_selection_filter_internal.cc
index 5e24331fe9..bf67a474f3 100644
--- a/cpp/src/arrow/compute/kernels/vector_selection_filter_internal.cc
+++ b/cpp/src/arrow/compute/kernels/vector_selection_filter_internal.cc
@@ -1101,6 +1101,8 @@ void 
PopulateFilterKernels(std::vector<SelectionKernelData>* out) {
       {InputType(Type::EXTENSION), plain_filter, ExtensionFilterExec},
       {InputType(Type::LIST), plain_filter, ListFilterExec},
       {InputType(Type::LARGE_LIST), plain_filter, LargeListFilterExec},
+      {InputType(Type::LIST_VIEW), plain_filter, ListViewFilterExec},
+      {InputType(Type::LARGE_LIST_VIEW), plain_filter, 
LargeListViewFilterExec},
       {InputType(Type::FIXED_SIZE_LIST), plain_filter, FSLFilterExec},
       {InputType(Type::DENSE_UNION), plain_filter, DenseUnionFilterExec},
       {InputType(Type::SPARSE_UNION), plain_filter, SparseUnionFilterExec},
@@ -1119,6 +1121,8 @@ void 
PopulateFilterKernels(std::vector<SelectionKernelData>* out) {
       {InputType(Type::EXTENSION), ree_filter, ExtensionFilterExec},
       {InputType(Type::LIST), ree_filter, ListFilterExec},
       {InputType(Type::LARGE_LIST), ree_filter, LargeListFilterExec},
+      {InputType(Type::LIST_VIEW), ree_filter, ListViewFilterExec},
+      {InputType(Type::LARGE_LIST_VIEW), ree_filter, LargeListViewFilterExec},
       {InputType(Type::FIXED_SIZE_LIST), ree_filter, FSLFilterExec},
       {InputType(Type::DENSE_UNION), ree_filter, DenseUnionFilterExec},
       {InputType(Type::SPARSE_UNION), ree_filter, SparseUnionFilterExec},
diff --git a/cpp/src/arrow/compute/kernels/vector_selection_internal.cc 
b/cpp/src/arrow/compute/kernels/vector_selection_internal.cc
index 1009bea5e7..7189d42850 100644
--- a/cpp/src/arrow/compute/kernels/vector_selection_internal.cc
+++ b/cpp/src/arrow/compute/kernels/vector_selection_internal.cc
@@ -612,6 +612,63 @@ struct ListSelectionImpl : public 
Selection<ListSelectionImpl<Type>, Type> {
   }
 };
 
+template <typename Type>
+struct ListViewSelectionImpl : public Selection<ListViewSelectionImpl<Type>, 
Type> {
+  using offset_type = typename Type::offset_type;
+
+  using Base = Selection<ListViewSelectionImpl<Type>, Type>;
+  LIFT_BASE_MEMBERS();
+
+  TypedBufferBuilder<offset_type> offsets_builder;
+  TypedBufferBuilder<offset_type> sizes_builder;
+
+  ListViewSelectionImpl(KernelContext* ctx, const ExecSpan& batch, int64_t 
output_length,
+                        ExecResult* out)
+      : Base(ctx, batch, output_length, out),
+        offsets_builder(ctx->memory_pool()),
+        sizes_builder(ctx->memory_pool()) {}
+
+  template <typename Adapter>
+  Status GenerateOutput() {
+    auto* offsets = this->values.template GetValues<offset_type>(1);
+    auto* sizes = this->values.template GetValues<offset_type>(2);
+
+    offset_type null_list_view_offset = 0;
+    Adapter adapter(this);
+    RETURN_NOT_OK(adapter.Generate(
+        [&](int64_t index) {
+          offset_type value_offset = offsets[index];
+          offset_type value_length = sizes[index];
+          offsets_builder.UnsafeAppend(value_offset);
+          sizes_builder.UnsafeAppend(value_length);
+          null_list_view_offset = value_offset + value_length;
+          return Status::OK();
+        },
+        [&]() {
+          // 0 could be appended here, but by adding the last offset, we keep
+          // the buffer compatible with how offsets behave in ListType as well.
+          // The invariant that `offsets[i] + sizes[i] <= values.length` is
+          // trivially maintained by having `sizes[i]` set to 0 here.
+          offsets_builder.UnsafeAppend(null_list_view_offset);
+          sizes_builder.UnsafeAppend(0);
+          return Status::OK();
+        }));
+    return Status::OK();
+  }
+
+  Status Init() override {
+    RETURN_NOT_OK(offsets_builder.Reserve(output_length));
+    return sizes_builder.Reserve(output_length);
+  }
+
+  Status Finish() override {
+    RETURN_NOT_OK(offsets_builder.Finish(&out->buffers[1]));
+    RETURN_NOT_OK(sizes_builder.Finish(&out->buffers[2]));
+    out->child_data = {this->values.child_data[0].ToArrayData()};
+    return Status::OK();
+  }
+};
+
 struct DenseUnionSelectionImpl
     : public Selection<DenseUnionSelectionImpl, DenseUnionType> {
   using Base = Selection<DenseUnionSelectionImpl, DenseUnionType>;
@@ -858,6 +915,15 @@ Status LargeListFilterExec(KernelContext* ctx, const 
ExecSpan& batch, ExecResult
   return FilterExec<ListSelectionImpl<LargeListType>>(ctx, batch, out);
 }
 
+Status ListViewFilterExec(KernelContext* ctx, const ExecSpan& batch, 
ExecResult* out) {
+  return FilterExec<ListViewSelectionImpl<ListViewType>>(ctx, batch, out);
+}
+
+Status LargeListViewFilterExec(KernelContext* ctx, const ExecSpan& batch,
+                               ExecResult* out) {
+  return FilterExec<ListViewSelectionImpl<LargeListViewType>>(ctx, batch, out);
+}
+
 Status FSLFilterExec(KernelContext* ctx, const ExecSpan& batch, ExecResult* 
out) {
   const ArraySpan& values = batch[0].array;
 
@@ -914,6 +980,14 @@ Status LargeListTakeExec(KernelContext* ctx, const 
ExecSpan& batch, ExecResult*
   return TakeExec<ListSelectionImpl<LargeListType>>(ctx, batch, out);
 }
 
+Status ListViewTakeExec(KernelContext* ctx, const ExecSpan& batch, ExecResult* 
out) {
+  return TakeExec<ListViewSelectionImpl<ListViewType>>(ctx, batch, out);
+}
+
+Status LargeListViewTakeExec(KernelContext* ctx, const ExecSpan& batch, 
ExecResult* out) {
+  return TakeExec<ListViewSelectionImpl<LargeListViewType>>(ctx, batch, out);
+}
+
 Status FSLTakeExec(KernelContext* ctx, const ExecSpan& batch, ExecResult* out) 
{
   const ArraySpan& values = batch[0].array;
 
diff --git a/cpp/src/arrow/compute/kernels/vector_selection_internal.h 
b/cpp/src/arrow/compute/kernels/vector_selection_internal.h
index c5075d6dfe..887bf08354 100644
--- a/cpp/src/arrow/compute/kernels/vector_selection_internal.h
+++ b/cpp/src/arrow/compute/kernels/vector_selection_internal.h
@@ -67,6 +67,8 @@ void VisitPlainxREEFilterOutputSegments(
 Status PrimitiveFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status ListFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status LargeListFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
+Status ListViewFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
+Status LargeListViewFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status FSLFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status DenseUnionFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status MapFilterExec(KernelContext*, const ExecSpan&, ExecResult*);
@@ -76,6 +78,8 @@ Status LargeVarBinaryTakeExec(KernelContext*, const 
ExecSpan&, ExecResult*);
 Status FixedWidthTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status ListTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status LargeListTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
+Status ListViewTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
+Status LargeListViewTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status FSLTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status DenseUnionTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
 Status SparseUnionTakeExec(KernelContext*, const ExecSpan&, ExecResult*);
diff --git a/cpp/src/arrow/compute/kernels/vector_selection_take_internal.cc 
b/cpp/src/arrow/compute/kernels/vector_selection_take_internal.cc
index 8b3f0431e6..c45cc552a2 100644
--- a/cpp/src/arrow/compute/kernels/vector_selection_take_internal.cc
+++ b/cpp/src/arrow/compute/kernels/vector_selection_take_internal.cc
@@ -745,6 +745,8 @@ void PopulateTakeKernels(std::vector<SelectionKernelData>* 
out) {
       {InputType(Type::EXTENSION), take_indices, ExtensionTake},
       {InputType(Type::LIST), take_indices, ListTakeExec},
       {InputType(Type::LARGE_LIST), take_indices, LargeListTakeExec},
+      {InputType(Type::LIST_VIEW), take_indices, ListViewTakeExec},
+      {InputType(Type::LARGE_LIST_VIEW), take_indices, LargeListViewTakeExec},
       {InputType(Type::FIXED_SIZE_LIST), take_indices, FSLTakeExec},
       {InputType(Type::DENSE_UNION), take_indices, DenseUnionTakeExec},
       {InputType(Type::SPARSE_UNION), take_indices, SparseUnionTakeExec},
diff --git a/cpp/src/arrow/compute/kernels/vector_selection_test.cc 
b/cpp/src/arrow/compute/kernels/vector_selection_test.cc
index cafd889015..aba016d6b7 100644
--- a/cpp/src/arrow/compute/kernels/vector_selection_test.cc
+++ b/cpp/src/arrow/compute/kernels/vector_selection_test.cc
@@ -679,18 +679,38 @@ TYPED_TEST(TestFilterKernelWithString, FilterDictionary) {
   this->AssertFilterDictionary(dict, "[3, 4, 2]", "[null, 1, 0]", "[null, 4]");
 }
 
+const auto kListAndListViewTypes = std::vector<std::shared_ptr<DataType>>{
+    list(int32()),
+    list_view(int32()),
+};
+
+const auto kNestedListAndListViewTypes = 
std::vector<std::shared_ptr<DataType>>{
+    list(list(int32())),
+    list_view(list_view(int32())),
+    list(list_view(int32())),
+    list_view(list(int32())),
+};
+
+const auto kLargeListAndListViewTypes = std::vector<std::shared_ptr<DataType>>{
+    large_list(int32()),
+    large_list_view(int32()),
+};
+
 class TestFilterKernelWithList : public TestFilterKernel {
  public:
 };
 
 TEST_F(TestFilterKernelWithList, FilterListInt32) {
   std::string list_json = "[[], [1,2], null, [3]]";
-  this->AssertFilter(list(int32()), list_json, "[0, 0, 0, 0]", "[]");
-  this->AssertFilter(list(int32()), list_json, "[0, 1, 1, null]", "[[1,2], 
null, null]");
-  this->AssertFilter(list(int32()), list_json, "[0, 0, 1, null]", "[null, 
null]");
-  this->AssertFilter(list(int32()), list_json, "[1, 0, 0, 1]", "[[], [3]]");
-  this->AssertFilter(list(int32()), list_json, "[1, 1, 1, 1]", list_json);
-  this->AssertFilter(list(int32()), list_json, "[0, 1, 0, 1]", "[[1,2], [3]]");
+  for (auto& type : kListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    this->AssertFilter(type, list_json, "[0, 0, 0, 0]", "[]");
+    this->AssertFilter(type, list_json, "[0, 1, 1, null]", "[[1,2], null, 
null]");
+    this->AssertFilter(type, list_json, "[0, 0, 1, null]", "[null, null]");
+    this->AssertFilter(type, list_json, "[1, 0, 0, 1]", "[[], [3]]");
+    this->AssertFilter(type, list_json, "[1, 1, 1, 1]", list_json);
+    this->AssertFilter(type, list_json, "[0, 1, 0, 1]", "[[1,2], [3]]");
+  }
 }
 
 TEST_F(TestFilterKernelWithList, FilterListListInt32) {
@@ -700,32 +720,36 @@ TEST_F(TestFilterKernelWithList, FilterListListInt32) {
     null,
     [[3, null], null]
   ])";
-  auto type = list(list(int32()));
-  this->AssertFilter(type, list_json, "[0, 0, 0, 0]", "[]");
-  this->AssertFilter(type, list_json, "[0, 1, 1, null]", R"([
-    [[1], [2, null, 2], []],
-    null,
-    null
-  ])");
-  this->AssertFilter(type, list_json, "[0, 0, 1, null]", "[null, null]");
-  this->AssertFilter(type, list_json, "[1, 0, 0, 1]", R"([
-    [],
-    [[3, null], null]
-  ])");
-  this->AssertFilter(type, list_json, "[1, 1, 1, 1]", list_json);
-  this->AssertFilter(type, list_json, "[0, 1, 0, 1]", R"([
-    [[1], [2, null, 2], []],
-    [[3, null], null]
-  ])");
+  for (auto& type : kNestedListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    this->AssertFilter(type, list_json, "[0, 0, 0, 0]", "[]");
+    this->AssertFilter(type, list_json, "[0, 1, 1, null]", R"([
+      [[1], [2, null, 2], []],
+      null,
+      null
+    ])");
+    this->AssertFilter(type, list_json, "[0, 0, 1, null]", "[null, null]");
+    this->AssertFilter(type, list_json, "[1, 0, 0, 1]", R"([
+      [],
+      [[3, null], null]
+    ])");
+    this->AssertFilter(type, list_json, "[1, 1, 1, 1]", list_json);
+    this->AssertFilter(type, list_json, "[0, 1, 0, 1]", R"([
+      [[1], [2, null, 2], []],
+      [[3, null], null]
+    ])");
+  }
 }
 
 class TestFilterKernelWithLargeList : public TestFilterKernel {};
 
 TEST_F(TestFilterKernelWithLargeList, FilterListInt32) {
   std::string list_json = "[[], [1,2], null, [3]]";
-  this->AssertFilter(large_list(int32()), list_json, "[0, 0, 0, 0]", "[]");
-  this->AssertFilter(large_list(int32()), list_json, "[0, 1, 1, null]",
-                     "[[1,2], null, null]");
+  for (auto& type : kLargeListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    this->AssertFilter(type, list_json, "[0, 0, 0, 0]", "[]");
+    this->AssertFilter(type, list_json, "[0, 1, 1, null]", "[[1,2], null, 
null]");
+  }
 }
 
 class TestFilterKernelWithFixedSizeList : public TestFilterKernel {
@@ -1449,17 +1473,18 @@ class TestTakeKernelWithList : public 
TestTakeKernelTyped<ListType> {};
 
 TEST_F(TestTakeKernelWithList, TakeListInt32) {
   std::string list_json = "[[], [1,2], null, [3]]";
-  CheckTake(list(int32()), list_json, "[]", "[]");
-  CheckTake(list(int32()), list_json, "[3, 2, 1]", "[[3], null, [1,2]]");
-  CheckTake(list(int32()), list_json, "[null, 3, 0]", "[null, [3], []]");
-  CheckTake(list(int32()), list_json, "[null, null]", "[null, null]");
-  CheckTake(list(int32()), list_json, "[3, 0, 0, 3]", "[[3], [], [], [3]]");
-  CheckTake(list(int32()), list_json, "[0, 1, 2, 3]", list_json);
-  CheckTake(list(int32()), list_json, "[0, 0, 0, 0, 0, 0, 1]",
-            "[[], [], [], [], [], [], [1, 2]]");
-
-  this->TestNoValidityBitmapButUnknownNullCount(list(int32()), "[[], [1,2], 
[3]]",
-                                                "[0, 1, 0]");
+  for (auto& type : kListAndListViewTypes) {
+    CheckTake(type, list_json, "[]", "[]");
+    CheckTake(type, list_json, "[3, 2, 1]", "[[3], null, [1,2]]");
+    CheckTake(type, list_json, "[null, 3, 0]", "[null, [3], []]");
+    CheckTake(type, list_json, "[null, null]", "[null, null]");
+    CheckTake(type, list_json, "[3, 0, 0, 3]", "[[3], [], [], [3]]");
+    CheckTake(type, list_json, "[0, 1, 2, 3]", list_json);
+    CheckTake(type, list_json, "[0, 0, 0, 0, 0, 0, 1]",
+              "[[], [], [], [], [], [], [1, 2]]");
+
+    this->TestNoValidityBitmapButUnknownNullCount(type, "[[], [1,2], [3]]", 
"[0, 1, 0]");
+  }
 }
 
 TEST_F(TestTakeKernelWithList, TakeListListInt32) {
@@ -1469,35 +1494,40 @@ TEST_F(TestTakeKernelWithList, TakeListListInt32) {
     null,
     [[3, null], null]
   ])";
-  auto type = list(list(int32()));
-  CheckTake(type, list_json, "[]", "[]");
-  CheckTake(type, list_json, "[3, 2, 1]", R"([
-    [[3, null], null],
-    null,
-    [[1], [2, null, 2], []]
-  ])");
-  CheckTake(type, list_json, "[null, 3, 0]", R"([
-    null,
-    [[3, null], null],
-    []
-  ])");
-  CheckTake(type, list_json, "[null, null]", "[null, null]");
-  CheckTake(type, list_json, "[3, 0, 0, 3]",
-            "[[[3, null], null], [], [], [[3, null], null]]");
-  CheckTake(type, list_json, "[0, 1, 2, 3]", list_json);
-  CheckTake(type, list_json, "[0, 0, 0, 0, 0, 0, 1]",
-            "[[], [], [], [], [], [], [[1], [2, null, 2], []]]");
+  for (auto& type : kNestedListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    CheckTake(type, list_json, "[]", "[]");
+    CheckTake(type, list_json, "[3, 2, 1]", R"([
+      [[3, null], null],
+      null,
+      [[1], [2, null, 2], []]
+    ])");
+    CheckTake(type, list_json, "[null, 3, 0]", R"([
+      null,
+      [[3, null], null],
+      []
+    ])");
+    CheckTake(type, list_json, "[null, null]", "[null, null]");
+    CheckTake(type, list_json, "[3, 0, 0, 3]",
+              "[[[3, null], null], [], [], [[3, null], null]]");
+    CheckTake(type, list_json, "[0, 1, 2, 3]", list_json);
+    CheckTake(type, list_json, "[0, 0, 0, 0, 0, 0, 1]",
+              "[[], [], [], [], [], [], [[1], [2, null, 2], []]]");
 
-  this->TestNoValidityBitmapButUnknownNullCount(
-      type, "[[[1], [2, null, 2], []], [[3, null]]]", "[0, 1, 0]");
+    this->TestNoValidityBitmapButUnknownNullCount(
+        type, "[[[1], [2, null, 2], []], [[3, null]]]", "[0, 1, 0]");
+  }
 }
 
 class TestTakeKernelWithLargeList : public TestTakeKernelTyped<LargeListType> 
{};
 
 TEST_F(TestTakeKernelWithLargeList, TakeLargeListInt32) {
   std::string list_json = "[[], [1,2], null, [3]]";
-  CheckTake(large_list(int32()), list_json, "[]", "[]");
-  CheckTake(large_list(int32()), list_json, "[null, 1, 2, 0]", "[null, [1,2], 
null, []]");
+  for (auto& type : kLargeListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    CheckTake(type, list_json, "[]", "[]");
+    CheckTake(type, list_json, "[null, 1, 2, 0]", "[null, [1,2], null, []]");
+  }
 }
 
 class TestTakeKernelWithFixedSizeList : public 
TestTakeKernelTyped<FixedSizeListType> {
@@ -2275,8 +2305,11 @@ class TestDropNullKernelWithList : public 
TestDropNullKernelTyped<ListType> {};
 
 TEST_F(TestDropNullKernelWithList, DropNullListInt32) {
   std::string list_json = "[[], [1,2], null, [3]]";
-  CheckDropNull(list(int32()), list_json, "[[], [1,2], [3]]");
-  this->TestNoValidityBitmapButUnknownNullCount(list(int32()), "[[], [1,2], 
[3]]");
+  for (const auto& type : kListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    CheckDropNull(type, list_json, "[[], [1,2], [3]]");
+    this->TestNoValidityBitmapButUnknownNullCount(type, "[[], [1,2], [3]]");
+  }
 }
 
 TEST_F(TestDropNullKernelWithList, DropNullListListInt32) {
@@ -2286,22 +2319,27 @@ TEST_F(TestDropNullKernelWithList, 
DropNullListListInt32) {
     null,
     [[3, null], null]
   ])";
-  auto type = list(list(int32()));
-  CheckDropNull(type, list_json, R"([
-    [],
-    [[1], [2, null, 2], []],
-    [[3, null], null]
-  ])");
+  for (auto& type : kNestedListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    CheckDropNull(type, list_json, R"([
+      [],
+      [[1], [2, null, 2], []],
+      [[3, null], null]
+    ])");
 
-  this->TestNoValidityBitmapButUnknownNullCount(type,
-                                                "[[[1], [2, null, 2], []], 
[[3, null]]]");
+    this->TestNoValidityBitmapButUnknownNullCount(
+        type, "[[[1], [2, null, 2], []], [[3, null]]]");
+  }
 }
 
 class TestDropNullKernelWithLargeList : public 
TestDropNullKernelTyped<LargeListType> {};
 
 TEST_F(TestDropNullKernelWithLargeList, DropNullLargeListInt32) {
   std::string list_json = "[[], [1,2], null, [3]]";
-  CheckDropNull(large_list(int32()), list_json, "[[], [1,2],  [3]]");
+  for (auto& type : kLargeListAndListViewTypes) {
+    ARROW_SCOPED_TRACE("type = ", *type);
+    CheckDropNull(type, list_json, "[[], [1,2],  [3]]");
+  }
 
   this->TestNoValidityBitmapButUnknownNullCount(
       fixed_size_list(int32(), 3), "[[1, null, 3], [4, 5, 6], [7, 8, null]]");

Reply via email to