viirya commented on code in PR #6654:
URL: https://github.com/apache/arrow-datafusion/pull/6654#discussion_r1233097208


##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),

Review Comment:
   ```suggestion
                   "second" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
   ```



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000_000),
+            };
+            ScalarValue::TimestampMillisecond(value, tz_opt.clone())
+        }
+        TimeUnit::Microsecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000),
+                "millisecond" => Some(nano.unwrap() / 1_000 * 1_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000),
+            };
+            ScalarValue::TimestampMicrosecond(value, tz_opt.clone())
+        }
+        _ => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 
1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000 * 1_000),

Review Comment:
   ```suggestion
                   "millisecond" => Some(nano.unwrap() / 1_000_000 * 1_000_000),
   ```



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())

Review Comment:
   ```suggestion
               let value = Some(nano.unwrap() / 1_000_000_000);
               ScalarValue::TimestampSecond(value, tz_opt.clone())
   ```
   
   As output unit is second, smaller granularity can be truncated simply.



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000_000),
+            };
+            ScalarValue::TimestampMillisecond(value, tz_opt.clone())
+        }
+        TimeUnit::Microsecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000),

Review Comment:
   ```suggestion
                   "second" => Some(nano.unwrap() / 1_000_000_000 * 1_000_000),
   ```



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000_000),

Review Comment:
   ditto. For granularity smaller than millisecond can be truncated simply.
   
   ```suggestion
                   _ => Some(nano.unwrap() / 1_000_000),
   ```



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000_000),
+            };
+            ScalarValue::TimestampMillisecond(value, tz_opt.clone())
+        }
+        TimeUnit::Microsecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000),
+                "millisecond" => Some(nano.unwrap() / 1_000 * 1_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000),
+            };
+            ScalarValue::TimestampMicrosecond(value, tz_opt.clone())
+        }
+        _ => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 
1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000 * 1_000),
+                "microsecond" => Some(nano.unwrap()),

Review Comment:
   ```suggestion
                   "microsecond" => Some(nano.unwrap() / 1_000 * 1_000),
   ```



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000_000),
+            };
+            ScalarValue::TimestampMillisecond(value, tz_opt.clone())
+        }
+        TimeUnit::Microsecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000),
+                "millisecond" => Some(nano.unwrap() / 1_000 * 1_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000),
+            };
+            ScalarValue::TimestampMicrosecond(value, tz_opt.clone())
+        }
+        _ => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 
1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000_000),

Review Comment:
   ```suggestion
                   "second" => Some(nano.unwrap() / 1_000_000_000 * 
1_000_000_000),
   ```



##########
datafusion/physical-expr/src/datetime_expressions.rs:
##########
@@ -262,6 +262,65 @@ fn date_trunc_single(granularity: &str, value: i64) -> 
Result<i64> {
     Ok(value.unwrap().timestamp_nanos())
 }
 
+fn _date_trunc(
+    tu: TimeUnit,
+    value: &Option<i64>,
+    granularity: &str,
+    f: impl Fn(Option<i64>) -> Result<Option<i64>>,
+    tz_opt: &Option<Arc<str>>,
+) -> Result<ColumnarValue, DataFusionError> {
+    let scale = match tu {
+        TimeUnit::Second => 1_000_000_000,
+        TimeUnit::Millisecond => 1_000_000,
+        TimeUnit::Microsecond => 1_000,
+        TimeUnit::Nanosecond => 1,
+    };
+    let nano = (f)(Some(value.unwrap() * scale))?;
+    let result = match tu {
+        TimeUnit::Second => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap()),
+                _ => Some(nano.unwrap() / 1_000_000_000),
+            };
+            ScalarValue::TimestampSecond(value, tz_opt.clone())
+        }
+        TimeUnit::Millisecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000),
+                "second" => Some(nano.unwrap() / 1_000_000_000),
+                "millisecond" => Some(nano.unwrap() / 1_000_000),
+                "microsecond" => Some(nano.unwrap() / 1_000),
+                _ => Some(nano.unwrap() / 1_000_000),
+            };
+            ScalarValue::TimestampMillisecond(value, tz_opt.clone())
+        }
+        TimeUnit::Microsecond => {
+            let value = match granularity {
+                "minute" => Some(nano.unwrap() / 1_000_000_000 * 1_000_000),
+                "second" => Some(nano.unwrap() / 1_000_000 * 1_000),
+                "millisecond" => Some(nano.unwrap() / 1_000 * 1_000),

Review Comment:
   ```suggestion
                   "millisecond" => Some(nano.unwrap() / 1_000_000 * 1_000),
   ```



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to