| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| #pragma once | |
| #include <memory> | |
| #include <vector> | |
| #include "arrow/api.h" | |
| #include "paimon/common/data/variant/generic_variant.h" | |
| #include "paimon/common/utils/arrow/status_utils.h" | |
| #include "paimon/memory/memory_pool.h" | |
| #include "paimon/result.h" | |
| namespace paimon::test { | |
| /// Helpers for building variant test data. | |
| class VariantTestData { | |
| public: | |
| VariantTestData() = delete; | |
| ~VariantTestData() = delete; | |
| /// Builds a `[id, v]` struct array where `v` holds the variant encodings of `jsons` (nullptr | |
| /// means a null variant) and `id` is a running int32 starting at `id_offset`. | |
| /// `variant_field` must be a variant-marked field (see `VariantTypeUtils::ToArrowField`). | |
| static Result<std::shared_ptr<arrow::StructArray>> BuildVariantBatch( | |
| const std::shared_ptr<arrow::Field>& id_field, | |
| const std::shared_ptr<arrow::Field>& variant_field, const std::vector<const char*>& jsons, | |
| const std::shared_ptr<MemoryPool>& pool, int32_t id_offset = 0); | |
| }; | |
| inline Result<std::shared_ptr<arrow::StructArray>> VariantTestData::BuildVariantBatch( | |
| const std::shared_ptr<arrow::Field>& id_field, | |
| const std::shared_ptr<arrow::Field>& variant_field, const std::vector<const char*>& jsons, | |
| const std::shared_ptr<MemoryPool>& pool, int32_t id_offset) { | |
| arrow::Int32Builder id_builder; | |
| auto value_builder = std::make_shared<arrow::BinaryBuilder>(); | |
| auto metadata_builder = std::make_shared<arrow::BinaryBuilder>(); | |
| arrow::StructBuilder variant_builder(variant_field->type(), arrow::default_memory_pool(), | |
| {value_builder, metadata_builder}); | |
| for (size_t i = 0; i < jsons.size(); ++i) { | |
| PAIMON_RETURN_NOT_OK_FROM_ARROW(id_builder.Append(id_offset + static_cast<int32_t>(i))); | |
| if (jsons[i] == nullptr) { | |
| // StructBuilder::AppendNull appends empty values to the child builders itself. | |
| PAIMON_RETURN_NOT_OK_FROM_ARROW(variant_builder.AppendNull()); | |
| } else { | |
| PAIMON_ASSIGN_OR_RAISE(std::shared_ptr<GenericVariant> variant, | |
| GenericVariant::FromJson(jsons[i], pool)); | |
| PAIMON_RETURN_NOT_OK_FROM_ARROW(variant_builder.Append()); | |
| PAIMON_RETURN_NOT_OK_FROM_ARROW(value_builder->Append(variant->RawValue())); | |
| PAIMON_RETURN_NOT_OK_FROM_ARROW(metadata_builder->Append(variant->Metadata())); | |
| } | |
| } | |
| PAIMON_ASSIGN_OR_RAISE_FROM_ARROW(std::shared_ptr<arrow::Array> id_array, id_builder.Finish()); | |
| std::shared_ptr<arrow::Array> variant_array; | |
| PAIMON_RETURN_NOT_OK_FROM_ARROW(variant_builder.Finish(&variant_array)); | |
| PAIMON_ASSIGN_OR_RAISE_FROM_ARROW( | |
| std::shared_ptr<arrow::StructArray> result, | |
| arrow::StructArray::Make({id_array, variant_array}, {id_field, variant_field})); | |
| return result; | |
| } | |
| } // namespace paimon::test |