This is an automated email from the ASF dual-hosted git repository.

agrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-python.git


The following commit(s) were added to refs/heads/main by this push:
     new 1f49d46  use ScalarValue::to_pyarrow to convert to python object (#731)
1f49d46 is described below

commit 1f49d4615ebc464394d38b2dea0fa130749ea55f
Author: Michael J Ward <[email protected]>
AuthorDate: Sun Jun 16 10:53:00 2024 -0500

    use ScalarValue::to_pyarrow to convert to python object (#731)
    
    Closes #729
---
 Cargo.lock  |  1 +
 Cargo.toml  |  1 +
 src/expr.rs | 91 ++-----------------------------------------------------------
 3 files changed, 5 insertions(+), 88 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index eb674d0..2e437a0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1032,6 +1032,7 @@ dependencies = [
 name = "datafusion-python"
 version = "39.0.0"
 dependencies = [
+ "arrow",
  "async-trait",
  "datafusion",
  "datafusion-common",
diff --git a/Cargo.toml b/Cargo.toml
index 85a19d1..7285cf3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -37,6 +37,7 @@ substrait = ["dep:datafusion-substrait"]
 tokio = { version = "1.35", features = ["macros", "rt", "rt-multi-thread", 
"sync"] }
 rand = "0.8"
 pyo3 = { version = "0.21", features = ["extension-module", "abi3", 
"abi3-py38", "gil-refs"] }
+arrow = { version = "52", feature = ["pyarrow"] }
 datafusion = { version = "39.0.0", features = ["pyarrow", "avro", 
"unicode_expressions"] }
 datafusion-common = { version = "39.0.0", features = ["pyarrow"] }
 datafusion-expr = "39.0.0"
diff --git a/src/expr.rs b/src/expr.rs
index 9fd29a5..09a773c 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -21,6 +21,7 @@ use pyo3::{basic::CompareOp, prelude::*};
 use std::convert::{From, Into};
 use std::sync::Arc;
 
+use arrow::pyarrow::ToPyArrow;
 use datafusion::arrow::datatypes::{DataType, Field};
 use datafusion::arrow::pyarrow::PyArrowType;
 use datafusion::functions::core::expr_ext::FieldAccessor;
@@ -32,7 +33,7 @@ use datafusion_expr::{
 };
 
 use crate::common::data_type::{DataTypeMap, RexType};
-use crate::errors::{py_datafusion_err, py_runtime_err, py_type_err, 
DataFusionError};
+use crate::errors::{py_runtime_err, py_type_err, DataFusionError};
 use crate::expr::aggregate_expr::PyAggregateFunction;
 use crate::expr::binary_expr::PyBinaryExpr;
 use crate::expr::column::PyColumn;
@@ -300,93 +301,7 @@ impl PyExpr {
     /// Extracts the Expr value into a PyObject that can be shared with Python
     pub fn python_value(&self, py: Python) -> PyResult<PyObject> {
         match &self.expr {
-            Expr::Literal(scalar_value) => match scalar_value {
-                ScalarValue::Null => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::Null".to_string(),
-                    ),
-                )),
-                ScalarValue::Boolean(v) => Ok(v.into_py(py)),
-                ScalarValue::Float16(_) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::Float16".to_string(),
-                    ),
-                )),
-                ScalarValue::Float32(v) => Ok(v.into_py(py)),
-                ScalarValue::Float64(v) => Ok(v.into_py(py)),
-                ScalarValue::Decimal128(v, _, _) => Ok(v.into_py(py)),
-                ScalarValue::Decimal256(_, _, _) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::Decimal256".to_string(),
-                    ),
-                )),
-                ScalarValue::Int8(v) => Ok(v.into_py(py)),
-                ScalarValue::Int16(v) => Ok(v.into_py(py)),
-                ScalarValue::Int32(v) => Ok(v.into_py(py)),
-                ScalarValue::Int64(v) => Ok(v.into_py(py)),
-                ScalarValue::UInt8(v) => Ok(v.into_py(py)),
-                ScalarValue::UInt16(v) => Ok(v.into_py(py)),
-                ScalarValue::UInt32(v) => Ok(v.into_py(py)),
-                ScalarValue::UInt64(v) => Ok(v.into_py(py)),
-                ScalarValue::Utf8(v) => Ok(v.clone().into_py(py)),
-                ScalarValue::LargeUtf8(v) => Ok(v.clone().into_py(py)),
-                ScalarValue::Binary(v) => Ok(v.clone().into_py(py)),
-                ScalarValue::FixedSizeBinary(_, _) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::FixedSizeBinary".to_string(),
-                    ),
-                )),
-                ScalarValue::LargeBinary(v) => Ok(v.clone().into_py(py)),
-                ScalarValue::List(_) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::List".to_string(),
-                    ),
-                )),
-                ScalarValue::Date32(v) => Ok(v.into_py(py)),
-                ScalarValue::Date64(v) => Ok(v.into_py(py)),
-                ScalarValue::Time32Second(v) => Ok(v.into_py(py)),
-                ScalarValue::Time32Millisecond(v) => Ok(v.into_py(py)),
-                ScalarValue::Time64Microsecond(v) => Ok(v.into_py(py)),
-                ScalarValue::Time64Nanosecond(v) => Ok(v.into_py(py)),
-                ScalarValue::TimestampSecond(v, _) => Ok(v.into_py(py)),
-                ScalarValue::TimestampMillisecond(v, _) => Ok(v.into_py(py)),
-                ScalarValue::TimestampMicrosecond(v, _) => Ok(v.into_py(py)),
-                ScalarValue::TimestampNanosecond(v, _) => Ok(v.into_py(py)),
-                ScalarValue::IntervalYearMonth(v) => Ok(v.into_py(py)),
-                ScalarValue::IntervalDayTime(v) => 
Ok(ScalarValue::IntervalDayTime(*v).into_py(py)),
-                ScalarValue::IntervalMonthDayNano(v) => {
-                    Ok(ScalarValue::IntervalMonthDayNano(*v).into_py(py))
-                }
-                ScalarValue::DurationSecond(v) => Ok(v.into_py(py)),
-                ScalarValue::DurationMicrosecond(v) => Ok(v.into_py(py)),
-                ScalarValue::DurationNanosecond(v) => Ok(v.into_py(py)),
-                ScalarValue::DurationMillisecond(v) => Ok(v.into_py(py)),
-                ScalarValue::Struct(_) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::Struct".to_string(),
-                    ),
-                )),
-                ScalarValue::Dictionary(_, _) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::Dictionary".to_string(),
-                    ),
-                )),
-                ScalarValue::FixedSizeList(_) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::FixedSizeList".to_string(),
-                    ),
-                )),
-                ScalarValue::LargeList(_) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::LargeList".to_string(),
-                    ),
-                )),
-                ScalarValue::Union(_, _, _) => Err(py_datafusion_err(
-                    datafusion_common::DataFusionError::NotImplemented(
-                        "ScalarValue::Union".to_string(),
-                    ),
-                )),
-            },
+            Expr::Literal(scalar_value) => Ok(scalar_value.to_pyarrow(py)?),
             _ => Err(py_type_err(format!(
                 "Non Expr::Literal encountered in types: {:?}",
                 &self.expr


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to