You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by tu...@apache.org on 2023/01/11 11:50:33 UTC
[arrow-rs] branch master updated: Fix negative interval prettyprint (#3491)
This is an automated email from the ASF dual-hosted git repository.
tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push:
new 5fb337db0 Fix negative interval prettyprint (#3491)
5fb337db0 is described below
commit 5fb337db04a1a19f7d40da46f19b7b5fd4051593
Author: Jeffrey <22...@users.noreply.github.com>
AuthorDate: Wed Jan 11 22:50:26 2023 +1100
Fix negative interval prettyprint (#3491)
* Fix negative interval prettyprint
* Simplify check
* Empty
* Fix edge case
---
arrow-cast/src/display.rs | 30 +++++++++++++++++++-------
arrow/src/util/pretty.rs | 54 +++++++++++++++++++++++++++++------------------
2 files changed, 55 insertions(+), 29 deletions(-)
diff --git a/arrow-cast/src/display.rs b/arrow-cast/src/display.rs
index 5534ebd81..e603260b0 100644
--- a/arrow-cast/src/display.rs
+++ b/arrow-cast/src/display.rs
@@ -67,20 +67,29 @@ macro_rules! make_string_interval_day_time {
let days_parts: i32 = ((value & 0xFFFFFFFF00000000) >> 32) as i32;
let milliseconds_part: i32 = (value & 0xFFFFFFFF) as i32;
- let secs = milliseconds_part / 1000;
+ let secs = milliseconds_part / 1_000;
let mins = secs / 60;
let hours = mins / 60;
let secs = secs - (mins * 60);
let mins = mins - (hours * 60);
+ let milliseconds = milliseconds_part % 1_000;
+
+ let secs_sign = if secs < 0 || milliseconds < 0 {
+ "-"
+ } else {
+ ""
+ };
+
Ok(format!(
- "0 years 0 mons {} days {} hours {} mins {}.{:03} secs",
+ "0 years 0 mons {} days {} hours {} mins {}{}.{:03} secs",
days_parts,
hours,
mins,
- secs,
- (milliseconds_part % 1000),
+ secs_sign,
+ secs.abs(),
+ milliseconds.abs(),
))
}};
}
@@ -99,21 +108,26 @@ macro_rules! make_string_interval_month_day_nano {
let days_part: i32 = ((value & 0xFFFFFFFF0000000000000000) >> 64) as i32;
let nanoseconds_part: i64 = (value & 0xFFFFFFFFFFFFFFFF) as i64;
- let secs = nanoseconds_part / 1000000000;
+ let secs = nanoseconds_part / 1_000_000_000;
let mins = secs / 60;
let hours = mins / 60;
let secs = secs - (mins * 60);
let mins = mins - (hours * 60);
+ let nanoseconds = nanoseconds_part % 1_000_000_000;
+
+ let secs_sign = if secs < 0 || nanoseconds < 0 { "-" } else { "" };
+
Ok(format!(
- "0 years {} mons {} days {} hours {} mins {}.{:09} secs",
+ "0 years {} mons {} days {} hours {} mins {}{}.{:09} secs",
months_part,
days_part,
hours,
mins,
- secs,
- (nanoseconds_part % 1000000000),
+ secs_sign,
+ secs.abs(),
+ nanoseconds.abs(),
))
}};
}
diff --git a/arrow/src/util/pretty.rs b/arrow/src/util/pretty.rs
index 859053352..53ae0fdde 100644
--- a/arrow/src/util/pretty.rs
+++ b/arrow/src/util/pretty.rs
@@ -991,6 +991,9 @@ mod tests {
#[test]
fn test_pretty_format_interval_day_time() -> Result<()> {
let arr = Arc::new(arrow_array::IntervalDayTimeArray::from(vec![
+ Some(-600000),
+ Some(4294966295),
+ Some(4294967295),
Some(1),
Some(10),
Some(100),
@@ -1007,13 +1010,16 @@ mod tests {
let table = pretty_format_batches(&[batch])?.to_string();
let expected = vec![
- "+-------------------------------------------------+",
- "| IntervalDayTime |",
- "+-------------------------------------------------+",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.001 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.010 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.100 secs |",
- "+-------------------------------------------------+",
+ "+----------------------------------------------------+",
+ "| IntervalDayTime |",
+ "+----------------------------------------------------+",
+ "| 0 years 0 mons -1 days 0 hours -10 mins 0.000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins -1.001 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins -0.001 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.001 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.010 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.100 secs |",
+ "+----------------------------------------------------+",
];
let actual: Vec<&str> = table.lines().collect();
@@ -1026,6 +1032,9 @@ mod tests {
#[test]
fn test_pretty_format_interval_month_day_nano_array() -> Result<()> {
let arr = Arc::new(arrow_array::IntervalMonthDayNanoArray::from(vec![
+ Some(-600000000000),
+ Some(18446744072709551615),
+ Some(18446744073709551615),
Some(1),
Some(10),
Some(100),
@@ -1049,20 +1058,23 @@ mod tests {
let table = pretty_format_batches(&[batch])?.to_string();
let expected = vec![
- "+-------------------------------------------------------+",
- "| IntervalMonthDayNano |",
- "+-------------------------------------------------------+",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.000000001 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.000000010 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.000000100 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.000001000 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.000010000 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.000100000 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.001000000 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.010000000 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 0.100000000 secs |",
- "| 0 years 0 mons 0 days 0 hours 0 mins 1.000000000 secs |",
- "+-------------------------------------------------------+",
+ "+-----------------------------------------------------------+",
+ "| IntervalMonthDayNano |",
+ "+-----------------------------------------------------------+",
+ "| 0 years -1 mons -1 days 0 hours -10 mins 0.000000000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins -1.000000001 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins -0.000000001 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.000000001 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.000000010 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.000000100 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.000001000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.000010000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.000100000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.001000000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.010000000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 0.100000000 secs |",
+ "| 0 years 0 mons 0 days 0 hours 0 mins 1.000000000 secs |",
+ "+-----------------------------------------------------------+",
];
let actual: Vec<&str> = table.lines().collect();