Path: blob/main/crates/polars-expr/src/dispatch/binary.rs
7884 views
use std::sync::Arc;12use polars_core::error::PolarsResult;3use polars_core::prelude::{Column, DataType, IntoColumn};4use polars_ops::prelude::BinaryNameSpaceImpl;5use polars_plan::dsl::{ColumnsUdf, SpecialEq};6use polars_plan::plans::IRBinaryFunction;78pub fn function_expr_to_udf(func: IRBinaryFunction) -> SpecialEq<Arc<dyn ColumnsUdf>> {9use IRBinaryFunction::*;10match func {11Contains => {12map_as_slice!(contains)13},14EndsWith => {15map_as_slice!(ends_with)16},17StartsWith => {18map_as_slice!(starts_with)19},20#[cfg(feature = "binary_encoding")]21HexDecode(strict) => map!(hex_decode, strict),22#[cfg(feature = "binary_encoding")]23HexEncode => map!(hex_encode),24#[cfg(feature = "binary_encoding")]25Base64Decode(strict) => map!(base64_decode, strict),26#[cfg(feature = "binary_encoding")]27Base64Encode => map!(base64_encode),28Size => map!(size_bytes),29#[cfg(feature = "binary_encoding")]30Reinterpret(dtype, is_little_endian) => map!(reinterpret, &dtype, is_little_endian),31Slice => {32map_as_slice!(bin_slice)33},34Head => {35map_as_slice!(bin_head)36},37Tail => {38map_as_slice!(bin_tail)39},40}41}4243pub(super) fn contains(s: &[Column]) -> PolarsResult<Column> {44let ca = s[0].binary()?;45let lit = s[1].binary()?;46Ok(ca47.contains_chunked(lit)?48.with_name(ca.name().clone())49.into_column())50}5152pub(super) fn ends_with(s: &[Column]) -> PolarsResult<Column> {53let ca = s[0].binary()?;54let suffix = s[1].binary()?;5556Ok(ca57.ends_with_chunked(suffix)?58.with_name(ca.name().clone())59.into_column())60}6162pub(super) fn starts_with(s: &[Column]) -> PolarsResult<Column> {63let ca = s[0].binary()?;64let prefix = s[1].binary()?;6566Ok(ca67.starts_with_chunked(prefix)?68.with_name(ca.name().clone())69.into_column())70}7172pub(super) fn size_bytes(s: &Column) -> PolarsResult<Column> {73let ca = s.binary()?;74Ok(ca.size_bytes().into_column())75}7677#[cfg(feature = "binary_encoding")]78pub(super) fn hex_decode(s: &Column, strict: bool) -> PolarsResult<Column> {79let ca = s.binary()?;80ca.hex_decode(strict).map(|ok| ok.into_column())81}8283#[cfg(feature = "binary_encoding")]84pub(super) fn hex_encode(s: &Column) -> PolarsResult<Column> {85let ca = s.binary()?;86Ok(ca.hex_encode().into())87}8889#[cfg(feature = "binary_encoding")]90pub(super) fn base64_decode(s: &Column, strict: bool) -> PolarsResult<Column> {91let ca = s.binary()?;92ca.base64_decode(strict).map(|ok| ok.into_column())93}9495#[cfg(feature = "binary_encoding")]96pub(super) fn base64_encode(s: &Column) -> PolarsResult<Column> {97let ca = s.binary()?;98Ok(ca.base64_encode().into())99}100101#[cfg(feature = "binary_encoding")]102pub(super) fn reinterpret(103s: &Column,104dtype: &DataType,105is_little_endian: bool,106) -> PolarsResult<Column> {107let ca = s.binary()?;108ca.reinterpret(dtype, is_little_endian)109.map(|val| val.into())110}111112pub(super) fn bin_slice(s: &mut [Column]) -> PolarsResult<Column> {113let ca = s[0].binary()?;114Ok(ca115.bin_slice(&s[1], &s[2])?116.with_name(ca.name().clone())117.into_column())118}119120pub(super) fn bin_head(s: &mut [Column]) -> PolarsResult<Column> {121let ca = s[0].binary()?;122Ok(ca123.bin_head(&s[1])?124.with_name(ca.name().clone())125.into_column())126}127128pub(super) fn bin_tail(s: &mut [Column]) -> PolarsResult<Column> {129let ca = s[0].binary()?;130Ok(ca131.bin_tail(&s[1])?132.with_name(ca.name().clone())133.into_column())134}135136137