This is an automated email from the ASF dual-hosted git repository.
tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push:
new b79f27b51 Use dyn Array in cast kernels (#3667)
b79f27b51 is described below
commit b79f27b512d46715e9881e34fe4bb525b88fef9d
Author: Raphael Taylor-Davies <[email protected]>
AuthorDate: Mon Feb 6 22:46:23 2023 +0000
Use dyn Array in cast kernels (#3667)
* Use dyn Array in cast kernel
* Fix test
---
arrow-cast/src/cast.rs | 254 +++++++++++++++++++---------------------------
arrow-cast/src/display.rs | 32 +++---
arrow/src/lib.rs | 2 +-
3 files changed, 116 insertions(+), 172 deletions(-)
diff --git a/arrow-cast/src/cast.rs b/arrow-cast/src/cast.rs
index 16a39d773..69e42a548 100644
--- a/arrow-cast/src/cast.rs
+++ b/arrow-cast/src/cast.rs
@@ -320,7 +320,7 @@ pub fn can_cast_types(from_type: &DataType, to_type:
&DataType) -> bool {
/// * To or from `StructArray`
/// * List to primitive
/// * Interval and duration
-pub fn cast(array: &ArrayRef, to_type: &DataType) -> Result<ArrayRef,
ArrowError> {
+pub fn cast(array: &dyn Array, to_type: &DataType) -> Result<ArrayRef,
ArrowError> {
cast_with_options(array, to_type, &DEFAULT_CAST_OPTIONS)
}
@@ -444,7 +444,7 @@ fn cast_reinterpret_arrays<
}
fn cast_decimal_to_integer<D, T>(
- array: &ArrayRef,
+ array: &dyn Array,
base: D::Native,
scale: i8,
cast_options: &CastOptions,
@@ -506,7 +506,7 @@ where
// cast the decimal array to floating-point array
fn cast_decimal_to_float<D: DecimalType, T: ArrowPrimitiveType, F>(
- array: &ArrayRef,
+ array: &dyn Array,
op: F,
) -> Result<ArrayRef, ArrowError>
where
@@ -601,7 +601,7 @@ fn as_time_res_with_timezone<T: ArrowPrimitiveType>(
/// * To or from `StructArray`
/// * List to primitive
pub fn cast_with_options(
- array: &ArrayRef,
+ array: &dyn Array,
to_type: &DataType,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError> {
@@ -610,7 +610,7 @@ pub fn cast_with_options(
// clone array if types are the same
if from_type == to_type {
- return Ok(array.clone());
+ return Ok(make_array(array.data().clone()));
}
match (from_type, to_type) {
(
@@ -683,7 +683,7 @@ pub fn cast_with_options(
"cannot cast list to large-list with different child
data".into(),
))
} else {
- cast_list_container::<i32, i64>(&**array, cast_options)
+ cast_list_container::<i32, i64>(array, cast_options)
}
}
(LargeList(list_from), List(list_to)) => {
@@ -692,7 +692,7 @@ pub fn cast_with_options(
"cannot cast large-list to list with different child
data".into(),
))
} else {
- cast_list_container::<i64, i32>(&**array, cast_options)
+ cast_list_container::<i64, i32>(array, cast_options)
}
}
(List(_) | LargeList(_), _) => match to_type {
@@ -1115,7 +1115,7 @@ pub fn cast_with_options(
))),
},
(Utf8, _) => match to_type {
- LargeUtf8 => cast_byte_container::<Utf8Type, LargeUtf8Type,
str>(&**array),
+ LargeUtf8 => cast_byte_container::<Utf8Type, LargeUtf8Type,
str>(array),
UInt8 => cast_string_to_numeric::<UInt8Type, i32>(array,
cast_options),
UInt16 => cast_string_to_numeric::<UInt16Type, i32>(array,
cast_options),
UInt32 => cast_string_to_numeric::<UInt32Type, i32>(array,
cast_options),
@@ -1126,34 +1126,34 @@ pub fn cast_with_options(
Int64 => cast_string_to_numeric::<Int64Type, i32>(array,
cast_options),
Float32 => cast_string_to_numeric::<Float32Type, i32>(array,
cast_options),
Float64 => cast_string_to_numeric::<Float64Type, i32>(array,
cast_options),
- Date32 => cast_string_to_date32::<i32>(&**array, cast_options),
- Date64 => cast_string_to_date64::<i32>(&**array, cast_options),
+ Date32 => cast_string_to_date32::<i32>(array, cast_options),
+ Date64 => cast_string_to_date64::<i32>(array, cast_options),
Binary =>
Ok(Arc::new(BinaryArray::from(as_string_array(array).clone()))),
LargeBinary => {
let binary = BinaryArray::from(as_string_array(array).clone());
cast_byte_container::<BinaryType, LargeBinaryType,
[u8]>(&binary)
}
Time32(TimeUnit::Second) => {
- cast_string_to_time32second::<i32>(&**array, cast_options)
+ cast_string_to_time32second::<i32>(array, cast_options)
}
Time32(TimeUnit::Millisecond) => {
- cast_string_to_time32millisecond::<i32>(&**array, cast_options)
+ cast_string_to_time32millisecond::<i32>(array, cast_options)
}
Time64(TimeUnit::Microsecond) => {
- cast_string_to_time64microsecond::<i32>(&**array, cast_options)
+ cast_string_to_time64microsecond::<i32>(array, cast_options)
}
Time64(TimeUnit::Nanosecond) => {
- cast_string_to_time64nanosecond::<i32>(&**array, cast_options)
+ cast_string_to_time64nanosecond::<i32>(array, cast_options)
}
Timestamp(TimeUnit::Nanosecond, None) => {
- cast_string_to_timestamp_ns::<i32>(&**array, cast_options)
+ cast_string_to_timestamp_ns::<i32>(array, cast_options)
}
_ => Err(ArrowError::CastError(format!(
"Casting from {from_type:?} to {to_type:?} not supported",
))),
},
(_, Utf8) => match from_type {
- LargeUtf8 => cast_byte_container::<LargeUtf8Type, Utf8Type,
str>(&**array),
+ LargeUtf8 => cast_byte_container::<LargeUtf8Type, Utf8Type,
str>(array),
UInt8 => cast_numeric_to_string::<UInt8Type, i32>(array),
UInt16 => cast_numeric_to_string::<UInt16Type, i32>(array),
UInt32 => cast_numeric_to_string::<UInt32Type, i32>(array),
@@ -1232,8 +1232,8 @@ pub fn cast_with_options(
Int64 => cast_string_to_numeric::<Int64Type, i64>(array,
cast_options),
Float32 => cast_string_to_numeric::<Float32Type, i64>(array,
cast_options),
Float64 => cast_string_to_numeric::<Float64Type, i64>(array,
cast_options),
- Date32 => cast_string_to_date32::<i64>(&**array, cast_options),
- Date64 => cast_string_to_date64::<i64>(&**array, cast_options),
+ Date32 => cast_string_to_date32::<i64>(array, cast_options),
+ Date64 => cast_string_to_date64::<i64>(array, cast_options),
Binary => {
let large_binary =
LargeBinaryArray::from(as_largestring_array(array).clone());
@@ -1243,19 +1243,19 @@ pub fn cast_with_options(
as_largestring_array(array).clone(),
))),
Time32(TimeUnit::Second) => {
- cast_string_to_time32second::<i64>(&**array, cast_options)
+ cast_string_to_time32second::<i64>(array, cast_options)
}
Time32(TimeUnit::Millisecond) => {
- cast_string_to_time32millisecond::<i64>(&**array, cast_options)
+ cast_string_to_time32millisecond::<i64>(array, cast_options)
}
Time64(TimeUnit::Microsecond) => {
- cast_string_to_time64microsecond::<i64>(&**array, cast_options)
+ cast_string_to_time64microsecond::<i64>(array, cast_options)
}
Time64(TimeUnit::Nanosecond) => {
- cast_string_to_time64nanosecond::<i64>(&**array, cast_options)
+ cast_string_to_time64nanosecond::<i64>(array, cast_options)
}
Timestamp(TimeUnit::Nanosecond, None) => {
- cast_string_to_timestamp_ns::<i64>(&**array, cast_options)
+ cast_string_to_timestamp_ns::<i64>(array, cast_options)
}
_ => Err(ArrowError::CastError(format!(
"Casting from {from_type:?} to {to_type:?} not supported",
@@ -1263,14 +1263,14 @@ pub fn cast_with_options(
},
(Binary, _) => match to_type {
LargeBinary => {
- cast_byte_container::<BinaryType, LargeBinaryType,
[u8]>(&**array)
+ cast_byte_container::<BinaryType, LargeBinaryType, [u8]>(array)
}
_ => Err(ArrowError::CastError(format!(
"Casting from {from_type:?} to {to_type:?} not supported",
))),
},
(LargeBinary, _) => match to_type {
- Binary => cast_byte_container::<LargeBinaryType, BinaryType,
[u8]>(&**array),
+ Binary => cast_byte_container::<LargeBinaryType, BinaryType,
[u8]>(array),
_ => Err(ArrowError::CastError(format!(
"Casting from {from_type:?} to {to_type:?} not supported",
))),
@@ -2111,7 +2111,7 @@ where
/// Convert Array into a PrimitiveArray of type, and apply numeric cast
fn cast_numeric_arrays<FROM, TO>(
- from: &ArrayRef,
+ from: &dyn Array,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
where
@@ -2235,7 +2235,7 @@ where
/// Cast timestamp types to Utf8/LargeUtf8
fn cast_timestamp_to_string<T, OffsetSize>(
- array: &ArrayRef,
+ array: &dyn Array,
tz: Option<&String>,
) -> Result<ArrayRef, ArrowError>
where
@@ -2271,7 +2271,7 @@ where
/// Cast date32 types to Utf8/LargeUtf8
fn cast_date32_to_string<OffsetSize: OffsetSizeTrait>(
- array: &ArrayRef,
+ array: &dyn Array,
) -> Result<ArrayRef, ArrowError> {
let array = array.as_any().downcast_ref::<Date32Array>().unwrap();
@@ -2290,7 +2290,7 @@ fn cast_date32_to_string<OffsetSize: OffsetSizeTrait>(
/// Cast date64 types to Utf8/LargeUtf8
fn cast_date64_to_string<OffsetSize: OffsetSizeTrait>(
- array: &ArrayRef,
+ array: &dyn Array,
) -> Result<ArrayRef, ArrowError> {
let array = array.as_any().downcast_ref::<Date64Array>().unwrap();
@@ -2309,7 +2309,7 @@ fn cast_date64_to_string<OffsetSize: OffsetSizeTrait>(
/// Cast numeric types to Utf8
fn cast_numeric_to_string<FROM, OffsetSize>(
- array: &ArrayRef,
+ array: &dyn Array,
) -> Result<ArrayRef, ArrowError>
where
FROM: ArrowPrimitiveType,
@@ -2339,7 +2339,7 @@ where
/// Cast numeric types to Utf8
fn cast_string_to_numeric<T, Offset: OffsetSizeTrait>(
- from: &ArrayRef,
+ from: &dyn Array,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
where
@@ -2795,7 +2795,7 @@ fn cast_string_to_timestamp_ns<Offset: OffsetSizeTrait>(
/// Casts Utf8 to Boolean
fn cast_utf8_to_boolean<OffsetSize>(
- from: &ArrayRef,
+ from: &dyn Array,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
where
@@ -2963,7 +2963,7 @@ where
/// Cast Utf8 to decimal
fn cast_string_to_decimal<T, Offset: OffsetSizeTrait>(
- from: &ArrayRef,
+ from: &dyn Array,
precision: u8,
scale: i8,
cast_options: &CastOptions,
@@ -2998,7 +2998,7 @@ where
/// Cast numeric types to Boolean
///
/// Any zero value returns `false` while non-zero returns `true`
-fn cast_numeric_to_bool<FROM>(from: &ArrayRef) -> Result<ArrayRef, ArrowError>
+fn cast_numeric_to_bool<FROM>(from: &dyn Array) -> Result<ArrayRef, ArrowError>
where
FROM: ArrowPrimitiveType,
{
@@ -3033,7 +3033,7 @@ where
///
/// `false` returns 0 while `true` returns 1
fn cast_bool_to_numeric<TO>(
- from: &ArrayRef,
+ from: &dyn Array,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
where
@@ -3076,7 +3076,7 @@ where
///
/// K is the key type
fn dictionary_cast<K: ArrowDictionaryKeyType>(
- array: &ArrayRef,
+ array: &dyn Array,
to_type: &DataType,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError> {
@@ -3153,7 +3153,7 @@ fn dictionary_cast<K: ArrowDictionaryKeyType>(
// Unpack a dictionary where the keys are of type <K> into a flattened array
of type to_type
fn unpack_dictionary<K>(
- array: &ArrayRef,
+ array: &dyn Array,
to_type: &DataType,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
@@ -3195,7 +3195,7 @@ where
///
/// K is the key type
fn cast_to_dictionary<K: ArrowDictionaryKeyType>(
- array: &ArrayRef,
+ array: &dyn Array,
dict_value_type: &DataType,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError> {
@@ -3271,7 +3271,7 @@ fn cast_to_dictionary<K: ArrowDictionaryKeyType>(
// Packs the data from the primitive array of type <V> to a
// DictionaryArray with keys of type K and values of value_type V
fn pack_numeric_to_dictionary<K, V>(
- array: &ArrayRef,
+ array: &dyn Array,
dict_value_type: &DataType,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
@@ -3303,7 +3303,7 @@ where
// Packs the data as a GenericByteDictionaryBuilder, if possible, with the
// key types of K
fn pack_byte_to_dictionary<K, T>(
- array: &ArrayRef,
+ array: &dyn Array,
cast_options: &CastOptions,
) -> Result<ArrayRef, ArrowError>
where
@@ -3331,7 +3331,7 @@ where
/// Helper function that takes a primitive array and casts to a (generic) list
array.
fn cast_primitive_to_list<OffsetSize: OffsetSizeTrait + NumCast>(
- array: &ArrayRef,
+ array: &dyn Array,
to: &Field,
to_type: &DataType,
cast_options: &CastOptions,
@@ -3371,7 +3371,7 @@ fn cast_primitive_to_list<OffsetSize: OffsetSizeTrait +
NumCast>(
/// Helper function that takes an Generic list container and casts the inner
datatype.
fn cast_list_inner<OffsetSize: OffsetSizeTrait>(
- array: &Arc<dyn Array>,
+ array: &dyn Array,
to: &Field,
to_type: &DataType,
cast_options: &CastOptions,
@@ -3772,8 +3772,7 @@ mod tests {
Some(-3123456),
None,
];
- let input_decimal_array = create_decimal_array(array, 20, 4).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal_array(array, 20, 4).unwrap();
// decimal128 to decimal128
let input_type = DataType::Decimal128(20, 4);
let output_type = DataType::Decimal128(20, 3);
@@ -3816,8 +3815,7 @@ mod tests {
Some(i256::from_i128(-3123456)),
None,
];
- let input_decimal_array = create_decimal256_array(array, 20,
4).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal256_array(array, 20, 4).unwrap();
// decimal256 to decimal256
let input_type = DataType::Decimal256(20, 4);
@@ -3859,8 +3857,7 @@ mod tests {
let output_type = DataType::Decimal128(20, 4);
assert!(can_cast_types(&input_type, &output_type));
let array = vec![Some(1123456), Some(2123456), Some(3123456), None];
- let input_decimal_array = create_decimal_array(array, 20, 3).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal_array(array, 20, 3).unwrap();
generate_cast_test_case!(
&array,
Decimal128Array,
@@ -3874,8 +3871,7 @@ mod tests {
);
// negative test
let array = vec![Some(123456), None];
- let input_decimal_array = create_decimal_array(array, 10, 0).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal_array(array, 10, 0).unwrap();
let result = cast(&array, &DataType::Decimal128(2, 2));
assert!(result.is_ok());
let array = result.unwrap();
@@ -3892,8 +3888,7 @@ mod tests {
assert!(can_cast_types(&input_type, &output_type));
let array = vec![Some(i128::MAX)];
- let input_decimal_array = create_decimal_array(array, 38, 3).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal_array(array, 38, 3).unwrap();
let result =
cast_with_options(&array, &output_type, &CastOptions { safe: false
});
assert_eq!("Cast error: Cannot cast to Decimal128(38, 38). Overflowing
on 170141183460469231731687303715884105727",
@@ -3907,8 +3902,7 @@ mod tests {
assert!(can_cast_types(&input_type, &output_type));
let array = vec![Some(i128::MAX)];
- let input_decimal_array = create_decimal_array(array, 38, 3).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal_array(array, 38, 3).unwrap();
let result =
cast_with_options(&array, &output_type, &CastOptions { safe: false
});
assert_eq!("Cast error: Cannot cast to Decimal256(76, 76). Overflowing
on 170141183460469231731687303715884105727",
@@ -3921,8 +3915,7 @@ mod tests {
let output_type = DataType::Decimal256(20, 4);
assert!(can_cast_types(&input_type, &output_type));
let array = vec![Some(1123456), Some(2123456), Some(3123456), None];
- let input_decimal_array = create_decimal_array(array, 20, 3).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal_array(array, 20, 3).unwrap();
generate_cast_test_case!(
&array,
Decimal256Array,
@@ -3942,8 +3935,7 @@ mod tests {
let output_type = DataType::Decimal128(38, 7);
assert!(can_cast_types(&input_type, &output_type));
let array = vec![Some(i256::from_i128(i128::MAX))];
- let input_decimal_array = create_decimal256_array(array, 76,
5).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal256_array(array, 76, 5).unwrap();
let result =
cast_with_options(&array, &output_type, &CastOptions { safe: false
});
assert_eq!("Cast error: Cannot cast to Decimal128(38, 7). Overflowing
on 170141183460469231731687303715884105727",
@@ -3956,8 +3948,7 @@ mod tests {
let output_type = DataType::Decimal256(76, 55);
assert!(can_cast_types(&input_type, &output_type));
let array = vec![Some(i256::from_i128(i128::MAX))];
- let input_decimal_array = create_decimal256_array(array, 76,
5).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal256_array(array, 76, 5).unwrap();
let result =
cast_with_options(&array, &output_type, &CastOptions { safe: false
});
assert_eq!("Cast error: Cannot cast to Decimal256(76, 55). Overflowing
on 170141183460469231731687303715884105727",
@@ -3975,8 +3966,7 @@ mod tests {
Some(i256::from_i128(3123456)),
None,
];
- let input_decimal_array = create_decimal256_array(array, 20,
3).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal256_array(array, 20, 3).unwrap();
generate_cast_test_case!(
&array,
Decimal128Array,
@@ -4001,8 +3991,7 @@ mod tests {
Some(i256::from_i128(3123456)),
None,
];
- let input_decimal_array = create_decimal256_array(array, 20,
3).unwrap();
- let array = Arc::new(input_decimal_array) as ArrayRef;
+ let array = create_decimal256_array(array, 20, 3).unwrap();
generate_cast_test_case!(
&array,
Decimal256Array,
@@ -4020,8 +4009,7 @@ mod tests {
fn test_cast_decimal_to_numeric() {
let value_array: Vec<Option<i128>> =
vec![Some(125), Some(225), Some(325), None, Some(525)];
- let decimal_array = create_decimal_array(value_array, 38, 2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal_array(value_array, 38, 2).unwrap();
// u8
generate_cast_test_case!(
&array,
@@ -4107,8 +4095,7 @@ mod tests {
// overflow test: out of range of max u8
let value_array: Vec<Option<i128>> = vec![Some(51300)];
- let decimal_array = create_decimal_array(value_array, 38, 2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal_array(value_array, 38, 2).unwrap();
let casted_array =
cast_with_options(&array, &DataType::UInt8, &CastOptions { safe:
false });
assert_eq!(
@@ -4123,8 +4110,7 @@ mod tests {
// overflow test: out of range of max i8
let value_array: Vec<Option<i128>> = vec![Some(24400)];
- let decimal_array = create_decimal_array(value_array, 38, 2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal_array(value_array, 38, 2).unwrap();
let casted_array =
cast_with_options(&array, &DataType::Int8, &CastOptions { safe:
false });
assert_eq!(
@@ -4149,8 +4135,7 @@ mod tests {
Some(112345678),
Some(112345679),
];
- let decimal_array = create_decimal_array(value_array, 38, 2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal_array(value_array, 38, 2).unwrap();
generate_cast_test_case!(
&array,
Float32Array,
@@ -4177,8 +4162,7 @@ mod tests {
Some(112345678901234568),
Some(112345678901234560),
];
- let decimal_array = create_decimal_array(value_array, 38, 2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal_array(value_array, 38, 2).unwrap();
generate_cast_test_case!(
&array,
Float64Array,
@@ -4204,8 +4188,7 @@ mod tests {
None,
Some(i256::from_i128(525)),
];
- let decimal_array = create_decimal256_array(value_array, 38,
2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal256_array(value_array, 38, 2).unwrap();
// u8
generate_cast_test_case!(
&array,
@@ -4291,8 +4274,7 @@ mod tests {
// overflow test: out of range of max i8
let value_array: Vec<Option<i256>> =
vec![Some(i256::from_i128(24400))];
- let decimal_array = create_decimal256_array(value_array, 38,
2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal256_array(value_array, 38, 2).unwrap();
let casted_array =
cast_with_options(&array, &DataType::Int8, &CastOptions { safe:
false });
assert_eq!(
@@ -4317,8 +4299,7 @@ mod tests {
Some(i256::from_i128(112345678)),
Some(i256::from_i128(112345679)),
];
- let decimal_array = create_decimal256_array(value_array, 76,
2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal256_array(value_array, 76, 2).unwrap();
generate_cast_test_case!(
&array,
Float32Array,
@@ -4345,8 +4326,7 @@ mod tests {
Some(i256::from_i128(112345678901234568)),
Some(i256::from_i128(112345678901234560)),
];
- let decimal_array = create_decimal256_array(value_array, 76,
2).unwrap();
- let array = Arc::new(decimal_array) as ArrayRef;
+ let array = create_decimal256_array(value_array, 76, 2).unwrap();
generate_cast_test_case!(
&array,
Float64Array,
@@ -4462,7 +4442,6 @@ mod tests {
// test u8 to decimal type with overflow the result type
// the 100 will be converted to 1000_i128, but it is out of range for
max value in the precision 3.
let array = UInt8Array::from(vec![1, 2, 3, 4, 100]);
- let array = Arc::new(array) as ArrayRef;
let casted_array = cast(&array, &DataType::Decimal128(3, 1));
assert!(casted_array.is_ok());
let array = casted_array.unwrap();
@@ -4473,7 +4452,6 @@ mod tests {
// test i8 to decimal type with overflow the result type
// the 100 will be converted to 1000_i128, but it is out of range for
max value in the precision 3.
let array = Int8Array::from(vec![1, 2, 3, 4, 100]);
- let array = Arc::new(array) as ArrayRef;
let casted_array = cast(&array, &DataType::Decimal128(3, 1));
assert!(casted_array.is_ok());
let array = casted_array.unwrap();
@@ -4516,7 +4494,6 @@ mod tests {
Some(1.123_456_489_012_345_6), // round down
Some(1.123_456_789_012_345_6), // round up
]);
- let array = Arc::new(array) as ArrayRef;
generate_cast_test_case!(
&array,
Decimal128Array,
@@ -4650,7 +4627,6 @@ mod tests {
Some(1.123_456_4), // round down
Some(1.123_456_7), // round up
]);
- let array = Arc::new(array) as ArrayRef;
generate_cast_test_case!(
&array,
Decimal256Array,
@@ -4676,7 +4652,6 @@ mod tests {
Some(1.123_456_489_012_345_6), // round down
Some(1.123_456_789_012_345_6), // round up
]);
- let array = Arc::new(array) as ArrayRef;
generate_cast_test_case!(
&array,
Decimal256Array,
@@ -4696,8 +4671,7 @@ mod tests {
#[test]
fn test_cast_i32_to_f64() {
- let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![5, 6, 7, 8, 9]);
let b = cast(&array, &DataType::Float64).unwrap();
let c = b.as_any().downcast_ref::<Float64Array>().unwrap();
assert_eq!(5.0, c.value(0));
@@ -4709,8 +4683,7 @@ mod tests {
#[test]
fn test_cast_i32_to_u8() {
- let a = Int32Array::from(vec![-5, 6, -7, 8, 100000000]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![-5, 6, -7, 8, 100000000]);
let b = cast(&array, &DataType::UInt8).unwrap();
let c = b.as_any().downcast_ref::<UInt8Array>().unwrap();
assert!(!c.is_valid(0));
@@ -4724,8 +4697,7 @@ mod tests {
#[test]
#[should_panic(expected = "Can't cast value -5 to type UInt8")]
fn test_cast_int32_to_u8_with_error() {
- let a = Int32Array::from(vec![-5, 6, -7, 8, 100000000]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![-5, 6, -7, 8, 100000000]);
// overflow with the error
let cast_option = CastOptions { safe: false };
let result = cast_with_options(&array, &DataType::UInt8, &cast_option);
@@ -4735,8 +4707,7 @@ mod tests {
#[test]
fn test_cast_i32_to_u8_sliced() {
- let a = Int32Array::from(vec![-5, 6, -7, 8, 100000000]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![-5, 6, -7, 8, 100000000]);
assert_eq!(0, array.offset());
let array = array.slice(2, 3);
assert_eq!(2, array.offset());
@@ -4752,8 +4723,7 @@ mod tests {
#[test]
fn test_cast_i32_to_i32() {
- let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![5, 6, 7, 8, 9]);
let b = cast(&array, &DataType::Int32).unwrap();
let c = b.as_any().downcast_ref::<Int32Array>().unwrap();
assert_eq!(5, c.value(0));
@@ -4765,8 +4735,7 @@ mod tests {
#[test]
fn test_cast_i32_to_list_i32() {
- let a = Int32Array::from(vec![5, 6, 7, 8, 9]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![5, 6, 7, 8, 9]);
let b = cast(
&array,
&DataType::List(Box::new(Field::new("item", DataType::Int32,
true))),
@@ -4790,8 +4759,7 @@ mod tests {
#[test]
fn test_cast_i32_to_list_i32_nullable() {
- let a = Int32Array::from(vec![Some(5), None, Some(7), Some(8),
Some(9)]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![Some(5), None, Some(7), Some(8),
Some(9)]);
let b = cast(
&array,
&DataType::List(Box::new(Field::new("item", DataType::Int32,
true))),
@@ -4818,8 +4786,8 @@ mod tests {
#[test]
fn test_cast_i32_to_list_f64_nullable_sliced() {
- let a = Int32Array::from(vec![Some(5), None, Some(7), Some(8), None,
Some(10)]);
- let array = Arc::new(a) as ArrayRef;
+ let array =
+ Int32Array::from(vec![Some(5), None, Some(7), Some(8), None,
Some(10)]);
let array = array.slice(2, 4);
let b = cast(
&array,
@@ -4844,8 +4812,7 @@ mod tests {
#[test]
fn test_cast_utf8_to_i32() {
- let a = StringArray::from(vec!["5", "6", "seven", "8", "9.1"]);
- let array = Arc::new(a) as ArrayRef;
+ let array = StringArray::from(vec!["5", "6", "seven", "8", "9.1"]);
let b = cast(&array, &DataType::Int32).unwrap();
let c = b.as_any().downcast_ref::<Int32Array>().unwrap();
assert_eq!(5, c.value(0));
@@ -4857,8 +4824,7 @@ mod tests {
#[test]
fn test_cast_with_options_utf8_to_i32() {
- let a = StringArray::from(vec!["5", "6", "seven", "8", "9.1"]);
- let array = Arc::new(a) as ArrayRef;
+ let array = StringArray::from(vec!["5", "6", "seven", "8", "9.1"]);
let result =
cast_with_options(&array, &DataType::Int32, &CastOptions { safe:
false });
match result {
@@ -4876,9 +4842,7 @@ mod tests {
#[test]
fn test_cast_utf8_to_bool() {
- let strings = Arc::new(StringArray::from(vec![
- "true", "false", "invalid", " Y ", "",
- ])) as ArrayRef;
+ let strings = StringArray::from(vec!["true", "false", "invalid", " Y
", ""]);
let casted = cast(&strings, &DataType::Boolean).unwrap();
let expected =
BooleanArray::from(vec![Some(true), Some(false), None, Some(true),
None]);
@@ -4887,9 +4851,7 @@ mod tests {
#[test]
fn test_cast_with_options_utf8_to_bool() {
- let strings = Arc::new(StringArray::from(vec![
- "true", "false", "invalid", " Y ", "",
- ])) as ArrayRef;
+ let strings = StringArray::from(vec!["true", "false", "invalid", " Y
", ""]);
let casted =
cast_with_options(&strings, &DataType::Boolean, &CastOptions {
safe: false });
match casted {
@@ -4904,8 +4866,7 @@ mod tests {
#[test]
fn test_cast_bool_to_i32() {
- let a = BooleanArray::from(vec![Some(true), Some(false), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array = BooleanArray::from(vec![Some(true), Some(false), None]);
let b = cast(&array, &DataType::Int32).unwrap();
let c = b.as_any().downcast_ref::<Int32Array>().unwrap();
assert_eq!(1, c.value(0));
@@ -4915,8 +4876,7 @@ mod tests {
#[test]
fn test_cast_bool_to_f64() {
- let a = BooleanArray::from(vec![Some(true), Some(false), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array = BooleanArray::from(vec![Some(true), Some(false), None]);
let b = cast(&array, &DataType::Float64).unwrap();
let c = b.as_any().downcast_ref::<Float64Array>().unwrap();
assert_eq!(1.0, c.value(0));
@@ -4929,8 +4889,7 @@ mod tests {
expected = "Casting from Int32 to Timestamp(Microsecond, None) not
supported"
)]
fn test_cast_int32_to_timestamp() {
- let a = Int32Array::from(vec![Some(2), Some(10), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![Some(2), Some(10), None]);
cast(&array, &DataType::Timestamp(TimeUnit::Microsecond,
None)).unwrap();
}
@@ -4952,7 +4911,7 @@ mod tests {
.add_child_data(value_data)
.build()
.unwrap();
- let list_array = Arc::new(ListArray::from(list_data)) as ArrayRef;
+ let list_array = ListArray::from(list_data);
let cast_array = cast(
&list_array,
@@ -5279,8 +5238,7 @@ mod tests {
#[test]
fn test_cast_date32_to_int32() {
- let a = Date32Array::from(vec![10000, 17890]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Date32Array::from(vec![10000, 17890]);
let b = cast(&array, &DataType::Int32).unwrap();
let c = b.as_any().downcast_ref::<Int32Array>().unwrap();
assert_eq!(10000, c.value(0));
@@ -5289,8 +5247,7 @@ mod tests {
#[test]
fn test_cast_int32_to_date32() {
- let a = Int32Array::from(vec![10000, 17890]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Int32Array::from(vec![10000, 17890]);
let b = cast(&array, &DataType::Date32).unwrap();
let c = b.as_any().downcast_ref::<Date32Array>().unwrap();
assert_eq!(10000, c.value(0));
@@ -5299,13 +5256,12 @@ mod tests {
#[test]
fn test_cast_timestamp_to_date32() {
- let a = TimestampMillisecondArray::from(vec![
+ let array = TimestampMillisecondArray::from(vec![
Some(864000000005),
Some(1545696000001),
None,
])
.with_timezone("UTC".to_string());
- let array = Arc::new(a) as ArrayRef;
let b = cast(&array, &DataType::Date32).unwrap();
let c = b.as_any().downcast_ref::<Date32Array>().unwrap();
assert_eq!(10000, c.value(0));
@@ -5315,12 +5271,11 @@ mod tests {
#[test]
fn test_cast_timestamp_to_date64() {
- let a = TimestampMillisecondArray::from(vec![
+ let array = TimestampMillisecondArray::from(vec![
Some(864000000005),
Some(1545696000001),
None,
]);
- let array = Arc::new(a) as ArrayRef;
let b = cast(&array, &DataType::Date64).unwrap();
let c = b.as_any().downcast_ref::<Date64Array>().unwrap();
assert_eq!(864000000005, c.value(0));
@@ -5331,9 +5286,8 @@ mod tests {
#[test]
fn test_cast_timestamp_to_time64() {
// test timestamp secs
- let a = TimestampSecondArray::from(vec![Some(86405), Some(1), None])
+ let array = TimestampSecondArray::from(vec![Some(86405), Some(1),
None])
.with_timezone("+01:00".to_string());
- let array = Arc::new(a) as ArrayRef;
let b = cast(&array,
&DataType::Time64(TimeUnit::Microsecond)).unwrap();
let c = b.as_any().downcast_ref::<Time64MicrosecondArray>().unwrap();
assert_eq!(3605000000, c.value(0));
@@ -5484,8 +5438,8 @@ mod tests {
#[test]
fn test_cast_date64_to_timestamp() {
- let a = Date64Array::from(vec![Some(864000000005),
Some(1545696000001), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array =
+ Date64Array::from(vec![Some(864000000005), Some(1545696000001),
None]);
let b = cast(&array, &DataType::Timestamp(TimeUnit::Second,
None)).unwrap();
let c = b.as_any().downcast_ref::<TimestampSecondArray>().unwrap();
assert_eq!(864000000, c.value(0));
@@ -5495,8 +5449,8 @@ mod tests {
#[test]
fn test_cast_date64_to_timestamp_ms() {
- let a = Date64Array::from(vec![Some(864000000005),
Some(1545696000001), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array =
+ Date64Array::from(vec![Some(864000000005), Some(1545696000001),
None]);
let b = cast(&array, &DataType::Timestamp(TimeUnit::Millisecond,
None)).unwrap();
let c = b
.as_any()
@@ -5509,8 +5463,8 @@ mod tests {
#[test]
fn test_cast_date64_to_timestamp_us() {
- let a = Date64Array::from(vec![Some(864000000005),
Some(1545696000001), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array =
+ Date64Array::from(vec![Some(864000000005), Some(1545696000001),
None]);
let b = cast(&array, &DataType::Timestamp(TimeUnit::Microsecond,
None)).unwrap();
let c = b
.as_any()
@@ -5523,8 +5477,8 @@ mod tests {
#[test]
fn test_cast_date64_to_timestamp_ns() {
- let a = Date64Array::from(vec![Some(864000000005),
Some(1545696000001), None]);
- let array = Arc::new(a) as ArrayRef;
+ let array =
+ Date64Array::from(vec![Some(864000000005), Some(1545696000001),
None]);
let b = cast(&array, &DataType::Timestamp(TimeUnit::Nanosecond,
None)).unwrap();
let c = b
.as_any()
@@ -5537,13 +5491,12 @@ mod tests {
#[test]
fn test_cast_timestamp_to_i64() {
- let a = TimestampMillisecondArray::from(vec![
+ let array = TimestampMillisecondArray::from(vec![
Some(864000000005),
Some(1545696000001),
None,
])
.with_timezone("UTC".to_string());
- let array = Arc::new(a) as ArrayRef;
let b = cast(&array, &DataType::Int64).unwrap();
let c = b.as_any().downcast_ref::<Int64Array>().unwrap();
assert_eq!(&DataType::Int64, c.data_type());
@@ -5554,8 +5507,7 @@ mod tests {
#[test]
fn test_cast_date32_to_string() {
- let a = Date32Array::from(vec![10000, 17890]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Date32Array::from(vec![10000, 17890]);
let b = cast(&array, &DataType::Utf8).unwrap();
let c = b.as_any().downcast_ref::<StringArray>().unwrap();
assert_eq!(&DataType::Utf8, c.data_type());
@@ -5565,8 +5517,7 @@ mod tests {
#[test]
fn test_cast_date64_to_string() {
- let a = Date64Array::from(vec![10000 * 86400000, 17890 * 86400000]);
- let array = Arc::new(a) as ArrayRef;
+ let array = Date64Array::from(vec![10000 * 86400000, 17890 *
86400000]);
let b = cast(&array, &DataType::Utf8).unwrap();
let c = b.as_any().downcast_ref::<StringArray>().unwrap();
assert_eq!(&DataType::Utf8, c.data_type());
@@ -5576,12 +5527,11 @@ mod tests {
#[test]
fn test_cast_between_timestamps() {
- let a = TimestampMillisecondArray::from(vec![
+ let array = TimestampMillisecondArray::from(vec![
Some(864000003005),
Some(1545696002001),
None,
]);
- let array = Arc::new(a) as ArrayRef;
let b = cast(&array, &DataType::Timestamp(TimeUnit::Second,
None)).unwrap();
let c = b.as_any().downcast_ref::<TimestampSecondArray>().unwrap();
assert_eq!(864000003, c.value(0));
@@ -5629,7 +5579,7 @@ mod tests {
#[test]
fn test_cast_to_strings() {
- let a = Arc::new(Int32Array::from(vec![1, 2, 3])) as ArrayRef;
+ let a = Int32Array::from(vec![1, 2, 3]);
let out = cast(&a, &DataType::Utf8).unwrap();
let out = out
.as_any()
@@ -5654,7 +5604,7 @@ mod tests {
vec![Some("foo"), Some("bar"), Some("ham")],
vec![Some("foo"), None, Some("bar")],
] {
- let a = Arc::new(LargeStringArray::from(data.clone())) as ArrayRef;
+ let a = LargeStringArray::from(data.clone());
let to = cast(&a, &DataType::Utf8).unwrap();
let expect = a
.as_any()
@@ -5670,7 +5620,7 @@ mod tests {
.collect::<Vec<_>>();
assert_eq!(expect, out);
- let a = Arc::new(StringArray::from(data)) as ArrayRef;
+ let a = StringArray::from(data);
let to = cast(&a, &DataType::LargeUtf8).unwrap();
let expect = a
.as_any()
@@ -6601,7 +6551,7 @@ mod tests {
#[test]
fn test_cast_from_int8() {
let i8_values: Vec<i8> = vec![i8::MIN, 0, i8::MAX];
- let i8_array: ArrayRef = Arc::new(Int8Array::from(i8_values));
+ let i8_array = Int8Array::from(i8_values);
let f64_expected = vec!["-128.0", "0.0", "127.0"];
assert_eq!(
@@ -6665,7 +6615,7 @@ mod tests {
}
/// Convert `array` into a vector of strings by casting to data type dt
- fn get_cast_values<T>(array: &ArrayRef, dt: &DataType) -> Vec<String>
+ fn get_cast_values<T>(array: &dyn Array, dt: &DataType) -> Vec<String>
where
T: ArrowPrimitiveType,
{
@@ -6782,7 +6732,7 @@ mod tests {
let val = format!("val{i}");
builder.append(&val).unwrap();
}
- let array: ArrayRef = Arc::new(builder.finish());
+ let array = builder.finish();
let cast_type = Dictionary(Box::new(Int8), Box::new(Utf8));
let res = cast(&array, &cast_type);
diff --git a/arrow-cast/src/display.rs b/arrow-cast/src/display.rs
index 721432112..bd4829898 100644
--- a/arrow-cast/src/display.rs
+++ b/arrow-cast/src/display.rs
@@ -20,7 +20,6 @@
//! record batch pretty printing.
use std::fmt::Write;
-use std::sync::Arc;
use arrow_array::timezone::Tz;
use arrow_array::types::*;
@@ -387,7 +386,7 @@ macro_rules! make_string_from_duration {
#[inline(always)]
pub fn make_string_from_decimal(
- column: &Arc<dyn Array>,
+ column: &dyn Array,
row: usize,
) -> Result<String, ArrowError> {
let array = column.as_any().downcast_ref::<Decimal128Array>().unwrap();
@@ -398,7 +397,7 @@ pub fn make_string_from_decimal(
fn append_struct_field_string(
target: &mut String,
name: &str,
- field_col: &Arc<dyn Array>,
+ field_col: &dyn Array,
row: usize,
) -> Result<(), ArrowError> {
target.push('"');
@@ -425,7 +424,7 @@ fn append_struct_field_string(
fn append_map_field_string(
target: &mut String,
- field_col: &Arc<dyn Array>,
+ field_col: &dyn Array,
row: usize,
) -> Result<(), ArrowError> {
if field_col.is_null(row) {
@@ -451,7 +450,7 @@ fn append_map_field_string(
/// Note this function is quite inefficient and is unlikely to be
/// suitable for converting large arrays or record batches.
fn array_value_to_string_internal(
- column: &ArrayRef,
+ column: &dyn Array,
col_idx: usize,
row_idx: usize,
format: Option<&str>,
@@ -722,7 +721,7 @@ fn array_value_to_string_internal(
}
pub fn temporal_array_value_to_string(
- column: &ArrayRef,
+ column: &dyn Array,
col_idx: usize,
row_idx: usize,
format: Option<&str>,
@@ -731,7 +730,7 @@ pub fn temporal_array_value_to_string(
}
pub fn array_value_to_string(
- column: &ArrayRef,
+ column: &dyn Array,
row_idx: usize,
) -> Result<String, ArrowError> {
array_value_to_string_internal(column, 0, row_idx, None)
@@ -739,7 +738,7 @@ pub fn array_value_to_string(
/// Converts the value of the union array at `row` to a String
fn union_to_string(
- column: &ArrayRef,
+ column: &dyn Array,
row: usize,
fields: &[Field],
type_ids: &[i8],
@@ -773,7 +772,7 @@ fn union_to_string(
}
/// Converts the value of the dictionary array at `row` to a String
fn dict_array_value_to_string<K: ArrowPrimitiveType>(
- colum: &ArrayRef,
+ colum: &dyn Array,
row: usize,
) -> Result<String, ArrowError> {
let dict_array =
colum.as_any().downcast_ref::<DictionaryArray<K>>().unwrap();
@@ -824,35 +823,30 @@ mod tests {
&entry_offsets,
)
.unwrap();
- let param = Arc::new(map_array) as ArrayRef;
assert_eq!(
"{\"d\": 30, \"e\": 40, \"f\": 50}",
- array_value_to_string(¶m, 1).unwrap()
+ array_value_to_string(&map_array, 1).unwrap()
);
}
#[test]
fn test_array_value_to_string_duration() {
- let ns_array =
- Arc::new(DurationNanosecondArray::from(vec![Some(1), None])) as
ArrayRef;
+ let ns_array = DurationNanosecondArray::from(vec![Some(1), None]);
assert_eq!(
array_value_to_string(&ns_array, 0).unwrap(),
"PT0.000000001S"
);
assert_eq!(array_value_to_string(&ns_array, 1).unwrap(), "");
- let us_array =
- Arc::new(DurationMicrosecondArray::from(vec![Some(1), None])) as
ArrayRef;
+ let us_array = DurationMicrosecondArray::from(vec![Some(1), None]);
assert_eq!(array_value_to_string(&us_array, 0).unwrap(),
"PT0.000001S");
assert_eq!(array_value_to_string(&us_array, 1).unwrap(), "");
- let ms_array =
- Arc::new(DurationMillisecondArray::from(vec![Some(1), None])) as
ArrayRef;
+ let ms_array = DurationMillisecondArray::from(vec![Some(1), None]);
assert_eq!(array_value_to_string(&ms_array, 0).unwrap(), "PT0.001S");
assert_eq!(array_value_to_string(&ms_array, 1).unwrap(), "");
- let s_array =
- Arc::new(DurationSecondArray::from(vec![Some(1), None])) as
ArrayRef;
+ let s_array = DurationSecondArray::from(vec![Some(1), None]);
assert_eq!(array_value_to_string(&s_array, 0).unwrap(), "PT1S");
assert_eq!(array_value_to_string(&s_array, 1).unwrap(), "");
}
diff --git a/arrow/src/lib.rs b/arrow/src/lib.rs
index 64e5d6a2c..f7ce24a97 100644
--- a/arrow/src/lib.rs
+++ b/arrow/src/lib.rs
@@ -186,7 +186,7 @@
//! where
//! I: IntoIterator<Item=&'a str>,
//! {
-//! let array =
Arc::new(StringArray::from_iter(iter.into_iter().map(Some))) as _;
+//! let array = StringArray::from_iter(iter.into_iter().map(Some));
//! arrow::compute::cast(&array, to_data_type)
//! }
//!