gluesql_core/query_builder/
index.rs1use {
2 super::{Build, OrderByExprNode},
3 crate::{plan::StatementPlan, result::Result},
4};
5
6#[derive(Clone, Debug)]
7pub struct CreateIndexNode<'a> {
8 name: String,
9 table_name: String,
10 column: OrderByExprNode<'a>,
11}
12
13impl<'a> CreateIndexNode<'a> {
14 pub fn new(table_name: String, name: String, column: OrderByExprNode<'a>) -> Self {
15 Self {
16 name,
17 table_name,
18 column,
19 }
20 }
21}
22
23impl Build for CreateIndexNode<'_> {
24 fn build(self) -> Result<StatementPlan> {
25 let table_name = self.table_name;
26 let name = self.name;
27 let column = self.column.build_order_by_expr()?;
28
29 Ok(StatementPlan::CreateIndex {
30 name,
31 table_name,
32 column,
33 })
34 }
35}
36
37#[derive(Clone)]
38pub struct DropIndexNode {
39 name: String,
40 table_name: String,
41}
42
43impl DropIndexNode {
44 pub fn new(table_name: String, name: String) -> Self {
45 Self { name, table_name }
46 }
47}
48
49impl Build for DropIndexNode {
50 fn build(self) -> Result<StatementPlan> {
51 let table_name = self.table_name;
52 let name = self.name;
53
54 Ok(StatementPlan::DropIndex { name, table_name })
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use crate::query_builder::{Build, col, table, test};
61
62 #[test]
63 fn create_index() {
64 let actual = table("Foo").create_index("nameIndex", "name asc").build();
65 let expected = "CREATE INDEX nameIndex ON Foo (name Asc)";
66 test(&actual, expected);
67
68 let actual = table("Foo").create_index("nameIndex", "name desc").build();
69 let expected = "CREATE INDEX nameIndex ON Foo (name Desc)";
70 test(&actual, expected);
71
72 let actual = table("Foo")
73 .create_index("nameIndex", col("name").desc())
74 .build();
75 let expected = "CREATE INDEX nameIndex ON Foo (name DESC)";
76 test(&actual, expected);
77 }
78
79 #[test]
80 fn drop_index() {
81 let actual = table("Foo").drop_index("nameIndex").build();
82 let expected = "DROP INDEX Foo.nameIndex";
83 test(&actual, expected);
84 }
85}