@@ -21,6 +21,7 @@ use pyo3::prelude::*;
2121use std:: convert:: TryFrom ;
2222use std:: result:: Result ;
2323
24+ use arrow:: pyarrow:: ToPyArrow ;
2425use datafusion_common:: { Column , ScalarValue } ;
2526use datafusion_expr:: { expr:: InList , Between , BinaryExpr , Expr , Operator } ;
2627
@@ -56,6 +57,7 @@ fn extract_scalar_list(exprs: &[Expr], py: Python) -> Result<Vec<PyObject>, Data
5657 let ret: Result < Vec < PyObject > , DataFusionError > = exprs
5758 . iter ( )
5859 . map ( |expr| match expr {
60+ // TODO: should we also leverage `ScalarValue::to_pyarrow` here?
5961 Expr :: Literal ( v) => match v {
6062 ScalarValue :: Boolean ( Some ( b) ) => Ok ( b. into_py ( py) ) ,
6163 ScalarValue :: Int8 ( Some ( i) ) => Ok ( i. into_py ( py) ) ,
@@ -100,23 +102,7 @@ impl TryFrom<&Expr> for PyArrowFilterExpression {
100102 let op_module = Python :: import_bound ( py, "operator" ) ?;
101103 let pc_expr: Result < Bound < ' _ , PyAny > , DataFusionError > = match expr {
102104 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) ) ,
120106 Expr :: BinaryExpr ( BinaryExpr { left, op, right } ) => {
121107 let operator = operator_to_py ( op, & op_module) ?;
122108 let left = PyArrowFilterExpression :: try_from ( left. as_ref ( ) ) ?. 0 ;
@@ -138,8 +124,13 @@ impl TryFrom<&Expr> for PyArrowFilterExpression {
138124 let expr = PyArrowFilterExpression :: try_from ( expr. as_ref ( ) ) ?
139125 . 0
140126 . 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)
143134 }
144135 Expr :: Between ( Between {
145136 expr,
0 commit comments