Skip to content

Simpler / easier to see expressions in tree explain mode #15107

Closed
@alamb

Description

@alamb

Is your feature request related to a problem or challenge?

Thanks to @Standing-Man , tree explains are looking nice

The current display of expressions makes it possible to understand their inner structure (what is casted, etc)

However, it is quite hard for normal users to read. For example

| physical_plan | ┌───────────────────────────┐                                                                         |
|               | │       ProjectionExec      │                                                                         |
|               | │    --------------------   │                                                                         |
|               | │ foo.int_column + Int64(100│                                                                         |
|               | │             ):            │                                                                         |
|               | │ CAST(int_column@0 AS Int64│                                                                         |
|               | │          ) + 100          │                                                                         |
|               | │                           │                                                                         |
|               | │  substr(foo.string_column │                                                                         |
|               | │    ,Int64(1),Int64(2)):   │                                                                         |
|               | │ substr(string_column@1, 1,│                                                                         |
|               | │             2)            │                                                                         |
|               | └─────────────┬─────────────┘      

For example

> explain select int_column + 100, substr(string_column, 1, 2) from foo where string_column = 'bar';
+---------------+-------------------------------------------------------------------------------------------------------+
| plan_type     | plan                                                                                                  |
+---------------+-------------------------------------------------------------------------------------------------------+
| logical_plan  | Projection: CAST(foo.int_column AS Int64) + Int64(100), substr(foo.string_column, Int64(1), Int64(2)) |
|               |   Filter: foo.string_column = Utf8("bar")                                                             |
|               |     TableScan: foo projection=[int_column, string_column]                                             |
| physical_plan | ┌───────────────────────────┐                                                                         |
|               | │       ProjectionExec      │                                                                         |
|               | │    --------------------   │                                                                         |
|               | │ foo.int_column + Int64(100│                                                                         |
|               | │             ):            │                                                                         |
|               | │ CAST(int_column@0 AS Int64│                                                                         |
|               | │          ) + 100          │                                                                         |
|               | │                           │                                                                         |
|               | │  substr(foo.string_column │                                                                         |
|               | │    ,Int64(1),Int64(2)):   │                                                                         |
|               | │ substr(string_column@1, 1,│                                                                         |
|               | │             2)            │                                                                         |
|               | └─────────────┬─────────────┘                                                                         |
|               | ┌─────────────┴─────────────┐                                                                         |
|               | │      RepartitionExec      │                                                                         |
|               | └─────────────┬─────────────┘                                                                         |
|               | ┌─────────────┴─────────────┐                                                                         |
|               | │    CoalesceBatchesExec    │                                                                         |
|               | └─────────────┬─────────────┘                                                                         |
|               | ┌─────────────┴─────────────┐                                                                         |
|               | │         FilterExec        │                                                                         |
|               | │    --------------------   │                                                                         |
|               | │         predicate:        │                                                                         |
|               | │   string_column@1 = bar   │                                                                         |
|               | └─────────────┬─────────────┘                                                                         |
|               | ┌─────────────┴─────────────┐                                                                         |
|               | │       DataSourceExec      │                                                                         |
|               | │    --------------------   │                                                                         |
|               | │        bytes: 1320        │                                                                         |
|               | │       format: memory      │                                                                         |
|               | │          rows: 1          │                                                                         |
|               | └───────────────────────────┘                                                                         |
|               |                                                                                                       |
+---------------+-------------------------------------------------------------------------------------------------------+
2 row(s) fetched.
Elapsed 0.012 seconds.

Describe the solution you'd like

I would like the expressions to be nicely formatted

For example instead of above it would be great to see

| physical_plan | ┌───────────────────────────┐                                                                         |
|               | │       ProjectionExec      │                                                                         |
|               | │    --------------------   │                                                                         |
|               | │ foo.int_column + 100      │                                                                         |
|               | │                           │                                                                         |
|               | │ substr(string_column, 1, 2)│                                                                         |
|               | └─────────────┬─────────────┘      

Describe alternatives you've considered

PhysicalExpr already has Debug and Display impls with varying levels of detail.

One way to add another way of displaying PhysicalExpr, would be to add a new method to the PhysicalExpr trait for "simplified display"

Maybe something like

    fn simply_fmt(&self, f: &mut Formatter<'_>) -> Result;

We could then make this work with normal write! style macros

Additional context

No response

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions