1use std::sync::LazyLock;
2use tank::{
3 AsValue, DataSet, Entity, Executor, Result, cols, expr,
4 stream::{StreamExt, TryStreamExt},
5};
6use tokio::sync::Mutex;
7
8#[derive(Debug, Default, Entity, PartialEq, Eq, PartialOrd, Ord)]
9struct MathTable {
10 #[tank(primary_key)]
11 id: u64,
12 read: u64,
13}
14static MUTEX: LazyLock<Mutex<()>> = LazyLock::new(|| Mutex::new(()));
15
16pub async fn math<E: Executor>(executor: &mut E) {
17 let _lock = MUTEX.lock().await;
18
19 MathTable::drop_table(executor, true, false)
21 .await
22 .expect("Failed to drop MathTable table");
23 MathTable::create_table(executor, false, false)
24 .await
25 .expect("Failed to create MathTable table");
26 MathTable { id: 0, read: 0 }
27 .save(executor)
28 .await
29 .expect("Could not save the dummy entry");
30
31 let result = MathTable::table()
32 .select(
33 executor,
34 cols!(MathTable::id, ((42 * 6 + 56) / 7) as read),
35 expr!(MathTable::id == 0),
36 None,
37 )
38 .map_ok(MathTable::from_row)
39 .map(Result::flatten)
40 .try_collect::<Vec<_>>()
41 .await
42 .expect("Could not get the result 1");
43 assert_eq!(result, [MathTable { id: 0, read: 44 }]);
44
45 let result = MathTable::table()
46 .select(
47 executor,
48 cols!(MathTable::id, ((5 - (1 << 2)) * 9 % 6) as read),
49 expr!(MathTable::id == 0),
50 None,
51 )
52 .map_ok(MathTable::from_row)
53 .map(Result::flatten)
54 .try_collect::<Vec<_>>()
55 .await
56 .expect("Could not get the result 2");
57 assert_eq!(result, [MathTable { id: 0, read: 3 }]);
58
59 let result = MathTable::table()
60 .select(
61 executor,
62 cols!(MathTable::id, ((1 | 2 | 4) + 1) as read),
63 expr!(MathTable::id == 0),
64 None,
65 )
66 .map_ok(MathTable::from_row)
67 .map(Result::flatten)
68 .try_collect::<Vec<_>>()
69 .await
70 .expect("Could not get the result 3");
71 assert_eq!(result, [MathTable { id: 0, read: 8 }]);
72
73 let result = MathTable::table()
74 .select(
75 executor,
76 cols!(MathTable::id, (90 > 89 && (10 & 6) == 2) as read),
77 expr!(MathTable::id == 0),
78 None,
79 )
80 .map_ok(|v| bool::try_from_value(v.values.into_iter().nth(1).unwrap()))
81 .map(Result::flatten)
82 .try_collect::<Vec<_>>()
83 .await
84 .expect("Could not get the result 4");
85 assert_eq!(result, [true]);
86
87 let result = MathTable::table()
88 .select(
89 executor,
90 cols!(MathTable::id, (4 == (2, 3, 4, 5) as IN) as read),
91 expr!(MathTable::id == 0),
92 None,
93 )
94 .map_ok(|v| bool::try_from_value(v.values.into_iter().nth(1).unwrap()))
95 .map(Result::flatten)
96 .try_collect::<Vec<_>>()
97 .await
98 .expect("Could not get the result 5");
99 assert_eq!(result, [true]);
100}