Skip to content

Commit 1f49d46

Browse files
use ScalarValue::to_pyarrow to convert to python object (#731)
Closes #729
1 parent b5446ef commit 1f49d46

File tree

3 files changed

+5
-88
lines changed

3 files changed

+5
-88
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ substrait = ["dep:datafusion-substrait"]
3737
tokio = { version = "1.35", features = ["macros", "rt", "rt-multi-thread", "sync"] }
3838
rand = "0.8"
3939
pyo3 = { version = "0.21", features = ["extension-module", "abi3", "abi3-py38", "gil-refs"] }
40+
arrow = { version = "52", feature = ["pyarrow"] }
4041
datafusion = { version = "39.0.0", features = ["pyarrow", "avro", "unicode_expressions"] }
4142
datafusion-common = { version = "39.0.0", features = ["pyarrow"] }
4243
datafusion-expr = "39.0.0"

src/expr.rs

+3-88
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use pyo3::{basic::CompareOp, prelude::*};
2121
use std::convert::{From, Into};
2222
use std::sync::Arc;
2323

24+
use arrow::pyarrow::ToPyArrow;
2425
use datafusion::arrow::datatypes::{DataType, Field};
2526
use datafusion::arrow::pyarrow::PyArrowType;
2627
use datafusion::functions::core::expr_ext::FieldAccessor;
@@ -32,7 +33,7 @@ use datafusion_expr::{
3233
};
3334

3435
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};
3637
use crate::expr::aggregate_expr::PyAggregateFunction;
3738
use crate::expr::binary_expr::PyBinaryExpr;
3839
use 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

Comments
 (0)