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
8353 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
Get(null_on_oob) => {
42
map_as_slice!(bin_get, null_on_oob)
43
},
44
}
45
}
46
47
pub(super) fn contains(s: &[Column]) -> PolarsResult<Column> {
48
let ca = s[0].binary()?;
49
let lit = s[1].binary()?;
50
Ok(ca
51
.contains_chunked(lit)?
52
.with_name(ca.name().clone())
53
.into_column())
54
}
55
56
pub(super) fn ends_with(s: &[Column]) -> PolarsResult<Column> {
57
let ca = s[0].binary()?;
58
let suffix = s[1].binary()?;
59
60
Ok(ca
61
.ends_with_chunked(suffix)?
62
.with_name(ca.name().clone())
63
.into_column())
64
}
65
66
pub(super) fn starts_with(s: &[Column]) -> PolarsResult<Column> {
67
let ca = s[0].binary()?;
68
let prefix = s[1].binary()?;
69
70
Ok(ca
71
.starts_with_chunked(prefix)?
72
.with_name(ca.name().clone())
73
.into_column())
74
}
75
76
pub(super) fn size_bytes(s: &Column) -> PolarsResult<Column> {
77
let ca = s.binary()?;
78
Ok(ca.size_bytes().into_column())
79
}
80
81
#[cfg(feature = "binary_encoding")]
82
pub(super) fn hex_decode(s: &Column, strict: bool) -> PolarsResult<Column> {
83
let ca = s.binary()?;
84
ca.hex_decode(strict).map(|ok| ok.into_column())
85
}
86
87
#[cfg(feature = "binary_encoding")]
88
pub(super) fn hex_encode(s: &Column) -> PolarsResult<Column> {
89
let ca = s.binary()?;
90
Ok(ca.hex_encode().into())
91
}
92
93
#[cfg(feature = "binary_encoding")]
94
pub(super) fn base64_decode(s: &Column, strict: bool) -> PolarsResult<Column> {
95
let ca = s.binary()?;
96
ca.base64_decode(strict).map(|ok| ok.into_column())
97
}
98
99
#[cfg(feature = "binary_encoding")]
100
pub(super) fn base64_encode(s: &Column) -> PolarsResult<Column> {
101
let ca = s.binary()?;
102
Ok(ca.base64_encode().into())
103
}
104
105
#[cfg(feature = "binary_encoding")]
106
pub(super) fn reinterpret(
107
s: &Column,
108
dtype: &DataType,
109
is_little_endian: bool,
110
) -> PolarsResult<Column> {
111
let ca = s.binary()?;
112
ca.reinterpret(dtype, is_little_endian)
113
.map(|val| val.into())
114
}
115
116
pub(super) fn bin_slice(s: &mut [Column]) -> PolarsResult<Column> {
117
let ca = s[0].binary()?;
118
Ok(ca
119
.bin_slice(&s[1], &s[2])?
120
.with_name(ca.name().clone())
121
.into_column())
122
}
123
124
pub(super) fn bin_head(s: &mut [Column]) -> PolarsResult<Column> {
125
let ca = s[0].binary()?;
126
Ok(ca
127
.bin_head(&s[1])?
128
.with_name(ca.name().clone())
129
.into_column())
130
}
131
132
pub(super) fn bin_tail(s: &mut [Column]) -> PolarsResult<Column> {
133
let ca = s[0].binary()?;
134
Ok(ca
135
.bin_tail(&s[1])?
136
.with_name(ca.name().clone())
137
.into_column())
138
}
139
140
pub(super) fn bin_get(s: &mut [Column], null_on_oob: bool) -> PolarsResult<Column> {
141
let ca = s[0].binary()?;
142
let index = s[1].cast(&DataType::Int64)?;
143
polars_ops::prelude::bin_get(ca, index.i64()?, null_on_oob)
144
}
145
146