Skip to main content

surrealdb_sql/statements/define/
index.rs

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