abreis commented on pull request #9454:
URL: https://github.com/apache/arrow/pull/9454#issuecomment-777809399
IMO, that would be the superior approach (though it's a much larger rewrite).
I tried to mock what it could look like for the numeric kernels:
```rust
// Datum with concrete types for the arithmetic module
enum DatumNumeric<'a, T>
where
T: ArrowNumericType,
{
Array(&'a PrimitiveArray<T>),
Scalar(T::Native),
}
// lets the user pass arrays without interacting with Datum
impl<'a, T> From<&'a PrimitiveArray<T>> for DatumNumeric<'a, T>
where
T: ArrowNumericType,
{
fn from(array: &'a PrimitiveArray<T>) -> Self {
DatumNumeric::Array(array)
}
}
// can match and run separate code for array/array, array/scalar, etcetera
fn new_math_divide<'a, T, DN>(left: DN, right: DN) ->
Result<PrimitiveArray<T>>
where
T: ArrowNumericType,
T::Native: Div<Output = T::Native> + Zero,
DN: Into<DatumNumeric<'a, T>>,
{
match (left.into(), right.into()) {
(DatumNumeric::Array(left), DatumNumeric::Array(right)) =>
todo!("array/array"),
(DatumNumeric::Array(array), DatumNumeric::Scalar(divisor)) =>
todo!("array/scalar"),
_ => todo!(),
}
}
fn test_datum_divide() {
let a = Int32Array::from(vec![15, 15, 8, 1, 9]);
let b = Int32Array::from(vec![5, 6, 8, 9, 1]);
let c = new_math_divide(&a, &b).unwrap(); // Works, same interface as
before
}
```
However, Rust doesn't like the impl From for scalars (I tried ` impl<'a, T>
From<T::Native> for DatumNumeric<'a, T> where T: ArrowNumericType`). Perhaps
there's a better way to accomplish this.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]