surrealdb_sql/statements/define/
index.rs1use 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}