Skip to main content

alopex_sql/ast/
ddl.rs

1use super::expr::Expr;
2use super::span::{Span, Spanned};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct CreateTable {
7    pub if_not_exists: bool,
8    pub name: String,
9    pub columns: Vec<ColumnDef>,
10    pub constraints: Vec<TableConstraint>,
11    pub with_options: Vec<IndexOption>,
12    pub span: Span,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct ColumnDef {
17    pub name: String,
18    pub data_type: DataType,
19    pub constraints: Vec<ColumnConstraint>,
20    pub span: Span,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
24#[serde(tag = "variant")]
25pub enum DataType {
26    Integer,
27    Int,
28    BigInt,
29    Float,
30    Double,
31    Text,
32    Blob,
33    Boolean,
34    Bool,
35    Timestamp,
36    Vector {
37        dimension: u32,
38        metric: Option<VectorMetric>,
39    },
40}
41
42#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
43pub enum VectorMetric {
44    Cosine,
45    L2,
46    Inner,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50#[serde(tag = "variant")]
51pub enum ColumnConstraint {
52    NotNull { span: Span },
53    PrimaryKey { span: Span },
54    Unique { span: Span },
55    Default { value: Expr, span: Span },
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(tag = "variant")]
60pub enum TableConstraint {
61    PrimaryKey { columns: Vec<String>, span: Span },
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct DropTable {
66    pub if_exists: bool,
67    pub name: String,
68    pub span: Span,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct CreateIndex {
73    pub if_not_exists: bool,
74    pub name: String,
75    pub table: String,
76    pub column: String,
77    pub method: Option<IndexMethod>,
78    pub options: Vec<IndexOption>,
79    pub span: Span,
80}
81
82#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
83pub enum IndexMethod {
84    BTree,
85    Hnsw,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct IndexOption {
90    pub key: String,
91    pub value: String,
92    pub span: Span,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct DropIndex {
97    pub if_exists: bool,
98    pub name: String,
99    pub span: Span,
100}
101
102impl Spanned for CreateTable {
103    fn span(&self) -> Span {
104        self.span
105    }
106}
107
108impl Spanned for ColumnDef {
109    fn span(&self) -> Span {
110        self.span
111    }
112}
113
114impl Spanned for ColumnConstraint {
115    fn span(&self) -> Span {
116        match self {
117            ColumnConstraint::NotNull { span }
118            | ColumnConstraint::PrimaryKey { span }
119            | ColumnConstraint::Unique { span }
120            | ColumnConstraint::Default { span, .. } => *span,
121        }
122    }
123}
124
125impl Spanned for TableConstraint {
126    fn span(&self) -> Span {
127        match self {
128            TableConstraint::PrimaryKey { span, .. } => *span,
129        }
130    }
131}
132
133impl Spanned for DropTable {
134    fn span(&self) -> Span {
135        self.span
136    }
137}
138
139impl Spanned for CreateIndex {
140    fn span(&self) -> Span {
141        self.span
142    }
143}
144
145impl Spanned for IndexOption {
146    fn span(&self) -> Span {
147        self.span
148    }
149}
150
151impl Spanned for DropIndex {
152    fn span(&self) -> Span {
153        self.span
154    }
155}