Skip to content

Commit 1adfcde

Browse files
committed
all done
Signed-off-by: jayzhan211 <[email protected]>
1 parent adc87a1 commit 1adfcde

File tree

6 files changed

+108
-476
lines changed

6 files changed

+108
-476
lines changed

datafusion/physical-expr/src/expressions/case.rs renamed to datafusion/physical-expr-common/src/expressions/case.rs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ use std::borrow::Cow;
1919
use std::hash::{Hash, Hasher};
2020
use std::{any::Any, sync::Arc};
2121

22-
use crate::expressions::{try_cast, NoOp};
22+
use crate::expressions::no_op::NoOp;
23+
use crate::expressions::try_cast::try_cast;
2324
use crate::physical_expr::down_cast_any_ref;
24-
use crate::PhysicalExpr;
25+
use crate::physical_expr::PhysicalExpr;
2526

2627
use arrow::array::*;
2728
use arrow::compute::kernels::cmp::eq;
@@ -414,7 +415,11 @@ pub fn case(
414415
#[cfg(test)]
415416
mod tests {
416417
use super::*;
417-
use crate::expressions::{binary, cast, col, lit};
418+
419+
use crate::expressions::binary::binary;
420+
use crate::expressions::cast::cast;
421+
use crate::expressions::column::col;
422+
use crate::expressions::literal::{lit, Literal};
418423

419424
use arrow::array::StringArray;
420425
use arrow::buffer::Buffer;
@@ -959,16 +964,15 @@ mod tests {
959964
let expr2 = expr
960965
.clone()
961966
.transform(|e| {
962-
let transformed =
963-
match e.as_any().downcast_ref::<crate::expressions::Literal>() {
964-
Some(lit_value) => match lit_value.value() {
965-
ScalarValue::Utf8(Some(str_value)) => {
966-
Some(lit(str_value.to_uppercase()))
967-
}
968-
_ => None,
969-
},
967+
let transformed = match e.as_any().downcast_ref::<Literal>() {
968+
Some(lit_value) => match lit_value.value() {
969+
ScalarValue::Utf8(Some(str_value)) => {
970+
Some(lit(str_value.to_uppercase()))
971+
}
970972
_ => None,
971-
};
973+
},
974+
_ => None,
975+
};
972976
Ok(if let Some(transformed) = transformed {
973977
Transformed::yes(transformed)
974978
} else {
@@ -981,16 +985,15 @@ mod tests {
981985
let expr3 = expr
982986
.clone()
983987
.transform_down(|e| {
984-
let transformed =
985-
match e.as_any().downcast_ref::<crate::expressions::Literal>() {
986-
Some(lit_value) => match lit_value.value() {
987-
ScalarValue::Utf8(Some(str_value)) => {
988-
Some(lit(str_value.to_uppercase()))
989-
}
990-
_ => None,
991-
},
988+
let transformed = match e.as_any().downcast_ref::<Literal>() {
989+
Some(lit_value) => match lit_value.value() {
990+
ScalarValue::Utf8(Some(str_value)) => {
991+
Some(lit(str_value.to_uppercase()))
992+
}
992993
_ => None,
993-
};
994+
},
995+
_ => None,
996+
};
994997
Ok(if let Some(transformed) = transformed {
995998
Transformed::yes(transformed)
996999
} else {

datafusion/physical-expr-common/src/expressions/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
2020
#[macro_use]
2121
pub mod binary;
22+
pub mod case;
2223
pub mod cast;
2324
pub mod column;
2425
pub mod datum;
@@ -28,5 +29,6 @@ pub mod is_null;
2829
pub mod like;
2930
pub mod literal;
3031
pub mod negative;
32+
pub mod no_op;
3133
pub mod not;
3234
pub mod try_cast;

datafusion/physical-expr/src/expressions/no_op.rs renamed to datafusion/physical-expr-common/src/expressions/no_op.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use arrow::{
2727
};
2828

2929
use crate::physical_expr::down_cast_any_ref;
30-
use crate::PhysicalExpr;
30+
use crate::physical_expr::PhysicalExpr;
3131
use datafusion_common::{internal_err, Result};
3232
use datafusion_expr::ColumnarValue;
3333

datafusion/physical-expr-common/src/physical_expr.rs

Lines changed: 77 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use datafusion_expr::{
3939
};
4040

4141
use crate::expressions::binary::binary;
42+
use crate::expressions::case;
4243
use crate::expressions::cast::cast;
4344
use crate::expressions::column::Column;
4445
use crate::expressions::in_list::in_list;
@@ -332,7 +333,6 @@ pub fn physical_exprs_equal(
332333
/// * `e` - The logical expression
333334
/// * `input_dfschema` - The DataFusion schema for the input, used to resolve `Column` references
334335
/// to qualified or unqualified fields by name.
335-
#[allow(clippy::only_used_in_recursion)]
336336
pub fn create_physical_expr(
337337
e: &Expr,
338338
input_dfschema: &DFSchema,
@@ -451,43 +451,43 @@ pub fn create_physical_expr(
451451
input_schema,
452452
)
453453
}
454-
// Expr::Case(case) => {
455-
// let expr: Option<Arc<dyn PhysicalExpr>> = if let Some(e) = &case.expr {
456-
// Some(create_physical_expr(
457-
// e.as_ref(),
458-
// input_dfschema,
459-
// execution_props,
460-
// )?)
461-
// } else {
462-
// None
463-
// };
464-
// let (when_expr, then_expr): (Vec<&Expr>, Vec<&Expr>) = case
465-
// .when_then_expr
466-
// .iter()
467-
// .map(|(w, t)| (w.as_ref(), t.as_ref()))
468-
// .unzip();
469-
// let when_expr =
470-
// create_physical_exprs(when_expr, input_dfschema, execution_props)?;
471-
// let then_expr =
472-
// create_physical_exprs(then_expr, input_dfschema, execution_props)?;
473-
// let when_then_expr: Vec<(Arc<dyn PhysicalExpr>, Arc<dyn PhysicalExpr>)> =
474-
// when_expr
475-
// .iter()
476-
// .zip(then_expr.iter())
477-
// .map(|(w, t)| (w.clone(), t.clone()))
478-
// .collect();
479-
// let else_expr: Option<Arc<dyn PhysicalExpr>> =
480-
// if let Some(e) = &case.else_expr {
481-
// Some(create_physical_expr(
482-
// e.as_ref(),
483-
// input_dfschema,
484-
// execution_props,
485-
// )?)
486-
// } else {
487-
// None
488-
// };
489-
// Ok(expressions::case(expr, when_then_expr, else_expr)?)
490-
// }
454+
Expr::Case(case) => {
455+
let expr: Option<Arc<dyn PhysicalExpr>> = if let Some(e) = &case.expr {
456+
Some(create_physical_expr(
457+
e.as_ref(),
458+
input_dfschema,
459+
execution_props,
460+
)?)
461+
} else {
462+
None
463+
};
464+
let (when_expr, then_expr): (Vec<&Expr>, Vec<&Expr>) = case
465+
.when_then_expr
466+
.iter()
467+
.map(|(w, t)| (w.as_ref(), t.as_ref()))
468+
.unzip();
469+
let when_expr =
470+
create_physical_exprs(when_expr, input_dfschema, execution_props)?;
471+
let then_expr =
472+
create_physical_exprs(then_expr, input_dfschema, execution_props)?;
473+
let when_then_expr: Vec<(Arc<dyn PhysicalExpr>, Arc<dyn PhysicalExpr>)> =
474+
when_expr
475+
.iter()
476+
.zip(then_expr.iter())
477+
.map(|(w, t)| (w.clone(), t.clone()))
478+
.collect();
479+
let else_expr: Option<Arc<dyn PhysicalExpr>> =
480+
if let Some(e) = &case.else_expr {
481+
Some(create_physical_expr(
482+
e.as_ref(),
483+
input_dfschema,
484+
execution_props,
485+
)?)
486+
} else {
487+
None
488+
};
489+
Ok(case::case(expr, when_then_expr, else_expr)?)
490+
}
491491
Expr::Cast(Cast { expr, data_type }) => cast(
492492
create_physical_expr(expr, input_dfschema, execution_props)?,
493493
input_schema,
@@ -604,3 +604,42 @@ where
604604
.map(|expr| create_physical_expr(expr, input_dfschema, execution_props))
605605
.collect::<Result<Vec<_>>>()
606606
}
607+
608+
#[cfg(test)]
609+
mod tests {
610+
use std::sync::Arc;
611+
612+
use arrow::array::{ArrayRef, BooleanArray, RecordBatch, StringArray};
613+
use arrow::datatypes::{DataType, Field, Schema};
614+
615+
use datafusion_common::{DFSchema, Result};
616+
use datafusion_expr::execution_props::ExecutionProps;
617+
use datafusion_expr::{col, lit};
618+
619+
use super::create_physical_expr;
620+
621+
#[test]
622+
fn test_create_physical_expr_scalar_input_output() -> Result<()> {
623+
let expr = col("letter").eq(lit("A"));
624+
625+
let schema = Schema::new(vec![Field::new("letter", DataType::Utf8, false)]);
626+
let df_schema = DFSchema::try_from_qualified_schema("data", &schema)?;
627+
let p = create_physical_expr(&expr, &df_schema, &ExecutionProps::new())?;
628+
629+
let batch = RecordBatch::try_new(
630+
Arc::new(schema),
631+
vec![Arc::new(StringArray::from_iter_values(vec![
632+
"A", "B", "C", "D",
633+
]))],
634+
)?;
635+
let result = p.evaluate(&batch)?;
636+
let result = result.into_array(4).expect("Failed to convert to array");
637+
638+
assert_eq!(
639+
&result,
640+
&(Arc::new(BooleanArray::from(vec![true, false, false, false,])) as ArrayRef)
641+
);
642+
643+
Ok(())
644+
}
645+
}

datafusion/physical-expr/src/expressions/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717

1818
//! Defines physical expressions that can evaluated at runtime during query execution
1919
20-
mod case;
2120
mod column;
22-
mod no_op;
2321

2422
/// Module with some convenient methods used in expression building
2523
pub mod helpers {
@@ -67,10 +65,10 @@ pub use datafusion_functions_aggregate::first_last::{
6765
FirstValuePhysicalExpr as FirstValue, LastValuePhysicalExpr as LastValue,
6866
};
6967

70-
pub use case::{case, CaseExpr};
7168
pub use column::UnKnownColumn;
7269
pub use datafusion_expr::utils::format_state_name;
7370
pub use datafusion_physical_expr_common::expressions::binary::{binary, BinaryExpr};
71+
pub use datafusion_physical_expr_common::expressions::case::{case, CaseExpr};
7472
pub use datafusion_physical_expr_common::expressions::cast::{
7573
cast, cast_with_options, CastExpr,
7674
};
@@ -85,9 +83,9 @@ pub use datafusion_physical_expr_common::expressions::literal::{lit, Literal};
8583
pub use datafusion_physical_expr_common::expressions::negative::{
8684
negative, NegativeExpr,
8785
};
86+
pub use datafusion_physical_expr_common::expressions::no_op::NoOp;
8887
pub use datafusion_physical_expr_common::expressions::not::{not, NotExpr};
8988
pub use datafusion_physical_expr_common::expressions::try_cast::{try_cast, TryCastExpr};
90-
pub use no_op::NoOp;
9189

9290
#[cfg(test)]
9391
pub(crate) mod tests {

0 commit comments

Comments
 (0)