sparrow 0.9.0
Loading...
Searching...
No Matches
arrow_schema.hpp
Go to the documentation of this file.
1// Copyright 2024 Man Group Operations Limited
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
17#include <array>
18#include <concepts>
19#include <cstdint>
20#include <memory>
21#include <optional>
22#include <ranges>
23#include <unordered_set>
24
26
27
28#if defined(__cpp_lib_format)
29# include <format>
30# include <ostream>
31#endif
32
38
39namespace sparrow
40{
63 template <class F, class N, input_metadata_container M = std::vector<metadata_pair>, std::ranges::input_range CHILDREN_OWNERSHIP>
64 requires std::constructible_from<arrow_schema_private_data::FormatType, F>
65 && std::constructible_from<arrow_schema_private_data::NameType, N>
66 && std::is_same_v<std::ranges::range_value_t<CHILDREN_OWNERSHIP>, bool>
67 [[nodiscard]] ArrowSchema make_arrow_schema(
68 F format,
69 N name,
70 std::optional<M> metadata,
71 std::optional<std::unordered_set<ArrowFlag>> flags,
72 ArrowSchema** children,
73 const CHILDREN_OWNERSHIP& children_ownership,
74 ArrowSchema* dictionary,
76 );
77
82
88
89 template <class F, class N, input_metadata_container M = std::vector<metadata_pair>, std::ranges::input_range CHILDREN_OWNERSHIP>
90 requires std::constructible_from<arrow_schema_private_data::FormatType, F>
91 && std::constructible_from<arrow_schema_private_data::NameType, N>
92 && std::is_same_v<std::ranges::range_value_t<CHILDREN_OWNERSHIP>, bool>
94 ArrowSchema& schema,
95 F format,
96 N name,
97 std::optional<M> metadata,
98 std::optional<std::unordered_set<ArrowFlag>> flags,
99 ArrowSchema** children,
100 const CHILDREN_OWNERSHIP& children_ownership,
101 ArrowSchema* dictionary,
103 )
104 {
106 SPARROW_ASSERT_TRUE(children_ownership.size() > 0 ? children != nullptr : children == nullptr);
107 SPARROW_ASSERT_FALSE(format.empty());
108 if (children)
109 {
110 for (size_t i = 0; i < children_ownership.size(); ++i)
111 {
112 SPARROW_ASSERT_FALSE(children[i] == nullptr);
113 }
114 }
115
116 schema.flags = 0;
117 if (flags.has_value())
118 {
119 for (const auto& flag : *flags)
120 {
121 schema.flags |= static_cast<int64_t>(flag);
122 }
123 }
124 schema.n_children = static_cast<int64_t>(children_ownership.size());
125
126 std::optional<std::string> metadata_str = metadata.has_value()
127 ? std::make_optional(
129 )
130 : std::nullopt;
131
133 std::move(format),
134 std::move(name),
135 std::move(metadata_str),
138 );
139
140 const auto private_data = static_cast<arrow_schema_private_data*>(schema.private_data);
141 schema.format = private_data->format_ptr();
142 schema.name = private_data->name_ptr();
143 schema.metadata = private_data->metadata_ptr();
144 schema.children = children;
145 schema.dictionary = dictionary;
147 }
148
149 template <class F, class N, input_metadata_container M, std::ranges::input_range CHILDREN_OWNERSHIP>
150 requires std::constructible_from<arrow_schema_private_data::FormatType, F>
151 && std::constructible_from<arrow_schema_private_data::NameType, N>
152 && std::is_same_v<std::ranges::range_value_t<CHILDREN_OWNERSHIP>, bool>
154 F format,
155 N name,
156 std::optional<M> metadata,
157 std::optional<std::unordered_set<ArrowFlag>> flags,
158 ArrowSchema** children,
159 const CHILDREN_OWNERSHIP& children_ownership,
160 ArrowSchema* dictionary,
162 )
163 {
165 SPARROW_ASSERT_TRUE(children_ownership.size() > 0 ? children != nullptr : children == nullptr);
166 SPARROW_ASSERT_FALSE(format.empty());
167 if (children)
168 {
169 for (size_t i = 0; i < children_ownership.size(); ++i)
170 {
171 SPARROW_ASSERT_FALSE(children[i] == nullptr);
172 }
173 }
174
175 ArrowSchema schema{};
177 schema,
178 std::move(format),
179 std::move(name),
180 std::move(metadata),
181 flags,
182 children,
184 dictionary,
186 );
187 return schema;
188 };
189
191 {
192 using namespace std::literals;
194 "n"sv,
195 ""sv,
196 std::nullopt,
197 std::nullopt,
198 nullptr,
199 std::array<bool, 0>{},
200 nullptr,
201 false
202 );
203 }
204
208 SPARROW_API void swap(ArrowSchema& lhs, ArrowSchema& rhs) noexcept;
209
213 SPARROW_API void copy_schema(const ArrowSchema& source, ArrowSchema& target);
214
221 [[nodiscard]]
222 inline ArrowSchema copy_schema(const ArrowSchema& source)
223 {
224 ArrowSchema target{};
225 copy_schema(source, target);
226 return target;
227 }
228
234 {
236 swap(source, target);
237 source.release(&source);
238 return target;
239 }
240
246 {
247 return move_schema(std::move(source));
248 }
249}
250
251#if defined(__cpp_lib_format)
252
253template <>
254struct std::formatter<ArrowSchema>
255{
256 constexpr auto parse(std::format_parse_context& ctx)
257 {
258 return ctx.begin(); // Simple implementation
259 }
260
261 auto format(const ArrowSchema& obj, std::format_context& ctx) const
262 {
263 std::string children_str = std::format("{}", static_cast<void*>(obj.children));
264 for (int i = 0; i < obj.n_children; ++i)
265 {
266 children_str += std::format("\n-{}", static_cast<void*>(obj.children[i]));
267 }
268
269 const std::string format = obj.format ? obj.format : "nullptr";
270 const std::string name = obj.name ? obj.name : "nullptr";
271 const std::string metadata = obj.metadata ? obj.metadata : "nullptr";
272
273 return std::format_to(
274 ctx.out(),
275 "ArrowSchema - ptr address: {}\n- format: {}\n- name: {}\n- metadata: {}\n- flags: {}\n- n_children: {}\n- children: {}\n- dictionary: {}\n- release: {}\n- private_data: {}\n",
276 static_cast<const void*>(&obj),
277 format,
278 name,
279 metadata,
280 obj.flags,
281 obj.n_children,
282 children_str,
283 static_cast<const void*>(obj.dictionary),
284 static_cast<const void*>(std::addressof(obj.release)),
285 obj.private_data
286 );
287 }
288};
289
290inline std::ostream& operator<<(std::ostream& os, const ArrowSchema& value)
291{
292 os << std::format("{}", value);
293 return os;
294}
295
296#endif
Private data for ArrowSchema.
#define SPARROW_API
Definition config.hpp:38
#define SPARROW_ASSERT_TRUE(expr__)
#define SPARROW_ASSERT_FALSE(expr__)
ArrowSchema make_arrow_schema(F format, N name, std::optional< M > metadata, std::optional< std::unordered_set< ArrowFlag > > flags, ArrowSchema **children, const CHILDREN_OWNERSHIP &children_ownership, ArrowSchema *dictionary, bool dictionary_ownership)
Creates an ArrowSchema owned by a unique_ptr and holding the provided data.
SPARROW_API void copy_schema(const ArrowSchema &source, ArrowSchema &target)
Fills the target ArrowSchema with a deep copy of the data from the source ArrowSchema.
SPARROW_API void release_arrow_schema(ArrowSchema *schema)
Release function to use for the ArrowSchema.release member.
SPARROW_API void swap(ArrowArray &lhs, ArrowArray &rhs)
Swaps the contents of the two ArrowArray objects.
std::string get_metadata_from_key_values(const T &metadata)
Converts a container of key-value pairs to binary metadata format.
Definition metadata.hpp:323
SPARROW_API void empty_release_arrow_schema(ArrowSchema *schema)
Empty release function to use for the ArrowSchema.release member.
ArrowSchema move_schema(ArrowSchema &&source)
Moves the content of source into a stack-allocated array, and reset the source to an empty ArrowSchem...
void fill_arrow_schema(ArrowSchema &schema, F format, N name, std::optional< M > metadata, std::optional< std::unordered_set< ArrowFlag > > flags, ArrowSchema **children, const CHILDREN_OWNERSHIP &children_ownership, ArrowSchema *dictionary, bool dictionary_ownership)
ArrowSchema make_empty_arrow_schema()
std::ostream & operator<<(std::ostream &os, const sparrow::nullval_t &)
int64_t flags
const char * metadata
int64_t n_children
const char * name
void * private_data
const char * format
struct ArrowSchema * dictionary
void(* release)(struct ArrowSchema *)
struct ArrowSchema ** children