Skip to main content

gluesql_core/query_builder/
index.rs

1use {
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}