(
e: &Expr,
input_dfschema: &DFSchema,
execution_props: &ExecutionProps,
)
| 113 | /// to qualified or unqualified fields by name. |
| 114 | #[cfg_attr(feature = "recursive_protection", recursive::recursive)] |
| 115 | pub fn create_physical_expr( |
| 116 | e: &Expr, |
| 117 | input_dfschema: &DFSchema, |
| 118 | execution_props: &ExecutionProps, |
| 119 | ) -> Result<Arc<dyn PhysicalExpr>> { |
| 120 | let input_schema = input_dfschema.as_arrow(); |
| 121 | |
| 122 | match e { |
| 123 | Expr::Alias(Alias { expr, metadata, .. }) => { |
| 124 | if let Expr::Literal(v, prior_metadata) = expr.as_ref() { |
| 125 | let new_metadata = FieldMetadata::merge_options( |
| 126 | prior_metadata.as_ref(), |
| 127 | metadata.as_ref(), |
| 128 | ); |
| 129 | Ok(Arc::new(Literal::new_with_metadata( |
| 130 | v.clone(), |
| 131 | new_metadata, |
| 132 | ))) |
| 133 | } else { |
| 134 | Ok(create_physical_expr(expr, input_dfschema, execution_props)?) |
| 135 | } |
| 136 | } |
| 137 | Expr::Column(c) => { |
| 138 | let idx = input_dfschema.index_of_column(c)?; |
| 139 | Ok(Arc::new(Column::new(&c.name, idx))) |
| 140 | } |
| 141 | Expr::Literal(value, metadata) => Ok(Arc::new(Literal::new_with_metadata( |
| 142 | value.clone(), |
| 143 | metadata.clone(), |
| 144 | ))), |
| 145 | Expr::ScalarVariable(_, variable_names) => { |
| 146 | if is_system_variables(variable_names) { |
| 147 | match execution_props.get_var_provider(VarType::System) { |
| 148 | Some(provider) => { |
| 149 | let scalar_value = provider.get_value(variable_names.clone())?; |
| 150 | Ok(Arc::new(Literal::new(scalar_value))) |
| 151 | } |
| 152 | _ => plan_err!("No system variable provider found"), |
| 153 | } |
| 154 | } else { |
| 155 | match execution_props.get_var_provider(VarType::UserDefined) { |
| 156 | Some(provider) => { |
| 157 | let scalar_value = provider.get_value(variable_names.clone())?; |
| 158 | Ok(Arc::new(Literal::new(scalar_value))) |
| 159 | } |
| 160 | _ => plan_err!("No user defined variable provider found"), |
| 161 | } |
| 162 | } |
| 163 | } |
| 164 | Expr::IsTrue(expr) => { |
| 165 | let binary_op = binary_expr( |
| 166 | expr.as_ref().clone(), |
| 167 | Operator::IsNotDistinctFrom, |
| 168 | lit(true), |
| 169 | ); |
| 170 | create_physical_expr(&binary_op, input_dfschema, execution_props) |
| 171 | } |
| 172 | Expr::IsNotTrue(expr) => { |
searching dependent graphs…