Skip to content

Commit e8e9239

Browse files
committed
test: Added one new tests for HashAgg operator
1 parent 8a62507 commit e8e9239

File tree

3 files changed

+115
-9
lines changed

3 files changed

+115
-9
lines changed

src/execution/executor/dql/aggregate/hash_agg.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,95 @@ impl HashAggExecutor {
9797
}
9898
}
9999
}
100+
}
101+
102+
#[cfg(test)]
103+
mod test {
104+
use std::sync::Arc;
105+
use itertools::Itertools;
106+
use crate::catalog::{ColumnCatalog, ColumnDesc};
107+
use crate::execution::executor::dql::aggregate::hash_agg::HashAggExecutor;
108+
use crate::execution::executor::dql::values::Values;
109+
use crate::execution::executor::{Executor, try_collect};
110+
use crate::execution::executor::dql::test::build_integers;
111+
use crate::execution::ExecutorError;
112+
use crate::expression::agg::AggKind;
113+
use crate::expression::ScalarExpression;
114+
use crate::planner::operator::aggregate::AggregateOperator;
115+
use crate::planner::operator::values::ValuesOperator;
116+
use crate::storage::memory::MemStorage;
117+
use crate::types::LogicalType;
118+
use crate::types::tuple::create_table;
119+
use crate::types::value::DataValue;
120+
121+
122+
#[tokio::test]
123+
async fn test_hash_agg() -> Result<(), ExecutorError> {
124+
let mem_storage = MemStorage::new();
125+
let desc = ColumnDesc::new(LogicalType::Integer, false);
126+
127+
let t1_columns = vec![
128+
Arc::new(ColumnCatalog::new("c1".to_string(), true, desc.clone())),
129+
Arc::new(ColumnCatalog::new("c2".to_string(), true, desc.clone())),
130+
Arc::new(ColumnCatalog::new("c3".to_string(), true, desc.clone())),
131+
];
132+
133+
let operator = AggregateOperator {
134+
groupby_exprs: vec![
135+
ScalarExpression::ColumnRef(t1_columns[0].clone())
136+
],
137+
agg_calls: vec![
138+
ScalarExpression::AggCall {
139+
distinct: false,
140+
kind: AggKind::Sum,
141+
args: vec![
142+
ScalarExpression::ColumnRef(t1_columns[1].clone())
143+
],
144+
ty: LogicalType::Integer,
145+
}
146+
],
147+
};
148+
149+
let input = Values::from(ValuesOperator {
150+
rows: vec![
151+
vec![
152+
Arc::new(DataValue::Int32(Some(0))),
153+
Arc::new(DataValue::Int32(Some(2))),
154+
Arc::new(DataValue::Int32(Some(4))),
155+
],
156+
vec![
157+
Arc::new(DataValue::Int32(Some(1))),
158+
Arc::new(DataValue::Int32(Some(3))),
159+
Arc::new(DataValue::Int32(Some(5))),
160+
],
161+
vec![
162+
Arc::new(DataValue::Int32(Some(0))),
163+
Arc::new(DataValue::Int32(Some(1))),
164+
Arc::new(DataValue::Int32(Some(2))),
165+
],
166+
vec![
167+
Arc::new(DataValue::Int32(Some(1))),
168+
Arc::new(DataValue::Int32(Some(2))),
169+
Arc::new(DataValue::Int32(Some(3))),
170+
]
171+
],
172+
columns: t1_columns,
173+
}).execute(&mem_storage);
174+
175+
let tuples = try_collect(&mut HashAggExecutor::from((operator, input)).execute(&mem_storage)).await?;
176+
177+
println!("hash_agg_test: \n{}", create_table(&tuples));
178+
179+
assert_eq!(tuples.len(), 2);
180+
181+
let vec_values = tuples
182+
.into_iter()
183+
.map(|tuple| tuple.values)
184+
.collect_vec();
185+
186+
assert!(vec_values.contains(&build_integers(vec![Some(3), Some(0)])));
187+
assert!(vec_values.contains(&build_integers(vec![Some(5), Some(1)])));
188+
189+
Ok(())
190+
}
100191
}

src/execution/executor/dql/join/hash_join.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,10 @@ impl HashJoin {
213213
#[cfg(test)]
214214
mod test {
215215
use std::sync::Arc;
216-
use itertools::Itertools;
217216
use crate::catalog::{ColumnCatalog, ColumnDesc};
218217
use crate::execution::executor::{BoxedExecutor, Executor, try_collect};
219218
use crate::execution::executor::dql::join::hash_join::HashJoin;
219+
use crate::execution::executor::dql::test::build_integers;
220220
use crate::execution::executor::dql::values::Values;
221221
use crate::execution::ExecutorError;
222222
use crate::expression::ScalarExpression;
@@ -226,7 +226,7 @@ mod test {
226226
use crate::storage::Storage;
227227
use crate::types::LogicalType;
228228
use crate::types::tuple::create_table;
229-
use crate::types::value::{DataValue, ValueRef};
229+
use crate::types::value::DataValue;
230230

231231
fn build_join_values<S: Storage>(_s: &S) -> (Vec<(ScalarExpression, ScalarExpression)>, BoxedExecutor, BoxedExecutor) {
232232
let desc = ColumnDesc::new(LogicalType::Integer, false);
@@ -299,12 +299,6 @@ mod test {
299299
(on_keys, values_t1.execute(_s), values_t2.execute(_s))
300300
}
301301

302-
fn build_integers(ints: Vec<Option<i32>>) -> Vec<ValueRef> {
303-
ints.into_iter()
304-
.map(|i| Arc::new(DataValue::Int32(i)))
305-
.collect_vec()
306-
}
307-
308302
#[tokio::test]
309303
async fn test_inner_join() -> Result<(), ExecutorError> {
310304
let mem_storage = MemStorage::new();
@@ -319,6 +313,8 @@ mod test {
319313

320314
println!("inner_test: \n{}", create_table(&tuples));
321315

316+
assert_eq!(tuples.len(), 3);
317+
322318
assert_eq!(tuples[0].values, build_integers(vec![Some(0), Some(2), Some(4), Some(0), Some(2), Some(4)]));
323319
assert_eq!(tuples[1].values, build_integers(vec![Some(1), Some(3), Some(5), Some(1), Some(3), Some(5)]));
324320
assert_eq!(tuples[2].values, build_integers(vec![Some(1), Some(3), Some(5), Some(1), Some(1), Some(1)]));
@@ -340,6 +336,8 @@ mod test {
340336

341337
println!("left_test: \n{}", create_table(&tuples));
342338

339+
assert_eq!(tuples.len(), 4);
340+
343341
assert_eq!(tuples[0].values, build_integers(vec![Some(0), Some(2), Some(4), Some(0), Some(2), Some(4)]));
344342
assert_eq!(tuples[1].values, build_integers(vec![Some(1), Some(3), Some(5), Some(1), Some(3), Some(5)]));
345343
assert_eq!(tuples[2].values, build_integers(vec![Some(1), Some(3), Some(5), Some(1), Some(1), Some(1)]));
@@ -362,6 +360,8 @@ mod test {
362360

363361
println!("right_test: \n{}", create_table(&tuples));
364362

363+
assert_eq!(tuples.len(), 4);
364+
365365
assert_eq!(tuples[0].values, build_integers(vec![Some(0), Some(2), Some(4), Some(0), Some(2), Some(4)]));
366366
assert_eq!(tuples[1].values, build_integers(vec![Some(1), Some(3), Some(5), Some(1), Some(3), Some(5)]));
367367
assert_eq!(tuples[2].values, build_integers(vec![None, None, None, Some(4), Some(6), Some(8)]));
@@ -384,6 +384,8 @@ mod test {
384384

385385
println!("full_test: \n{}", create_table(&tuples));
386386

387+
assert_eq!(tuples.len(), 5);
388+
387389
assert_eq!(tuples[0].values, build_integers(vec![Some(0), Some(2), Some(4), Some(0), Some(2), Some(4)]));
388390
assert_eq!(tuples[1].values, build_integers(vec![Some(1), Some(3), Some(5), Some(1), Some(3), Some(5)]));
389391
assert_eq!(tuples[2].values, build_integers(vec![None, None, None, Some(4), Some(6), Some(8)]));

src/execution/executor/dql/mod.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,17 @@ pub(crate) mod sort;
66
pub(crate) mod limit;
77
pub(crate) mod join;
88
pub(crate) mod dummy;
9-
pub(crate) mod aggregate;
9+
pub(crate) mod aggregate;
10+
11+
#[cfg(test)]
12+
pub(crate) mod test {
13+
use std::sync::Arc;
14+
use itertools::Itertools;
15+
use crate::types::value::{DataValue, ValueRef};
16+
17+
pub(crate) fn build_integers(ints: Vec<Option<i32>>) -> Vec<ValueRef> {
18+
ints.into_iter()
19+
.map(|i| Arc::new(DataValue::Int32(i)))
20+
.collect_vec()
21+
}
22+
}

0 commit comments

Comments
 (0)