in datafusion/physical-plan/src/display.rs [639:770]
fn render_box_content(
&mut self,
root: &RenderTree,
y: usize,
) -> Result<(), fmt::Error> {
let mut extra_info: Vec<Vec<String>> = vec![vec![]; root.width];
let mut extra_height = 0;
for (x, extra_info_item) in extra_info.iter_mut().enumerate().take(root.width) {
if let Some(node) = root.get_node(x, y) {
Self::split_up_extra_info(
&node.extra_text,
extra_info_item,
Self::MAX_EXTRA_LINES,
);
if extra_info_item.len() > extra_height {
extra_height = extra_info_item.len();
}
}
}
let halfway_point = extra_height.div_ceil(2);
// Render the actual node.
for render_y in 0..=extra_height {
for (x, _) in root.nodes.iter().enumerate().take(root.width) {
if x * Self::NODE_RENDER_WIDTH >= Self::MAXIMUM_RENDER_WIDTH {
break;
}
let mut has_adjacent_nodes = false;
for i in 0..(root.width - x) {
has_adjacent_nodes = has_adjacent_nodes || root.has_node(x + i, y);
}
if let Some(node) = root.get_node(x, y) {
write!(self.f, "{}", Self::VERTICAL)?;
// Rigure out what to render.
let mut render_text = String::new();
if render_y == 0 {
render_text = node.name.clone();
} else if render_y <= extra_info[x].len() {
render_text = extra_info[x][render_y - 1].clone();
}
render_text = Self::adjust_text_for_rendering(
&render_text,
Self::NODE_RENDER_WIDTH - 2,
);
write!(self.f, "{}", render_text)?;
if render_y == halfway_point && node.child_positions.len() > 1 {
write!(self.f, "{}", Self::LMIDDLE)?;
} else {
write!(self.f, "{}", Self::VERTICAL)?;
}
} else if render_y == halfway_point {
let has_child_to_the_right =
Self::should_render_whitespace(root, x, y);
if root.has_node(x, y + 1) {
// Node right below this one.
write!(
self.f,
"{}",
Self::HORIZONTAL.repeat(Self::NODE_RENDER_WIDTH / 2)
)?;
if has_child_to_the_right {
write!(self.f, "{}", Self::TMIDDLE)?;
// Have another child to the right, Keep rendering the line.
write!(
self.f,
"{}",
Self::HORIZONTAL.repeat(Self::NODE_RENDER_WIDTH / 2)
)?;
} else {
write!(self.f, "{}", Self::RTCORNER)?;
if has_adjacent_nodes {
// Only a child below this one: fill the reset with spaces.
write!(
self.f,
"{}",
" ".repeat(Self::NODE_RENDER_WIDTH / 2)
)?;
}
}
} else if has_child_to_the_right {
// Child to the right, but no child right below this one: render a full
// line.
write!(
self.f,
"{}",
Self::HORIZONTAL.repeat(Self::NODE_RENDER_WIDTH)
)?;
} else if has_adjacent_nodes {
// Empty spot: render spaces.
write!(self.f, "{}", " ".repeat(Self::NODE_RENDER_WIDTH))?;
}
} else if render_y >= halfway_point {
if root.has_node(x, y + 1) {
// Have a node below this empty spot: render a vertical line.
write!(
self.f,
"{}{}",
" ".repeat(Self::NODE_RENDER_WIDTH / 2),
Self::VERTICAL
)?;
if has_adjacent_nodes
|| Self::should_render_whitespace(root, x, y)
{
write!(
self.f,
"{}",
" ".repeat(Self::NODE_RENDER_WIDTH / 2)
)?;
}
} else if has_adjacent_nodes
|| Self::should_render_whitespace(root, x, y)
{
// Empty spot: render spaces.
write!(self.f, "{}", " ".repeat(Self::NODE_RENDER_WIDTH))?;
}
} else if has_adjacent_nodes {
// Empty spot: render spaces.
write!(self.f, "{}", " ".repeat(Self::NODE_RENDER_WIDTH))?;
}
}
writeln!(self.f)?;
}
Ok(())
}