@@ -21,6 +21,7 @@ use pyo3::prelude::*;
21
21
use std:: convert:: TryFrom ;
22
22
use std:: result:: Result ;
23
23
24
+ use arrow:: pyarrow:: ToPyArrow ;
24
25
use datafusion_common:: { Column , ScalarValue } ;
25
26
use datafusion_expr:: { expr:: InList , Between , BinaryExpr , Expr , Operator } ;
26
27
@@ -56,6 +57,7 @@ fn extract_scalar_list(exprs: &[Expr], py: Python) -> Result<Vec<PyObject>, Data
56
57
let ret: Result < Vec < PyObject > , DataFusionError > = exprs
57
58
. iter ( )
58
59
. map ( |expr| match expr {
60
+ // TODO: should we also leverage `ScalarValue::to_pyarrow` here?
59
61
Expr :: Literal ( v) => match v {
60
62
ScalarValue :: Boolean ( Some ( b) ) => Ok ( b. into_py ( py) ) ,
61
63
ScalarValue :: Int8 ( Some ( i) ) => Ok ( i. into_py ( py) ) ,
@@ -100,23 +102,7 @@ impl TryFrom<&Expr> for PyArrowFilterExpression {
100
102
let op_module = Python :: import_bound ( py, "operator" ) ?;
101
103
let pc_expr: Result < Bound < ' _ , PyAny > , DataFusionError > = match expr {
102
104
Expr :: Column ( Column { name, .. } ) => Ok ( pc. getattr ( "field" ) ?. call1 ( ( name, ) ) ?) ,
103
- Expr :: Literal ( v) => match v {
104
- ScalarValue :: Boolean ( Some ( b) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * b, ) ) ?) ,
105
- ScalarValue :: Int8 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
106
- ScalarValue :: Int16 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
107
- ScalarValue :: Int32 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
108
- ScalarValue :: Int64 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
109
- ScalarValue :: UInt8 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
110
- ScalarValue :: UInt16 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
111
- ScalarValue :: UInt32 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
112
- ScalarValue :: UInt64 ( Some ( i) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * i, ) ) ?) ,
113
- ScalarValue :: Float32 ( Some ( f) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * f, ) ) ?) ,
114
- ScalarValue :: Float64 ( Some ( f) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( * f, ) ) ?) ,
115
- ScalarValue :: Utf8 ( Some ( s) ) => Ok ( pc. getattr ( "scalar" ) ?. call1 ( ( s, ) ) ?) ,
116
- _ => Err ( DataFusionError :: Common ( format ! (
117
- "PyArrow can't handle ScalarValue: {v:?}"
118
- ) ) ) ,
119
- } ,
105
+ Expr :: Literal ( scalar) => Ok ( scalar. to_pyarrow ( py) ?. into_bound ( py) ) ,
120
106
Expr :: BinaryExpr ( BinaryExpr { left, op, right } ) => {
121
107
let operator = operator_to_py ( op, & op_module) ?;
122
108
let left = PyArrowFilterExpression :: try_from ( left. as_ref ( ) ) ?. 0 ;
@@ -138,8 +124,13 @@ impl TryFrom<&Expr> for PyArrowFilterExpression {
138
124
let expr = PyArrowFilterExpression :: try_from ( expr. as_ref ( ) ) ?
139
125
. 0
140
126
. into_bound ( py) ;
141
- // TODO: this expression does not seems like it should be `call_method0`
142
- Ok ( expr. clone ( ) . call_method1 ( "is_null" , ( expr, ) ) ?)
127
+
128
+ // https://arrow.apache.org/docs/python/generated/pyarrow.dataset.Expression.html#pyarrow.dataset.Expression.is_null
129
+ // Whether floating-point NaNs are considered null.
130
+ let nan_is_null = false ;
131
+
132
+ let res = expr. call_method1 ( "is_null" , ( nan_is_null, ) ) ?;
133
+ Ok ( res)
143
134
}
144
135
Expr :: Between ( Between {
145
136
expr,
0 commit comments