Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-expr/src/dispatch/binary.rs
7884 views
1
use std::sync::Arc;
2
3
use polars_core::error::PolarsResult;
4
use polars_core::prelude::{Column, DataType, IntoColumn};
5
use polars_ops::prelude::BinaryNameSpaceImpl;
6
use polars_plan::dsl::{ColumnsUdf, SpecialEq};
7
use polars_plan::plans::IRBinaryFunction;
8
9
pub fn function_expr_to_udf(func: IRBinaryFunction) -> SpecialEq<Arc<dyn ColumnsUdf>> {
10
use IRBinaryFunction::*;
11
match func {
12
Contains => {
13
map_as_slice!(contains)
14
},
15
EndsWith => {
16
map_as_slice!(ends_with)
17
},
18
StartsWith => {
19
map_as_slice!(starts_with)
20
},
21
#[cfg(feature = "binary_encoding")]
22
HexDecode(strict) => map!(hex_decode, strict),
23
#[cfg(feature = "binary_encoding")]
24
HexEncode => map!(hex_encode),
25
#[cfg(feature = "binary_encoding")]
26
Base64Decode(strict) => map!(base64_decode, strict),
27
#[cfg(feature = "binary_encoding")]
28
Base64Encode => map!(base64_encode),
29
Size => map!(size_bytes),
30
#[cfg(feature = "binary_encoding")]
31
Reinterpret(dtype, is_little_endian) => map!(reinterpret, &dtype, is_little_endian),
32
Slice => {
33
map_as_slice!(bin_slice)
34
},
35
Head => {
36
map_as_slice!(bin_head)
37
},
38
Tail => {
39
map_as_slice!(bin_tail)
40
},
41
}
42
}
43
44
pub(super) fn contains(s: &[Column]) -> PolarsResult<Column> {
45
let ca = s[0].binary()?;
46
let lit = s[1].binary()?;
47
Ok(ca
48
.contains_chunked(lit)?
49
.with_name(ca.name().clone())
50
.into_column())
51
}
52
53
pub(super) fn ends_with(s: &[Column]) -> PolarsResult<Column> {
54
let ca = s[0].binary()?;
55
let suffix = s[1].binary()?;
56
57
Ok(ca
58
.ends_with_chunked(suffix)?
59
.with_name(ca.name().clone())
60
.into_column())
61
}
62
63
pub(super) fn starts_with(s: &[Column]) -> PolarsResult<Column> {
64
let ca = s[0].binary()?;
65
let prefix = s[1].binary()?;
66
67
Ok(ca
68
.starts_with_chunked(prefix)?
69
.with_name(ca.name().clone())
70
.into_column())
71
}
72
73
pub(super) fn size_bytes(s: &Column) -> PolarsResult<Column> {
74
let ca = s.binary()?;
75
Ok(ca.size_bytes().into_column())
76
}
77
78
#[cfg(feature = "binary_encoding")]
79
pub(super) fn hex_decode(s: &Column, strict: bool) -> PolarsResult<Column> {
80
let ca = s.binary()?;
81
ca.hex_decode(strict).map(|ok| ok.into_column())
82
}
83
84
#[cfg(feature = "binary_encoding")]
85
pub(super) fn hex_encode(s: &Column) -> PolarsResult<Column> {
86
let ca = s.binary()?;
87
Ok(ca.hex_encode().into())
88
}
89
90
#[cfg(feature = "binary_encoding")]
91
pub(super) fn base64_decode(s: &Column, strict: bool) -> PolarsResult<Column> {
92
let ca = s.binary()?;
93
ca.base64_decode(strict).map(|ok| ok.into_column())
94
}
95
96
#[cfg(feature = "binary_encoding")]
97
pub(super) fn base64_encode(s: &Column) -> PolarsResult<Column> {
98
let ca = s.binary()?;
99
Ok(ca.base64_encode().into())
100
}
101
102
#[cfg(feature = "binary_encoding")]
103
pub(super) fn reinterpret(
104
s: &Column,
105
dtype: &DataType,
106
is_little_endian: bool,
107
) -> PolarsResult<Column> {
108
let ca = s.binary()?;
109
ca.reinterpret(dtype, is_little_endian)
110
.map(|val| val.into())
111
}
112
113
pub(super) fn bin_slice(s: &mut [Column]) -> PolarsResult<Column> {
114
let ca = s[0].binary()?;
115
Ok(ca
116
.bin_slice(&s[1], &s[2])?
117
.with_name(ca.name().clone())
118
.into_column())
119
}
120
121
pub(super) fn bin_head(s: &mut [Column]) -> PolarsResult<Column> {
122
let ca = s[0].binary()?;
123
Ok(ca
124
.bin_head(&s[1])?
125
.with_name(ca.name().clone())
126
.into_column())
127
}
128
129
pub(super) fn bin_tail(s: &mut [Column]) -> PolarsResult<Column> {
130
let ca = s[0].binary()?;
131
Ok(ca
132
.bin_tail(&s[1])?
133
.with_name(ca.name().clone())
134
.into_column())
135
}
136
137