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 writer.write_drop_table::<One>(&mut query, true);
35 query.push_str("\t\t");
36 writer.write_drop_table::<Two>(&mut query, true);
38 writer.write_drop_table::<Three>(&mut query, true);
40 writer.write_create_table::<One>(&mut query, true);
42 query.push('\n');
43 writer.write_create_table::<Two>(&mut query, true);
45 writer.write_create_table::<Three>(&mut query, true);
47 query.push_str(" ");
48 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 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 writer.write_select(
83 &mut query,
84 &QueryBuilder::new()
85 .select([Three::string])
86 .from(Three::table())
87 .where_expr(true),
88 );
89 writer.write_insert(
91 &mut query,
92 [&One {
93 a1: 11,
94 string: "zzz".into(),
95 c1: 512,
96 }],
97 false,
98 );
99 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 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 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}