in native/spark-expr/src/kernels/temporal.rs [1005:1148]
fn test_timestamp_trunc_array_fmt_dyn() {
let size = 10;
let formats = [
"YEAR",
"YYYY",
"YY",
"QUARTER",
"MONTH",
"MON",
"MM",
"WEEK",
"DAY",
"DD",
"HOUR",
"MINUTE",
"SECOND",
"MILLISECOND",
"MICROSECOND",
];
let mut vec: Vec<i64> = Vec::with_capacity(size * formats.len());
let mut fmt_vec: Vec<&str> = Vec::with_capacity(size * formats.len());
for i in 0..size {
for fmt_value in &formats {
vec.push(i as i64 * 1_000_000_001);
fmt_vec.push(fmt_value);
}
}
// timestamp array
let array = TimestampMicrosecondArray::from(vec).with_timezone_utc();
// formats array
let fmt_array = StringArray::from(fmt_vec);
// timestamp dictionary array
let mut timestamp_dict_builder =
PrimitiveDictionaryBuilder::<Int32Type, TimestampMicrosecondType>::new();
for v in array.iter() {
timestamp_dict_builder
.append(v.unwrap())
.expect("Error in building timestamp array");
}
let mut array_dict = timestamp_dict_builder.finish();
// apply timezone
array_dict = array_dict.with_values(Arc::new(
array_dict
.values()
.as_any()
.downcast_ref::<TimestampMicrosecondArray>()
.unwrap()
.clone()
.with_timezone_utc(),
));
// formats dictionary array
let mut formats_dict_builder = StringDictionaryBuilder::<Int32Type>::new();
for v in fmt_array.iter() {
formats_dict_builder
.append(v.unwrap())
.expect("Error in building formats array");
}
let fmt_dict = formats_dict_builder.finish();
// verify input arrays
let iter = ArrayIter::new(&array);
let mut dict_iter = array_dict
.downcast_dict::<PrimitiveArray<TimestampMicrosecondType>>()
.unwrap()
.into_iter();
for val in iter {
assert_eq!(
dict_iter
.next()
.expect("array and dictionary array do not match"),
val
)
}
// verify input format arrays
let fmt_iter = ArrayIter::new(&fmt_array);
let mut fmt_dict_iter = fmt_dict.downcast_dict::<StringArray>().unwrap().into_iter();
for val in fmt_iter {
assert_eq!(
fmt_dict_iter
.next()
.expect("formats and dictionary formats do not match"),
val
)
}
// test cases
if let Ok(a) = timestamp_trunc_array_fmt_dyn(&array, &fmt_array) {
for i in 0..array.len() {
assert!(
array.value(i)
>= a.as_any()
.downcast_ref::<TimestampMicrosecondArray>()
.unwrap()
.value(i)
)
}
} else {
unreachable!()
}
if let Ok(a) = timestamp_trunc_array_fmt_dyn(&array_dict, &fmt_array) {
for i in 0..array.len() {
assert!(
array.value(i)
>= a.as_any()
.downcast_ref::<TimestampMicrosecondArray>()
.unwrap()
.value(i)
)
}
} else {
unreachable!()
}
if let Ok(a) = timestamp_trunc_array_fmt_dyn(&array, &fmt_dict) {
for i in 0..array.len() {
assert!(
array.value(i)
>= a.as_any()
.downcast_ref::<TimestampMicrosecondArray>()
.unwrap()
.value(i)
)
}
} else {
unreachable!()
}
if let Ok(a) = timestamp_trunc_array_fmt_dyn(&array_dict, &fmt_dict) {
for i in 0..array.len() {
assert!(
array.value(i)
>= a.as_any()
.downcast_ref::<TimestampMicrosecondArray>()
.unwrap()
.value(i)
)
}
} else {
unreachable!()
}
}