Path: blob/main/crates/polars-expr/src/expressions/field.rs
8424 views
use polars_core::error::PolarsResult;1use polars_core::frame::DataFrame;2use polars_core::prelude::{Column, Field, GroupPositions};3use polars_plan::dsl::Expr;45use super::*;6use crate::prelude::AggregationContext;7use crate::state::ExecutionState;89#[derive(Clone)]10pub struct FieldExpr {11name: PlSmallStr,12expr: Expr,13output_field: Field,14}1516impl FieldExpr {17pub fn new(name: PlSmallStr, expr: Expr, output_field: Field) -> Self {18Self {19name,20expr,21output_field,22}23}24}2526impl PhysicalExpr for FieldExpr {27fn as_expression(&self) -> Option<&Expr> {28Some(&self.expr)29}3031// In-memory engine only.32fn evaluate(&self, _df: &DataFrame, state: &ExecutionState) -> PolarsResult<Column> {33let ca = state34.with_fields35.as_ref()36.ok_or_else(|| polars_err!(invalid_field_use))?;3738ca.field_by_name(self.name.as_str()).map(Column::from)39}4041// In-memory engine only.42fn evaluate_on_groups<'a>(43&self,44_df: &DataFrame,45_groups: &'a GroupPositions,46state: &ExecutionState,47) -> PolarsResult<AggregationContext<'a>> {48let ac = state49.with_fields_ac50.as_ref()51.ok_or_else(|| polars_err!(invalid_field_use))?;5253let col = ac.flat_naive().clone();54let ca = col.struct_()?;55let out = ca.field_by_name(self.name.as_str()).map(Column::from)?;5657Ok(AggregationContext {58state: match ac.agg_state() {59AggState::AggregatedList(_) => AggState::AggregatedList(out),60AggState::NotAggregated(_) => AggState::NotAggregated(out),61AggState::AggregatedScalar(_) => AggState::AggregatedScalar(out),62AggState::LiteralScalar(_) => AggState::LiteralScalar(out),63},64groups: ac.groups.clone(),65update_groups: ac.update_groups,66original_len: ac.original_len,67})68}6970fn to_field(&self, _input_schema: &Schema) -> PolarsResult<Field> {71Ok(self.output_field.clone())72}7374fn is_scalar(&self) -> bool {75false76}77}787980