| 48 | } |
| 49 | |
| 50 | void TestRangeOfValuesUsed() { |
| 51 | std::shared_ptr<ArrayData> result; |
| 52 | |
| 53 | // These list-views are built manually with the list-view builders instead |
| 54 | // of using something like ArrayFromJSON() because we want to test the |
| 55 | // RangeOfValuesUsed() function's ability to handle arrays containing |
| 56 | // overlapping list-views. |
| 57 | |
| 58 | // Empty list-like array |
| 59 | ASSERT_OK(builder_->FinishInternal(&result)); |
| 60 | builder_->Reset(); |
| 61 | ASSERT_OK_AND_ASSIGN(auto range, list_util::internal::RangeOfValuesUsed(*result)); |
| 62 | ASSERT_EQ(range.first, 0); |
| 63 | ASSERT_EQ(range.second, 0); |
| 64 | |
| 65 | // List-like array with only nulls |
| 66 | ASSERT_OK(builder_->AppendNulls(3)); |
| 67 | ASSERT_OK(builder_->FinishInternal(&result)); |
| 68 | builder_->Reset(); |
| 69 | ASSERT_OK_AND_ASSIGN(range, list_util::internal::RangeOfValuesUsed(*result)); |
| 70 | ASSERT_EQ(range.first, 0); |
| 71 | ASSERT_EQ(range.second, 0); |
| 72 | |
| 73 | // Array with nulls and non-nulls (starting at a non-zero offset) |
| 74 | Int16Builder* vb = checked_cast<Int16Builder*>(builder_->value_builder()); |
| 75 | ASSERT_OK(vb->Append(-2)); |
| 76 | ASSERT_OK(vb->Append(-1)); |
| 77 | ASSERT_OK(builder_->Append(/*is_valid=*/false, 0)); |
| 78 | ASSERT_OK(builder_->Append(/*is_valid=*/true, 2)); |
| 79 | ASSERT_OK(vb->Append(0)); |
| 80 | ASSERT_OK(vb->Append(1)); |
| 81 | ASSERT_OK(builder_->Append(/*is_valid=*/true, 3)); |
| 82 | ASSERT_OK(vb->Append(2)); |
| 83 | ASSERT_OK(vb->Append(3)); |
| 84 | ASSERT_OK(vb->Append(4)); |
| 85 | if constexpr (is_list_view_type<TypeClass>::value) { |
| 86 | ASSERT_OK(vb->Append(10)); |
| 87 | ASSERT_OK(vb->Append(11)); |
| 88 | } |
| 89 | std::shared_ptr<Array> array; |
| 90 | ASSERT_OK(builder_->Finish(&array)); |
| 91 | builder_->Reset(); |
| 92 | ASSERT_OK(array->ValidateFull()); |
| 93 | ASSERT_OK_AND_ASSIGN(range, list_util::internal::RangeOfValuesUsed(*array->data())); |
| 94 | ASSERT_EQ(range.first, 2); |
| 95 | ASSERT_EQ(range.second, 5); |
| 96 | |
| 97 | // Overlapping list-views |
| 98 | vb = checked_cast<Int16Builder*>(builder_->value_builder()); |
| 99 | ASSERT_OK(vb->Append(-2)); |
| 100 | ASSERT_OK(vb->Append(-1)); |
| 101 | ASSERT_OK(builder_->Append(/*is_valid=*/false, 0)); |
| 102 | if constexpr (is_list_view_type<TypeClass>::value) { |
| 103 | ASSERT_OK(builder_->Append(/*is_valid=*/true, 6)); |
| 104 | ASSERT_OK(vb->Append(0)); |
| 105 | ASSERT_OK(builder_->Append(/*is_valid=*/true, 2)); |
| 106 | ASSERT_OK(vb->Append(1)); |
| 107 | ASSERT_OK(vb->Append(2)); |
no test coverage detected