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]