surql_parser/upstream/sql/statements/define/
index.rs1use super::DefineKind;
2use crate::upstream::fmt::{CoverStmts, Fmt};
3use crate::upstream::sql::{Expr, Index, Literal};
4use surrealdb_types::{SqlFormat, ToSql, write_sql};
5#[derive(Clone, Debug, PartialEq, Eq)]
6pub struct DefineIndexStatement {
7 pub kind: DefineKind,
8 pub name: Expr,
9 pub what: Expr,
10 pub cols: Vec<Expr>,
11 pub index: Index,
12 pub comment: Expr,
13 pub concurrently: bool,
14}
15impl ToSql for DefineIndexStatement {
16 fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
17 write_sql!(f, sql_fmt, "DEFINE INDEX");
18 match self.kind {
19 DefineKind::Default => {}
20 DefineKind::Overwrite => write_sql!(f, sql_fmt, " OVERWRITE"),
21 DefineKind::IfNotExists => write_sql!(f, sql_fmt, " IF NOT EXISTS"),
22 }
23 write_sql!(
24 f,
25 sql_fmt,
26 " {} ON {}",
27 CoverStmts(&self.name),
28 CoverStmts(&self.what)
29 );
30 if !self.cols.is_empty() {
31 write_sql!(
32 f,
33 sql_fmt,
34 " FIELDS {}",
35 Fmt::comma_separated(self.cols.iter().map(CoverStmts))
36 );
37 }
38 if Index::Idx != self.index {
39 write_sql!(f, sql_fmt, " {}", self.index);
40 }
41 if !matches!(self.comment, Expr::Literal(Literal::None)) {
42 write_sql!(f, sql_fmt, " COMMENT {}", CoverStmts(&self.comment));
43 }
44 if self.concurrently {
45 write_sql!(f, sql_fmt, " CONCURRENTLY");
46 }
47 }
48}