Path: blob/main/crates/polars-plan/src/dsl/expr/anonymous/agg.rs
8430 views
use std::any::Any;1use std::hash::{Hash, Hasher};2use std::sync::Arc;34use polars_core::prelude::Field;5use polars_core::schema::Schema;6use polars_error::{PolarsResult, feature_gated};78use super::SpecialEq;9use crate::dsl::LazySerde;1011pub trait AnonymousAgg: Send + Sync {12fn as_any(&self) -> &dyn Any;1314fn get_field(&self, input_schema: &Schema, fields: &[Field]) -> PolarsResult<Field>;15}1617pub type OpaqueStreamingAgg = LazySerde<SpecialEq<Arc<dyn AnonymousAgg>>>;1819impl OpaqueStreamingAgg {20pub fn materialize(&self) -> PolarsResult<SpecialEq<Arc<dyn AnonymousAgg>>> {21match self {22Self::Deserialized(t) => Ok(t.clone()),23Self::Named {24name,25payload,26value,27} => feature_gated!("serde", {28use super::named_serde::NAMED_SERDE_REGISTRY_EXPR;29match value {30Some(v) => Ok(v.clone()),31None => Ok(SpecialEq::new(32NAMED_SERDE_REGISTRY_EXPR33.read()34.unwrap()35.as_ref()36.expect("NAMED EXPR REGISTRY NOT SET")37.get_agg(name, payload.as_ref().unwrap())?38.expect("NAMED AGG NOT FOUND"),39)),40}41}),42Self::Bytes(_b) => {43feature_gated!("serde", {44use crate::dsl::anonymous::serde_expr;45serde_expr::deserialize_anon_agg(_b.as_ref()).map(SpecialEq::new)46})47},48}49}50}5152impl Hash for OpaqueStreamingAgg {53fn hash<H: Hasher>(&self, state: &mut H) {54core::mem::discriminant(self).hash(state);55match self {56Self::Deserialized(ptr) => ptr.hash(state),57Self::Bytes(b) => b.hash(state),58Self::Named {59name,60payload,61value: _,62} => {63name.hash(state);64payload.hash(state);65},66}67}68}697071