@@ -21,6 +21,7 @@ use pyo3::{basic::CompareOp, prelude::*};
21
21
use std:: convert:: { From , Into } ;
22
22
use std:: sync:: Arc ;
23
23
24
+ use arrow:: pyarrow:: ToPyArrow ;
24
25
use datafusion:: arrow:: datatypes:: { DataType , Field } ;
25
26
use datafusion:: arrow:: pyarrow:: PyArrowType ;
26
27
use datafusion:: functions:: core:: expr_ext:: FieldAccessor ;
@@ -32,7 +33,7 @@ use datafusion_expr::{
32
33
} ;
33
34
34
35
use 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 } ;
36
37
use crate :: expr:: aggregate_expr:: PyAggregateFunction ;
37
38
use crate :: expr:: binary_expr:: PyBinaryExpr ;
38
39
use crate :: expr:: column:: PyColumn ;
@@ -300,93 +301,7 @@ impl PyExpr {
300
301
/// Extracts the Expr value into a PyObject that can be shared with Python
301
302
pub fn python_value ( & self , py : Python ) -> PyResult < PyObject > {
302
303
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) ?) ,
390
305
_ => Err ( py_type_err ( format ! (
391
306
"Non Expr::Literal encountered in types: {:?}" ,
392
307
& self . expr
0 commit comments