Skip to main content

tank_tests/
multiple.rs

1#![allow(dead_code)]
2use std::sync::LazyLock;
3use tank::{AsValue, DynQuery, QueryBuilder};
4use tank::{Driver, Entity, Executor, QueryResult, SqlWriter, stream::TryStreamExt};
5use tokio::sync::Mutex;
6
7static MUTEX: LazyLock<Mutex<()>> = LazyLock::new(|| Mutex::new(()));
8
9#[derive(Entity, PartialEq, Debug)]
10struct One {
11    a1: u32,
12    string: String,
13    c1: u64,
14}
15
16#[derive(Entity, PartialEq, Debug)]
17struct Two {
18    a2: u32,
19    string: String,
20}
21
22#[derive(Entity, PartialEq, Debug)]
23struct Three {
24    string: String,
25}
26
27pub async fn multiple(executor: &mut impl Executor) {
28    let _lock = MUTEX.lock().await;
29
30    let mut query = DynQuery::default();
31    let writer = executor.driver().sql_writer();
32    query.push_str("    \n\n  \n \n\t\t\n   \n    ");
33    // 1
34    writer.write_drop_table::<One>(&mut query, true);
35    query.push_str("\t\t");
36    // 2
37    writer.write_drop_table::<Two>(&mut query, true);
38    // 3
39    writer.write_drop_table::<Three>(&mut query, true);
40    // 4
41    writer.write_create_table::<One>(&mut query, true);
42    query.push('\n');
43    // 5
44    writer.write_create_table::<Two>(&mut query, true);
45    // 6
46    writer.write_create_table::<Three>(&mut query, true);
47    query.push_str(" ");
48    // 7
49    writer.write_insert(
50        &mut query,
51        [
52            &Two {
53                a2: 21,
54                string: "aaa".into(),
55            },
56            &Two {
57                a2: 22,
58                string: "bbb".into(),
59            },
60            &Two {
61                a2: 23,
62                string: "eee".into(),
63            },
64        ],
65        false,
66    );
67    query.push_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
68    // 8
69    writer.write_insert(
70        &mut query,
71        [
72            &Three {
73                string: "ddd".into(),
74            },
75            &Three {
76                string: "ccc".into(),
77            },
78        ],
79        false,
80    );
81    // 9
82    writer.write_select(
83        &mut query,
84        &QueryBuilder::new()
85            .select([Three::string])
86            .from(Three::table())
87            .where_expr(true),
88    );
89    // 10
90    writer.write_insert(
91        &mut query,
92        [&One {
93            a1: 11,
94            string: "zzz".into(),
95            c1: 512,
96        }],
97        false,
98    );
99    // 11
100    writer.write_select(
101        &mut query,
102        &QueryBuilder::new()
103            .select([One::a1, One::string, One::c1])
104            .from(One::table())
105            .where_expr(true),
106    );
107    // 12
108    writer.write_select(
109        &mut query,
110        &QueryBuilder::new()
111            .select([Two::a2, Two::string])
112            .from(Two::table())
113            .where_expr(true),
114    );
115    query.push_str("            \t    \t\t  \n \n \n \t    \n\n\n ");
116    let result = executor
117        .run(query)
118        .try_collect::<Vec<_>>()
119        .await
120        .expect("Could not run the composite query");
121    // 12 statements but one select returns 3 rows and another one returns 2 rows (12 - 2 + 3 + 2 = 15)
122    assert_eq!(result.len(), 15);
123    let mut result = result
124        .into_iter()
125        .filter_map(|v| match v {
126            QueryResult::Row(row) => Some(row),
127            QueryResult::Affected(..) => None,
128        })
129        .collect::<Vec<_>>();
130    result.sort_by(|a, b| {
131        let a = a
132            .get_column("string")
133            .map(|v| String::try_from_value(v.clone()))
134            .expect("Does not have column \"string\"")
135            .expect("The column called `string` is not a VARCHAR");
136        let b = b
137            .get_column("string")
138            .map(|v| String::try_from_value(v.clone()))
139            .expect("Does not have column \"string\"")
140            .expect("The column called `string` is not a VARCHAR");
141        a.cmp(&b)
142    });
143    assert_eq!(result.len(), 6);
144    let mut result = result.into_iter().peekable();
145    assert_eq!(*result.peek().unwrap().labels, ["a2", "string"]);
146    assert_eq!(
147        Two::from_row(result.peek().unwrap().clone()).expect("The row was not an entity Two"),
148        Two {
149            a2: 21,
150            string: "aaa".into()
151        }
152    );
153    result.next();
154    assert_eq!(*result.peek().unwrap().labels, ["a2", "string"]);
155    assert_eq!(
156        Two::from_row(result.peek().unwrap().clone()).expect("The row was not an entity Two"),
157        Two {
158            a2: 22,
159            string: "bbb".into()
160        }
161    );
162    result.next();
163    assert_eq!(*result.peek().unwrap().labels, ["string"]);
164    assert_eq!(
165        Three::from_row(result.peek().unwrap().clone()).expect("The row was not an entity Two"),
166        Three {
167            string: "ccc".into(),
168        }
169    );
170    result.next();
171    assert_eq!(*result.peek().unwrap().labels, ["string"]);
172    assert_eq!(
173        Three::from_row(result.peek().unwrap().clone()).expect("The row was not an entity Two"),
174        Three {
175            string: "ddd".into(),
176        }
177    );
178    result.next();
179    assert_eq!(*result.peek().unwrap().labels, ["a2", "string"]);
180    assert_eq!(
181        Two::from_row(result.peek().unwrap().clone()).expect("The row was not an entity Two"),
182        Two {
183            a2: 23,
184            string: "eee".into()
185        }
186    );
187    result.next();
188    assert_eq!(*result.peek().unwrap().labels, ["a1", "string", "c1"]);
189    assert_eq!(
190        One::from_row(result.peek().unwrap().clone()).expect("The row was not an entity Two"),
191        One {
192            a1: 11,
193            string: "zzz".into(),
194            c1: 512,
195        }
196    );
197    result.next();
198}