This is an automated email from the ASF dual-hosted git repository.
mneumann pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 6ecbd623c0 refactor: split `num` dependency (#8459)
6ecbd623c0 is described below
commit 6ecbd623c046c081c898d5b3b2417b453c1db8db
Author: Marco Neumann <[email protected]>
AuthorDate: Fri Sep 26 14:21:25 2025 +0200
refactor: split `num` dependency (#8459)
# Which issue does this PR close?
\-
# Rationale for this change
`num` is a meta-crate that bundles functionality of a bunch of `num-*`
crates, similar to how `futures` work:
```text
num v0.4.3
├── num-bigint v0.4.6
│ ├── num-integer v0.1.46
│ │ └── num-traits v0.2.19 (*)
│ └── num-traits v0.2.19 (*)
├── num-complex v0.4.6
│ └── num-traits v0.2.19 (*)
├── num-integer v0.1.46 (*)
├── num-iter v0.1.45
│ ├── num-integer v0.1.46 (*)
│ └── num-traits v0.2.19 (*)
│ [build-dependencies]
│ └── autocfg v1.5.0
├── num-rational v0.4.2
│ ├── num-bigint v0.4.6 (*)
│ ├── num-integer v0.1.46 (*)
│ └── num-traits v0.2.19 (*)
└── num-traits v0.2.19 (*)
```
We don't need all these sub-crates but only a very specific set. So
instead of using the meta-crate, let's use the actual things we need.
# What changes are included in this PR?
Dependency changes.
# Are these changes tested?
It still compiles.
# Are there any user-facing changes?
Faster compilation.
---
arrow-arith/Cargo.toml | 2 +-
arrow-arith/src/bitwise.rs | 2 +-
arrow-array/Cargo.toml | 4 ++-
arrow-array/src/arithmetic.rs | 2 +-
arrow-array/src/array/byte_view_array.rs | 2 +-
arrow-array/src/array/list_array.rs | 4 +--
.../fixed_size_binary_dictionary_builder.rs | 4 +--
arrow-array/src/builder/generic_bytes_builder.rs | 2 +-
.../builder/generic_bytes_dictionary_builder.rs | 4 +--
.../src/builder/primitive_dictionary_builder.rs | 4 +--
arrow-buffer/Cargo.toml | 3 ++-
arrow-buffer/benches/i256.rs | 2 +-
arrow-buffer/src/bigint/mod.rs | 8 +++---
arrow-cast/Cargo.toml | 2 +-
arrow-cast/src/cast/decimal.rs | 2 +-
arrow-cast/src/cast/mod.rs | 29 +++++++++++-----------
arrow-data/Cargo.toml | 3 ++-
arrow-data/src/data.rs | 18 +++++++-------
arrow-data/src/equal/list.rs | 2 +-
arrow-data/src/equal/variable_size.rs | 2 +-
arrow-data/src/transform/list.rs | 3 ++-
arrow-data/src/transform/mod.rs | 2 +-
arrow-data/src/transform/run.rs | 2 +-
arrow-data/src/transform/utils.rs | 3 ++-
arrow-data/src/transform/variable_size.rs | 4 +--
arrow-integration-test/Cargo.toml | 3 ++-
arrow-integration-test/src/lib.rs | 4 +--
arrow-json/Cargo.toml | 2 +-
arrow-json/src/reader/primitive_array.rs | 2 +-
arrow-select/Cargo.toml | 2 +-
arrow-select/src/filter.rs | 2 +-
arrow-select/src/take.rs | 2 +-
arrow-select/src/window.rs | 2 +-
arrow-string/Cargo.toml | 2 +-
arrow-string/src/substring.rs | 2 +-
parquet/Cargo.toml | 3 ++-
parquet/benches/arrow_reader.rs | 2 +-
parquet/src/arrow/arrow_reader/mod.rs | 2 +-
parquet/src/arrow/arrow_writer/mod.rs | 2 +-
parquet/src/encodings/decoding.rs | 3 +--
parquet/src/record/api.rs | 2 +-
parquet/src/util/bit_util.rs | 4 +--
42 files changed, 81 insertions(+), 75 deletions(-)
diff --git a/arrow-arith/Cargo.toml b/arrow-arith/Cargo.toml
index a3fdafa823..f2a4604c11 100644
--- a/arrow-arith/Cargo.toml
+++ b/arrow-arith/Cargo.toml
@@ -41,4 +41,4 @@ arrow-buffer = { workspace = true }
arrow-data = { workspace = true }
arrow-schema = { workspace = true }
chrono = { workspace = true }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
diff --git a/arrow-arith/src/bitwise.rs b/arrow-arith/src/bitwise.rs
index a3c18136c5..aedeecd5b8 100644
--- a/arrow-arith/src/bitwise.rs
+++ b/arrow-arith/src/bitwise.rs
@@ -21,7 +21,7 @@ use crate::arity::{binary, unary};
use arrow_array::*;
use arrow_buffer::ArrowNativeType;
use arrow_schema::ArrowError;
-use num::traits::{WrappingShl, WrappingShr};
+use num_traits::{WrappingShl, WrappingShr};
use std::ops::{BitAnd, BitOr, BitXor, Not};
/// The helper function for bitwise operation with two array
diff --git a/arrow-array/Cargo.toml b/arrow-array/Cargo.toml
index 9fffe3b6bb..94c595f079 100644
--- a/arrow-array/Cargo.toml
+++ b/arrow-array/Cargo.toml
@@ -44,7 +44,9 @@ arrow-schema = { workspace = true }
arrow-data = { workspace = true }
chrono = { workspace = true }
chrono-tz = { version = "0.10", optional = true }
-num = { version = "0.4.1", default-features = false, features = ["std"] }
+num-complex = { version = "0.4.6", default-features = false, features =
["std"] }
+num-integer = { version = "0.1.46", default-features = false, features =
["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
half = { version = "2.1", default-features = false, features = ["num-traits"] }
hashbrown = { version = "0.16.0", default-features = false }
diff --git a/arrow-array/src/arithmetic.rs b/arrow-array/src/arithmetic.rs
index 0e2aa5a28c..24deec36fb 100644
--- a/arrow-array/src/arithmetic.rs
+++ b/arrow-array/src/arithmetic.rs
@@ -18,7 +18,7 @@
use arrow_buffer::{i256, ArrowNativeType, IntervalDayTime,
IntervalMonthDayNano};
use arrow_schema::ArrowError;
use half::f16;
-use num::complex::ComplexFloat;
+use num_complex::ComplexFloat;
use std::cmp::Ordering;
/// Trait for [`ArrowNativeType`] that adds checked and unchecked arithmetic
operations,
diff --git a/arrow-array/src/array/byte_view_array.rs
b/arrow-array/src/array/byte_view_array.rs
index 7c8993d602..ec65b422f7 100644
--- a/arrow-array/src/array/byte_view_array.rs
+++ b/arrow-array/src/array/byte_view_array.rs
@@ -25,7 +25,7 @@ use arrow_buffer::{ArrowNativeType, Buffer, NullBuffer,
ScalarBuffer};
use arrow_data::{ArrayData, ArrayDataBuilder, ByteView, MAX_INLINE_VIEW_LEN};
use arrow_schema::{ArrowError, DataType};
use core::str;
-use num::ToPrimitive;
+use num_traits::ToPrimitive;
use std::any::Any;
use std::cmp::Ordering;
use std::fmt::Debug;
diff --git a/arrow-array/src/array/list_array.rs
b/arrow-array/src/array/list_array.rs
index 0ddccb9681..2270987524 100644
--- a/arrow-array/src/array/list_array.rs
+++ b/arrow-array/src/array/list_array.rs
@@ -24,7 +24,7 @@ use crate::{
use arrow_buffer::{ArrowNativeType, NullBuffer, OffsetBuffer};
use arrow_data::{ArrayData, ArrayDataBuilder};
use arrow_schema::{ArrowError, DataType, FieldRef};
-use num::Integer;
+use num_integer::Integer;
use std::any::Any;
use std::sync::Arc;
@@ -38,7 +38,7 @@ use std::sync::Arc;
/// [`StringArray`]: crate::array::StringArray
/// [`LargeStringArray`]: crate::array::LargeStringArray
pub trait OffsetSizeTrait:
- ArrowNativeType + std::ops::AddAssign + Integer + num::CheckedAdd
+ ArrowNativeType + std::ops::AddAssign + Integer + num_traits::CheckedAdd
{
/// True for 64 bit offset size and false for 32 bit offset size
const IS_LARGE: bool;
diff --git a/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
b/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
index 852ba68022..cadcf0d399 100644
--- a/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
+++ b/arrow-array/src/builder/fixed_size_binary_dictionary_builder.rs
@@ -22,7 +22,7 @@ use arrow_buffer::ArrowNativeType;
use arrow_schema::DataType::FixedSizeBinary;
use arrow_schema::{ArrowError, DataType};
use hashbrown::HashTable;
-use num::NumCast;
+use num_traits::NumCast;
use std::any::Any;
use std::sync::Arc;
@@ -142,7 +142,7 @@ where
let source_keys = source.keys_builder.finish();
let new_keys: PrimitiveArray<K> = source_keys.try_unary(|value| {
- num::cast::cast::<K2::Native, K::Native>(value).ok_or_else(|| {
+ num_traits::cast::cast::<K2::Native,
K::Native>(value).ok_or_else(|| {
ArrowError::CastError(format!(
"Can't cast dictionary keys from source type {:?} to type
{:?}",
K2::DATA_TYPE,
diff --git a/arrow-array/src/builder/generic_bytes_builder.rs
b/arrow-array/src/builder/generic_bytes_builder.rs
index 1480f8f328..5a68797cb0 100644
--- a/arrow-array/src/builder/generic_bytes_builder.rs
+++ b/arrow-array/src/builder/generic_bytes_builder.rs
@@ -144,7 +144,7 @@ impl<T: ByteArrayType> GenericByteBuilder<T> {
/// (this means that underlying null values are copied as is).
#[inline]
pub fn append_array(&mut self, array: &GenericByteArray<T>) -> Result<(),
ArrowError> {
- use num::CheckedAdd;
+ use num_traits::CheckedAdd;
if array.len() == 0 {
return Ok(());
}
diff --git a/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
b/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
index 1c7d8bedbc..8291f270ca 100644
--- a/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
+++ b/arrow-array/src/builder/generic_bytes_dictionary_builder.rs
@@ -23,7 +23,7 @@ use crate::{
use arrow_buffer::ArrowNativeType;
use arrow_schema::{ArrowError, DataType};
use hashbrown::HashTable;
-use num::NumCast;
+use num_traits::NumCast;
use std::any::Any;
use std::sync::Arc;
@@ -197,7 +197,7 @@ where
let source_keys = source.keys_builder.finish();
let new_keys: PrimitiveArray<K> = source_keys.try_unary(|value| {
- num::cast::cast::<K2::Native, K::Native>(value).ok_or_else(|| {
+ num_traits::cast::cast::<K2::Native,
K::Native>(value).ok_or_else(|| {
ArrowError::CastError(format!(
"Can't cast dictionary keys from source type {:?} to type
{:?}",
K2::DATA_TYPE,
diff --git a/arrow-array/src/builder/primitive_dictionary_builder.rs
b/arrow-array/src/builder/primitive_dictionary_builder.rs
index acef8446ad..8827e2257a 100644
--- a/arrow-array/src/builder/primitive_dictionary_builder.rs
+++ b/arrow-array/src/builder/primitive_dictionary_builder.rs
@@ -22,7 +22,7 @@ use crate::{
};
use arrow_buffer::{ArrowNativeType, ToByteSlice};
use arrow_schema::{ArrowError, DataType};
-use num::NumCast;
+use num_traits::NumCast;
use std::any::Any;
use std::collections::HashMap;
use std::sync::Arc;
@@ -210,7 +210,7 @@ where
let source_keys = source.keys_builder.finish();
let new_keys: PrimitiveArray<K> = source_keys.try_unary(|value| {
- num::cast::cast::<K2::Native, K::Native>(value).ok_or_else(|| {
+ num_traits::cast::cast::<K2::Native,
K::Native>(value).ok_or_else(|| {
ArrowError::CastError(format!(
"Can't cast dictionary keys from source type {:?} to type
{:?}",
K2::DATA_TYPE,
diff --git a/arrow-buffer/Cargo.toml b/arrow-buffer/Cargo.toml
index 21ed4212da..d1651abb79 100644
--- a/arrow-buffer/Cargo.toml
+++ b/arrow-buffer/Cargo.toml
@@ -40,7 +40,8 @@ pool = []
[dependencies]
bytes = { version = "1.4" }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-bigint = { version = "0.4.6", default-features = false, features = ["std"]
}
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
half = { version = "2.1", default-features = false }
[dev-dependencies]
diff --git a/arrow-buffer/benches/i256.rs b/arrow-buffer/benches/i256.rs
index 11aaa83c8d..2bbb5c0284 100644
--- a/arrow-buffer/benches/i256.rs
+++ b/arrow-buffer/benches/i256.rs
@@ -17,7 +17,7 @@
use arrow_buffer::i256;
use criterion::*;
-use num::cast::ToPrimitive;
+use num_traits::cast::ToPrimitive;
use rand::rngs::StdRng;
use rand::{Rng, SeedableRng};
use std::{hint, str::FromStr};
diff --git a/arrow-buffer/src/bigint/mod.rs b/arrow-buffer/src/bigint/mod.rs
index d7959a71ab..b078555c36 100644
--- a/arrow-buffer/src/bigint/mod.rs
+++ b/arrow-buffer/src/bigint/mod.rs
@@ -17,8 +17,8 @@
use crate::arith::derive_arith;
use crate::bigint::div::div_rem;
-use num::cast::AsPrimitive;
-use num::{BigInt, FromPrimitive, ToPrimitive};
+use num_bigint::BigInt;
+use num_traits::{cast::AsPrimitive, FromPrimitive, ToPrimitive};
use std::cmp::Ordering;
use std::num::ParseIntError;
use std::ops::{BitAnd, BitOr, BitXor, Neg, Shl, Shr};
@@ -304,7 +304,7 @@ impl i256 {
let v_bytes = v.to_signed_bytes_le();
match v_bytes.len().cmp(&32) {
Ordering::Less => {
- let mut bytes = if num::Signed::is_negative(&v) {
+ let mut bytes = if num_traits::Signed::is_negative(&v) {
[255_u8; 32]
} else {
[0; 32]
@@ -867,7 +867,7 @@ impl ToPrimitive for i256 {
#[cfg(all(test, not(miri)))] // llvm.x86.subborrow.64 not supported by MIRI
mod tests {
use super::*;
- use num::Signed;
+ use num_traits::Signed;
use rand::{rng, Rng};
#[test]
diff --git a/arrow-cast/Cargo.toml b/arrow-cast/Cargo.toml
index 99a01103d3..12da1af79f 100644
--- a/arrow-cast/Cargo.toml
+++ b/arrow-cast/Cargo.toml
@@ -47,7 +47,7 @@ arrow-schema = { workspace = true }
arrow-select = { workspace = true }
chrono = { workspace = true }
half = { version = "2.1", default-features = false }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
lexical-core = { version = "1.0", default-features = false, features =
["write-integers", "write-floats", "parse-integers", "parse-floats"] }
atoi = "2.0.0"
comfy-table = { version = "7", optional = true, default-features = false }
diff --git a/arrow-cast/src/cast/decimal.rs b/arrow-cast/src/cast/decimal.rs
index a73b593491..94f2d53828 100644
--- a/arrow-cast/src/cast/decimal.rs
+++ b/arrow-cast/src/cast/decimal.rs
@@ -83,7 +83,7 @@ impl DecimalCast for i64 {
fn from_f64(n: f64) -> Option<Self> {
// Call implementation explicitly otherwise this resolves to `to_i64`
// in arrow-buffer that behaves differently.
- num::traits::ToPrimitive::to_i64(&n)
+ num_traits::ToPrimitive::to_i64(&n)
}
}
diff --git a/arrow-cast/src/cast/mod.rs b/arrow-cast/src/cast/mod.rs
index 2034b30cb3..46061754dc 100644
--- a/arrow-cast/src/cast/mod.rs
+++ b/arrow-cast/src/cast/mod.rs
@@ -65,8 +65,7 @@ use arrow_data::transform::MutableArrayData;
use arrow_data::ArrayData;
use arrow_schema::*;
use arrow_select::take::take;
-use num::cast::AsPrimitive;
-use num::{NumCast, ToPrimitive};
+use num_traits::{cast::AsPrimitive, NumCast, ToPrimitive};
/// CastOptions provides a way to override the default cast behaviors
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -2216,14 +2215,14 @@ fn cast_to_decimal<D, M>(
where
D: DecimalType + ArrowPrimitiveType<Native = M>,
M: ArrowNativeTypeOp + DecimalCast,
- u8: num::traits::AsPrimitive<M>,
- u16: num::traits::AsPrimitive<M>,
- u32: num::traits::AsPrimitive<M>,
- u64: num::traits::AsPrimitive<M>,
- i8: num::traits::AsPrimitive<M>,
- i16: num::traits::AsPrimitive<M>,
- i32: num::traits::AsPrimitive<M>,
- i64: num::traits::AsPrimitive<M>,
+ u8: num_traits::AsPrimitive<M>,
+ u16: num_traits::AsPrimitive<M>,
+ u32: num_traits::AsPrimitive<M>,
+ u64: num_traits::AsPrimitive<M>,
+ i8: num_traits::AsPrimitive<M>,
+ i16: num_traits::AsPrimitive<M>,
+ i32: num_traits::AsPrimitive<M>,
+ i64: num_traits::AsPrimitive<M>,
{
use DataType::*;
// cast data to decimal
@@ -2351,7 +2350,7 @@ where
R::Native: NumCast,
{
from.try_unary(|value| {
- num::cast::cast::<T::Native, R::Native>(value).ok_or_else(|| {
+ num_traits::cast::cast::<T::Native, R::Native>(value).ok_or_else(|| {
ArrowError::CastError(format!(
"Can't cast value {:?} to type {}",
value,
@@ -2370,7 +2369,7 @@ where
T::Native: NumCast,
R::Native: NumCast,
{
- from.unary_opt::<_, R>(num::cast::cast::<T::Native, R::Native>)
+ from.unary_opt::<_, R>(num_traits::cast::cast::<T::Native, R::Native>)
}
fn cast_numeric_to_binary<FROM: ArrowPrimitiveType, O: OffsetSizeTrait>(
@@ -2446,7 +2445,7 @@ fn cast_bool_to_numeric<TO>(
) -> Result<ArrayRef, ArrowError>
where
TO: ArrowPrimitiveType,
- TO::Native: num::cast::NumCast,
+ TO::Native: num_traits::cast::NumCast,
{
Ok(Arc::new(bool_to_numeric_cast::<TO>(
from.as_any().downcast_ref::<BooleanArray>().unwrap(),
@@ -2457,14 +2456,14 @@ where
fn bool_to_numeric_cast<T>(from: &BooleanArray, _cast_options: &CastOptions)
-> PrimitiveArray<T>
where
T: ArrowPrimitiveType,
- T::Native: num::NumCast,
+ T::Native: num_traits::NumCast,
{
let iter = (0..from.len()).map(|i| {
if from.is_null(i) {
None
} else if from.value(i) {
// a workaround to cast a primitive to T::Native, infallible
- num::cast::cast(1)
+ num_traits::cast::cast(1)
} else {
Some(T::default_value())
}
diff --git a/arrow-data/Cargo.toml b/arrow-data/Cargo.toml
index fbed24fea1..9c7a5206b2 100644
--- a/arrow-data/Cargo.toml
+++ b/arrow-data/Cargo.toml
@@ -48,7 +48,8 @@ all-features = true
arrow-buffer = { workspace = true }
arrow-schema = { workspace = true }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-integer = { version = "0.1.46", default-features = false, features =
["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
half = { version = "2.1", default-features = false }
[dev-dependencies]
diff --git a/arrow-data/src/data.rs b/arrow-data/src/data.rs
index fca19bc3aa..ce0dced686 100644
--- a/arrow-data/src/data.rs
+++ b/arrow-data/src/data.rs
@@ -886,7 +886,7 @@ impl ArrayData {
/// entries.
///
/// For an empty array, the `buffer` can also be empty.
- fn typed_offsets<T: ArrowNativeType + num::Num>(&self) -> Result<&[T],
ArrowError> {
+ fn typed_offsets<T: ArrowNativeType + num_traits::Num>(&self) ->
Result<&[T], ArrowError> {
// An empty list-like array can have 0 offsets
if self.len == 0 && self.buffers[0].is_empty() {
return Ok(&[]);
@@ -896,7 +896,7 @@ impl ArrayData {
}
/// Returns a reference to the data in `buffers[idx]` as a typed slice
after validating
- fn typed_buffer<T: ArrowNativeType + num::Num>(
+ fn typed_buffer<T: ArrowNativeType + num_traits::Num>(
&self,
idx: usize,
len: usize,
@@ -920,7 +920,7 @@ impl ArrayData {
/// Does a cheap sanity check that the `self.len` values in `buffer` are
valid
/// offsets (of type T) into some other buffer of `values_length` bytes
long
- fn validate_offsets<T: ArrowNativeType + num::Num + std::fmt::Display>(
+ fn validate_offsets<T: ArrowNativeType + num_traits::Num +
std::fmt::Display>(
&self,
values_length: usize,
) -> Result<(), ArrowError> {
@@ -970,7 +970,7 @@ impl ArrayData {
/// Does a cheap sanity check that the `self.len` values in `buffer` are
valid
/// offsets and sizes (of type T) into some other buffer of
`values_length` bytes long
- fn validate_offsets_and_sizes<T: ArrowNativeType + num::Num +
std::fmt::Display>(
+ fn validate_offsets_and_sizes<T: ArrowNativeType + num_traits::Num +
std::fmt::Display>(
&self,
values_length: usize,
) -> Result<(), ArrowError> {
@@ -1373,7 +1373,7 @@ impl ArrayData {
/// function would call `validate([1,2])`, and `validate([2,4])`
fn validate_each_offset<T, V>(&self, offset_limit: usize, validate: V) ->
Result<(), ArrowError>
where
- T: ArrowNativeType + TryInto<usize> + num::Num + std::fmt::Display,
+ T: ArrowNativeType + TryInto<usize> + num_traits::Num +
std::fmt::Display,
V: Fn(usize, Range<usize>) -> Result<(), ArrowError>,
{
self.typed_offsets::<T>()?
@@ -1420,7 +1420,7 @@ impl ArrayData {
/// into `buffers[1]` are valid utf8 sequences
fn validate_utf8<T>(&self) -> Result<(), ArrowError>
where
- T: ArrowNativeType + TryInto<usize> + num::Num + std::fmt::Display,
+ T: ArrowNativeType + TryInto<usize> + num_traits::Num +
std::fmt::Display,
{
let values_buffer = &self.buffers[1].as_slice();
if let Ok(values_str) = std::str::from_utf8(values_buffer) {
@@ -1452,7 +1452,7 @@ impl ArrayData {
/// between `0` and `offset_limit`
fn validate_offsets_full<T>(&self, offset_limit: usize) -> Result<(),
ArrowError>
where
- T: ArrowNativeType + TryInto<usize> + num::Num + std::fmt::Display,
+ T: ArrowNativeType + TryInto<usize> + num_traits::Num +
std::fmt::Display,
{
self.validate_each_offset::<T, _>(offset_limit, |_string_index,
_range| {
// No validation applied to each value, but the iteration
@@ -1465,7 +1465,7 @@ impl ArrayData {
/// is within the range [0, max_value], inclusive
fn check_bounds<T>(&self, max_value: i64) -> Result<(), ArrowError>
where
- T: ArrowNativeType + TryInto<i64> + num::Num + std::fmt::Display,
+ T: ArrowNativeType + TryInto<i64> + num_traits::Num +
std::fmt::Display,
{
let required_len = self.len + self.offset;
let buffer = &self.buffers[0];
@@ -1500,7 +1500,7 @@ impl ArrayData {
/// Validates that each value in run_ends array is positive and strictly
increasing.
fn check_run_ends<T>(&self) -> Result<(), ArrowError>
where
- T: ArrowNativeType + TryInto<i64> + num::Num + std::fmt::Display,
+ T: ArrowNativeType + TryInto<i64> + num_traits::Num +
std::fmt::Display,
{
let values = self.typed_buffer::<T>(0, self.len)?;
let mut prev_value: i64 = 0_i64;
diff --git a/arrow-data/src/equal/list.rs b/arrow-data/src/equal/list.rs
index cc4ba3cacf..92d8f39fe9 100644
--- a/arrow-data/src/equal/list.rs
+++ b/arrow-data/src/equal/list.rs
@@ -17,7 +17,7 @@
use crate::data::{count_nulls, ArrayData};
use arrow_buffer::ArrowNativeType;
-use num::Integer;
+use num_integer::Integer;
use super::equal_range;
diff --git a/arrow-data/src/equal/variable_size.rs
b/arrow-data/src/equal/variable_size.rs
index d6e8e6a954..36d9684f53 100644
--- a/arrow-data/src/equal/variable_size.rs
+++ b/arrow-data/src/equal/variable_size.rs
@@ -17,7 +17,7 @@
use crate::data::{contains_nulls, ArrayData};
use arrow_buffer::ArrowNativeType;
-use num::Integer;
+use num_integer::Integer;
use super::utils::equal_len;
diff --git a/arrow-data/src/transform/list.rs b/arrow-data/src/transform/list.rs
index 2a3cb1c207..bcd487abff 100644
--- a/arrow-data/src/transform/list.rs
+++ b/arrow-data/src/transform/list.rs
@@ -21,7 +21,8 @@ use super::{
};
use crate::ArrayData;
use arrow_buffer::ArrowNativeType;
-use num::{CheckedAdd, Integer};
+use num_integer::Integer;
+use num_traits::CheckedAdd;
pub(super) fn build_extend<T: ArrowNativeType + Integer + CheckedAdd>(
array: &ArrayData,
diff --git a/arrow-data/src/transform/mod.rs b/arrow-data/src/transform/mod.rs
index d23e458acc..b4f880d38f 100644
--- a/arrow-data/src/transform/mod.rs
+++ b/arrow-data/src/transform/mod.rs
@@ -26,7 +26,7 @@ use arrow_buffer::buffer::{BooleanBuffer, NullBuffer};
use arrow_buffer::{bit_util, i256, ArrowNativeType, Buffer, MutableBuffer};
use arrow_schema::{ArrowError, DataType, IntervalUnit, UnionMode};
use half::f16;
-use num::Integer;
+use num_integer::Integer;
use std::mem;
mod boolean;
diff --git a/arrow-data/src/transform/run.rs b/arrow-data/src/transform/run.rs
index af0b9e640c..9fffac0aac 100644
--- a/arrow-data/src/transform/run.rs
+++ b/arrow-data/src/transform/run.rs
@@ -18,7 +18,7 @@
use super::{ArrayData, Extend, _MutableArrayData};
use arrow_buffer::{ArrowNativeType, Buffer, ToByteSlice};
use arrow_schema::DataType;
-use num::CheckedAdd;
+use num_traits::CheckedAdd;
/// Generic helper to get the last run end value from a run ends array
fn get_last_run_end<T: ArrowNativeType>(run_ends_data:
&super::MutableArrayData) -> T {
diff --git a/arrow-data/src/transform/utils.rs
b/arrow-data/src/transform/utils.rs
index 5407f68e0d..96b227ea03 100644
--- a/arrow-data/src/transform/utils.rs
+++ b/arrow-data/src/transform/utils.rs
@@ -16,7 +16,8 @@
// under the License.
use arrow_buffer::{bit_util, ArrowNativeType, MutableBuffer};
-use num::{CheckedAdd, Integer};
+use num_integer::Integer;
+use num_traits::CheckedAdd;
/// extends the `buffer` to be able to hold `len` bits, setting all bits of
the new size to zero.
#[inline]
diff --git a/arrow-data/src/transform/variable_size.rs
b/arrow-data/src/transform/variable_size.rs
index 083ee7c74d..2e082ba833 100644
--- a/arrow-data/src/transform/variable_size.rs
+++ b/arrow-data/src/transform/variable_size.rs
@@ -17,8 +17,8 @@
use crate::ArrayData;
use arrow_buffer::{ArrowNativeType, MutableBuffer};
-use num::traits::AsPrimitive;
-use num::{CheckedAdd, Integer};
+use num_integer::Integer;
+use num_traits::{AsPrimitive, CheckedAdd};
use super::{
Extend, _MutableArrayData,
diff --git a/arrow-integration-test/Cargo.toml
b/arrow-integration-test/Cargo.toml
index d560d4fd83..39ea3b60b1 100644
--- a/arrow-integration-test/Cargo.toml
+++ b/arrow-integration-test/Cargo.toml
@@ -39,6 +39,7 @@ all-features = true
arrow = { workspace = true }
arrow-buffer = { workspace = true }
hex = { version = "0.4", default-features = false, features = ["std"] }
+num-bigint = { version = "0.4", default-features = false }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
serde = { version = "1.0", default-features = false, features = ["rc",
"derive"] }
serde_json = { version = "1.0", default-features = false, features = ["std"] }
-num = { version = "0.4", default-features = false, features = ["std"] }
diff --git a/arrow-integration-test/src/lib.rs
b/arrow-integration-test/src/lib.rs
index 1f4c4bd4bd..78a49f32bb 100644
--- a/arrow-integration-test/src/lib.rs
+++ b/arrow-integration-test/src/lib.rs
@@ -29,8 +29,8 @@
#![warn(missing_docs)]
use arrow_buffer::{IntervalDayTime, IntervalMonthDayNano, ScalarBuffer};
use hex::decode;
-use num::BigInt;
-use num::Signed;
+use num_bigint::BigInt;
+use num_traits::Signed;
use serde::{Deserialize, Serialize};
use serde_json::{Map as SJMap, Value};
use std::collections::HashMap;
diff --git a/arrow-json/Cargo.toml b/arrow-json/Cargo.toml
index de084f9597..1324c287aa 100644
--- a/arrow-json/Cargo.toml
+++ b/arrow-json/Cargo.toml
@@ -43,7 +43,7 @@ arrow-data = { workspace = true }
arrow-schema = { workspace = true }
half = { version = "2.1", default-features = false }
indexmap = { version = "2.0", default-features = false, features = ["std"] }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
serde = { version = "1.0", default-features = false }
serde_json = { version = "1.0", default-features = false, features = ["std"] }
chrono = { workspace = true }
diff --git a/arrow-json/src/reader/primitive_array.rs
b/arrow-json/src/reader/primitive_array.rs
index 257c216cf5..bf6c0a86f3 100644
--- a/arrow-json/src/reader/primitive_array.rs
+++ b/arrow-json/src/reader/primitive_array.rs
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-use num::NumCast;
+use num_traits::NumCast;
use std::marker::PhantomData;
use arrow_array::builder::PrimitiveBuilder;
diff --git a/arrow-select/Cargo.toml b/arrow-select/Cargo.toml
index 238e1a8f58..443094e6c9 100644
--- a/arrow-select/Cargo.toml
+++ b/arrow-select/Cargo.toml
@@ -40,7 +40,7 @@ arrow-buffer = { workspace = true }
arrow-data = { workspace = true }
arrow-schema = { workspace = true }
arrow-array = { workspace = true }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
ahash = { version = "0.8", default-features = false}
[dev-dependencies]
diff --git a/arrow-select/src/filter.rs b/arrow-select/src/filter.rs
index 73877bb88c..708033e6d8 100644
--- a/arrow-select/src/filter.rs
+++ b/arrow-select/src/filter.rs
@@ -794,7 +794,7 @@ fn filter_fixed_size_binary(
fn filter_dict<T>(array: &DictionaryArray<T>, predicate: &FilterPredicate) ->
DictionaryArray<T>
where
T: ArrowDictionaryKeyType,
- T::Native: num::Num,
+ T::Native: num_traits::Num,
{
let builder = filter_primitive::<T>(array.keys(), predicate)
.into_data()
diff --git a/arrow-select/src/take.rs b/arrow-select/src/take.rs
index 5bb966c678..25136ad43f 100644
--- a/arrow-select/src/take.rs
+++ b/arrow-select/src/take.rs
@@ -30,7 +30,7 @@ use arrow_buffer::{
use arrow_data::ArrayDataBuilder;
use arrow_schema::{ArrowError, DataType, FieldRef, UnionMode};
-use num::{One, Zero};
+use num_traits::{One, Zero};
/// Take elements by index from [Array], creating a new [Array] from those
indexes.
///
diff --git a/arrow-select/src/window.rs b/arrow-select/src/window.rs
index 2ad51561c6..3987994173 100644
--- a/arrow-select/src/window.rs
+++ b/arrow-select/src/window.rs
@@ -20,7 +20,7 @@
use crate::concat::concat;
use arrow_array::{make_array, new_null_array, Array, ArrayRef};
use arrow_schema::ArrowError;
-use num::abs;
+use num_traits::abs;
/// Shifts array by defined number of items (to left or right)
/// A positive value for `offset` shifts the array to the right
diff --git a/arrow-string/Cargo.toml b/arrow-string/Cargo.toml
index 95aa289178..3045c355e4 100644
--- a/arrow-string/Cargo.toml
+++ b/arrow-string/Cargo.toml
@@ -43,5 +43,5 @@ arrow-array = { workspace = true }
arrow-select = { workspace = true }
regex = { version = "1.7.0", default-features = false, features = ["std",
"unicode", "perf"] }
regex-syntax = { version = "0.8.0", default-features = false, features =
["unicode"] }
-num = { version = "0.4", default-features = false, features = ["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
memchr = "2.7.4"
diff --git a/arrow-string/src/substring.rs b/arrow-string/src/substring.rs
index fa6a471475..3447b62908 100644
--- a/arrow-string/src/substring.rs
+++ b/arrow-string/src/substring.rs
@@ -25,7 +25,7 @@ use arrow_array::*;
use arrow_buffer::{ArrowNativeType, Buffer, MutableBuffer};
use arrow_data::ArrayData;
use arrow_schema::{ArrowError, DataType};
-use num::Zero;
+use num_traits::Zero;
use std::cmp::Ordering;
use std::sync::Arc;
diff --git a/parquet/Cargo.toml b/parquet/Cargo.toml
index 5dbd4b5b39..f57a7627a5 100644
--- a/parquet/Cargo.toml
+++ b/parquet/Cargo.toml
@@ -60,8 +60,9 @@ flate2 = { version = "1.1", default-features = false,
optional = true }
lz4_flex = { version = "0.11", default-features = false, features = ["std",
"frame"], optional = true }
zstd = { version = "0.13", optional = true, default-features = false }
chrono = { workspace = true }
-num = { version = "0.4", default-features = false }
num-bigint = { version = "0.4", default-features = false }
+num-integer = { version = "0.1.46", default-features = false, features =
["std"] }
+num-traits = { version = "0.2.19", default-features = false, features =
["std"] }
base64 = { version = "0.22", default-features = false, features = ["std", ],
optional = true }
clap = { version = "4.1", default-features = false, features = ["std",
"derive", "env", "help", "error-context", "usage"], optional = true }
serde = { version = "1.0", default-features = false, features = ["derive"],
optional = true }
diff --git a/parquet/benches/arrow_reader.rs b/parquet/benches/arrow_reader.rs
index 321424b820..6104d6d2a5 100644
--- a/parquet/benches/arrow_reader.rs
+++ b/parquet/benches/arrow_reader.rs
@@ -21,8 +21,8 @@ use arrow_schema::Field;
use criterion::measurement::WallTime;
use criterion::{criterion_group, criterion_main, BenchmarkGroup, Criterion};
use half::f16;
-use num::FromPrimitive;
use num_bigint::BigInt;
+use num_traits::FromPrimitive;
use parquet::arrow::array_reader::{
make_byte_array_reader, make_byte_view_array_reader,
make_fixed_len_byte_array_reader,
ListArrayReader,
diff --git a/parquet/src/arrow/arrow_reader/mod.rs
b/parquet/src/arrow/arrow_reader/mod.rs
index 8a7e2ef709..17bc5a298e 100644
--- a/parquet/src/arrow/arrow_reader/mod.rs
+++ b/parquet/src/arrow/arrow_reader/mod.rs
@@ -1168,7 +1168,7 @@ mod tests {
use arrow_select::concat::concat_batches;
use bytes::Bytes;
use half::f16;
- use num::PrimInt;
+ use num_traits::PrimInt;
use rand::{rng, Rng, RngCore};
use tempfile::tempfile;
diff --git a/parquet/src/arrow/arrow_writer/mod.rs
b/parquet/src/arrow/arrow_writer/mod.rs
index 25fd2396c1..8d641dc189 100644
--- a/parquet/src/arrow/arrow_writer/mod.rs
+++ b/parquet/src/arrow/arrow_writer/mod.rs
@@ -1524,7 +1524,7 @@ mod tests {
use arrow_buffer::{i256, IntervalDayTime, IntervalMonthDayNano,
NullBuffer};
use arrow_schema::Fields;
use half::f16;
- use num::{FromPrimitive, ToPrimitive};
+ use num_traits::{FromPrimitive, ToPrimitive};
use tempfile::tempfile;
use crate::basic::Encoding;
diff --git a/parquet/src/encodings/decoding.rs
b/parquet/src/encodings/decoding.rs
index 03bed70cd6..7b22710367 100644
--- a/parquet/src/encodings/decoding.rs
+++ b/parquet/src/encodings/decoding.rs
@@ -18,8 +18,7 @@
//! Contains all supported decoders for Parquet.
use bytes::Bytes;
-use num::traits::WrappingAdd;
-use num::FromPrimitive;
+use num_traits::{FromPrimitive, WrappingAdd};
use std::{cmp, marker::PhantomData, mem};
use super::rle::RleDecoder;
diff --git a/parquet/src/record/api.rs b/parquet/src/record/api.rs
index ebf933f33e..c55fb02269 100644
--- a/parquet/src/record/api.rs
+++ b/parquet/src/record/api.rs
@@ -21,8 +21,8 @@ use std::fmt;
use chrono::{TimeZone, Utc};
use half::f16;
-use num::traits::Float;
use num_bigint::{BigInt, Sign};
+use num_traits::Float;
use crate::basic::{ConvertedType, LogicalType, Type as PhysicalType};
use crate::data_type::{ByteArray, Decimal, Int96};
diff --git a/parquet/src/util/bit_util.rs b/parquet/src/util/bit_util.rs
index f31f70b426..35a59e3d13 100644
--- a/parquet/src/util/bit_util.rs
+++ b/parquet/src/util/bit_util.rs
@@ -150,8 +150,8 @@ where
/// This function should be removed after
/// [`int_roundings`](https://github.com/rust-lang/rust/issues/88581) is
stable.
#[inline]
-pub fn ceil<T: num::Integer>(value: T, divisor: T) -> T {
- num::Integer::div_ceil(&value, &divisor)
+pub fn ceil<T: num_integer::Integer>(value: T, divisor: T) -> T {
+ num_integer::Integer::div_ceil(&value, &divisor)
}
/// Returns the `num_bits` least-significant bits of `v`