sparrow-ipc 0.2.0
Loading...
Searching...
No Matches
deserialize_array_impl.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <optional>
4#include <span>
5#include <string>
6#include <string_view>
7#include <unordered_set>
8#include <vector>
9
10#include <sparrow/arrow_interface/arrow_array_schema_proxy.hpp>
11
12#include "Message_generated.h"
16
18{
37 template <template<typename...> class ArrayType, typename T>
38 [[nodiscard]] ArrayType<T> deserialize_non_owning_simple_array(
39 const org::apache::arrow::flatbuf::RecordBatch& record_batch,
40 std::span<const uint8_t> body,
41 std::string_view name,
42 const std::optional<std::vector<sparrow::metadata_pair>>& metadata,
43 bool nullable,
44 size_t& buffer_index,
45 std::optional<std::string> format_override = std::nullopt
46 )
47 {
48 const std::string_view format = format_override.has_value()
49 ? *format_override
50 : data_type_to_format(sparrow::detail::get_data_type_from_array<ArrayType<T>>::get());
51
52 // Set up flags based on nullable
53 std::optional<std::unordered_set<sparrow::ArrowFlag>> flags;
54 if (nullable)
55 {
56 flags = std::unordered_set<sparrow::ArrowFlag>{sparrow::ArrowFlag::NULLABLE};
57 }
58
59 ArrowSchema schema = make_non_owning_arrow_schema(
60 format,
61 name.data(),
62 metadata,
63 flags,
64 0,
65 nullptr,
66 nullptr
67 );
68
69 const auto compression = record_batch.compression();
70 std::vector<arrow_array_private_data::optionally_owned_buffer> buffers;
71
72 auto validity_buffer_span = utils::get_buffer(record_batch, body, buffer_index);
73 auto data_buffer_span = utils::get_buffer(record_batch, body, buffer_index);
74
75 if (compression)
76 {
77 buffers.push_back(utils::get_decompressed_buffer(validity_buffer_span, compression));
78 buffers.push_back(utils::get_decompressed_buffer(data_buffer_span, compression));
79 }
80 else
81 {
82 buffers.emplace_back(validity_buffer_span);
83 buffers.emplace_back(data_buffer_span);
84 }
85
86 // TODO bitmap_ptr is not used anymore... Leave it for now, and remove later if no need confirmed
87 const auto [bitmap_ptr, null_count] = utils::get_bitmap_pointer_and_null_count(validity_buffer_span, record_batch.length());
88
90 record_batch.length(),
91 null_count,
92 0,
93 0,
94 nullptr,
95 nullptr,
96 std::move(buffers)
97 );
98
99 sparrow::arrow_proxy ap{std::move(array), std::move(schema)};
100 return ArrayType<T>{std::move(ap)};
101 }
102}
ArrayType< T > deserialize_non_owning_simple_array(const org::apache::arrow::flatbuf::RecordBatch &record_batch, std::span< const uint8_t > body, std::string_view name, const std::optional< std::vector< sparrow::metadata_pair > > &metadata, bool nullable, size_t &buffer_index, std::optional< std::string > format_override=std::nullopt)
Generic implementation for deserializing non-owning arrays with simple layout.
std::span< const uint8_t > get_buffer(const org::apache::arrow::flatbuf::RecordBatch &record_batch, std::span< const uint8_t > body, size_t &buffer_index)
Extracts a buffer from a RecordBatch's body.
std::variant< sparrow::buffer< std::uint8_t >, std::span< const std::uint8_t > > get_decompressed_buffer(std::span< const uint8_t > buffer_span, const org::apache::arrow::flatbuf::BodyCompression *compression)
Retrieves a decompressed buffer or a view of the original buffer.
std::pair< std::uint8_t *, int64_t > get_bitmap_pointer_and_null_count(std::span< const uint8_t > validity_buffer_span, const int64_t length)
Extracts bitmap pointer and null count from a validity buffer span.
ArrowSchema make_non_owning_arrow_schema(std::string_view format, const char *name, std::optional< M > metadata, std::optional< std::unordered_set< sparrow::ArrowFlag > > flags, size_t children_count, ArrowSchema **children, ArrowSchema *dictionary)
ArrowArray make_arrow_array(int64_t length, int64_t null_count, int64_t offset, size_t children_count, ArrowArray **children, ArrowArray *dictionary, Arg &&private_data_arg)