Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-expr/src/dispatch/extension.rs
7884 views
1
use std::sync::Arc;
2
3
use polars_core::error::PolarsResult;
4
use polars_core::prelude::*;
5
use polars_plan::dsl::{ColumnsUdf, SpecialEq};
6
use polars_plan::plans::IRExtensionFunction;
7
8
pub fn function_expr_to_udf(func: IRExtensionFunction) -> SpecialEq<Arc<dyn ColumnsUdf>> {
9
use IRExtensionFunction::*;
10
match func {
11
To(dtype) => map!(ext_to, dtype.clone()),
12
Storage => map!(ext_storage),
13
}
14
}
15
16
fn ext_to(s: &Column, dtype: DataType) -> PolarsResult<Column> {
17
let DataType::Extension(typ, storage) = &dtype else {
18
polars_bail!(ComputeError: "ext.to() requires an Extension dtype")
19
};
20
21
Ok(s.apply_unary_elementwise(|s| {
22
assert!(*s.dtype() == **storage);
23
s.clone().into_extension(typ.clone())
24
}))
25
}
26
27
fn ext_storage(s: &Column) -> PolarsResult<Column> {
28
Ok(s.apply_unary_elementwise(|s| s.to_storage().clone()))
29
}
30
31