Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-sql/tests/functions_string.rs
6939 views
1
use polars_core::prelude::*;
2
use polars_lazy::prelude::*;
3
use polars_sql::*;
4
5
#[test]
6
fn test_string_functions() {
7
let df = df! {
8
"a" => &["foo", "xxxbarxxx", "---bazyyy"]
9
}
10
.unwrap();
11
let mut context = SQLContext::new();
12
context.register("df", df.clone().lazy());
13
let sql = r#"
14
SELECT
15
a,
16
lower('LITERAL') as lower_literal,
17
lower(a) as lower_a,
18
lower("a") as lower_a2,
19
lower(df.a) as lower_a_df,
20
lower("df".a) as lower_a_df2,
21
lower("df"."a") as lower_a_df3,
22
upper(a) as upper_a,
23
upper(df.a) as upper_a_df,
24
upper("df".a) as upper_a_df2,
25
upper("df"."a") as upper_a_df3,
26
trim(both 'x' from a) as trim_a,
27
trim(leading 'x' from a) as trim_a_leading,
28
trim(trailing 'x' from a) as trim_a_trailing,
29
ltrim(a) as ltrim_a,
30
rtrim(a) as rtrim_a,
31
ltrim(a, '-') as ltrim_a_dash,
32
rtrim(a, '-') as rtrim_a_dash,
33
ltrim(a, 'xyz') as ltrim_a_xyz,
34
rtrim(a, 'xyz') as rtrim_a_xyz
35
FROM df"#;
36
let df_sql = context.execute(sql).unwrap().collect().unwrap();
37
let df_pl = df
38
.lazy()
39
.select(&[
40
col("a"),
41
lit("LITERAL").str().to_lowercase().alias("lower_literal"),
42
col("a").str().to_lowercase().alias("lower_a"),
43
col("a").str().to_lowercase().alias("lower_a2"),
44
col("a").str().to_lowercase().alias("lower_a_df"),
45
col("a").str().to_lowercase().alias("lower_a_df2"),
46
col("a").str().to_lowercase().alias("lower_a_df3"),
47
col("a").str().to_uppercase().alias("upper_a"),
48
col("a").str().to_uppercase().alias("upper_a_df"),
49
col("a").str().to_uppercase().alias("upper_a_df2"),
50
col("a").str().to_uppercase().alias("upper_a_df3"),
51
col("a").str().strip_chars(lit("x")).alias("trim_a"),
52
col("a")
53
.str()
54
.strip_chars_start(lit("x"))
55
.alias("trim_a_leading"),
56
col("a")
57
.str()
58
.strip_chars_end(lit("x"))
59
.alias("trim_a_trailing"),
60
col("a")
61
.str()
62
.strip_chars_start(lit(LiteralValue::untyped_null()))
63
.alias("ltrim_a"),
64
col("a")
65
.str()
66
.strip_chars_end(lit(LiteralValue::untyped_null()))
67
.alias("rtrim_a"),
68
col("a")
69
.str()
70
.strip_chars_start(lit("-"))
71
.alias("ltrim_a_dash"),
72
col("a")
73
.str()
74
.strip_chars_end(lit("-"))
75
.alias("rtrim_a_dash"),
76
col("a")
77
.str()
78
.strip_chars_start(lit("xyz"))
79
.alias("ltrim_a_xyz"),
80
col("a")
81
.str()
82
.strip_chars_end(lit("xyz"))
83
.alias("rtrim_a_xyz"),
84
])
85
.collect()
86
.unwrap();
87
assert!(df_sql.equals_missing(&df_pl));
88
}
89
90
#[test]
91
fn test_array_to_string() {
92
let df = df! {
93
"a" => &["first", "first", "third"],
94
"b" => &[1, 1, 42],
95
}
96
.unwrap();
97
98
let mut context = SQLContext::new();
99
context.register("df", df.lazy());
100
101
let sql = r#"
102
SELECT b, ARRAY_TO_STRING("a",', ') AS a2s,
103
FROM (
104
SELECT b, ARRAY_AGG(a) AS "a"
105
FROM df
106
GROUP BY b
107
) tbl
108
ORDER BY a2s"#;
109
let df_sql = context.execute(sql).unwrap().collect().unwrap();
110
let df_expected = df! {
111
"b" => &[1, 42],
112
"a2s" => &["first, first", "third"],
113
}
114
.unwrap();
115
assert!(df_sql.equals(&df_expected));
116
}
117
118
#[test]
119
fn test_array_literal() {
120
let mut context = SQLContext::new();
121
context.register("df", DataFrame::empty().lazy());
122
123
let sql = "SELECT [100,200,300] AS arr FROM df";
124
let df_sql = context.execute(sql).unwrap().collect().unwrap();
125
let df_expected = df! {
126
"arr" => &[100i64, 200, 300],
127
}
128
.unwrap()
129
.lazy()
130
.select(&[col("arr").implode()])
131
.collect()
132
.unwrap();
133
134
assert!(df_sql.equals(&df_expected));
135
assert!(df_sql.height() == 1);
136
}
137
138