From a3f1391ef027a08c636c82badb45a297829f9498 Mon Sep 17 00:00:00 2001 From: "Jorge C. Leitao" Date: Sat, 28 Aug 2021 06:08:45 +0000 Subject: [PATCH] Reduced dependencies. --- Cargo.toml | 2 +- benches/arithmetic_kernels.rs | 2 +- src/array/dictionary/mod.rs | 5 +- src/array/specification.rs | 4 +- src/compute/arithmetics/basic/add.rs | 5 +- src/compute/arithmetics/basic/div.rs | 2 +- src/compute/arithmetics/basic/mul.rs | 5 +- src/compute/arithmetics/basic/pow.rs | 2 +- src/compute/arithmetics/basic/rem.rs | 2 +- src/compute/arithmetics/basic/sub.rs | 5 +- src/compute/arithmetics/mod.rs | 2 +- src/compute/arithmetics/time.rs | 2 +- src/compute/arity.rs | 21 ++--- src/compute/cast/boolean_to.rs | 4 +- src/compute/cast/dictionary_to.rs | 2 +- src/compute/cast/primitive_to.rs | 14 ++-- src/compute/window.rs | 2 +- src/io/json/read/deserialize.rs | 10 +-- src/io/json_integration/read.rs | 12 +-- src/io/parquet/read/statistics/primitive.rs | 2 +- src/io/parquet/write/primitive/basic.rs | 6 +- src/io/parquet/write/primitive/nested.rs | 2 +- src/types/index.rs | 2 +- tests/it/compute/cast.rs | 86 --------------------- 24 files changed, 52 insertions(+), 149 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ad96f42e54e..94a058e7904 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ name = "arrow2" bench = false [dependencies] -num = "^0.4" +num-traits = "0.2" chrono = "^0.4" # To efficiently cast numbers to strings lexical-core = { version = "0.7", optional = true } diff --git a/benches/arithmetic_kernels.rs b/benches/arithmetic_kernels.rs index f2ef5a9450b..0faa06ff389 100644 --- a/benches/arithmetic_kernels.rs +++ b/benches/arithmetic_kernels.rs @@ -24,7 +24,7 @@ use arrow2::util::bench_util::*; use arrow2::{ compute::arithmetics::basic::div::div_scalar, datatypes::DataType, types::NativeType, }; -use num::NumCast; +use num_traits::NumCast; use std::ops::Div; fn bench_div_scalar(lhs: &PrimitiveArray, rhs: &T) diff --git a/src/array/dictionary/mod.rs b/src/array/dictionary/mod.rs index 1d911a440b7..beb4960fff1 100644 --- a/src/array/dictionary/mod.rs +++ b/src/array/dictionary/mod.rs @@ -16,7 +16,10 @@ pub use mutable::*; use super::{new_empty_array, primitive::PrimitiveArray, Array}; /// Trait denoting [`NativeType`]s that can be used as keys of a dictionary. -pub trait DictionaryKey: NativeType + NaturalDataType + num::NumCast + num::FromPrimitive {} +pub trait DictionaryKey: + NativeType + NaturalDataType + num_traits::NumCast + num_traits::FromPrimitive +{ +} impl DictionaryKey for i8 {} impl DictionaryKey for i16 {} diff --git a/src/array/specification.rs b/src/array/specification.rs index e0a09757a54..00c69cbd979 100644 --- a/src/array/specification.rs +++ b/src/array/specification.rs @@ -1,6 +1,6 @@ use std::convert::TryFrom; -use num::Num; +use num_traits::Num; use crate::types::Index; @@ -8,7 +8,7 @@ use crate::types::Index; /// This trait is only implemented for `i32` and `i64`, the two sizes part of the specification. /// # Safety /// Do not implement. -pub unsafe trait Offset: Index + Num + Ord + num::CheckedAdd { +pub unsafe trait Offset: Index + Num + Ord + num_traits::CheckedAdd { fn is_large() -> bool; fn to_isize(&self) -> isize; diff --git a/src/compute/arithmetics/basic/add.rs b/src/compute/arithmetics/basic/add.rs index f6b89fd889d..e2e0d8ebb54 100644 --- a/src/compute/arithmetics/basic/add.rs +++ b/src/compute/arithmetics/basic/add.rs @@ -1,10 +1,7 @@ //! Definition of basic add operations with primitive arrays use std::ops::Add; -use num::{ - traits::{ops::overflowing::OverflowingAdd, SaturatingAdd}, - CheckedAdd, Zero, -}; +use num_traits::{ops::overflowing::OverflowingAdd, CheckedAdd, SaturatingAdd, Zero}; use crate::{ array::{Array, PrimitiveArray}, diff --git a/src/compute/arithmetics/basic/div.rs b/src/compute/arithmetics/basic/div.rs index 8e83bb1953e..e39fd650111 100644 --- a/src/compute/arithmetics/basic/div.rs +++ b/src/compute/arithmetics/basic/div.rs @@ -1,7 +1,7 @@ //! Definition of basic div operations with primitive arrays use std::ops::Div; -use num::{CheckedDiv, NumCast, Zero}; +use num_traits::{CheckedDiv, NumCast, Zero}; use crate::datatypes::DataType; use crate::{ diff --git a/src/compute/arithmetics/basic/mul.rs b/src/compute/arithmetics/basic/mul.rs index 6038bc6f822..f804345c841 100644 --- a/src/compute/arithmetics/basic/mul.rs +++ b/src/compute/arithmetics/basic/mul.rs @@ -1,10 +1,7 @@ //! Definition of basic mul operations with primitive arrays use std::ops::Mul; -use num::{ - traits::{ops::overflowing::OverflowingMul, SaturatingMul}, - CheckedMul, Zero, -}; +use num_traits::{ops::overflowing::OverflowingMul, CheckedMul, SaturatingMul, Zero}; use crate::{ array::{Array, PrimitiveArray}, diff --git a/src/compute/arithmetics/basic/pow.rs b/src/compute/arithmetics/basic/pow.rs index 017f4515abd..78157ef81e5 100644 --- a/src/compute/arithmetics/basic/pow.rs +++ b/src/compute/arithmetics/basic/pow.rs @@ -1,5 +1,5 @@ //! Definition of basic pow operations with primitive arrays -use num::{checked_pow, traits::Pow, CheckedMul, One, Zero}; +use num_traits::{checked_pow, CheckedMul, One, Pow, Zero}; use crate::{ array::{Array, PrimitiveArray}, diff --git a/src/compute/arithmetics/basic/rem.rs b/src/compute/arithmetics/basic/rem.rs index 68f2088a75c..af696de4968 100644 --- a/src/compute/arithmetics/basic/rem.rs +++ b/src/compute/arithmetics/basic/rem.rs @@ -1,6 +1,6 @@ use std::ops::Rem; -use num::{traits::CheckedRem, NumCast, Zero}; +use num_traits::{CheckedRem, NumCast, Zero}; use crate::datatypes::DataType; use crate::{ diff --git a/src/compute/arithmetics/basic/sub.rs b/src/compute/arithmetics/basic/sub.rs index fd812c9cb90..ffd0b79015d 100644 --- a/src/compute/arithmetics/basic/sub.rs +++ b/src/compute/arithmetics/basic/sub.rs @@ -1,10 +1,7 @@ //! Definition of basic sub operations with primitive arrays use std::ops::Sub; -use num::{ - traits::{ops::overflowing::OverflowingSub, SaturatingSub}, - CheckedSub, Zero, -}; +use num_traits::{ops::overflowing::OverflowingSub, CheckedSub, SaturatingSub, Zero}; use crate::{ array::{Array, PrimitiveArray}, diff --git a/src/compute/arithmetics/mod.rs b/src/compute/arithmetics/mod.rs index c22ff7428dd..3414634dfc3 100644 --- a/src/compute/arithmetics/mod.rs +++ b/src/compute/arithmetics/mod.rs @@ -61,7 +61,7 @@ pub mod time; use std::ops::{Add, Div, Mul, Neg, Rem, Sub}; -use num::{NumCast, Zero}; +use num_traits::{NumCast, Zero}; use crate::datatypes::{DataType, TimeUnit}; use crate::error::{ArrowError, Result}; diff --git a/src/compute/arithmetics/time.rs b/src/compute/arithmetics/time.rs index cc6a0579c80..07e979eaf7f 100644 --- a/src/compute/arithmetics/time.rs +++ b/src/compute/arithmetics/time.rs @@ -11,7 +11,7 @@ use std::ops::{Add, Sub}; -use num::cast::AsPrimitive; +use num_traits::AsPrimitive; use crate::{ array::{Array, PrimitiveArray}, diff --git a/src/compute/arity.rs b/src/compute/arity.rs index e69d8162a21..c48058c81ec 100644 --- a/src/compute/arity.rs +++ b/src/compute/arity.rs @@ -1,18 +1,13 @@ //! Defines kernels suitable to perform operations to primitive arrays. -use num::Zero; - use super::utils::combine_validities; -use crate::{ - bitmap::{Bitmap, MutableBitmap}, - error::{ArrowError, Result}, -}; - -use crate::buffer::Buffer; -use crate::types::NativeType; use crate::{ array::{Array, PrimitiveArray}, + bitmap::{Bitmap, MutableBitmap}, + buffer::Buffer, datatypes::DataType, + error::{ArrowError, Result}, + types::NativeType, }; /// Applies an unary and infallible function to a primitive array. This is the @@ -97,7 +92,7 @@ pub fn unary_checked( ) -> PrimitiveArray where I: NativeType, - O: NativeType + Zero, + O: NativeType, F: Fn(I) -> Option, { let mut mut_bitmap = MutableBitmap::with_capacity(array.len()); @@ -109,7 +104,7 @@ where } None => { mut_bitmap.push(false); - O::zero() + O::default() } }); @@ -247,7 +242,7 @@ pub fn binary_checked( op: F, ) -> Result> where - T: NativeType + Zero, + T: NativeType, D: NativeType, F: Fn(T, D) -> Option, { @@ -270,7 +265,7 @@ where } None => { mut_bitmap.push(false); - T::zero() + T::default() } }); diff --git a/src/compute/cast/boolean_to.rs b/src/compute/cast/boolean_to.rs index 47a34dc0c09..2d6c2437053 100644 --- a/src/compute/cast/boolean_to.rs +++ b/src/compute/cast/boolean_to.rs @@ -10,7 +10,7 @@ use crate::{ pub(super) fn boolean_to_primitive_dyn(array: &dyn Array) -> Result> where - T: NativeType + NaturalDataType + num::One, + T: NativeType + NaturalDataType + num_traits::One, { let array = array.as_any().downcast_ref().unwrap(); Ok(Box::new(boolean_to_primitive::(array))) @@ -19,7 +19,7 @@ where /// Casts the [`BooleanArray`] to a [`PrimitiveArray`]. pub fn boolean_to_primitive(from: &BooleanArray) -> PrimitiveArray where - T: NativeType + NaturalDataType + num::One, + T: NativeType + NaturalDataType + num_traits::One, { let iter = from .values() diff --git a/src/compute/cast/dictionary_to.rs b/src/compute/cast/dictionary_to.rs index eb90610cc74..7b149a3906f 100644 --- a/src/compute/cast/dictionary_to.rs +++ b/src/compute/cast/dictionary_to.rs @@ -78,7 +78,7 @@ pub fn wrapping_dictionary_to_dictionary_keys( from: &DictionaryArray, ) -> Result> where - K1: DictionaryKey + num::traits::AsPrimitive, + K1: DictionaryKey + num_traits::AsPrimitive, K2: DictionaryKey, { let keys = from.keys(); diff --git a/src/compute/cast/primitive_to.rs b/src/compute/cast/primitive_to.rs index 6b6bb90f3f3..dcab5683300 100644 --- a/src/compute/cast/primitive_to.rs +++ b/src/compute/cast/primitive_to.rs @@ -53,8 +53,8 @@ pub(super) fn primitive_to_primitive_dyn( options: CastOptions, ) -> Result> where - I: NativeType + num::NumCast + num::traits::AsPrimitive, - O: NativeType + num::NumCast, + I: NativeType + num_traits::NumCast + num_traits::AsPrimitive, + O: NativeType + num_traits::NumCast, { let from = from.as_any().downcast_ref::>().unwrap(); if options.wrapped { @@ -70,12 +70,12 @@ pub fn primitive_to_primitive( to_type: &DataType, ) -> PrimitiveArray where - I: NativeType + num::NumCast, - O: NativeType + num::NumCast, + I: NativeType + num_traits::NumCast, + O: NativeType + num_traits::NumCast, { let iter = from .iter() - .map(|v| v.and_then(|x| num::cast::cast::(*x))); + .map(|v| v.and_then(|x| num_traits::cast::cast::(*x))); PrimitiveArray::::from_trusted_len_iter(iter).to(to_type.clone()) } @@ -86,10 +86,10 @@ pub fn primitive_as_primitive( to_type: &DataType, ) -> PrimitiveArray where - I: NativeType + num::traits::AsPrimitive, + I: NativeType + num_traits::AsPrimitive, O: NativeType, { - unary(from, num::traits::AsPrimitive::::as_, to_type.clone()) + unary(from, num_traits::AsPrimitive::::as_, to_type.clone()) } /// Cast [`PrimitiveArray`] to a [`PrimitiveArray`] of the same physical type. diff --git a/src/compute/window.rs b/src/compute/window.rs index 27be63b3c7b..9b8e47ef036 100644 --- a/src/compute/window.rs +++ b/src/compute/window.rs @@ -18,7 +18,7 @@ //! Defines windowing functions, like `shift`ing use crate::compute::concat; -use num::{abs, clamp}; +use num_traits::{abs, clamp}; use crate::{ array::{new_null_array, Array}, diff --git a/src/io/json/read/deserialize.rs b/src/io/json/read/deserialize.rs index f06b51b7132..fb9e56ef1f6 100644 --- a/src/io/json/read/deserialize.rs +++ b/src/io/json/read/deserialize.rs @@ -20,7 +20,7 @@ use std::{collections::hash_map::DefaultHasher, sync::Arc}; use hash_hasher::HashedMap; use indexmap::map::IndexMap as HashMap; -use num::NumCast; +use num_traits::NumCast; use serde_json::Value; use crate::types::NaturalDataType; @@ -80,8 +80,8 @@ fn read_int( data_type: DataType, ) -> PrimitiveArray { let iter = rows.iter().map(|row| match row { - Value::Number(number) => number.as_i64().and_then(num::cast::cast::), - Value::Bool(number) => num::cast::cast::(*number as i32), + Value::Number(number) => number.as_i64().and_then(num_traits::cast::), + Value::Bool(number) => num_traits::cast::(*number as i32), _ => None, }); PrimitiveArray::from_trusted_len_iter(iter).to(data_type) @@ -92,8 +92,8 @@ fn read_float( data_type: DataType, ) -> PrimitiveArray { let iter = rows.iter().map(|row| match row { - Value::Number(number) => number.as_f64().and_then(num::cast::cast::), - Value::Bool(number) => num::cast::cast::(*number as i32), + Value::Number(number) => number.as_f64().and_then(num_traits::cast::), + Value::Bool(number) => num_traits::cast::(*number as i32), _ => None, }); PrimitiveArray::from_trusted_len_iter(iter).to(data_type) diff --git a/src/io/json_integration/read.rs b/src/io/json_integration/read.rs index cbdcefe7a13..188aa6f412b 100644 --- a/src/io/json_integration/read.rs +++ b/src/io/json_integration/read.rs @@ -17,7 +17,7 @@ use std::{collections::HashMap, sync::Arc}; -use num::NumCast; +use num_traits::NumCast; use serde_json::Value; use crate::{ @@ -119,7 +119,7 @@ fn to_primitive( .as_ref() .unwrap() .iter() - .map(|value| value.as_f64().and_then(num::cast::cast::).unwrap()) + .map(|value| value.as_f64().and_then(num_traits::cast::).unwrap()) .collect() } else { json_col @@ -128,11 +128,11 @@ fn to_primitive( .unwrap() .iter() .map(|value| match value { - Value::Number(x) => x.as_i64().and_then(num::cast::cast::).unwrap(), + Value::Number(x) => x.as_i64().and_then(num_traits::cast::).unwrap(), Value::String(x) => x .parse::() .ok() - .and_then(num::cast::cast::) + .and_then(num_traits::cast::) .unwrap(), _ => { panic!() @@ -324,7 +324,7 @@ pub fn to_array( x.iter() .map(|value| match value { Value::Number(x) => { - x.as_i64().and_then(num::cast::cast::).unwrap() + x.as_i64().and_then(num_traits::cast::).unwrap() } Value::String(x) => x.parse::().ok().unwrap(), _ => { @@ -343,7 +343,7 @@ pub fn to_array( x.iter() .map(|value| match value { Value::Number(x) => { - x.as_i64().and_then(num::cast::cast::).unwrap() + x.as_i64().and_then(num_traits::cast::).unwrap() } _ => panic!(), }) diff --git a/src/io/parquet/read/statistics/primitive.rs b/src/io/parquet/read/statistics/primitive.rs index c1b0e8f7af3..d669425e507 100644 --- a/src/io/parquet/read/statistics/primitive.rs +++ b/src/io/parquet/read/statistics/primitive.rs @@ -26,7 +26,7 @@ impl From<(&ParquetPrimitiveStatistics, DataType)> for PrimitiveStatist where T: NativeType, R: ParquetNativeType, - R: num::cast::AsPrimitive, + R: num_traits::AsPrimitive, { fn from((stats, data_type): (&ParquetPrimitiveStatistics, DataType)) -> Self { Self { diff --git a/src/io/parquet/write/primitive/basic.rs b/src/io/parquet/write/primitive/basic.rs index 796df77c083..a86f246c7b9 100644 --- a/src/io/parquet/write/primitive/basic.rs +++ b/src/io/parquet/write/primitive/basic.rs @@ -19,7 +19,7 @@ pub(crate) fn encode_plain(array: &PrimitiveArray, is_optional: bool, b where T: ArrowNativeType, R: NativeType, - T: num::cast::AsPrimitive, + T: num_traits::AsPrimitive, { if is_optional { // append the non-null values @@ -46,7 +46,7 @@ pub fn array_to_page( where T: ArrowNativeType, R: NativeType, - T: num::cast::AsPrimitive, + T: num_traits::AsPrimitive, { let is_optional = is_type_nullable(descriptor.type_()); @@ -96,7 +96,7 @@ pub fn build_statistics( where T: ArrowNativeType, R: NativeType, - T: num::cast::AsPrimitive, + T: num_traits::AsPrimitive, { let statistics = &PrimitiveStatistics:: { descriptor, diff --git a/src/io/parquet/write/primitive/nested.rs b/src/io/parquet/write/primitive/nested.rs index 36ff01a723d..43483a81499 100644 --- a/src/io/parquet/write/primitive/nested.rs +++ b/src/io/parquet/write/primitive/nested.rs @@ -22,7 +22,7 @@ pub fn array_to_page( where T: ArrowNativeType, R: NativeType, - T: num::cast::AsPrimitive, + T: num_traits::AsPrimitive, O: Offset, { let is_optional = is_type_nullable(descriptor.type_()); diff --git a/src/types/index.rs b/src/types/index.rs index 3a6103f0028..110c000bc30 100644 --- a/src/types/index.rs +++ b/src/types/index.rs @@ -48,7 +48,7 @@ pub trait Index: + NaturalDataType + std::ops::AddAssign + std::ops::Sub - + num::One + + num_traits::One + PartialOrd { fn to_usize(&self) -> usize; diff --git a/tests/it/compute/cast.rs b/tests/it/compute/cast.rs index 36ebfde4f90..fa6cf994fd0 100644 --- a/tests/it/compute/cast.rs +++ b/tests/it/compute/cast.rs @@ -48,92 +48,6 @@ fn u16_as_u8_no_overflow() { assert_eq!(values, &[1, 2, 3, 4, 5]) } -#[test] -fn float_range_max() { - //floats to integers - let u: Option = num::cast(f32::MAX); - assert_eq!(u, None); - let u: Option = num::cast(f32::MAX); - assert_eq!(u, None); - - let u: Option = num::cast(f32::MAX); - assert_eq!(u, None); - let u: Option = num::cast(f32::MAX); - assert_eq!(u, None); - - let u: Option = num::cast(f64::MAX); - assert_eq!(u, None); - let u: Option = num::cast(f64::MAX); - assert_eq!(u, None); - - let u: Option = num::cast(f64::MAX); - assert_eq!(u, None); - let u: Option = num::cast(f64::MAX); - assert_eq!(u, None); - - //integers to floats - let u: Option = num::cast(u32::MAX); - assert!(u.is_some()); - let u: Option = num::cast(u32::MAX); - assert!(u.is_some()); - - let u: Option = num::cast(i32::MAX); - assert!(u.is_some()); - let u: Option = num::cast(i32::MAX); - assert!(u.is_some()); - - let u: Option = num::cast(i64::MAX); - assert!(u.is_some()); - let u: Option = num::cast(u64::MAX); - assert!(u.is_some()); - - let u: Option = num::cast(f32::MAX); - assert!(u.is_some()); -} - -#[test] -fn float_range_min() { - //floats to integers - let u: Option = num::cast(f32::MIN); - assert_eq!(u, None); - let u: Option = num::cast(f32::MIN); - assert_eq!(u, None); - - let u: Option = num::cast(f32::MIN); - assert_eq!(u, None); - let u: Option = num::cast(f32::MIN); - assert_eq!(u, None); - - let u: Option = num::cast(f64::MIN); - assert_eq!(u, None); - let u: Option = num::cast(f64::MIN); - assert_eq!(u, None); - - let u: Option = num::cast(f64::MIN); - assert_eq!(u, None); - let u: Option = num::cast(f64::MIN); - assert_eq!(u, None); - - //integers to floats - let u: Option = num::cast(u32::MIN); - assert!(u.is_some()); - let u: Option = num::cast(u32::MIN); - assert!(u.is_some()); - - let u: Option = num::cast(i32::MIN); - assert!(u.is_some()); - let u: Option = num::cast(i32::MIN); - assert!(u.is_some()); - - let u: Option = num::cast(i64::MIN); - assert!(u.is_some()); - let u: Option = num::cast(u64::MIN); - assert!(u.is_some()); - - let u: Option = num::cast(f32::MIN); - assert!(u.is_some()); -} - #[test] fn f32_as_u8_overflow() { let array = Float32Array::from_slice(&[1.1, 5000.0]);