@@ -21,6 +21,7 @@ use pyo3::{basic::CompareOp, prelude::*};
2121use std:: convert:: { From , Into } ;
2222use std:: sync:: Arc ;
2323
24+ use arrow:: pyarrow:: ToPyArrow ;
2425use datafusion:: arrow:: datatypes:: { DataType , Field } ;
2526use datafusion:: arrow:: pyarrow:: PyArrowType ;
2627use datafusion:: functions:: core:: expr_ext:: FieldAccessor ;
@@ -32,7 +33,7 @@ use datafusion_expr::{
3233} ;
3334
3435use crate :: common:: data_type:: { DataTypeMap , RexType } ;
35- use crate :: errors:: { py_datafusion_err , py_runtime_err, py_type_err, DataFusionError } ;
36+ use crate :: errors:: { py_runtime_err, py_type_err, DataFusionError } ;
3637use crate :: expr:: aggregate_expr:: PyAggregateFunction ;
3738use crate :: expr:: binary_expr:: PyBinaryExpr ;
3839use crate :: expr:: column:: PyColumn ;
@@ -300,93 +301,7 @@ impl PyExpr {
300301 /// Extracts the Expr value into a PyObject that can be shared with Python
301302 pub fn python_value ( & self , py : Python ) -> PyResult < PyObject > {
302303 match & self . expr {
303- Expr :: Literal ( scalar_value) => match scalar_value {
304- ScalarValue :: Null => Err ( py_datafusion_err (
305- datafusion_common:: DataFusionError :: NotImplemented (
306- "ScalarValue::Null" . to_string ( ) ,
307- ) ,
308- ) ) ,
309- ScalarValue :: Boolean ( v) => Ok ( v. into_py ( py) ) ,
310- ScalarValue :: Float16 ( _) => Err ( py_datafusion_err (
311- datafusion_common:: DataFusionError :: NotImplemented (
312- "ScalarValue::Float16" . to_string ( ) ,
313- ) ,
314- ) ) ,
315- ScalarValue :: Float32 ( v) => Ok ( v. into_py ( py) ) ,
316- ScalarValue :: Float64 ( v) => Ok ( v. into_py ( py) ) ,
317- ScalarValue :: Decimal128 ( v, _, _) => Ok ( v. into_py ( py) ) ,
318- ScalarValue :: Decimal256 ( _, _, _) => Err ( py_datafusion_err (
319- datafusion_common:: DataFusionError :: NotImplemented (
320- "ScalarValue::Decimal256" . to_string ( ) ,
321- ) ,
322- ) ) ,
323- ScalarValue :: Int8 ( v) => Ok ( v. into_py ( py) ) ,
324- ScalarValue :: Int16 ( v) => Ok ( v. into_py ( py) ) ,
325- ScalarValue :: Int32 ( v) => Ok ( v. into_py ( py) ) ,
326- ScalarValue :: Int64 ( v) => Ok ( v. into_py ( py) ) ,
327- ScalarValue :: UInt8 ( v) => Ok ( v. into_py ( py) ) ,
328- ScalarValue :: UInt16 ( v) => Ok ( v. into_py ( py) ) ,
329- ScalarValue :: UInt32 ( v) => Ok ( v. into_py ( py) ) ,
330- ScalarValue :: UInt64 ( v) => Ok ( v. into_py ( py) ) ,
331- ScalarValue :: Utf8 ( v) => Ok ( v. clone ( ) . into_py ( py) ) ,
332- ScalarValue :: LargeUtf8 ( v) => Ok ( v. clone ( ) . into_py ( py) ) ,
333- ScalarValue :: Binary ( v) => Ok ( v. clone ( ) . into_py ( py) ) ,
334- ScalarValue :: FixedSizeBinary ( _, _) => Err ( py_datafusion_err (
335- datafusion_common:: DataFusionError :: NotImplemented (
336- "ScalarValue::FixedSizeBinary" . to_string ( ) ,
337- ) ,
338- ) ) ,
339- ScalarValue :: LargeBinary ( v) => Ok ( v. clone ( ) . into_py ( py) ) ,
340- ScalarValue :: List ( _) => Err ( py_datafusion_err (
341- datafusion_common:: DataFusionError :: NotImplemented (
342- "ScalarValue::List" . to_string ( ) ,
343- ) ,
344- ) ) ,
345- ScalarValue :: Date32 ( v) => Ok ( v. into_py ( py) ) ,
346- ScalarValue :: Date64 ( v) => Ok ( v. into_py ( py) ) ,
347- ScalarValue :: Time32Second ( v) => Ok ( v. into_py ( py) ) ,
348- ScalarValue :: Time32Millisecond ( v) => Ok ( v. into_py ( py) ) ,
349- ScalarValue :: Time64Microsecond ( v) => Ok ( v. into_py ( py) ) ,
350- ScalarValue :: Time64Nanosecond ( v) => Ok ( v. into_py ( py) ) ,
351- ScalarValue :: TimestampSecond ( v, _) => Ok ( v. into_py ( py) ) ,
352- ScalarValue :: TimestampMillisecond ( v, _) => Ok ( v. into_py ( py) ) ,
353- ScalarValue :: TimestampMicrosecond ( v, _) => Ok ( v. into_py ( py) ) ,
354- ScalarValue :: TimestampNanosecond ( v, _) => Ok ( v. into_py ( py) ) ,
355- ScalarValue :: IntervalYearMonth ( v) => Ok ( v. into_py ( py) ) ,
356- ScalarValue :: IntervalDayTime ( v) => Ok ( ScalarValue :: IntervalDayTime ( * v) . into_py ( py) ) ,
357- ScalarValue :: IntervalMonthDayNano ( v) => {
358- Ok ( ScalarValue :: IntervalMonthDayNano ( * v) . into_py ( py) )
359- }
360- ScalarValue :: DurationSecond ( v) => Ok ( v. into_py ( py) ) ,
361- ScalarValue :: DurationMicrosecond ( v) => Ok ( v. into_py ( py) ) ,
362- ScalarValue :: DurationNanosecond ( v) => Ok ( v. into_py ( py) ) ,
363- ScalarValue :: DurationMillisecond ( v) => Ok ( v. into_py ( py) ) ,
364- ScalarValue :: Struct ( _) => Err ( py_datafusion_err (
365- datafusion_common:: DataFusionError :: NotImplemented (
366- "ScalarValue::Struct" . to_string ( ) ,
367- ) ,
368- ) ) ,
369- ScalarValue :: Dictionary ( _, _) => Err ( py_datafusion_err (
370- datafusion_common:: DataFusionError :: NotImplemented (
371- "ScalarValue::Dictionary" . to_string ( ) ,
372- ) ,
373- ) ) ,
374- ScalarValue :: FixedSizeList ( _) => Err ( py_datafusion_err (
375- datafusion_common:: DataFusionError :: NotImplemented (
376- "ScalarValue::FixedSizeList" . to_string ( ) ,
377- ) ,
378- ) ) ,
379- ScalarValue :: LargeList ( _) => Err ( py_datafusion_err (
380- datafusion_common:: DataFusionError :: NotImplemented (
381- "ScalarValue::LargeList" . to_string ( ) ,
382- ) ,
383- ) ) ,
384- ScalarValue :: Union ( _, _, _) => Err ( py_datafusion_err (
385- datafusion_common:: DataFusionError :: NotImplemented (
386- "ScalarValue::Union" . to_string ( ) ,
387- ) ,
388- ) ) ,
389- } ,
304+ Expr :: Literal ( scalar_value) => Ok ( scalar_value. to_pyarrow ( py) ?) ,
390305 _ => Err ( py_type_err ( format ! (
391306 "Non Expr::Literal encountered in types: {:?}" ,
392307 & self . expr
0 commit comments