gluesql_core/ast_builder/
index.rs1use {
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}