Skip to content

Commit

Permalink
Fix negative interval prettyprint (#3491)
Browse files Browse the repository at this point in the history
* Fix negative interval prettyprint

* Simplify check

* Empty

* Fix edge case
  • Loading branch information
Jefffrey committed Jan 11, 2023
1 parent 3788fd2 commit 5fb337d
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 29 deletions.
30 changes: 22 additions & 8 deletions arrow-cast/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
))
}};
}
Expand All @@ -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(),
))
}};
}
Expand Down
54 changes: 33 additions & 21 deletions arrow/src/util/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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();
Expand All @@ -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),
Expand All @@ -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();
Expand Down

0 comments on commit 5fb337d

Please sign in to comment.