gluesql_core/ast_builder/
index.rs

1use {
2    super::{Build, OrderByExprNode},
3    crate::{ast::Statement, 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            table_name,
17            name,
18            column,
19        }
20    }
21}
22
23impl<'a> Build for CreateIndexNode<'a> {
24    fn build(self) -> Result<Statement> {
25        let table_name = self.table_name;
26        let name = self.name;
27        let column = self.column.try_into()?;
28
29        Ok(Statement::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 { table_name, name }
46    }
47}
48
49impl Build for DropIndexNode {
50    fn build(self) -> Result<Statement> {
51        let table_name = self.table_name;
52        let name = self.name;
53
54        Ok(Statement::DropIndex { name, table_name })
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use crate::ast_builder::{Build, 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
73    #[test]
74    fn drop_index() {
75        let actual = table("Foo").drop_index("nameIndex").build();
76        let expected = "DROP INDEX Foo.nameIndex";
77        test(actual, expected);
78    }
79}