fn make_builders()

in native/core/src/execution/shuffle/row.rs [1826:3144]


fn make_builders(
    dt: &DataType,
    row_num: usize,
    prefer_dictionary_ratio: f64,
) -> Result<Box<dyn ArrayBuilder>, CometError> {
    let builder: Box<dyn ArrayBuilder> = match dt {
        DataType::Boolean => Box::new(BooleanBuilder::with_capacity(row_num)),
        DataType::Int8 => Box::new(Int8Builder::with_capacity(row_num)),
        DataType::Int16 => Box::new(Int16Builder::with_capacity(row_num)),
        DataType::Int32 => Box::new(Int32Builder::with_capacity(row_num)),
        DataType::Int64 => Box::new(Int64Builder::with_capacity(row_num)),
        DataType::Float32 => Box::new(Float32Builder::with_capacity(row_num)),
        DataType::Float64 => Box::new(Float64Builder::with_capacity(row_num)),
        DataType::Decimal128(_, _) => {
            Box::new(Decimal128Builder::with_capacity(row_num).with_data_type(dt.clone()))
        }
        DataType::Utf8 => {
            if prefer_dictionary_ratio > 1.0 {
                Box::new(StringDictionaryBuilder::<Int32Type>::with_capacity(
                    row_num / 2,
                    row_num,
                    1024,
                ))
            } else {
                Box::new(StringBuilder::with_capacity(row_num, 1024))
            }
        }
        DataType::Binary => {
            if prefer_dictionary_ratio > 1.0 {
                Box::new(BinaryDictionaryBuilder::<Int32Type>::with_capacity(
                    row_num / 2,
                    row_num,
                    1024,
                ))
            } else {
                Box::new(BinaryBuilder::with_capacity(row_num, 1024))
            }
        }
        DataType::Date32 => Box::new(Date32Builder::with_capacity(row_num)),
        DataType::Timestamp(TimeUnit::Microsecond, _) => {
            Box::new(TimestampMicrosecondBuilder::with_capacity(row_num).with_data_type(dt.clone()))
        }
        DataType::Map(field, _) => {
            let (key_field, value_field, map_field_names) = get_map_key_value_fields(field)?;
            let key_dt = key_field.data_type();
            let value_dt = value_field.data_type();
            let key_builder = make_builders(key_dt, NESTED_TYPE_BUILDER_CAPACITY, 1.0)?;
            let value_builder = make_builders(value_dt, NESTED_TYPE_BUILDER_CAPACITY, 1.0)?;

            // TODO: support other types of map after new release of Arrow. In new API, `MapBuilder`
            // can take general `Box<dyn ArrayBuilder>` as key/value builder.
            match (key_dt, value_dt) {
                (DataType::Boolean, DataType::Boolean) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Int8) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Int16) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Int32) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Int64) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Float32) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Float64) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Date32) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Binary) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Utf8) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Boolean, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(BooleanBuilder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Int8) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Int16) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Int32) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Int64) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Float32) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Float64) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Date32) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Binary) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int8, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Int8Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Int8) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Int16) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Int32) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Int64) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Float32) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Float64) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Date32) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Binary) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int16, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Int16Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Int8) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Int16) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Int32) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Int64) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Float32) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Float64) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Date32) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Binary) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int32, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Int32Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Int8) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Int16) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Int32) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Int64) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Float32) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Float64) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Date32) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Binary) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Int64, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Int64Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Int8) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Int16) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Int32) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Int64) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Float32) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Float64) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Date32) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Binary) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float32, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Float32Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Int8) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Int16) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Int32) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Int64) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Float32) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Float64) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Date32) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Binary) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Float64, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Float64Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Boolean) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Int8) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Int16) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Int32) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Int64) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Float32) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Float64) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Date32) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Binary) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Utf8) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Date32, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Date32Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Boolean) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int8) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int16) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int32) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Int64) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Float32) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Float64) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (
                    DataType::Timestamp(TimeUnit::Microsecond, _),
                    DataType::Timestamp(TimeUnit::Microsecond, _),
                ) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Date32) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Binary) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Utf8) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Timestamp(TimeUnit::Microsecond, _), DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(TimestampMicrosecondBuilder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Boolean) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Int8) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Int16) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Int32) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Int64) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Float32) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Float64) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Date32) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Binary) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Utf8) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Binary, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(BinaryBuilder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Boolean) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Int8) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Int16) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Int32) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Int64) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Float32) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Float64) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Date32) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Binary) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Utf8) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Utf8, DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(StringBuilder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Boolean) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Int8) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Int16) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Int32) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Int64) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Float32) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Float64) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Timestamp(TimeUnit::Microsecond, _)) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder =
                        downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Date32) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Binary) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Utf8) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }
                (DataType::Decimal128(_, _), DataType::Decimal128(_, _)) => {
                    let key_builder = downcast_builder!(Decimal128Builder, key_builder);
                    let value_builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(
                        MapBuilder::new(Some(map_field_names), *key_builder, *value_builder)
                            .with_values_field(Arc::clone(value_field)),
                    )
                }

                _ => {
                    return Err(CometError::Internal(format!(
                        "Unsupported map type: {:?}",
                        field.data_type()
                    )))
                }
            }
        }
        DataType::List(field) => {
            // Disable dictionary encoding for array element
            let value_builder =
                make_builders(field.data_type(), NESTED_TYPE_BUILDER_CAPACITY, 1.0)?;

            // Needed to overwrite default ListBuilder creation having the incoming field schema to be driving
            let value_field = Arc::clone(field);

            match field.data_type() {
                DataType::Boolean => {
                    let builder = downcast_builder!(BooleanBuilder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Int8 => {
                    let builder = downcast_builder!(Int8Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Int16 => {
                    let builder = downcast_builder!(Int16Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Int32 => {
                    let builder = downcast_builder!(Int32Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Int64 => {
                    let builder = downcast_builder!(Int64Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Float32 => {
                    let builder = downcast_builder!(Float32Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Float64 => {
                    let builder = downcast_builder!(Float64Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Decimal128(_, _) => {
                    let builder = downcast_builder!(Decimal128Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Timestamp(TimeUnit::Microsecond, _) => {
                    let builder = downcast_builder!(TimestampMicrosecondBuilder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Date32 => {
                    let builder = downcast_builder!(Date32Builder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Binary => {
                    let builder = downcast_builder!(BinaryBuilder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Utf8 => {
                    let builder = downcast_builder!(StringBuilder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                DataType::Struct(_) => {
                    let builder = downcast_builder!(StructBuilder, value_builder);
                    Box::new(ListBuilder::new(*builder).with_field(value_field))
                }
                // TODO: nested list is not supported. Due to the design of `ListBuilder`, it has
                // a `T: ArrayBuilder` as type parameter. It makes hard to construct an arbitrarily
                // nested `ListBuilder`.
                DataType::List(_) => {
                    return Err(CometError::Internal(
                        "list of list is not supported type".to_string(),
                    ))
                }
                _ => {
                    return Err(CometError::Internal(format!(
                        "Unsupported list type: {:?}",
                        field.data_type()
                    )))
                }
            }
        }
        DataType::Struct(fields) => {
            let field_builders = fields
                .iter()
                // Disable dictionary encoding for struct fields
                .map(|field| make_builders(field.data_type(), row_num, 1.0))
                .collect::<Result<Vec<_>, _>>()?;

            Box::new(StructBuilder::new(fields.clone(), field_builders))
        }
        _ => return Err(CometError::Internal(format!("Unsupported type: {:?}", dt))),
    };

    Ok(builder)
}