Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-sql/tests/issues.rs
6939 views
1
use polars_core::prelude::*;
2
use polars_lazy::prelude::*;
3
use polars_sql::*;
4
use polars_utils::plpath::PlPath;
5
6
#[test]
7
#[cfg(feature = "csv")]
8
fn iss_7437() -> PolarsResult<()> {
9
let mut context = SQLContext::new();
10
let sql = r#"
11
CREATE TABLE foods AS
12
SELECT *
13
FROM read_csv('../../examples/datasets/foods1.csv')"#;
14
context.execute(sql)?.collect()?;
15
16
let df_sql = context
17
.execute(
18
r#"
19
SELECT "category" as category
20
FROM foods
21
GROUP BY "category"
22
"#,
23
)?
24
.collect()?
25
.sort(["category"], SortMultipleOptions::default())?;
26
27
let expected = LazyCsvReader::new(PlPath::new("../../examples/datasets/foods1.csv"))
28
.finish()?
29
.group_by(vec![col("category").alias("category")])
30
.agg(vec![])
31
.collect()?
32
.sort(["category"], Default::default())?;
33
34
assert!(df_sql.equals(&expected));
35
Ok(())
36
}
37
38
#[test]
39
#[cfg(feature = "csv")]
40
fn iss_7436() {
41
let mut context = SQLContext::new();
42
let sql = r#"
43
CREATE TABLE foods AS
44
SELECT *
45
FROM read_csv('../../examples/datasets/foods1.csv')"#;
46
context.execute(sql).unwrap().collect().unwrap();
47
let df_sql = context
48
.execute(
49
r#"
50
SELECT
51
"fats_g" AS fats,
52
AVG(calories) OVER (PARTITION BY "category") AS avg_calories_by_category
53
FROM foods
54
LIMIT 5
55
"#,
56
)
57
.unwrap()
58
.collect()
59
.unwrap();
60
let expected = LazyCsvReader::new(PlPath::new("../../examples/datasets/foods1.csv"))
61
.finish()
62
.unwrap()
63
.select(&[
64
col("fats_g").alias("fats"),
65
col("calories")
66
.mean()
67
.over(vec![col("category")])
68
.alias("avg_calories_by_category"),
69
])
70
.limit(5)
71
.collect()
72
.unwrap();
73
assert!(df_sql.equals(&expected));
74
}
75
76
#[test]
77
fn iss_7440() {
78
let df = df! {
79
"a" => [2.0, -2.5]
80
}
81
.unwrap()
82
.lazy();
83
let sql = r#"SELECT a, FLOOR(a) AS floor, CEIL(a) AS ceil FROM df"#;
84
let mut context = SQLContext::new();
85
context.register("df", df.clone());
86
87
let df_sql = context.execute(sql).unwrap().collect().unwrap();
88
89
let df_pl = df
90
.select(&[
91
col("a"),
92
col("a").floor().alias("floor"),
93
col("a").ceil().alias("ceil"),
94
])
95
.collect()
96
.unwrap();
97
assert!(df_sql.equals_missing(&df_pl));
98
}
99
100
#[test]
101
#[cfg(feature = "csv")]
102
fn iss_8395() -> PolarsResult<()> {
103
let mut context = SQLContext::new();
104
let sql = r#"
105
with foods as (
106
SELECT *
107
FROM read_csv('../../examples/datasets/foods1.csv')
108
)
109
select * from foods where category IN ('vegetables', 'seafood')"#;
110
let res = context.execute(sql)?;
111
let df = res.collect()?;
112
113
// assert that the df only contains [vegetables, seafood]
114
let s = df.column("category")?.unique()?.sort(Default::default())?;
115
let expected = Column::new("category".into(), &["seafood", "vegetables"]);
116
assert!(s.equals(&expected));
117
Ok(())
118
}
119
120
#[test]
121
fn iss_8419() {
122
let df = df! {
123
"Year"=> [2018, 2018, 2019, 2019, 2020, 2020],
124
"Country"=> ["US", "UK", "US", "UK", "US", "UK"],
125
"Sales"=> [1000, 2000, 3000, 4000, 5000, 6000]
126
}
127
.unwrap()
128
.lazy();
129
let expected = df
130
.clone()
131
.select(&[
132
col("Year"),
133
col("Country"),
134
col("Sales"),
135
col("Sales")
136
.sort(SortOptions::default().with_order_descending(true))
137
.cum_sum(false)
138
.alias("SalesCumulative"),
139
])
140
.sort(["SalesCumulative"], Default::default())
141
.collect()
142
.unwrap();
143
let mut ctx = SQLContext::new();
144
ctx.register("df", df);
145
146
let query = r#"
147
SELECT
148
Year,
149
Country,
150
Sales,
151
SUM(Sales) OVER (ORDER BY Sales DESC) as SalesCumulative
152
FROM
153
df
154
ORDER BY
155
SalesCumulative
156
"#;
157
let df = ctx.execute(query).unwrap().collect().unwrap();
158
159
assert!(df.equals(&expected))
160
}
161
162
#[test]
163
fn iss_23134() -> PolarsResult<()> {
164
// Reproduce issue: https://github.com/pola-rs/polars/issues/23134
165
// Applying function to a column of group_by results in a list
166
167
// Create test data
168
let df = df! {
169
"a" => ["a", "a", "b"],
170
"b" => [1, 1, 2]
171
}?;
172
173
let mut ctx = SQLContext::new();
174
ctx.register("test", df.lazy());
175
176
let result1 = ctx
177
.execute("SELECT a, b FROM test GROUP BY a, b")?
178
.collect()?;
179
180
// This should return 2 rows with distinct (a, b) pairs
181
assert_eq!(result1.height(), 2);
182
183
let result2 = ctx
184
.execute("SELECT CONCAT(a, ' kek') as c, b FROM test GROUP BY a, b")?
185
.collect()?;
186
187
// Check the result structure
188
let c_column = result2.column("c")?;
189
190
// BUG: Currently returns List[String] instead of String
191
// The issue is that it returns ["a kek", "a kek"] and ["b kek"] instead of "a kek" and "b kek"
192
assert_eq!(c_column.dtype(), &DataType::String);
193
194
let result3 = ctx
195
.execute("SELECT CONCAT(a, ' kek'), b FROM test GROUP BY a, b")?
196
.collect()?;
197
198
// Check the result structure
199
let columns: Vec<String> = result3
200
.get_column_names()
201
.into_iter()
202
.map(|s| s.to_string())
203
.collect();
204
// a and b
205
assert_eq!(columns, vec!["a", "b"]);
206
207
Ok(())
208
}
209
210