Skip to content

Move numeric and boolean cast helpers into a private submodule - #11076

Open
anandghegde wants to merge 1 commit into
apache:mainfrom
anandghegde:extract-numeric-bool-cast-helpers
Open

anandghegde wants to merge 1 commit into
apache:mainfrom
anandghegde:extract-numeric-bool-cast-helpers

Conversation

@anandghegde

Copy link
Copy Markdown

Which issue does this PR close?

Part of #11032 — the numeric and boolean conversion helpers group only, so it
does not close the issue.

Sibling PRs against the same issue: #11075 (temporal helpers). The two are
independent and touch disjoint parts of mod.rs, but both add a mod line and
an import, so whichever lands second will want a trivial rebase.

Rationale for this change

arrow-cast/src/cast/mod.rs is ~14k lines. #5125 moved list, decimal,
dictionary, string, map, run-array and union support into private submodules,
and #11032 lists the groups still inline. The numeric and boolean conversions
are one of them.

What changes are included in this PR?

A new arrow-cast/src/cast/numeric.rs holding:

  • cast_numeric_arrays, try_numeric_cast, num_cast, numeric_cast
  • cast_numeric_to_bool, numeric_to_bool_cast, cast_num_to_bool
  • cast_bool_to_numeric, bool_to_numeric_cast, single_bool_to_numeric

cast_with_options stays the top-level dispatcher in mod.rs.

Worth flagging for review:

  • The public API is unchanged. num_cast, cast_num_to_bool and
    single_bool_to_numeric are pub, so mod.rs re-exports the module with
    pub use crate::cast::numeric::* (the same shape already used for union).
    arrow_cast::cast::num_cast and the other two resolve exactly as before.
  • Visibility is minimal rather than uniform. Only the three helpers the
    dispatcher actually calls — cast_numeric_arrays, cast_numeric_to_bool,
    cast_bool_to_numeric — became pub(crate). try_numeric_cast,
    numeric_cast, numeric_to_bool_cast and bool_to_numeric_cast have no
    callers outside the moved code and stay private to the new module.
  • The group is not contiguous in mod.rs. cast_numeric_to_binary and
    adjust_timestamp_to_timezone sit between the numeric and boolean halves and
    belong to other groups, so they are left where they are.

Are these changes tested?

Covered by the existing arrow-cast tests — this is a code move, so no new
tests are warranted and no existing test was modified.

cargo test -p arrow-cast     379 passed + 12 passed, 0 failed (same as base)
cargo clippy -p arrow-cast --all-targets -- -D warnings   clean
cargo fmt -p arrow-cast -- --check                        clean
cargo build -p arrow                                      builds

Two checks beyond the suite, because a code move is only worth anything if it is
faithful and the public paths survive:

  • Extracting the two original line ranges from HEAD and normalising away the
    added pub(crate) gives a byte-identical match against the new file.
  • A temporary integration test calling arrow_cast::cast::num_cast,
    ::cast_num_to_bool and ::single_bool_to_numeric through their public paths
    compiles and passes. It is not part of this diff — it existed only to confirm
    the re-export, and was removed.

Run on macOS 26.6.2, aarch64-apple-darwin, toolchain 1.98.1 from
rust-toolchain.toml.

Are there any user-facing changes?

No. No public API change and no behavioural change.

AI usage disclosure

Written with AI assistance (Claude). The AI performed the mechanical extraction
and ran the verification above; I reviewed the result and own the change.

The moved bodies are unedited, and the byte-identity check is the evidence for
that rather than a reading. The judgement calls — which helpers need
pub(crate), which stay private, keeping the two interleaved functions from
other groups in place, and re-exporting to preserve the public paths — are
listed above because they are exactly the parts a "pure move" diff would not
otherwise draw attention to.

Follow-up to apache#5125, continuing the extractions in apache#5537 and friends.

Move the numeric and boolean conversion helpers out of
`arrow-cast/src/cast/mod.rs` into a private `numeric` submodule, leaving
`cast_with_options` as the top-level dispatcher.

The bodies are moved verbatim. `num_cast`, `cast_num_to_bool` and
`single_bool_to_numeric` stay `pub` and are re-exported with
`pub use crate::cast::numeric::*`, so `arrow_cast::cast::num_cast` and the
other two keep their existing paths. The three helpers the dispatcher calls
become `pub(crate)`; the rest stay private to the new module.

No behavioural change and no public API change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arrow Changes to the arrow crate arrow-cast

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant