Skip to content

Commit 774d3cb

Browse files
zjregeealamb
andauthored
implement display for ColumnarValue (#14220)
* implement display for ColumnarValue * add tests * avoid panic when impl Display * align the strings in tests --------- Co-authored-by: Andrew Lamb <[email protected]>
1 parent ab16fd5 commit 774d3cb

File tree

1 file changed

+61
-1
lines changed

1 file changed

+61
-1
lines changed

datafusion/expr-common/src/columnar_value.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
use arrow::array::{Array, ArrayRef, NullArray};
2121
use arrow::compute::{kernels, CastOptions};
2222
use arrow::datatypes::DataType;
23+
use arrow::util::pretty::pretty_format_columns;
2324
use datafusion_common::format::DEFAULT_CAST_OPTIONS;
2425
use datafusion_common::{internal_err, Result, ScalarValue};
26+
use std::fmt;
2527
use std::sync::Arc;
2628

2729
/// The result of evaluating an expression.
@@ -218,9 +220,34 @@ impl ColumnarValue {
218220
}
219221
}
220222

223+
// Implement Display trait for ColumnarValue
224+
impl fmt::Display for ColumnarValue {
225+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
226+
let formatted = match self {
227+
ColumnarValue::Array(array) => {
228+
pretty_format_columns("ColumnarValue(ArrayRef)", &[Arc::clone(array)])
229+
}
230+
ColumnarValue::Scalar(_) => {
231+
if let Ok(array) = self.to_array(1) {
232+
pretty_format_columns("ColumnarValue(ScalarValue)", &[array])
233+
} else {
234+
return write!(f, "Error formatting columnar value");
235+
}
236+
}
237+
};
238+
239+
if let Ok(formatted) = formatted {
240+
write!(f, "{}", formatted)
241+
} else {
242+
write!(f, "Error formatting columnar value")
243+
}
244+
}
245+
}
246+
221247
#[cfg(test)]
222248
mod tests {
223249
use super::*;
250+
use arrow::array::Int32Array;
224251

225252
#[test]
226253
fn values_to_arrays() {
@@ -329,6 +356,39 @@ mod tests {
329356

330357
/// Makes an array of length `len` with all elements set to `val`
331358
fn make_array(val: i32, len: usize) -> ArrayRef {
332-
Arc::new(arrow::array::Int32Array::from(vec![val; len]))
359+
Arc::new(Int32Array::from(vec![val; len]))
360+
}
361+
362+
#[test]
363+
fn test_display_scalar() {
364+
let column = ColumnarValue::from(ScalarValue::from("foo"));
365+
assert_eq!(
366+
column.to_string(),
367+
concat!(
368+
"+----------------------------+\n",
369+
"| ColumnarValue(ScalarValue) |\n",
370+
"+----------------------------+\n",
371+
"| foo |\n",
372+
"+----------------------------+"
373+
)
374+
);
375+
}
376+
377+
#[test]
378+
fn test_display_array() {
379+
let array: ArrayRef = Arc::new(Int32Array::from_iter_values(vec![1, 2, 3]));
380+
let column = ColumnarValue::from(array);
381+
assert_eq!(
382+
column.to_string(),
383+
concat!(
384+
"+-------------------------+\n",
385+
"| ColumnarValue(ArrayRef) |\n",
386+
"+-------------------------+\n",
387+
"| 1 |\n",
388+
"| 2 |\n",
389+
"| 3 |\n",
390+
"+-------------------------+"
391+
)
392+
);
333393
}
334394
}

0 commit comments

Comments
 (0)