Skip to main content

surql_parser/upstream/sql/statements/define/
index.rs

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