48 template <
class T,
class LAYOUT_POLICY,
class OPTIONS_TYPE>
76 template <
class T,
class... OPTION_FLAGS>
77 [[nodiscard]]
auto build(T&& t, OPTION_FLAGS&&...)
80 using decayed_t = std::decay_t<T>;
87 using value_type =
typename decayed_t::value_type;
89 std::forward<T>(t).get()
102 template <
class T,
class... OPTION_FLAGS>
103 [[nodiscard]]
auto build(std::initializer_list<T> t, OPTION_FLAGS&&... flags)
105 auto subranges = std::views::all(t);
106 return build(std::forward<
decltype(subranges)>(subranges), std::forward<OPTION_FLAGS>(flags)...);
112 template <
class LAYOUT_POLICY,
class T,
class... OPTION_FLAGS>
121 && std::is_scalar_v<ensured_range_value_t<T>>;
123 template <
typename T>
129 template <
typename T>
135 template <
typename T>
139 template <
typename T>
148 template <
typename T>
155 template <
typename T>
164 && std::ranges::input_range<ensured_range_value_t<T>>
178 && std::is_same_v<std::ranges::range_value_t<T>,
byte_t>;
192 && std::ranges::input_range<ensured_range_value_t<T>>
218 template <translates_to_primitive_layout T,
class OPTION_FLAGS>
226 return type(std::forward<U>(t));
230 template <translates_to_date_layout T,
class OPTION_FLAGS>
231 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
238 return type(std::forward<U>(t));
242 template <translates_to_duration_layout T,
class OPTION_FLAGS>
243 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
250 return type(std::forward<U>(t));
254 template <translates_to_timestamp_layout T,
class OPTION_FLAGS>
255 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
258 using timezone_ptr = std::decay_t<
decltype(std::declval<ensured_range_value_t<T>>().get_time_zone())>;
271 return t.begin()->get_time_zone();
274 return type(tz, std::forward<U>(t));
278 template <translates_to_timestamp_without_timezone_layout T,
class OPTION_FLAGS>
279 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
286 return type(std::forward<U>(t));
290 template <translates_to_
interval_layout T,
class OPTION_FLAGS>
291 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
298 return type(std::forward<U>(t));
302 template <translates_to_time_layout T,
class OPTION_FLAGS>
303 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
310 return type(std::forward<U>(t));
314 template <translate_to_variable_sized_list_layout T,
class OPTION_FLAGS>
315 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
319 using type = std::conditional_t<
330 | std::views::transform(
341 auto detyped_array =
array(std::move(typed_array));
343 return type(std::move(detyped_array), type::offset_from_sizes(sizes),
where_null(t));
347 template <translate_to_fixed_sized_list_layout T,
class OPTION_FLAGS>
348 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
351 static constexpr std::size_t
352 list_size = std::tuple_size_v<look_trough_t<std::ranges::range_value_t<T>>>;
372 template <translate_to_struct_layout T,
class OPTION_FLAGS>
373 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
376 static constexpr std::size_t
n_children = std::tuple_size_v<mnv_t<std::ranges::range_value_t<T>>>;
382 std::vector<array> detyped_children(
n_children);
387 | std::views::transform(
388 [](
const auto& maybe_nullable_tuple)
390 const auto& tuple_val =
ensure_value(maybe_nullable_tuple);
391 return std::get<decltype(i)::value>(tuple_val);
395 using tuple_element_type = std::tuple_element_t<
decltype(i)::value,
tuple_type>;
397 detyped_children[
decltype(i)::value] =
array(
407 template <translate_to_variable_sized_binary_layout T,
class OPTION_FLAGS>
408 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
419 | std::views::transform(
426 return type(std::move(data_buffer), type::offset_from_sizes(sizes),
where_null(t));
430 template <translate_to_fixed_w
idth_binary_layout T,
class OPTION_FLAGS>
431 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
438 return type(std::move(t));
442 template <translate_to_union_layout T,
class OPTION_FLAGS>
443 struct builder<T, dont_enforce_layout, OPTION_FLAGS>
447 static constexpr std::size_t
variant_size = std::variant_size_v<variant_type>;
451 requires(std::is_same_v<type, sparrow::sparse_union_array>)
457 using type_at_index = std::variant_alternative_t<
decltype(i)::value,
variant_type>;
459 | std::views::transform(
460 [](
const auto& variant)
462 return variant.index() ==
decltype(i)::value
463 ? std::get<type_at_index>(variant)
469 detyped_children[
decltype(i)::value] =
array(
476 auto type_id_range = t
477 | std::views::transform(
480 return static_cast<std::uint8_t
>(v.index());
485 return type(std::move(detyped_children), std::move(type_id_buffer));
489 template <
class T,
class OPTION_FLAGS>
502 std::map<raw_range_value_type, key_type, nested_less<raw_range_value_type>> value_map;
503 std::vector<raw_range_value_type> values;
504 std::vector<key_type> keys;
506 values.reserve(input_size);
507 keys.reserve(input_size);
509 for (
const auto& v : t)
511 auto find_res = value_map.find(v);
512 if (find_res == value_map.end())
514 value_map.insert({v, key});
521 keys.push_back(find_res->second);
532 return type(std::move(keys_buffer),
array(std::move(values_array)));
536 template <
class T,
class OPTION_FLAGS>
545 using value_type = std::decay_t<raw_range_value_type>;
549 std::vector<value_type> values{};
550 std::vector<int64_t> acc_run_lengths{};
552 values.reserve(input_size);
553 acc_run_lengths.reserve(input_size);
559 for (
const auto& v : t)
569 if (!eq(values.back(), v))
571 acc_run_lengths.push_back(i);
577 acc_run_lengths.push_back(i);
586 return type(
array(std::move(run_length_typed_array)),
array(std::move(values_array)));
Dynamically typed array encapsulating an Arrow layout.
This buffer class is use as storage buffer for all sparrow arrays.
std::conditional_t< is_dict_encode< mnv_t< T > >, enforce_dict_encoded_layout, std::conditional_t< is_run_end_encode< mnv_t< T > >, enforce_run_end_encoded_layout, dont_enforce_layout > > layout_flag_t
look_trough_t< std::ranges::range_value_t< T > > ensured_range_value_t
ensured_range_value_t< ensured_range_value_t< T > > nested_ensured_range_inner_value_t
decltype(auto) ensure_value_range(T &&t)
std::vector< std::size_t > where_null(T &&t)
decltype(auto) ensure_value(T &&t)
void for_each_index(F &&f)
auto build_impl(T &&t, sparrow::mpl::typelist< OPTION_FLAGS... > typelist)
std::size_t get_size_save(T &&t)
consteval bool contains(L list)
consteval bool any_of(L< T... >, Predicate predicate={})
Checks that at least one type in the provided list of is making the provide predicate return true.
constexpr bool is_type_instance_of_v
true if T is a concrete type template instanciation of U which is a type template.
primitive_array_impl< T > time_array
Array of time values.
mpl:: typelist< chrono::time_seconds, chrono::time_milliseconds, chrono::time_microseconds, chrono::time_nanoseconds > time_types_t
list_array_impl< false > list_array
primitive_array_impl< T > interval_array
Array of interval values.
auto build(T &&t, OPTION_FLAGS &&...)
function to create a sparrow array from arbitrary nested combinations of ranges, tuples,...
mpl::typelist< zoned_time_without_timezone_seconds, zoned_time_without_timezone_milliseconds, zoned_time_without_timezone_microseconds, zoned_time_without_timezone_nanoseconds > zoned_time_without_timezone_types_t
mpl::typelist< date_days, date_milliseconds > date_types_t
variable_size_binary_array_impl< std::string, std::string_view, std::int32_t > string_array
constexpr large_list_flag_t large_list_flag
primitive_array_impl< T > date_array
Array of std::chrono::duration values.
primitive_array_impl< T > primitive_array
Array of values of whose type has fixed binary size.
date::zoned_time< Duration, TimeZonePtr > timestamp
fixed_width_binary_array_impl< fixed_width_binary_traits::value_type, fixed_width_binary_traits::const_reference > fixed_width_binary_array
primitive_array_impl< T > timestamp_without_timezone_array
Array of std::chrono::duration values.
list_array_impl< true > big_list_array
primitive_array_impl< T > duration_array
Array of std::chrono::duration values.
mpl::typelist< chrono::months, days_time_interval, month_day_nanoseconds_interval > interval_types_t
std::size_t range_size(R &&r)
mpl:: typelist< std::chrono::seconds, std::chrono::milliseconds, std::chrono::microseconds, std::chrono::nanoseconds > duration_types_t
sparrow::primitive_array< ensured_range_value_t< T > > type
static constexpr std::size_t n_children
std::ranges::range_value_t< T > raw_value_type
std::ranges::range_value_t< T > variant_type
static constexpr std::size_t list_size
static type create(U &&t)
static constexpr std::size_t variant_size
static type create(U &&t)
ensured_range_value_t< T > tuple_type
std::decay_t< decltype(std::declval< ensured_range_value_t< T > >().get_time_zone())> timezone_ptr
sparrow::dictionary_encoded_array< key_type > type
static type create(U &&t)
std::ranges::range_value_t< T > raw_range_value_type
std::ranges::range_value_t< T > raw_range_value_type
static type create(U &&t)
sparrow::run_end_encoded_array type
Workaround to replace static_assert(false) in template code.
Compile-time type predicate: true if the evaluated type is the same as T.
A sequence of types, used for meta-programming operations.