native/core/src/execution/shuffle/map.rs (2,574 lines of code) (raw):
// 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.
use crate::{
errors::CometError,
execution::shuffle::{
list::SparkUnsafeArray,
row::{append_field, downcast_builder_ref, SparkUnsafeObject, SparkUnsafeRow},
},
};
use arrow::array::builder::{
ArrayBuilder, BinaryBuilder, BooleanBuilder, Date32Builder, Decimal128Builder, Float32Builder,
Float64Builder, Int16Builder, Int32Builder, Int64Builder, Int8Builder, MapBuilder,
MapFieldNames, StringBuilder, StructBuilder, TimestampMicrosecondBuilder,
};
use arrow::datatypes::{DataType, FieldRef, Fields, TimeUnit};
pub struct SparkUnsafeMap {
pub(crate) keys: SparkUnsafeArray,
pub(crate) values: SparkUnsafeArray,
}
impl SparkUnsafeMap {
/// Creates a `SparkUnsafeMap` which points to the given address and size in bytes.
pub(crate) fn new(addr: i64, size: i32) -> Self {
// Read the number of bytes of key array from the first 8 bytes.
let slice: &[u8] = unsafe { std::slice::from_raw_parts(addr as *const u8, 8) };
let key_array_size = i64::from_le_bytes(slice.try_into().unwrap());
if key_array_size < 0 {
panic!("Negative key size in bytes of map: {}", key_array_size);
}
if key_array_size > i32::MAX as i64 {
panic!(
"Number of key size in bytes should <= i32::MAX: {}",
key_array_size
);
}
let value_array_size = size - key_array_size as i32 - 8;
if value_array_size < 0 {
panic!("Negative value size in bytes of map: {}", value_array_size);
}
let keys = SparkUnsafeArray::new(addr + 8);
let values = SparkUnsafeArray::new(addr + 8 + key_array_size);
if keys.get_num_elements() != values.get_num_elements() {
panic!(
"Number of elements of keys and values should be the same: {} vs {}",
keys.get_num_elements(),
values.get_num_elements()
);
}
Self { keys, values }
}
}
/// A macro defining a function to append elements of a map to a map builder with given key builder
/// and given value builder.
macro_rules! define_append_map_element {
($func:ident, $key_builder_type:ty, $value_builder_type:ty, $key_accessor:expr, $value_accessor:expr) => {
#[allow(clippy::redundant_closure_call)]
fn $func(
map_builder: &mut MapBuilder<$key_builder_type, $value_builder_type>,
map: &SparkUnsafeMap,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!($key_builder_type, map_builder.keys());
$key_accessor(key_builder, keys, idx);
let value_builder =
downcast_builder_ref!($value_builder_type, map_builder.values());
if values.is_null_at(idx) {
value_builder.append_null();
} else {
$value_accessor(value_builder, values, idx);
}
}
map_builder.append(true)?;
Ok(())
}
};
}
/// A macro defining a function to append elements of a map to a map builder with given key builder
/// and struct builder as value builder.
macro_rules! define_append_map_struct_value_element {
($func:ident, $key_builder_type:ty, $key_accessor:expr) => {
#[allow(clippy::redundant_closure_call)]
fn $func(
map_builder: &mut MapBuilder<$key_builder_type, StructBuilder>,
map: &SparkUnsafeMap,
fields: &Fields,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!($key_builder_type, map_builder.keys());
$key_accessor(key_builder, keys, idx);
let value_builder = downcast_builder_ref!(StructBuilder, map_builder.values());
let nested_row = if values.is_null_at(idx) {
value_builder.append_null();
SparkUnsafeRow::default()
} else {
value_builder.append(true);
values.get_struct(idx, fields.len())
};
for (field_idx, field) in fields.into_iter().enumerate() {
append_field(field.data_type(), value_builder, &nested_row, field_idx)?;
}
}
map_builder.append(true)?;
Ok(())
}
};
}
/// A macro defining a function to append elements of a map to a map builder with struct builder as
/// key builder and given value builder.
macro_rules! define_append_map_struct_key_element {
($func:ident, $value_builder_type:ty, $value_accessor:expr) => {
#[allow(clippy::redundant_closure_call)]
fn $func(
map_builder: &mut MapBuilder<StructBuilder, $value_builder_type>,
map: &SparkUnsafeMap,
fields: &Fields,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!(StructBuilder, map_builder.keys());
let nested_row = keys.get_struct(idx, fields.len());
key_builder.append(true);
for (field_idx, field) in fields.into_iter().enumerate() {
append_field(field.data_type(), key_builder, &nested_row, field_idx)?;
}
let value_builder =
downcast_builder_ref!($value_builder_type, map_builder.values());
if values.is_null_at(idx) {
value_builder.append_null();
} else {
$value_accessor(value_builder, values, idx);
}
}
map_builder.append(true)?;
Ok(())
}
};
}
fn append_map_struct_struct_element(
map_builder: &mut MapBuilder<StructBuilder, StructBuilder>,
map: &SparkUnsafeMap,
key_fields: &Fields,
value_fields: &Fields,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!(StructBuilder, map_builder.keys());
let nested_row = keys.get_struct(idx, key_fields.len());
key_builder.append(true);
for (field_idx, field) in key_fields.into_iter().enumerate() {
append_field(field.data_type(), key_builder, &nested_row, field_idx)?;
}
let value_builder = downcast_builder_ref!(StructBuilder, map_builder.values());
let nested_row = if values.is_null_at(idx) {
value_builder.append_null();
SparkUnsafeRow::default()
} else {
value_builder.append(true);
values.get_struct(idx, value_fields.len())
};
for (field_idx, field) in value_fields.into_iter().enumerate() {
append_field(field.data_type(), value_builder, &nested_row, field_idx)?;
}
}
map_builder.append(true)?;
Ok(())
}
/// A macro defining a function to append elements of a map to a map builder with given key builder
/// and decimal builder as value builder.
macro_rules! define_append_map_decimal_value_element {
($func:ident, $key_builder_type:ty, $key_accessor:expr) => {
#[allow(clippy::redundant_closure_call)]
fn $func(
map_builder: &mut MapBuilder<$key_builder_type, Decimal128Builder>,
map: &SparkUnsafeMap,
precision: u8,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!($key_builder_type, map_builder.keys());
$key_accessor(key_builder, keys, idx);
let value_builder = downcast_builder_ref!(Decimal128Builder, map_builder.values());
if values.is_null_at(idx) {
value_builder.append_null();
} else {
value_builder.append_value(values.get_decimal(idx, precision));
}
}
map_builder.append(true)?;
Ok(())
}
};
}
/// A macro defining a function to append elements of a map to a map builder with decimal builder as
/// key builder and given value builder.
macro_rules! define_append_map_decimal_key_element {
($func:ident, $value_builder_type:ty, $value_accessor:expr) => {
#[allow(clippy::redundant_closure_call)]
fn $func(
map_builder: &mut MapBuilder<Decimal128Builder, $value_builder_type>,
map: &SparkUnsafeMap,
precision: u8,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!(Decimal128Builder, map_builder.keys());
key_builder.append_value(keys.get_decimal(idx, precision));
let value_builder =
downcast_builder_ref!($value_builder_type, map_builder.values());
if values.is_null_at(idx) {
value_builder.append_null();
} else {
$value_accessor(value_builder, values, idx);
}
}
map_builder.append(true)?;
Ok(())
}
};
}
fn append_map_decimal_decimal_element(
map_builder: &mut MapBuilder<Decimal128Builder, Decimal128Builder>,
map: &SparkUnsafeMap,
key_precision: u8,
value_precision: u8,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!(Decimal128Builder, map_builder.keys());
key_builder.append_value(keys.get_decimal(idx, key_precision));
let value_builder = downcast_builder_ref!(Decimal128Builder, map_builder.values());
if values.is_null_at(idx) {
value_builder.append_null();
} else {
value_builder.append_value(values.get_decimal(idx, value_precision));
}
}
map_builder.append(true)?;
Ok(())
}
fn append_map_decimal_struct_element(
map_builder: &mut MapBuilder<Decimal128Builder, StructBuilder>,
map: &SparkUnsafeMap,
precision: u8,
fields: &Fields,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!(Decimal128Builder, map_builder.keys());
key_builder.append_value(keys.get_decimal(idx, precision));
let value_builder = downcast_builder_ref!(StructBuilder, map_builder.values());
let nested_row = if values.is_null_at(idx) {
value_builder.append_null();
SparkUnsafeRow::default()
} else {
value_builder.append(true);
values.get_struct(idx, fields.len())
};
for (field_idx, field) in fields.into_iter().enumerate() {
append_field(field.data_type(), value_builder, &nested_row, field_idx)?;
}
}
map_builder.append(true)?;
Ok(())
}
fn append_map_struct_decimal_element(
map_builder: &mut MapBuilder<StructBuilder, Decimal128Builder>,
map: &SparkUnsafeMap,
precision: u8,
fields: &Fields,
) -> Result<(), CometError> {
let keys = &map.keys;
let values = &map.values;
for idx in 0..keys.get_num_elements() {
// Map key cannot be null
// TODO: Getting key/value builders outside loop when new API is available
// from upstream release
let key_builder = downcast_builder_ref!(StructBuilder, map_builder.keys());
let nested_row = values.get_struct(idx, fields.len());
key_builder.append(true);
for (field_idx, field) in fields.into_iter().enumerate() {
append_field(field.data_type(), key_builder, &nested_row, field_idx)?;
}
let value_builder = downcast_builder_ref!(Decimal128Builder, map_builder.values());
if values.is_null_at(idx) {
value_builder.append_null();
} else {
value_builder.append_value(values.get_decimal(idx, precision));
}
}
map_builder.append(true)?;
Ok(())
}
// Boolean key
define_append_map_element!(
append_map_boolean_boolean_element,
BooleanBuilder,
BooleanBuilder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_boolean_int8_element,
BooleanBuilder,
Int8Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_boolean_int16_element,
BooleanBuilder,
Int16Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_boolean_int32_element,
BooleanBuilder,
Int32Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_boolean_int64_element,
BooleanBuilder,
Int64Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_boolean_float32_element,
BooleanBuilder,
Float32Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_boolean_float64_element,
BooleanBuilder,
Float64Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_boolean_date32_element,
BooleanBuilder,
Date32Builder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_boolean_timestamp_element,
BooleanBuilder,
TimestampMicrosecondBuilder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_boolean_binary_element,
BooleanBuilder,
BinaryBuilder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_boolean_string_element,
BooleanBuilder,
StringBuilder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_boolean_decimal_element,
BooleanBuilder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx))
);
define_append_map_struct_value_element!(
append_map_boolean_struct_element,
BooleanBuilder,
|builder: &mut BooleanBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_boolean(idx))
);
// Int8 key
define_append_map_element!(
append_map_int8_boolean_element,
Int8Builder,
BooleanBuilder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_int8_int8_element,
Int8Builder,
Int8Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_int8_int16_element,
Int8Builder,
Int16Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_int8_int32_element,
Int8Builder,
Int32Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_int8_int64_element,
Int8Builder,
Int64Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_int8_float32_element,
Int8Builder,
Float32Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_int8_float64_element,
Int8Builder,
Float64Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_int8_date32_element,
Int8Builder,
Date32Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_int8_timestamp_element,
Int8Builder,
TimestampMicrosecondBuilder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_int8_binary_element,
Int8Builder,
BinaryBuilder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_int8_string_element,
Int8Builder,
StringBuilder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_int8_decimal_element,
Int8Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx))
);
define_append_map_struct_value_element!(
append_map_int8_struct_element,
Int8Builder,
|builder: &mut Int8Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_byte(idx))
);
// Int16 key
define_append_map_element!(
append_map_int16_boolean_element,
Int16Builder,
BooleanBuilder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_int16_int8_element,
Int16Builder,
Int8Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_int16_int16_element,
Int16Builder,
Int16Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_int16_int32_element,
Int16Builder,
Int32Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_int16_int64_element,
Int16Builder,
Int64Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_int16_float32_element,
Int16Builder,
Float32Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_int16_float64_element,
Int16Builder,
Float64Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_int16_date32_element,
Int16Builder,
Date32Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_int16_timestamp_element,
Int16Builder,
TimestampMicrosecondBuilder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_int16_binary_element,
Int16Builder,
BinaryBuilder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_int16_string_element,
Int16Builder,
StringBuilder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_int16_decimal_element,
Int16Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx))
);
define_append_map_struct_value_element!(
append_map_int16_struct_element,
Int16Builder,
|builder: &mut Int16Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_short(idx))
);
// Int32 key
define_append_map_element!(
append_map_int32_boolean_element,
Int32Builder,
BooleanBuilder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_int32_int8_element,
Int32Builder,
Int8Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_int32_int16_element,
Int32Builder,
Int16Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_int32_int32_element,
Int32Builder,
Int32Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_int32_int64_element,
Int32Builder,
Int64Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_int32_float32_element,
Int32Builder,
Float32Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_int32_float64_element,
Int32Builder,
Float64Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_int32_date32_element,
Int32Builder,
Date32Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_int32_timestamp_element,
Int32Builder,
TimestampMicrosecondBuilder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_int32_binary_element,
Int32Builder,
BinaryBuilder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_int32_string_element,
Int32Builder,
StringBuilder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_int32_decimal_element,
Int32Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx))
);
define_append_map_struct_value_element!(
append_map_int32_struct_element,
Int32Builder,
|builder: &mut Int32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_int(idx))
);
// Int64 key
define_append_map_element!(
append_map_int64_boolean_element,
Int64Builder,
BooleanBuilder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_int64_int8_element,
Int64Builder,
Int8Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_int64_int16_element,
Int64Builder,
Int16Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_int64_int32_element,
Int64Builder,
Int32Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_int64_int64_element,
Int64Builder,
Int64Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_int64_float32_element,
Int64Builder,
Float32Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_int64_float64_element,
Int64Builder,
Float64Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_int64_date32_element,
Int64Builder,
Date32Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_int64_timestamp_element,
Int64Builder,
TimestampMicrosecondBuilder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_int64_binary_element,
Int64Builder,
BinaryBuilder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_int64_string_element,
Int64Builder,
StringBuilder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_int64_decimal_element,
Int64Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx))
);
define_append_map_struct_value_element!(
append_map_int64_struct_element,
Int64Builder,
|builder: &mut Int64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_long(idx))
);
// Float32 key
define_append_map_element!(
append_map_float32_boolean_element,
Float32Builder,
BooleanBuilder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_float32_int8_element,
Float32Builder,
Int8Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_float32_int16_element,
Float32Builder,
Int16Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_float32_int32_element,
Float32Builder,
Int32Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_float32_int64_element,
Float32Builder,
Int64Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_float32_float32_element,
Float32Builder,
Float32Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_float32_float64_element,
Float32Builder,
Float64Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_float32_date32_element,
Float32Builder,
Date32Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_float32_timestamp_element,
Float32Builder,
TimestampMicrosecondBuilder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_float32_binary_element,
Float32Builder,
BinaryBuilder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_float32_string_element,
Float32Builder,
StringBuilder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_float32_decimal_element,
Float32Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx))
);
define_append_map_struct_value_element!(
append_map_float32_struct_element,
Float32Builder,
|builder: &mut Float32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_float(idx))
);
// Float64 key
define_append_map_element!(
append_map_float64_boolean_element,
Float64Builder,
BooleanBuilder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_float64_int8_element,
Float64Builder,
Int8Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_float64_int16_element,
Float64Builder,
Int16Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_float64_int32_element,
Float64Builder,
Int32Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_float64_int64_element,
Float64Builder,
Int64Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_float64_float32_element,
Float64Builder,
Float32Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_float64_float64_element,
Float64Builder,
Float64Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_float64_date32_element,
Float64Builder,
Date32Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_float64_timestamp_element,
Float64Builder,
TimestampMicrosecondBuilder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_float64_binary_element,
Float64Builder,
BinaryBuilder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_float64_string_element,
Float64Builder,
StringBuilder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_float64_decimal_element,
Float64Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx))
);
define_append_map_struct_value_element!(
append_map_float64_struct_element,
Float64Builder,
|builder: &mut Float64Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_double(idx))
);
// Date32 key
define_append_map_element!(
append_map_date32_boolean_element,
Date32Builder,
BooleanBuilder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_date32_int8_element,
Date32Builder,
Int8Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_date32_int16_element,
Date32Builder,
Int16Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_date32_int32_element,
Date32Builder,
Int32Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_date32_int64_element,
Date32Builder,
Int64Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_date32_float32_element,
Date32Builder,
Float32Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_date32_float64_element,
Date32Builder,
Float64Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_date32_date32_element,
Date32Builder,
Date32Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_date32_timestamp_element,
Date32Builder,
TimestampMicrosecondBuilder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_date32_binary_element,
Date32Builder,
BinaryBuilder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_date32_string_element,
Date32Builder,
StringBuilder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_date32_decimal_element,
Date32Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx))
);
define_append_map_struct_value_element!(
append_map_date32_struct_element,
Date32Builder,
|builder: &mut Date32Builder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_date(idx))
);
// Timestamp key
define_append_map_element!(
append_map_timestamp_boolean_element,
TimestampMicrosecondBuilder,
BooleanBuilder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_timestamp_int8_element,
TimestampMicrosecondBuilder,
Int8Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_timestamp_int16_element,
TimestampMicrosecondBuilder,
Int16Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_timestamp_int32_element,
TimestampMicrosecondBuilder,
Int32Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_timestamp_int64_element,
TimestampMicrosecondBuilder,
Int64Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_timestamp_float32_element,
TimestampMicrosecondBuilder,
Float32Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_timestamp_float64_element,
TimestampMicrosecondBuilder,
Float64Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_timestamp_date32_element,
TimestampMicrosecondBuilder,
Date32Builder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_timestamp_timestamp_element,
TimestampMicrosecondBuilder,
TimestampMicrosecondBuilder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_timestamp_binary_element,
TimestampMicrosecondBuilder,
BinaryBuilder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_timestamp_string_element,
TimestampMicrosecondBuilder,
StringBuilder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_timestamp_decimal_element,
TimestampMicrosecondBuilder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx))
);
define_append_map_struct_value_element!(
append_map_timestamp_struct_element,
TimestampMicrosecondBuilder,
|builder: &mut TimestampMicrosecondBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_timestamp(idx))
);
// Binary key
define_append_map_element!(
append_map_binary_boolean_element,
BinaryBuilder,
BooleanBuilder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_binary_int8_element,
BinaryBuilder,
Int8Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_binary_int16_element,
BinaryBuilder,
Int16Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_binary_int32_element,
BinaryBuilder,
Int32Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_binary_int64_element,
BinaryBuilder,
Int64Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_binary_float32_element,
BinaryBuilder,
Float32Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_binary_float64_element,
BinaryBuilder,
Float64Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_binary_date32_element,
BinaryBuilder,
Date32Builder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_binary_timestamp_element,
BinaryBuilder,
TimestampMicrosecondBuilder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_binary_binary_element,
BinaryBuilder,
BinaryBuilder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_binary_string_element,
BinaryBuilder,
StringBuilder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_binary_decimal_element,
BinaryBuilder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx))
);
define_append_map_struct_value_element!(
append_map_binary_struct_element,
BinaryBuilder,
|builder: &mut BinaryBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_binary(idx))
);
// String key
define_append_map_element!(
append_map_string_boolean_element,
StringBuilder,
BooleanBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_element!(
append_map_string_int8_element,
StringBuilder,
Int8Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_element!(
append_map_string_int16_element,
StringBuilder,
Int16Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_element!(
append_map_string_int32_element,
StringBuilder,
Int32Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_element!(
append_map_string_int64_element,
StringBuilder,
Int64Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_element!(
append_map_string_float32_element,
StringBuilder,
Float32Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_element!(
append_map_string_float64_element,
StringBuilder,
Float64Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_element!(
append_map_string_date32_element,
StringBuilder,
Date32Builder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_element!(
append_map_string_timestamp_element,
StringBuilder,
TimestampMicrosecondBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_element!(
append_map_string_binary_element,
StringBuilder,
BinaryBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_element!(
append_map_string_string_element,
StringBuilder,
StringBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx)),
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
define_append_map_decimal_value_element!(
append_map_string_decimal_element,
StringBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx))
);
define_append_map_struct_value_element!(
append_map_string_struct_element,
StringBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx))
);
// Decimal key
define_append_map_decimal_key_element!(
append_map_decimal_boolean_element,
BooleanBuilder,
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_int8_element,
Int8Builder,
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_int16_element,
Int16Builder,
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_int32_element,
Int32Builder,
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_int64_element,
Int64Builder,
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_float32_element,
Float32Builder,
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_float64_element,
Float64Builder,
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_date32_element,
Date32Builder,
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_timestamp_element,
TimestampMicrosecondBuilder,
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_binary_element,
BinaryBuilder,
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_decimal_key_element!(
append_map_decimal_string_element,
StringBuilder,
|builder: &mut StringBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_string(idx))
);
// Struct key
define_append_map_struct_key_element!(
append_map_struct_boolean_element,
BooleanBuilder,
|builder: &mut BooleanBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_boolean(idx))
);
define_append_map_struct_key_element!(
append_map_struct_int8_element,
Int8Builder,
|builder: &mut Int8Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_byte(idx))
);
define_append_map_struct_key_element!(
append_map_struct_int16_element,
Int16Builder,
|builder: &mut Int16Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_short(idx))
);
define_append_map_struct_key_element!(
append_map_struct_int32_element,
Int32Builder,
|builder: &mut Int32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_int(idx))
);
define_append_map_struct_key_element!(
append_map_struct_int64_element,
Int64Builder,
|builder: &mut Int64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_long(idx))
);
define_append_map_struct_key_element!(
append_map_struct_float32_element,
Float32Builder,
|builder: &mut Float32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_float(idx))
);
define_append_map_struct_key_element!(
append_map_struct_float64_element,
Float64Builder,
|builder: &mut Float64Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_double(idx))
);
define_append_map_struct_key_element!(
append_map_struct_date32_element,
Date32Builder,
|builder: &mut Date32Builder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_date(idx))
);
define_append_map_struct_key_element!(
append_map_struct_timestamp_element,
TimestampMicrosecondBuilder,
|builder: &mut TimestampMicrosecondBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_timestamp(idx))
);
define_append_map_struct_key_element!(
append_map_struct_binary_element,
BinaryBuilder,
|builder: &mut BinaryBuilder, values: &SparkUnsafeArray, idx: usize| builder
.append_value(values.get_binary(idx))
);
define_append_map_struct_key_element!(
append_map_struct_string_element,
StringBuilder,
|builder: &mut StringBuilder, keys: &SparkUnsafeArray, idx: usize| builder
.append_value(keys.get_string(idx))
);
/// Appending the given map stored in `SparkUnsafeMap` into `MapBuilder`.
/// `field` includes data types of the map element. `map_builder` is the map builder.
/// `map` is the map stored in `SparkUnsafeMap`.
pub fn append_map_elements<K: ArrayBuilder, V: ArrayBuilder>(
field: &FieldRef,
map_builder: &mut MapBuilder<K, V>,
map: &SparkUnsafeMap,
) -> Result<(), CometError> {
let (key_field, value_field, _) = get_map_key_value_fields(field)?;
// macro cannot expand to match arm
match (key_field.data_type(), value_field.data_type()) {
(DataType::Boolean, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, BooleanBuilder>, map_builder);
append_map_boolean_boolean_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Int8Builder>, map_builder);
append_map_boolean_int8_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Int16Builder>, map_builder);
append_map_boolean_int16_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Int32Builder>, map_builder);
append_map_boolean_int32_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Int64Builder>, map_builder);
append_map_boolean_int64_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Float32Builder>, map_builder);
append_map_boolean_float32_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Float64Builder>, map_builder);
append_map_boolean_float64_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Date32Builder>, map_builder);
append_map_boolean_date32_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<BooleanBuilder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_boolean_timestamp_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, BinaryBuilder>, map_builder);
append_map_boolean_binary_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, StringBuilder>, map_builder);
append_map_boolean_string_element(map_builder, map)?;
}
(DataType::Boolean, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, Decimal128Builder>, map_builder);
append_map_boolean_decimal_element(map_builder, map, *p)?;
}
(DataType::Boolean, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BooleanBuilder, StructBuilder>, map_builder);
append_map_boolean_struct_element(map_builder, map, fields)?;
}
(DataType::Int8, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, BooleanBuilder>, map_builder);
append_map_int8_boolean_element(map_builder, map)?;
}
(DataType::Int8, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Int8Builder>, map_builder);
append_map_int8_int8_element(map_builder, map)?;
}
(DataType::Int8, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Int16Builder>, map_builder);
append_map_int8_int16_element(map_builder, map)?;
}
(DataType::Int8, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Int32Builder>, map_builder);
append_map_int8_int32_element(map_builder, map)?;
}
(DataType::Int8, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Int64Builder>, map_builder);
append_map_int8_int64_element(map_builder, map)?;
}
(DataType::Int8, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Float32Builder>, map_builder);
append_map_int8_float32_element(map_builder, map)?;
}
(DataType::Int8, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Float64Builder>, map_builder);
append_map_int8_float64_element(map_builder, map)?;
}
(DataType::Int8, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Date32Builder>, map_builder);
append_map_int8_date32_element(map_builder, map)?;
}
(DataType::Int8, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Int8Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_int8_timestamp_element(map_builder, map)?;
}
(DataType::Int8, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, BinaryBuilder>, map_builder);
append_map_int8_binary_element(map_builder, map)?;
}
(DataType::Int8, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, StringBuilder>, map_builder);
append_map_int8_string_element(map_builder, map)?;
}
(DataType::Int8, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, Decimal128Builder>, map_builder);
append_map_int8_decimal_element(map_builder, map, *p)?;
}
(DataType::Int8, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int8Builder, StructBuilder>, map_builder);
append_map_int8_struct_element(map_builder, map, fields)?;
}
(DataType::Int16, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, BooleanBuilder>, map_builder);
append_map_int16_boolean_element(map_builder, map)?;
}
(DataType::Int16, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Int8Builder>, map_builder);
append_map_int16_int8_element(map_builder, map)?;
}
(DataType::Int16, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Int16Builder>, map_builder);
append_map_int16_int16_element(map_builder, map)?;
}
(DataType::Int16, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Int32Builder>, map_builder);
append_map_int16_int32_element(map_builder, map)?;
}
(DataType::Int16, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Int64Builder>, map_builder);
append_map_int16_int64_element(map_builder, map)?;
}
(DataType::Int16, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Float32Builder>, map_builder);
append_map_int16_float32_element(map_builder, map)?;
}
(DataType::Int16, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Float64Builder>, map_builder);
append_map_int16_float64_element(map_builder, map)?;
}
(DataType::Int16, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Date32Builder>, map_builder);
append_map_int16_date32_element(map_builder, map)?;
}
(DataType::Int16, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Int16Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_int16_timestamp_element(map_builder, map)?;
}
(DataType::Int16, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, BinaryBuilder>, map_builder);
append_map_int16_binary_element(map_builder, map)?;
}
(DataType::Int16, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, StringBuilder>, map_builder);
append_map_int16_string_element(map_builder, map)?;
}
(DataType::Int16, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, Decimal128Builder>, map_builder);
append_map_int16_decimal_element(map_builder, map, *p)?;
}
(DataType::Int16, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int16Builder, StructBuilder>, map_builder);
append_map_int16_struct_element(map_builder, map, fields)?;
}
(DataType::Int32, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, BooleanBuilder>, map_builder);
append_map_int32_boolean_element(map_builder, map)?;
}
(DataType::Int32, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Int8Builder>, map_builder);
append_map_int32_int8_element(map_builder, map)?;
}
(DataType::Int32, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Int16Builder>, map_builder);
append_map_int32_int16_element(map_builder, map)?;
}
(DataType::Int32, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Int32Builder>, map_builder);
append_map_int32_int32_element(map_builder, map)?;
}
(DataType::Int32, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Int64Builder>, map_builder);
append_map_int32_int64_element(map_builder, map)?;
}
(DataType::Int32, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Float32Builder>, map_builder);
append_map_int32_float32_element(map_builder, map)?;
}
(DataType::Int32, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Float64Builder>, map_builder);
append_map_int32_float64_element(map_builder, map)?;
}
(DataType::Int32, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Date32Builder>, map_builder);
append_map_int32_date32_element(map_builder, map)?;
}
(DataType::Int32, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Int32Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_int32_timestamp_element(map_builder, map)?;
}
(DataType::Int32, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, BinaryBuilder>, map_builder);
append_map_int32_binary_element(map_builder, map)?;
}
(DataType::Int32, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, StringBuilder>, map_builder);
append_map_int32_string_element(map_builder, map)?;
}
(DataType::Int32, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, Decimal128Builder>, map_builder);
append_map_int32_decimal_element(map_builder, map, *p)?;
}
(DataType::Int32, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int32Builder, StructBuilder>, map_builder);
append_map_int32_struct_element(map_builder, map, fields)?;
}
(DataType::Int64, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, BooleanBuilder>, map_builder);
append_map_int64_boolean_element(map_builder, map)?;
}
(DataType::Int64, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Int8Builder>, map_builder);
append_map_int64_int8_element(map_builder, map)?;
}
(DataType::Int64, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Int16Builder>, map_builder);
append_map_int64_int16_element(map_builder, map)?;
}
(DataType::Int64, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Int32Builder>, map_builder);
append_map_int64_int32_element(map_builder, map)?;
}
(DataType::Int64, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Int64Builder>, map_builder);
append_map_int64_int64_element(map_builder, map)?;
}
(DataType::Int64, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Float32Builder>, map_builder);
append_map_int64_float32_element(map_builder, map)?;
}
(DataType::Int64, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Float64Builder>, map_builder);
append_map_int64_float64_element(map_builder, map)?;
}
(DataType::Int64, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Date32Builder>, map_builder);
append_map_int64_date32_element(map_builder, map)?;
}
(DataType::Int64, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Int64Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_int64_timestamp_element(map_builder, map)?;
}
(DataType::Int64, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, BinaryBuilder>, map_builder);
append_map_int64_binary_element(map_builder, map)?;
}
(DataType::Int64, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, StringBuilder>, map_builder);
append_map_int64_string_element(map_builder, map)?;
}
(DataType::Int64, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, Decimal128Builder>, map_builder);
append_map_int64_decimal_element(map_builder, map, *p)?;
}
(DataType::Int64, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Int64Builder, StructBuilder>, map_builder);
append_map_int64_struct_element(map_builder, map, fields)?;
}
(DataType::Float32, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, BooleanBuilder>, map_builder);
append_map_float32_boolean_element(map_builder, map)?;
}
(DataType::Float32, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Int8Builder>, map_builder);
append_map_float32_int8_element(map_builder, map)?;
}
(DataType::Float32, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Int16Builder>, map_builder);
append_map_float32_int16_element(map_builder, map)?;
}
(DataType::Float32, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Int32Builder>, map_builder);
append_map_float32_int32_element(map_builder, map)?;
}
(DataType::Float32, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Int64Builder>, map_builder);
append_map_float32_int64_element(map_builder, map)?;
}
(DataType::Float32, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Float32Builder>, map_builder);
append_map_float32_float32_element(map_builder, map)?;
}
(DataType::Float32, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Float64Builder>, map_builder);
append_map_float32_float64_element(map_builder, map)?;
}
(DataType::Float32, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Date32Builder>, map_builder);
append_map_float32_date32_element(map_builder, map)?;
}
(DataType::Float32, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Float32Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_float32_timestamp_element(map_builder, map)?;
}
(DataType::Float32, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, BinaryBuilder>, map_builder);
append_map_float32_binary_element(map_builder, map)?;
}
(DataType::Float32, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, StringBuilder>, map_builder);
append_map_float32_string_element(map_builder, map)?;
}
(DataType::Float32, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, Decimal128Builder>, map_builder);
append_map_float32_decimal_element(map_builder, map, *p)?;
}
(DataType::Float32, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float32Builder, StructBuilder>, map_builder);
append_map_float32_struct_element(map_builder, map, fields)?;
}
(DataType::Float64, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, BooleanBuilder>, map_builder);
append_map_float64_boolean_element(map_builder, map)?;
}
(DataType::Float64, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Int8Builder>, map_builder);
append_map_float64_int8_element(map_builder, map)?;
}
(DataType::Float64, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Int16Builder>, map_builder);
append_map_float64_int16_element(map_builder, map)?;
}
(DataType::Float64, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Int32Builder>, map_builder);
append_map_float64_int32_element(map_builder, map)?;
}
(DataType::Float64, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Int64Builder>, map_builder);
append_map_float64_int64_element(map_builder, map)?;
}
(DataType::Float64, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Float32Builder>, map_builder);
append_map_float64_float32_element(map_builder, map)?;
}
(DataType::Float64, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Float64Builder>, map_builder);
append_map_float64_float64_element(map_builder, map)?;
}
(DataType::Float64, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Date32Builder>, map_builder);
append_map_float64_date32_element(map_builder, map)?;
}
(DataType::Float64, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Float64Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_float64_timestamp_element(map_builder, map)?;
}
(DataType::Float64, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, BinaryBuilder>, map_builder);
append_map_float64_binary_element(map_builder, map)?;
}
(DataType::Float64, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, StringBuilder>, map_builder);
append_map_float64_string_element(map_builder, map)?;
}
(DataType::Float64, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, Decimal128Builder>, map_builder);
append_map_float64_decimal_element(map_builder, map, *p)?;
}
(DataType::Float64, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Float64Builder, StructBuilder>, map_builder);
append_map_float64_struct_element(map_builder, map, fields)?;
}
(DataType::Date32, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, BooleanBuilder>, map_builder);
append_map_date32_boolean_element(map_builder, map)?;
}
(DataType::Date32, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Int8Builder>, map_builder);
append_map_date32_int8_element(map_builder, map)?;
}
(DataType::Date32, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Int16Builder>, map_builder);
append_map_date32_int16_element(map_builder, map)?;
}
(DataType::Date32, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Int32Builder>, map_builder);
append_map_date32_int32_element(map_builder, map)?;
}
(DataType::Date32, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Int64Builder>, map_builder);
append_map_date32_int64_element(map_builder, map)?;
}
(DataType::Date32, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Float32Builder>, map_builder);
append_map_date32_float32_element(map_builder, map)?;
}
(DataType::Date32, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Float64Builder>, map_builder);
append_map_date32_float64_element(map_builder, map)?;
}
(DataType::Date32, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Date32Builder>, map_builder);
append_map_date32_date32_element(map_builder, map)?;
}
(DataType::Date32, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Date32Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_date32_timestamp_element(map_builder, map)?;
}
(DataType::Date32, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, BinaryBuilder>, map_builder);
append_map_date32_binary_element(map_builder, map)?;
}
(DataType::Date32, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, StringBuilder>, map_builder);
append_map_date32_string_element(map_builder, map)?;
}
(DataType::Date32, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, Decimal128Builder>, map_builder);
append_map_date32_decimal_element(map_builder, map, *p)?;
}
(DataType::Date32, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Date32Builder, StructBuilder>, map_builder);
append_map_date32_struct_element(map_builder, map, fields)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Boolean) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, BooleanBuilder>,
map_builder
);
append_map_timestamp_boolean_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int8) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Int8Builder>,
map_builder
);
append_map_timestamp_int8_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int16) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Int16Builder>,
map_builder
);
append_map_timestamp_int16_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int32) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Int32Builder>,
map_builder
);
append_map_timestamp_int32_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int64) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Int64Builder>,
map_builder
);
append_map_timestamp_int64_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Float32) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Float32Builder>,
map_builder
);
append_map_timestamp_float32_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Float64) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Float64Builder>,
map_builder
);
append_map_timestamp_float64_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Date32) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, Date32Builder>,
map_builder
);
append_map_timestamp_date32_element(map_builder, map)?;
}
(
DataType::Timestamp(TimeUnit::Microsecond, _),
DataType::Timestamp(TimeUnit::Microsecond, _),
) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_timestamp_timestamp_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Binary) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, BinaryBuilder>,
map_builder
);
append_map_timestamp_binary_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Utf8) => {
let map_builder = downcast_builder_ref!(
MapBuilder<TimestampMicrosecondBuilder, StringBuilder>,
map_builder
);
append_map_timestamp_string_element(map_builder, map)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Decimal128(p, _)) => {
let map_builder = downcast_builder_ref!(MapBuilder<TimestampMicrosecondBuilder, Decimal128Builder>, map_builder);
append_map_timestamp_decimal_element(map_builder, map, *p)?;
}
(DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Struct(fields)) => {
let map_builder = downcast_builder_ref!(MapBuilder<TimestampMicrosecondBuilder, StructBuilder>, map_builder);
append_map_timestamp_struct_element(map_builder, map, fields)?;
}
(DataType::Binary, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, BooleanBuilder>, map_builder);
append_map_binary_boolean_element(map_builder, map)?;
}
(DataType::Binary, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Int8Builder>, map_builder);
append_map_binary_int8_element(map_builder, map)?;
}
(DataType::Binary, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Int16Builder>, map_builder);
append_map_binary_int16_element(map_builder, map)?;
}
(DataType::Binary, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Int32Builder>, map_builder);
append_map_binary_int32_element(map_builder, map)?;
}
(DataType::Binary, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Int64Builder>, map_builder);
append_map_binary_int64_element(map_builder, map)?;
}
(DataType::Binary, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Float32Builder>, map_builder);
append_map_binary_float32_element(map_builder, map)?;
}
(DataType::Binary, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Float64Builder>, map_builder);
append_map_binary_float64_element(map_builder, map)?;
}
(DataType::Binary, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Date32Builder>, map_builder);
append_map_binary_date32_element(map_builder, map)?;
}
(DataType::Binary, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<BinaryBuilder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_binary_timestamp_element(map_builder, map)?;
}
(DataType::Binary, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, BinaryBuilder>, map_builder);
append_map_binary_binary_element(map_builder, map)?;
}
(DataType::Binary, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, StringBuilder>, map_builder);
append_map_binary_string_element(map_builder, map)?;
}
(DataType::Binary, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, Decimal128Builder>, map_builder);
append_map_binary_decimal_element(map_builder, map, *p)?;
}
(DataType::Binary, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<BinaryBuilder, StructBuilder>, map_builder);
append_map_binary_struct_element(map_builder, map, fields)?;
}
(DataType::Utf8, DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, BooleanBuilder>, map_builder);
append_map_string_boolean_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Int8Builder>, map_builder);
append_map_string_int8_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Int16Builder>, map_builder);
append_map_string_int16_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Int32Builder>, map_builder);
append_map_string_int32_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Int64Builder>, map_builder);
append_map_string_int64_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Float32Builder>, map_builder);
append_map_string_float32_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Float64Builder>, map_builder);
append_map_string_float64_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Date32Builder>, map_builder);
append_map_string_date32_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<StringBuilder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_string_timestamp_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, BinaryBuilder>, map_builder);
append_map_string_binary_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, StringBuilder>, map_builder);
append_map_string_string_element(map_builder, map)?;
}
(DataType::Utf8, DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, Decimal128Builder>, map_builder);
append_map_string_decimal_element(map_builder, map, *p)?;
}
(DataType::Utf8, DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StringBuilder, StructBuilder>, map_builder);
append_map_string_struct_element(map_builder, map, fields)?;
}
(DataType::Decimal128(p, _), DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, BooleanBuilder>, map_builder);
append_map_decimal_boolean_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Int8Builder>, map_builder);
append_map_decimal_int8_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Int16Builder>, map_builder);
append_map_decimal_int16_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Int32Builder>, map_builder);
append_map_decimal_int32_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Int64Builder>, map_builder);
append_map_decimal_int64_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Float32Builder>, map_builder);
append_map_decimal_float32_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Float64Builder>, map_builder);
append_map_decimal_float64_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, Date32Builder>, map_builder);
append_map_decimal_date32_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<Decimal128Builder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_decimal_timestamp_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, BinaryBuilder>, map_builder);
append_map_decimal_binary_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p, _), DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, StringBuilder>, map_builder);
append_map_decimal_string_element(map_builder, map, *p)?;
}
(DataType::Decimal128(p1, _), DataType::Decimal128(p2, _)) => {
let map_builder = downcast_builder_ref!(MapBuilder<Decimal128Builder, Decimal128Builder>, map_builder);
append_map_decimal_decimal_element(map_builder, map, *p1, *p2)?;
}
(DataType::Decimal128(p, _), DataType::Struct(fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<Decimal128Builder, StructBuilder>, map_builder);
append_map_decimal_struct_element(map_builder, map, *p, fields)?;
}
(DataType::Struct(fields), DataType::Boolean) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, BooleanBuilder>, map_builder);
append_map_struct_boolean_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Int8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Int8Builder>, map_builder);
append_map_struct_int8_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Int16) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Int16Builder>, map_builder);
append_map_struct_int16_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Int32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Int32Builder>, map_builder);
append_map_struct_int32_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Int64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Int64Builder>, map_builder);
append_map_struct_int64_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Float32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Float32Builder>, map_builder);
append_map_struct_float32_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Float64) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Float64Builder>, map_builder);
append_map_struct_float64_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Date32) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Date32Builder>, map_builder);
append_map_struct_date32_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Timestamp(TimeUnit::Microsecond, _)) => {
let map_builder = downcast_builder_ref!(
MapBuilder<StructBuilder, TimestampMicrosecondBuilder>,
map_builder
);
append_map_struct_timestamp_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Binary) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, BinaryBuilder>, map_builder);
append_map_struct_binary_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Utf8) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, StringBuilder>, map_builder);
append_map_struct_string_element(map_builder, map, fields)?;
}
(DataType::Struct(fields), DataType::Decimal128(p, _)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, Decimal128Builder>, map_builder);
append_map_struct_decimal_element(map_builder, map, *p, fields)?;
}
(DataType::Struct(key_fields), DataType::Struct(value_fields)) => {
let map_builder =
downcast_builder_ref!(MapBuilder<StructBuilder, StructBuilder>, map_builder);
append_map_struct_struct_element(map_builder, map, key_fields, value_fields)?;
}
_ => {
return Err(CometError::Internal(format!(
"Unsupported map key/value data type: {:?}/{:?}",
key_field.data_type(),
value_field.data_type()
)))
}
}
Ok(())
}
#[allow(clippy::field_reassign_with_default)]
pub fn get_map_key_value_fields(
field: &FieldRef,
) -> Result<(&FieldRef, &FieldRef, MapFieldNames), CometError> {
let mut map_fieldnames = MapFieldNames::default();
map_fieldnames.entry = field.name().to_string();
let (key_field, value_field) = match field.data_type() {
DataType::Struct(fields) => {
if fields.len() != 2 {
return Err(CometError::Internal(format!(
"Map field should have 2 fields, but got {}",
fields.len()
)));
}
let key = &fields[0];
let value = &fields[1];
map_fieldnames.key = key.name().to_string();
map_fieldnames.value = value.name().to_string();
(key, value)
}
_ => {
return Err(CometError::Internal(format!(
"Map field should be a struct, but got {:?}",
field.data_type()
)));
}
};
Ok((key_field, value_field, map_fieldnames))
}