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}