From 3554584b7ed9343a3343132e57a1ce3405526398 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Wed, 23 Jun 2021 10:44:14 +0300 Subject: [PATCH 1/3] implement second/minute helpers for temporal --- arrow/src/compute/kernels/temporal.rs | 110 ++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/arrow/src/compute/kernels/temporal.rs b/arrow/src/compute/kernels/temporal.rs index 18a267f9f66d..eead838db5f5 100644 --- a/arrow/src/compute/kernels/temporal.rs +++ b/arrow/src/compute/kernels/temporal.rs @@ -100,6 +100,72 @@ where Ok(b.finish()) } +/// Extracts the minutes of a given temporal array as an array of integers +pub fn minute(array: &PrimitiveArray) -> Result +where + T: ArrowTemporalType + ArrowNumericType, + i64: std::convert::From, +{ + let mut b = Int32Builder::new(array.len()); + match array.data_type() { + &DataType::Date64 | &DataType::Timestamp(_, _) => { + for i in 0..array.len() { + if array.is_null(i) { + b.append_null()?; + } else { + match array.value_as_datetime(i) { + Some(dt) => b.append_value(dt.minute() as i32)?, + None => b.append_null()?, + } + } + } + } + dt => { + return { + Err(ArrowError::ComputeError(format!( + "year does not support type {:?}", + dt + ))) + } + } + } + + Ok(b.finish()) +} + +/// Extracts the seconds of a given temporal array as an array of integers +pub fn second(array: &PrimitiveArray) -> Result +where + T: ArrowTemporalType + ArrowNumericType, + i64: std::convert::From, +{ + let mut b = Int32Builder::new(array.len()); + match array.data_type() { + &DataType::Date64 | &DataType::Timestamp(_, _) => { + for i in 0..array.len() { + if array.is_null(i) { + b.append_null()?; + } else { + match array.value_as_datetime(i) { + Some(dt) => b.append_value(dt.second() as i32)?, + None => b.append_null()?, + } + } + } + } + dt => { + return { + Err(ArrowError::ComputeError(format!( + "year does not support type {:?}", + dt + ))) + } + } + } + + Ok(b.finish()) +} + #[cfg(test)] mod tests { use super::*; @@ -184,4 +250,48 @@ mod tests { assert!(!b.is_valid(1)); assert_eq!(2024, b.value(2)); } + + #[test] + fn test_temporal_array_date64_minute() { + let a: PrimitiveArray = + vec![Some(1514764800000), None, Some(1550636625000)].into(); + + let b = minute(&a).unwrap(); + assert_eq!(0, b.value(0)); + assert!(!b.is_valid(1)); + assert_eq!(23, b.value(2)); + } + + #[test] + fn test_temporal_array_timestamp_micro_minute() { + let a: TimestampMicrosecondArray = + vec![Some(1612025847000000), None, Some(1722015847000000)].into(); + + let b = minute(&a).unwrap(); + assert_eq!(57, b.value(0)); + assert!(!b.is_valid(1)); + assert_eq!(44, b.value(2)); + } + + #[test] + fn test_temporal_array_date64_second() { + let a: PrimitiveArray = + vec![Some(1514764800000), None, Some(1550636625000)].into(); + + let b = second(&a).unwrap(); + assert_eq!(0, b.value(0)); + assert!(!b.is_valid(1)); + assert_eq!(45, b.value(2)); + } + + #[test] + fn test_temporal_array_timestamp_micro_second() { + let a: TimestampMicrosecondArray = + vec![Some(1612025847000000), None, Some(1722015847000000)].into(); + + let b = second(&a).unwrap(); + assert_eq!(27, b.value(0)); + assert!(!b.is_valid(1)); + assert_eq!(7, b.value(2)); + } } From ac9db7ba862ae8a7d2ed67855a45d7e459be0d02 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Wed, 23 Jun 2021 11:16:55 +0300 Subject: [PATCH 2/3] Update arrow/src/compute/kernels/temporal.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniël Heres --- arrow/src/compute/kernels/temporal.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arrow/src/compute/kernels/temporal.rs b/arrow/src/compute/kernels/temporal.rs index eead838db5f5..d4c1eed856bc 100644 --- a/arrow/src/compute/kernels/temporal.rs +++ b/arrow/src/compute/kernels/temporal.rs @@ -156,7 +156,7 @@ where dt => { return { Err(ArrowError::ComputeError(format!( - "year does not support type {:?}", + "second does not support type {:?}", dt ))) } From c297f3f87a7ed49f5abee0e1f04056eb6eb4fa83 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Wed, 23 Jun 2021 11:17:00 +0300 Subject: [PATCH 3/3] Update arrow/src/compute/kernels/temporal.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniël Heres --- arrow/src/compute/kernels/temporal.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arrow/src/compute/kernels/temporal.rs b/arrow/src/compute/kernels/temporal.rs index d4c1eed856bc..5db0dfb6a664 100644 --- a/arrow/src/compute/kernels/temporal.rs +++ b/arrow/src/compute/kernels/temporal.rs @@ -123,7 +123,7 @@ where dt => { return { Err(ArrowError::ComputeError(format!( - "year does not support type {:?}", + "minute does not support type {:?}", dt ))) }