Path: blob/main/crates/polars-plan/src/dsl/expr/expr_dyn_fn.rs
6940 views
use std::fmt::Formatter;1use std::ops::Deref;2use std::sync::Arc;34use super::*;56pub trait AnonymousColumnsUdf: ColumnsUdf {7fn as_column_udf(self: Arc<Self>) -> Arc<dyn ColumnsUdf>;8fn deep_clone(self: Arc<Self>) -> Arc<dyn AnonymousColumnsUdf>;910fn try_serialize(&self, _buf: &mut Vec<u8>) -> PolarsResult<()> {11polars_bail!(ComputeError: "serialization not supported for this 'opaque' function")12}1314fn get_field(&self, input_schema: &Schema, fields: &[Field]) -> PolarsResult<Field>;15}1617/// A wrapper trait for any closure `Fn(Vec<Series>) -> PolarsResult<Series>`18pub trait ColumnsUdf: Send + Sync {19fn as_any(&self) -> &dyn std::any::Any {20unimplemented!("as_any not implemented for this 'opaque' function")21}2223fn call_udf(&self, s: &mut [Column]) -> PolarsResult<Column>;24}2526impl<F> ColumnsUdf for F27where28F: Fn(&mut [Column]) -> PolarsResult<Column> + Send + Sync,29{30fn call_udf(&self, s: &mut [Column]) -> PolarsResult<Column> {31self(s)32}33}3435impl Debug for dyn ColumnsUdf {36fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {37write!(f, "ColumnUdf")38}39}4041#[derive(Clone)]42/// Wrapper type that has special equality properties43/// depending on the inner type specialization44pub struct SpecialEq<T>(T);4546impl<T> SpecialEq<T> {47pub fn new(val: T) -> Self {48SpecialEq(val)49}5051pub fn into_inner(self) -> T {52self.053}54}5556impl SpecialEq<Arc<dyn AnonymousColumnsUdf>> {57pub fn deep_clone(self) -> Self {58SpecialEq(self.0.deep_clone())59}60}6162impl<T: ?Sized> PartialEq for SpecialEq<Arc<T>> {63fn eq(&self, other: &Self) -> bool {64Arc::ptr_eq(&self.0, &other.0)65}66}6768impl<T: ?Sized> Eq for SpecialEq<Arc<T>> {}6970impl<T: ?Sized> Hash for SpecialEq<Arc<T>> {71fn hash<H: Hasher>(&self, state: &mut H) {72Arc::as_ptr(self).hash(state);73}74}7576impl PartialEq for SpecialEq<Series> {77fn eq(&self, other: &Self) -> bool {78self.0 == other.079}80}8182impl<T> Debug for SpecialEq<T> {83fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {84write!(f, "no_eq")85}86}8788impl<T> Deref for SpecialEq<T> {89type Target = T;9091fn deref(&self) -> &Self::Target {92&self.093}94}9596pub struct BaseColumnUdf<F, DT> {97f: F,98dt: DT,99}100101impl<F, DT> BaseColumnUdf<F, DT> {102pub fn new(f: F, dt: DT) -> Self {103Self { f, dt }104}105}106107impl<F, DT> ColumnsUdf for BaseColumnUdf<F, DT>108where109F: Fn(&mut [Column]) -> PolarsResult<Column> + Send + Sync,110DT: Fn(&Schema, &[Field]) -> PolarsResult<Field> + Send + Sync,111{112fn call_udf(&self, s: &mut [Column]) -> PolarsResult<Column> {113(self.f)(s)114}115}116117impl<F, DT> AnonymousColumnsUdf for BaseColumnUdf<F, DT>118where119F: Fn(&mut [Column]) -> PolarsResult<Column> + 'static + Send + Sync,120DT: Fn(&Schema, &[Field]) -> PolarsResult<Field> + 'static + Send + Sync,121{122fn as_column_udf(self: Arc<Self>) -> Arc<dyn ColumnsUdf> {123self as _124}125fn deep_clone(self: Arc<Self>) -> Arc<dyn AnonymousColumnsUdf> {126self127}128129fn get_field(&self, input_schema: &Schema, fields: &[Field]) -> PolarsResult<Field> {130(self.dt)(input_schema, fields)131}132}133134pub type OpaqueColumnUdf = LazySerde<SpecialEq<Arc<dyn AnonymousColumnsUdf>>>;135pub(crate) fn new_column_udf<F: AnonymousColumnsUdf + 'static>(func: F) -> OpaqueColumnUdf {136LazySerde::Deserialized(SpecialEq::new(Arc::new(func)))137}138139impl OpaqueColumnUdf {140pub fn materialize(self) -> PolarsResult<SpecialEq<Arc<dyn AnonymousColumnsUdf>>> {141match self {142Self::Deserialized(t) => Ok(t),143Self::Named {144name,145payload,146value,147} => feature_gated!("serde", {148use super::named_serde::NAMED_SERDE_REGISTRY_EXPR;149match value {150Some(v) => Ok(v),151None => Ok(SpecialEq(152NAMED_SERDE_REGISTRY_EXPR153.read()154.unwrap()155.as_ref()156.expect("NAMED EXPR REGISTRY NOT SET")157.get_function(&name, payload.unwrap().as_ref())158.expect("NAMED FUNCTION NOT FOUND"),159)),160}161}),162Self::Bytes(_b) => {163feature_gated!("serde";"python", {164serde_expr::deserialize_column_udf(_b.as_ref()).map(SpecialEq::new)165})166},167}168}169}170171172