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();