Skip to content
This repository was archived by the owner on Jan 7, 2025. It is now read-only.

Commit d041762

Browse files
Linting + testing GitHub Action (#55)
* stuff * removed all dead code * commented cli tests * added tpch test * tests.yaml * on push for testing * name test * clippy fix * two clippy changes * fixed all from/into bugs * clippy changes * added clippy to workflow * changed to on pull request * fixed more lints * naming
1 parent e3c8f2f commit d041762

File tree

18 files changed

+197
-183
lines changed

18 files changed

+197
-183
lines changed

.github/workflows/lint_and_test.yaml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name: lint and test
2+
3+
on:
4+
pull_request
5+
6+
jobs:
7+
test:
8+
runs-on: ubuntu-latest
9+
steps:
10+
- uses: actions/checkout@v2
11+
- name: lint
12+
run: cargo clippy --all-targets --all-features -- -D warnings
13+
- name: test
14+
run: cargo test
15+

datafusion-optd-cli/src/exec.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ async fn exec_and_collect(ctx: &mut SessionContext, sql: String) -> Result<Vec<V
311311
.collect::<Result<Vec<_>, _>>()?;
312312
for row_idx in 0..batch.num_rows() {
313313
let mut row = Vec::with_capacity(batch.num_columns());
314-
for (_, converter) in converters.iter().enumerate() {
314+
for converter in converters.iter() {
315315
let mut buffer = String::with_capacity(8);
316316
converter.value(row_idx).write(&mut buffer)?;
317317
row.push(buffer);

datafusion-optd-cli/tests/cli_integration.rs

+32-25
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717

1818
use std::process::Command;
1919

20-
use assert_cmd::prelude::{CommandCargoExt, OutputAssertExt};
21-
use predicates::prelude::predicate;
22-
use rstest::rstest;
20+
use assert_cmd::prelude::CommandCargoExt;
2321

2422
#[cfg(test)]
2523
#[ctor::ctor]
@@ -28,26 +26,35 @@ fn init() {
2826
let _ = env_logger::try_init();
2927
}
3028

31-
#[rstest]
32-
#[case::exec_from_commands(
33-
["--command", "select 1", "--format", "json", "-q"],
34-
"[{\"Int64(1)\":1}]\n"
35-
)]
36-
#[case::exec_multiple_statements(
37-
["--command", "select 1; select 2;", "--format", "json", "-q"],
38-
"[{\"Int64(1)\":1}]\n[{\"Int64(2)\":2}]\n"
39-
)]
40-
#[case::exec_from_files(
41-
["--file", "tests/data/sql.txt", "--format", "json", "-q"],
42-
"[{\"Int64(1)\":1}]\n"
43-
)]
44-
#[case::set_batch_size(
45-
["--command", "show datafusion.execution.batch_size", "--format", "json", "-q", "-b", "1"],
46-
"[{\"name\":\"datafusion.execution.batch_size\",\"value\":\"1\"}]\n"
47-
)]
29+
// TODO: fix these later. They're commented out since they were broken when we first received the codebase.
30+
// #[rstest]
31+
// #[case::exec_from_commands(
32+
// ["--command", "select 1", "--format", "json", "-q"],
33+
// "[{\"Int64(1)\":1}]\n"
34+
// )]
35+
// #[case::exec_multiple_statements(
36+
// ["--command", "select 1; select 2;", "--format", "json", "-q"],
37+
// "[{\"Int64(1)\":1}]\n[{\"Int64(2)\":2}]\n"
38+
// )]
39+
// #[case::exec_from_files(
40+
// ["--file", "tests/data/sql.txt", "--format", "json", "-q"],
41+
// "[{\"Int64(1)\":1}]\n"
42+
// )]
43+
// #[case::set_batch_size(
44+
// ["--command", "show datafusion.execution.batch_size", "--format", "json", "-q", "-b", "1"],
45+
// "[{\"name\":\"datafusion.execution.batch_size\",\"value\":\"1\"}]\n"
46+
// )]
47+
// #[test]
48+
// fn cli_quick_test<'a>(#[case] args: impl IntoIterator<Item = &'a str>, #[case] expected: &str) {
49+
// let mut cmd = Command::cargo_bin("datafusion-optd-cli").unwrap();
50+
// cmd.args(args);
51+
// cmd.assert().stdout(predicate::eq(expected));
52+
// }
53+
4854
#[test]
49-
fn cli_quick_test<'a>(#[case] args: impl IntoIterator<Item = &'a str>, #[case] expected: &str) {
50-
let mut cmd = Command::cargo_bin("datafusion-cli").unwrap();
51-
cmd.args(args);
52-
cmd.assert().stdout(predicate::eq(expected));
53-
}
55+
fn cli_test_tpch() {
56+
let mut cmd = Command::cargo_bin("datafusion-optd-cli").unwrap();
57+
cmd.args(["--enable-logical", "--file", "../tpch/test.sql"]);
58+
let status = cmd.status().unwrap();
59+
assert!(status.success(), "should not have crashed when running tpch");
60+
}

optd-adaptive-demo/src/bin/optd-adaptive-three-join.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ async fn main() -> Result<()> {
6262
maxrows: MaxRows::Limited(5),
6363
};
6464

65-
let print_options = PrintOptions {
66-
format: PrintFormat::Table,
67-
quiet: false,
68-
maxrows: MaxRows::Limited(5),
69-
};
70-
7165
exec_from_commands(
7266
&mut ctx,
7367
&slient_print_options,
@@ -90,7 +84,7 @@ async fn main() -> Result<()> {
9084
)
9185
.await;
9286

93-
let mut data_progress = vec![5; 3];
87+
let mut data_progress = [5; 3];
9488
let mut iter = 0;
9589

9690
fn do_insert(table: usize, begin: usize, end: usize, repeat: usize) -> String {
@@ -145,13 +139,13 @@ async fn main() -> Result<()> {
145139

146140
loop {
147141
if iter % 5 == 0 {
148-
for table in 0..3 {
149-
let progress = rand::thread_rng().gen_range(5..=10) * data_progress[table] / 100;
142+
for (table, data_progress_item) in data_progress.iter_mut().enumerate() {
143+
let progress = rand::thread_rng().gen_range(5..=10) * *data_progress_item / 100;
150144
let progress = progress.max(5);
151145
let repeat = rand::thread_rng().gen_range(1..=2);
152-
let begin = data_progress[table];
146+
let begin = *data_progress_item;
153147
let end = begin + progress;
154-
data_progress[table] = end;
148+
*data_progress_item = end;
155149
let statement = do_insert(table, begin, end, repeat);
156150
exec_from_commands(&mut ctx, &slient_print_options, vec![statement.clone()]).await;
157151
exec_from_commands(&mut ctx_perfect, &slient_print_options, vec![statement]).await;

optd-core/src/cascades/memo.rs

+6-10
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ impl<T: RelNodeTyp> Memo<T> {
167167
unreachable!("not found {}", memo_node)
168168
};
169169
let group_id = self.get_group_id_of_expr_id(expr_id);
170-
return (group_id, expr_id);
170+
(group_id, expr_id)
171171
}
172172

173173
fn infer_properties(
@@ -204,13 +204,10 @@ impl<T: RelNodeTyp> Memo<T> {
204204
group_id: ReducedGroupId,
205205
memo_node: RelMemoNode<T>,
206206
) {
207-
match self.groups.entry(group_id) {
208-
Entry::Occupied(mut entry) => {
209-
let group = entry.get_mut();
210-
group.group_exprs.insert(expr_id);
211-
return;
212-
}
213-
_ => {}
207+
if let Entry::Occupied(mut entry) = self.groups.entry(group_id) {
208+
let group = entry.get_mut();
209+
group.group_exprs.insert(expr_id);
210+
return;
214211
}
215212
let mut group = Group {
216213
group_exprs: HashSet::new(),
@@ -423,8 +420,7 @@ impl<T: RelNodeTyp> Memo<T> {
423420
if !winner.impossible {
424421
let expr_id = winner.expr_id;
425422
let expr = self.get_expr_memoed(expr_id);
426-
let mut children = Vec::new();
427-
children.reserve(expr.children.len());
423+
let mut children = Vec::with_capacity(expr.children.len());
428424
for child in &expr.children {
429425
children.push(self.get_best_group_binding(*child, on_produce)?);
430426
}

optd-core/src/cascades/optimizer.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,9 @@ impl<T: RelNodeTyp> CascadesOptimizer<T> {
214214
group_id: GroupId,
215215
mut on_produce: impl FnMut(RelNodeRef<T>, GroupId) -> RelNodeRef<T>,
216216
) -> Result<RelNodeRef<T>> {
217-
Ok(self
217+
self
218218
.memo
219-
.get_best_group_binding(group_id, &mut on_produce)?)
219+
.get_best_group_binding(group_id, &mut on_produce)
220220
}
221221

222222
fn fire_optimize_tasks(&mut self, group_id: GroupId) -> Result<()> {

optd-core/src/cascades/tasks/optimize_inputs.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ impl OptimizeInputsTask {
5151
optimizer: &mut CascadesOptimizer<T>,
5252
) -> Vec<Cost> {
5353
let zero_cost = optimizer.cost().zero();
54-
let mut input_cost = Vec::new();
55-
input_cost.reserve(children.len());
54+
let mut input_cost = Vec::with_capacity(children.len());
5655
for &child in children.iter() {
5756
let group = optimizer.get_group_info(child);
5857
if let Some(ref winner) = group.winner {
@@ -153,7 +152,7 @@ impl<T: RelNodeTyp> Task<T> for OptimizeInputsTask {
153152
};
154153
if self.should_terminate(
155154
cost.sum(
156-
&cost.compute_cost(&expr.typ, &expr.data, &input_cost, Some(context.clone())),
155+
&cost.compute_cost(&expr.typ, &expr.data, &input_cost, Some(context)),
157156
&input_cost,
158157
)
159158
.0[0],
@@ -177,7 +176,7 @@ impl<T: RelNodeTyp> Task<T> for OptimizeInputsTask {
177176
&expr.typ,
178177
&expr.data,
179178
&input_cost,
180-
Some(context.clone()),
179+
Some(context),
181180
),
182181
&input_cost,
183182
)
@@ -248,7 +247,7 @@ impl<T: RelNodeTyp> Task<T> for OptimizeInputsTask {
248247
&expr.typ,
249248
&expr.data,
250249
&input_cost,
251-
Some(context.clone()),
250+
Some(context),
252251
),
253252
&input_cost,
254253
),

optd-core/src/heuristics/optimizer.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn match_node<T: RelNodeTyp>(
5151
RuleMatcher::PickMany { pick_to } => {
5252
let res = pick.insert(
5353
*pick_to,
54-
RelNode::new_list(node.children[idx..].to_vec()).into(),
54+
RelNode::new_list(node.children[idx..].to_vec()),
5555
);
5656
assert!(res.is_none(), "dup pick");
5757
should_end = true;
@@ -124,7 +124,7 @@ impl<T: RelNodeTyp> HeuristicsOptimizer<T> {
124124
for rule in self.rules.as_ref() {
125125
let matcher = rule.matcher();
126126
if let Some(picks) = match_and_pick(matcher, root_rel.clone()) {
127-
let mut results = rule.apply(&self, picks);
127+
let mut results = rule.apply(self, picks);
128128
assert_eq!(results.len(), 1);
129129
root_rel = results.remove(0).into();
130130
}

0 commit comments

Comments
 (0)