Skip to main content

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

1use super::DefineKind;
2use crate::upstream::fmt::{CoverStmts, EscapeKwFreeIdent, Fmt};
3use crate::upstream::sql::filter::Filter;
4use crate::upstream::sql::tokenizer::Tokenizer;
5use crate::upstream::sql::{Expr, Literal};
6use surrealdb_types::{SqlFormat, ToSql, write_sql};
7#[derive(Clone, Debug, PartialEq, Eq)]
8pub struct DefineAnalyzerStatement {
9	pub kind: DefineKind,
10	pub name: Expr,
11	pub function: Option<String>,
12	pub tokenizers: Option<Vec<Tokenizer>>,
13	pub filters: Option<Vec<Filter>>,
14	pub comment: Expr,
15}
16impl Default for DefineAnalyzerStatement {
17	fn default() -> Self {
18		Self {
19			kind: DefineKind::Default,
20			name: Expr::Literal(Literal::None),
21			function: None,
22			tokenizers: None,
23			filters: None,
24			comment: Expr::Literal(Literal::None),
25		}
26	}
27}
28impl ToSql for DefineAnalyzerStatement {
29	fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
30		write_sql!(f, sql_fmt, "DEFINE ANALYZER");
31		match self.kind {
32			DefineKind::Default => {}
33			DefineKind::Overwrite => write_sql!(f, sql_fmt, " OVERWRITE"),
34			DefineKind::IfNotExists => write_sql!(f, sql_fmt, " IF NOT EXISTS"),
35		}
36		write_sql!(f, sql_fmt, " {}", CoverStmts(&self.name));
37		if let Some(ref i) = self.function {
38			f.push_str(" FUNCTION fn");
39			for x in i.split("::") {
40				f.push_str("::");
41				EscapeKwFreeIdent(x).fmt_sql(f, sql_fmt);
42			}
43		}
44		if let Some(v) = &self.tokenizers {
45			let tokens: Vec<String> = v.iter().map(|f| f.to_sql()).collect();
46			write_sql!(f, sql_fmt, " TOKENIZERS {}", tokens.join(","));
47		}
48		if let Some(v) = &self.filters {
49			write_sql!(f, sql_fmt, " FILTERS {}", Fmt::comma_separated(v.iter()));
50		}
51		if !matches!(self.comment, Expr::Literal(Literal::None)) {
52			write_sql!(f, sql_fmt, " COMMENT {}", CoverStmts(&self.comment));
53		}
54	}
55}