Skip to content

Remove as_any on the PhysicalExpr trait#21573

Merged
timsaucer merged 7 commits intoapache:mainfrom
timsaucer:feat/remove-as-any-physical-expr
Apr 15, 2026
Merged

Remove as_any on the PhysicalExpr trait#21573
timsaucer merged 7 commits intoapache:mainfrom
timsaucer:feat/remove-as-any-physical-expr

Conversation

@timsaucer
Copy link
Copy Markdown
Member

Which issue does this PR close?

Rationale for this change

This PR reduces the amount of boilerplate code that users need to write for Physical Expressions.

What changes are included in this PR?

Now that we have trait upcasting since rust 1.86, we no longer need every implementation of this trait to have the as_any function that returns &self. This PR makes Any an supertrait and makes the appropriate casts when necessary.

Are these changes tested?

Existing unit tests.

Are there any user-facing changes?

Yes, the users simply need to remove the as_any function. The upgrade guide is updated.

timsaucer and others added 2 commits April 12, 2026 12:34
Leverage Rust 1.86 trait upcasting to remove the `as_any` boilerplate
from `PhysicalExpr`, following the same pattern as apache#21346 which did
this for `TableProvider`, `SchemaProvider`, `CatalogProvider`, and
`CatalogProviderList`.

Since `PhysicalExpr: Any`, Rust can now upcast `&dyn PhysicalExpr` to
`&dyn Any` directly. This adds `is` and `downcast_ref` convenience
methods on `impl dyn PhysicalExpr` and removes `fn as_any` from the
trait and all 24 implementors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@timsaucer timsaucer self-assigned this Apr 12, 2026
@timsaucer timsaucer added the api change Changes the API exposed to users of the crate label Apr 12, 2026
@github-actions github-actions bot added documentation Improvements or additions to documentation physical-expr Changes to the physical-expr crates optimizer Optimizer rules core Core DataFusion crate execution Related to the execution crate proto Related to proto crate functions Changes to functions implementation datasource Changes to the datasource crate ffi Changes to the ffi crate physical-plan Changes to the physical-plan crate labels Apr 12, 2026
Comment on lines -942 to -951
Field::new(
left_col.as_any().downcast_ref::<Column>().unwrap().name(),
DataType::Int32,
true,
),
Field::new(
right_col.as_any().downcast_ref::<Column>().unwrap().name(),
DataType::Int32,
true,
),
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks at first glance like we're removing a check on the Column type but if you look higher up you can see that left_col is an Arc<Column> so this doesn't impact the test.

let literal_expr = lit(10i64);
let binary_expr =
Arc::new(BinaryExpr::new(cast_expr, Operator::Gt, literal_expr));
let binary_ref = binary_expr.as_any().downcast_ref::<BinaryExpr>().unwrap();
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to above, this test didn't really do anything other than step through the as_any() function since binary_expr is already an Arc<BinaryExpr>

@timsaucer timsaucer marked this pull request as ready for review April 12, 2026 17:32
Copy link
Copy Markdown
Contributor

@nuno-faria nuno-faria left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @timsaucer, LGTM.

Comment on lines 200 to 344
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not for this PR but the upgrade guide for these changes is becoming quite large. Wouldn't just a single example suffice?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great idea!

timsaucer and others added 4 commits April 15, 2026 15:46
Reduce the upgrade guide section from 9 nearly identical diffs to one
representative example, per reviewer feedback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts:
#	datafusion-examples/examples/custom_data_source/custom_file_casts.rs
#	datafusion/physical-expr/src/expressions/cast_column.rs
@timsaucer timsaucer added this pull request to the merge queue Apr 15, 2026
Merged via the queue into apache:main with commit dc6142e Apr 15, 2026
36 checks passed
@timsaucer timsaucer deleted the feat/remove-as-any-physical-expr branch April 15, 2026 23:09
github-merge-queue bot pushed a commit that referenced this pull request Apr 16, 2026
## Which issue does this PR close?

<!--
We generally require a GitHub issue to be filed for all bug fixes and
enhancements and this helps us generate change logs for our releases.
You can link an issue to this PR using the GitHub syntax. For example
`Closes #123` indicates that this PR will close issue #123.
-->

`main` is not able to compile due to merge race by #21479 and #21573

This PR fixes the conflict

## Rationale for this change

<!--
Why are you proposing this change? If this is already explained clearly
in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand
your changes and offer better suggestions for fixes.
-->

## What changes are included in this PR?

<!--
There is no need to duplicate the description in the issue here but it
is sometimes worth providing a summary of the individual changes in this
PR.
-->

## Are these changes tested?

<!--
We typically require tests for all PRs in order to:
1. Prevent the code from being accidentally broken by subsequent changes
2. Serve as another way to document the expected behavior of the code

If tests are not included in your PR, please explain why (for example,
are they covered by existing tests)?
-->

## Are there any user-facing changes?

<!--
If there are user-facing changes then we may require documentation to be
updated before approving the PR.
-->

<!--
If there are any breaking changes to public APIs, please add the `api
change` label.
-->
asolimando added a commit to asolimando/datafusion that referenced this pull request Apr 16, 2026
github-merge-queue bot pushed a commit that referenced this pull request Apr 17, 2026
Merging in #21031 broke main
due to #21573 landing before it
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api change Changes the API exposed to users of the crate core Core DataFusion crate datasource Changes to the datasource crate documentation Improvements or additions to documentation execution Related to the execution crate ffi Changes to the ffi crate functions Changes to functions implementation optimizer Optimizer rules physical-expr Changes to the physical-expr crates physical-plan Changes to the physical-plan crate proto Related to proto crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants