This is an automated email from the ASF dual-hosted git repository.
agrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new d47a40e ARROW-5680: [Rust] [DataFusion] GROUP BY sql tests are now
deterministic
d47a40e is described below
commit d47a40e88292840b9c73bec59af1828b273445e8
Author: Andy Grove <[email protected]>
AuthorDate: Sat Oct 12 10:37:11 2019 -0600
ARROW-5680: [Rust] [DataFusion] GROUP BY sql tests are now deterministic
DataFusion doesn't support `ORDER BY` yet, so I modified the aggregate
tests to collect `Vec<String>` and sort it before comparing against expected
results, making these tests deterministic.
The PR is a little noisy because I removed the final `\n` from the expected
results in most of the tests due to the new approach of collecting
`Vec<String>` and then performing a `.join("\n")` to create the string.
Closes #5622 from andygrove/ARROW-5680 and squashes the following commits:
a3083c6cb <Andy Grove> GROUP BY sql tests are now deterministic
Authored-by: Andy Grove <[email protected]>
Signed-off-by: Andy Grove <[email protected]>
---
rust/datafusion/tests/sql.rs | 141 +++++++++++++++----------------------------
1 file changed, 47 insertions(+), 94 deletions(-)
diff --git a/rust/datafusion/tests/sql.rs b/rust/datafusion/tests/sql.rs
index bb60603..b9741ce 100644
--- a/rust/datafusion/tests/sql.rs
+++ b/rust/datafusion/tests/sql.rs
@@ -87,8 +87,10 @@ fn parquet_query() {
let mut ctx = ExecutionContext::new();
register_alltypes_parquet(&mut ctx);
let sql = "SELECT id, string_col FROM alltypes_plain";
- let actual = execute(&mut ctx, sql);
- let expected =
"4\t\"0\"\n5\t\"1\"\n6\t\"0\"\n7\t\"1\"\n2\t\"0\"\n3\t\"1\"\n0\t\"0\"\n1\t\"1\"\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
+
"4\t\"0\"\n5\t\"1\"\n6\t\"0\"\n7\t\"1\"\n2\t\"0\"\n3\t\"1\"\n0\t\"0\"\n1\t\"1\""
+ .to_string();
assert_eq!(expected, actual);
}
@@ -114,8 +116,8 @@ fn csv_count_star() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT COUNT(*), COUNT(1), COUNT(c1) FROM aggregate_test_100";
- let actual = execute(&mut ctx, sql);
- let expected = "100\t100\t100\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected = "100\t100\t100".to_string();
assert_eq!(expected, actual);
}
@@ -124,8 +126,8 @@ fn csv_query_with_predicate() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT c1, c12 FROM aggregate_test_100 WHERE c12 > 0.376 AND
c12 < 0.4";
- let actual = execute(&mut ctx, sql);
- let expected =
"\"e\"\t0.39144436569161134\n\"d\"\t0.38870280983958583\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
"\"e\"\t0.39144436569161134\n\"d\"\t0.38870280983958583".to_string();
assert_eq!(expected, actual);
}
@@ -133,40 +135,39 @@ fn csv_query_with_predicate() {
fn csv_query_group_by_int_min_max() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
- //TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT c2, MIN(c12), MAX(c12) FROM aggregate_test_100 GROUP BY
c2";
- let actual = execute(&mut ctx, sql);
- let expected =
"4\t0.02182578039211991\t0.9237877978193884\n5\t0.01479305307777301\t0.9723580396501548\n2\t0.16301110515739792\t0.991517828651004\n3\t0.047343434291126085\t0.9293883502480845\n1\t0.05636955101974106\t0.9965400387585364\n".to_string();
- assert_eq!(expected, actual);
+ let mut actual = execute(&mut ctx, sql);
+ actual.sort();
+ let expected =
"1\t0.05636955101974106\t0.9965400387585364\n2\t0.16301110515739792\t0.991517828651004\n3\t0.047343434291126085\t0.9293883502480845\n4\t0.02182578039211991\t0.9237877978193884\n5\t0.01479305307777301\t0.9723580396501548".to_string();
+ assert_eq!(expected, actual.join("\n"));
}
#[test]
fn csv_query_avg() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
- //TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT avg(c12) FROM aggregate_test_100";
- let actual = execute(&mut ctx, sql);
- let expected = "0.5089725099127211\n".to_string();
- assert_eq!(expected, actual);
+ let mut actual = execute(&mut ctx, sql);
+ actual.sort();
+ let expected = "0.5089725099127211".to_string();
+ assert_eq!(expected, actual.join("\n"));
}
#[test]
fn csv_query_group_by_avg() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
- //TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT c1, avg(c12) FROM aggregate_test_100 GROUP BY c1";
- let actual = execute(&mut ctx, sql);
- let expected =
"\"a\"\t0.48754517466109415\n\"e\"\t0.48600669271341534\n\"d\"\t0.48855379387549824\n\"c\"\t0.6600456536439784\n\"b\"\t0.41040709263815384\n".to_string();
- assert_eq!(expected, actual);
+ let mut actual = execute(&mut ctx, sql);
+ actual.sort();
+ let expected =
"\"a\"\t0.48754517466109415\n\"b\"\t0.41040709263815384\n\"c\"\t0.6600456536439784\n\"d\"\t0.48855379387549824\n\"e\"\t0.48600669271341534".to_string();
+ assert_eq!(expected, actual.join("\n"));
}
#[test]
fn csv_query_avg_multi_batch() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
- //TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT avg(c12) FROM aggregate_test_100";
let plan = ctx.create_logical_plan(&sql).unwrap();
let plan = ctx.optimize(&plan).unwrap();
@@ -182,49 +183,14 @@ fn csv_query_avg_multi_batch() {
assert!((expected - actual).abs() < 0.01);
}
-//#[test]
-//fn csv_query_group_by_avg_multi_batch() {
-// let mut ctx = ExecutionContext::new();
-// register_aggregate_csv(&mut ctx);
-// //TODO add ORDER BY once supported, to make this test determistic
-// let sql = "SELECT c1, avg(c12) FROM aggregate_test_100 GROUP BY c1";
-// let plan = ctx.create_logical_plan(&sql).unwrap();
-// let results = ctx.execute(&plan, 4).unwrap();
-// let mut relation = results.borrow_mut();
-// let mut actual_vec = Vec::new();
-// while let Some(batch) = relation.next().unwrap() {
-// let column = batch.column(1);
-// let array = column.as_any().downcast_ref::<Float64Array>().unwrap();
-//
-// for row_index in 0..batch.num_rows() {
-// actual_vec.push(array.value(row_index));
-// }
-// }
-//
-// let expect_vec = vec![0.41040709, 0.48754517, 0.48855379, 0.66004565];
-//
-// actual_vec.sort_by(|a, b| a.partial_cmp(b).unwrap());
-//
-// println!("actual : {:?}", actual_vec);
-// println!("expected: {:?}", expect_vec);
-//
-// actual_vec
-// .iter()
-// .zip(expect_vec.iter())
-// .for_each(|(actual, expect)| {
-// // Due to float number's accuracy, different batch size will
lead to
-// different answers. assert!((expect - actual).abs() < 0.01);
-// });
-//}
-
#[test]
fn csv_query_count() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
//TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT count(c12) FROM aggregate_test_100";
- let actual = execute(&mut ctx, sql);
- let expected = "100\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected = "100".to_string();
assert_eq!(expected, actual);
}
@@ -234,8 +200,8 @@ fn csv_query_group_by_int_count() {
register_aggregate_csv(&mut ctx);
//TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT count(c12) FROM aggregate_test_100 GROUP BY c1";
- let actual = execute(&mut ctx, sql);
- let expected =
"\"a\"\t21\n\"e\"\t21\n\"d\"\t18\n\"c\"\t21\n\"b\"\t19\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
"\"a\"\t21\n\"e\"\t21\n\"d\"\t18\n\"c\"\t21\n\"b\"\t19".to_string();
assert_eq!(expected, actual);
}
@@ -245,9 +211,9 @@ fn csv_query_group_by_string_min_max() {
register_aggregate_csv(&mut ctx);
//TODO add ORDER BY once supported, to make this test determistic
let sql = "SELECT c2, MIN(c12), MAX(c12) FROM aggregate_test_100 GROUP BY
c1";
- let actual = execute(&mut ctx, sql);
+ let actual = execute(&mut ctx, sql).join("\n");
let expected =
-
"\"a\"\t0.02182578039211991\t0.9800193410444061\n\"e\"\t0.01479305307777301\t0.9965400387585364\n\"d\"\t0.061029375346466685\t0.9748360509016578\n\"c\"\t0.0494924465469434\t0.991517828651004\n\"b\"\t0.04893135681998029\t0.9185813970744787\n".to_string();
+
"\"a\"\t0.02182578039211991\t0.9800193410444061\n\"e\"\t0.01479305307777301\t0.9965400387585364\n\"d\"\t0.061029375346466685\t0.9748360509016578\n\"c\"\t0.0494924465469434\t0.991517828651004\n\"b\"\t0.04893135681998029\t0.9185813970744787".to_string();
assert_eq!(expected, actual);
}
@@ -256,8 +222,8 @@ fn csv_query_cast() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT CAST(c12 AS float) FROM aggregate_test_100 WHERE c12 >
0.376 AND c12 < 0.4";
- let actual = execute(&mut ctx, sql);
- let expected = "0.39144436569161134\n0.38870280983958583\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected = "0.39144436569161134\n0.38870280983958583".to_string();
assert_eq!(expected, actual);
}
@@ -266,8 +232,8 @@ fn csv_query_cast_literal() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT c12, CAST(1 AS float) FROM aggregate_test_100 WHERE c12
> CAST(0 AS float) LIMIT 2";
- let actual = execute(&mut ctx, sql);
- let expected =
"0.9294097332465232\t1.0\n0.3114712539863804\t1.0\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
"0.9294097332465232\t1.0\n0.3114712539863804\t1.0".to_string();
assert_eq!(expected, actual);
}
@@ -276,8 +242,8 @@ fn csv_query_limit() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT 0 FROM aggregate_test_100 LIMIT 2";
- let actual = execute(&mut ctx, sql);
- let expected = "0\n0\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected = "0\n0".to_string();
assert_eq!(expected, actual);
}
@@ -286,8 +252,8 @@ fn csv_query_limit_bigger_than_nbr_of_rows() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT c2 FROM aggregate_test_100 LIMIT 200";
- let actual = execute(&mut ctx, sql);
- let expected =
"2\n5\n1\n1\n5\n4\n3\n3\n1\n4\n1\n4\n3\n2\n1\n1\n2\n1\n3\n2\n4\n1\n5\n4\n2\n1\n4\n5\n2\n3\n4\n2\n1\n5\n3\n1\n2\n3\n3\n3\n2\n4\n1\n3\n2\n5\n2\n1\n4\n1\n4\n2\n5\n4\n2\n3\n4\n4\n4\n5\n4\n2\n1\n2\n4\n2\n3\n5\n1\n1\n4\n2\n1\n2\n1\n1\n5\n4\n5\n2\n3\n2\n4\n1\n3\n4\n3\n2\n5\n3\n3\n2\n5\n5\n4\n1\n3\n3\n4\n4\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
"2\n5\n1\n1\n5\n4\n3\n3\n1\n4\n1\n4\n3\n2\n1\n1\n2\n1\n3\n2\n4\n1\n5\n4\n2\n1\n4\n5\n2\n3\n4\n2\n1\n5\n3\n1\n2\n3\n3\n3\n2\n4\n1\n3\n2\n5\n2\n1\n4\n1\n4\n2\n5\n4\n2\n3\n4\n4\n4\n5\n4\n2\n1\n2\n4\n2\n3\n5\n1\n1\n4\n2\n1\n2\n1\n1\n5\n4\n5\n2\n3\n2\n4\n1\n3\n4\n3\n2\n5\n3\n3\n2\n5\n5\n4\n1\n3\n3\n4\n4".to_string();
assert_eq!(expected, actual);
}
@@ -296,8 +262,8 @@ fn csv_query_limit_with_same_nbr_of_rows() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT c2 FROM aggregate_test_100 LIMIT 100";
- let actual = execute(&mut ctx, sql);
- let expected =
"2\n5\n1\n1\n5\n4\n3\n3\n1\n4\n1\n4\n3\n2\n1\n1\n2\n1\n3\n2\n4\n1\n5\n4\n2\n1\n4\n5\n2\n3\n4\n2\n1\n5\n3\n1\n2\n3\n3\n3\n2\n4\n1\n3\n2\n5\n2\n1\n4\n1\n4\n2\n5\n4\n2\n3\n4\n4\n4\n5\n4\n2\n1\n2\n4\n2\n3\n5\n1\n1\n4\n2\n1\n2\n1\n1\n5\n4\n5\n2\n3\n2\n4\n1\n3\n4\n3\n2\n5\n3\n3\n2\n5\n5\n4\n1\n3\n3\n4\n4\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
"2\n5\n1\n1\n5\n4\n3\n3\n1\n4\n1\n4\n3\n2\n1\n1\n2\n1\n3\n2\n4\n1\n5\n4\n2\n1\n4\n5\n2\n3\n4\n2\n1\n5\n3\n1\n2\n3\n3\n3\n2\n4\n1\n3\n2\n5\n2\n1\n4\n1\n4\n2\n5\n4\n2\n3\n4\n4\n4\n5\n4\n2\n1\n2\n4\n2\n3\n5\n1\n1\n4\n2\n1\n2\n1\n1\n5\n4\n5\n2\n3\n2\n4\n1\n3\n4\n3\n2\n5\n3\n3\n2\n5\n5\n4\n1\n3\n3\n4\n4".to_string();
assert_eq!(expected, actual);
}
@@ -306,7 +272,7 @@ fn csv_query_limit_zero() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv(&mut ctx);
let sql = "SELECT 0 FROM aggregate_test_100 LIMIT 0";
- let actual = execute(&mut ctx, sql);
+ let actual = execute(&mut ctx, sql).join("\n");
let expected = "".to_string();
assert_eq!(expected, actual);
}
@@ -316,8 +282,8 @@ fn csv_query_create_external_table() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv_by_sql(&mut ctx);
let sql = "SELECT c1, c2, c3, c4, c5, c6, c7, c8, c9, 10, c11, c12, c13
FROM aggregate_test_100 LIMIT 1";
- let actual = execute(&mut ctx, sql);
- let expected =
"\"c\"\t2\t1\t18109\t2033001162\t-6513304855495910254\t25\t43062\t1491205016\t10\t0.110830784\t0.9294097332465232\t\"6WfVFBVGJSQb7FhA7E0lBwdvjfZnSW\"\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected =
"\"c\"\t2\t1\t18109\t2033001162\t-6513304855495910254\t25\t43062\t1491205016\t10\t0.110830784\t0.9294097332465232\t\"6WfVFBVGJSQb7FhA7E0lBwdvjfZnSW\"".to_string();
assert_eq!(expected, actual);
}
@@ -326,24 +292,10 @@ fn csv_query_external_table_count() {
let mut ctx = ExecutionContext::new();
register_aggregate_csv_by_sql(&mut ctx);
let sql = "SELECT COUNT(c12) FROM aggregate_test_100";
- let actual = execute(&mut ctx, sql);
- let expected = "100\n".to_string();
- assert_eq!(expected, actual);
-}
-
-//TODO Uncomment the following test when ORDER BY is implemented to be able to
test ORDER
-// BY + LIMIT
-/*
-#[test]
-fn csv_query_limit_with_order_by() {
- let mut ctx = ExecutionContext::new();
- register_aggregate_csv(&mut ctx);
- let sql = "SELECT c7 FROM aggregate_test_100 ORDER BY c7 ASC LIMIT 2";
- let actual = execute(&mut ctx, sql);
- let expected = "0\n2\n".to_string();
+ let actual = execute(&mut ctx, sql).join("\n");
+ let expected = "100".to_string();
assert_eq!(expected, actual);
}
-*/
fn aggr_test_schema() -> Arc<Schema> {
Arc::new(Schema::new(vec![
@@ -427,7 +379,7 @@ fn register_alltypes_parquet(ctx: &mut ExecutionContext) {
}
/// Execute query and return result set as tab delimited string
-fn execute(ctx: &mut ExecutionContext, sql: &str) -> String {
+fn execute(ctx: &mut ExecutionContext, sql: &str) -> Vec<String> {
let plan = ctx.create_logical_plan(&sql).unwrap();
let plan = ctx.optimize(&plan).unwrap();
let plan = ctx.create_physical_plan(&plan, DEFAULT_BATCH_SIZE).unwrap();
@@ -435,10 +387,11 @@ fn execute(ctx: &mut ExecutionContext, sql: &str) ->
String {
result_str(&results)
}
-fn result_str(results: &Vec<RecordBatch>) -> String {
- let mut str = String::new();
+fn result_str(results: &Vec<RecordBatch>) -> Vec<String> {
+ let mut result = vec![];
for batch in results {
for row_index in 0..batch.num_rows() {
+ let mut str = String::new();
for column_index in 0..batch.num_columns() {
if column_index > 0 {
str.push_str("\t");
@@ -502,8 +455,8 @@ fn result_str(results: &Vec<RecordBatch>) -> String {
_ => str.push_str("???"),
}
}
- str.push_str("\n");
+ result.push(str);
}
}
- str
+ result
}