Path: blob/main/crates/polars-expr/src/dispatch/binary.rs
8353 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},40Get(null_on_oob) => {41map_as_slice!(bin_get, null_on_oob)42},43}44}4546pub(super) fn contains(s: &[Column]) -> PolarsResult<Column> {47let ca = s[0].binary()?;48let lit = s[1].binary()?;49Ok(ca50.contains_chunked(lit)?51.with_name(ca.name().clone())52.into_column())53}5455pub(super) fn ends_with(s: &[Column]) -> PolarsResult<Column> {56let ca = s[0].binary()?;57let suffix = s[1].binary()?;5859Ok(ca60.ends_with_chunked(suffix)?61.with_name(ca.name().clone())62.into_column())63}6465pub(super) fn starts_with(s: &[Column]) -> PolarsResult<Column> {66let ca = s[0].binary()?;67let prefix = s[1].binary()?;6869Ok(ca70.starts_with_chunked(prefix)?71.with_name(ca.name().clone())72.into_column())73}7475pub(super) fn size_bytes(s: &Column) -> PolarsResult<Column> {76let ca = s.binary()?;77Ok(ca.size_bytes().into_column())78}7980#[cfg(feature = "binary_encoding")]81pub(super) fn hex_decode(s: &Column, strict: bool) -> PolarsResult<Column> {82let ca = s.binary()?;83ca.hex_decode(strict).map(|ok| ok.into_column())84}8586#[cfg(feature = "binary_encoding")]87pub(super) fn hex_encode(s: &Column) -> PolarsResult<Column> {88let ca = s.binary()?;89Ok(ca.hex_encode().into())90}9192#[cfg(feature = "binary_encoding")]93pub(super) fn base64_decode(s: &Column, strict: bool) -> PolarsResult<Column> {94let ca = s.binary()?;95ca.base64_decode(strict).map(|ok| ok.into_column())96}9798#[cfg(feature = "binary_encoding")]99pub(super) fn base64_encode(s: &Column) -> PolarsResult<Column> {100let ca = s.binary()?;101Ok(ca.base64_encode().into())102}103104#[cfg(feature = "binary_encoding")]105pub(super) fn reinterpret(106s: &Column,107dtype: &DataType,108is_little_endian: bool,109) -> PolarsResult<Column> {110let ca = s.binary()?;111ca.reinterpret(dtype, is_little_endian)112.map(|val| val.into())113}114115pub(super) fn bin_slice(s: &mut [Column]) -> PolarsResult<Column> {116let ca = s[0].binary()?;117Ok(ca118.bin_slice(&s[1], &s[2])?119.with_name(ca.name().clone())120.into_column())121}122123pub(super) fn bin_head(s: &mut [Column]) -> PolarsResult<Column> {124let ca = s[0].binary()?;125Ok(ca126.bin_head(&s[1])?127.with_name(ca.name().clone())128.into_column())129}130131pub(super) fn bin_tail(s: &mut [Column]) -> PolarsResult<Column> {132let ca = s[0].binary()?;133Ok(ca134.bin_tail(&s[1])?135.with_name(ca.name().clone())136.into_column())137}138139pub(super) fn bin_get(s: &mut [Column], null_on_oob: bool) -> PolarsResult<Column> {140let ca = s[0].binary()?;141let index = s[1].cast(&DataType::Int64)?;142polars_ops::prelude::bin_get(ca, index.i64()?, null_on_oob)143}144145146