alamb commented on code in PR #2850:
URL: https://github.com/apache/arrow-rs/pull/2850#discussion_r993856462


##########
arrow/src/compute/kernels/temporal.rs:
##########
@@ -28,83 +28,111 @@ use chrono::format::strftime::StrftimeItems;
 use chrono::format::{parse, Parsed};
 use chrono::FixedOffset;
 
-macro_rules! extract_component_from_array {
-    ($iter:ident, $builder:ident, $extract_fn:ident, $using:expr, 
$convert:expr) => {
-        $iter.into_iter().for_each(|value| {
-            if let Some(value) = value {
-                match $using(value) {
-                    Some(dt) => 
$builder.append_value($convert(dt.$extract_fn())),
-                    None => $builder.append_null(),
-                }
-            } else {
-                $builder.append_null();
+fn as_time_with_op<A: ArrayAccessor<Item = T::Native>, T: ArrowTemporalType, 
F>(
+    iter: ArrayIter<A>,
+    mut builder: PrimitiveBuilder<Int32Type>,
+    op: F,
+) -> Int32Array
+where
+    F: Fn(NaiveTime) -> i32,
+    i64: From<T::Native>,
+{
+    iter.into_iter().for_each(|value| {
+        if let Some(value) = value {
+            match as_time::<T>(i64::from(value)) {
+                Some(dt) => builder.append_value(op(dt)),
+                None => builder.append_null(),
             }
-        })
-    };
-    ($iter:ident, $builder:ident, $extract_fn1:ident, $extract_fn2:ident, 
$using:expr, $convert:expr) => {
-        $iter.into_iter().for_each(|value| {
-            if let Some(value) = value {
-                match $using(value) {
-                    Some(dt) => {
-                        
$builder.append_value($convert(dt.$extract_fn1().$extract_fn2()));
-                    }
-                    None => $builder.append_null(),
-                }
-            } else {
-                $builder.append_null();
+        } else {
+            builder.append_null();
+        }
+    });
+
+    builder.finish()
+}
+
+fn as_datetime_with_op<A: ArrayAccessor<Item = T::Native>, T: 
ArrowTemporalType, F>(
+    iter: ArrayIter<A>,
+    mut builder: PrimitiveBuilder<Int32Type>,
+    op: F,
+) -> Int32Array
+where
+    F: Fn(NaiveDateTime) -> i32,
+    i64: From<T::Native>,
+{
+    iter.into_iter().for_each(|value| {
+        if let Some(value) = value {
+            match as_datetime::<T>(i64::from(value)) {
+                Some(dt) => builder.append_value(op(dt)),
+                None => builder.append_null(),
             }
-        })
-    };
-    ($iter:ident, $builder:ident, $extract_fn:ident, $using:expr, $tz:ident, 
$parsed:ident, $value_as_datetime:expr, $convert:expr) => {
-        if ($tz.starts_with('+') || $tz.starts_with('-')) && 
!$tz.contains(':') {
-            return_compute_error_with!(
-                "Invalid timezone",
-                "Expected format [+-]XX:XX".to_string()
-            )
         } else {
-            let tz_parse_result = parse(&mut $parsed, &$tz, 
StrftimeItems::new("%z"));
-            let fixed_offset_from_parsed = match tz_parse_result {
-                Ok(_) => match $parsed.to_fixed_offset() {
-                    Ok(fo) => Some(fo),
-                    err => return_compute_error_with!("Invalid timezone", err),
-                },
-                _ => None,
-            };
-
-            for value in $iter.into_iter() {
-                if let Some(value) = value {
-                    match $value_as_datetime(value) {
-                        Some(utc) => {
-                            let fixed_offset = match fixed_offset_from_parsed {
-                                Some(fo) => fo,
-                                None => match 
using_chrono_tz_and_utc_naive_date_time(
-                                    &$tz, utc,
-                                ) {
+            builder.append_null();
+        }
+    });
+
+    builder.finish()
+}
+
+fn extract_component_from_datatime_array<

Review Comment:
   It would help me to have some docstrings here that explained the parameters 
and types here
   
   However this is already much easier to read than the macro so 👍 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to