Skip to main content

surql_parser/upstream/sql/
block.rs

1use crate::upstream::sql::{BinaryOperator, Expr, Literal};
2use surrealdb_types::{SqlFormat, ToSql, write_sql};
3#[derive(Clone, Debug, PartialEq, Eq)]
4#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
5pub struct Block(pub Vec<Expr>);
6impl ToSql for Block {
7	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
8		match self.0.len() {
9			0 => f.push_str("{;}"),
10			1 => {
11				let v = &self.0[0];
12				if fmt.is_pretty() {
13					f.push('{');
14					f.push('\n');
15					f.push('\n');
16					let fmt = fmt.increment();
17					fmt.write_indent(f);
18					if let Expr::Literal(Literal::RecordId(_)) = v {
19						write_sql!(f, fmt, "({v})");
20					} else if let Expr::Binary {
21						left,
22						op: BinaryOperator::Equal,
23						..
24					} = v && let Expr::Param(_) = **left
25					{
26						write_sql!(f, fmt, "({v})");
27					} else {
28						v.fmt_sql(f, fmt);
29					}
30					f.push('\n');
31					if let SqlFormat::Indented(level) = fmt
32						&& level > 0
33					{
34						for _ in 0..(level - 1) {
35							f.push('\t');
36						}
37					}
38					f.push('}')
39				} else {
40					f.push_str("{ ");
41					if let Expr::Literal(Literal::RecordId(_)) = v {
42						write_sql!(f, fmt, "({v})");
43					} else if let Expr::Binary {
44						left,
45						op: BinaryOperator::Equal,
46						..
47					} = v && let Expr::Param(_) = **left
48					{
49						write_sql!(f, fmt, "({v})");
50					} else {
51						v.fmt_sql(f, fmt);
52					}
53					f.push_str(" }");
54				}
55			}
56			_ => {
57				if fmt.is_pretty() {
58					f.push('{');
59					f.push('\n');
60					f.push('\n');
61					let fmt = fmt.increment();
62					for (i, v) in self.0.iter().enumerate() {
63						if i > 0 {
64							f.push('\n');
65							f.push('\n');
66						}
67						fmt.write_indent(f);
68						if i == 0
69							&& let Expr::Literal(Literal::RecordId(_)) = v
70						{
71							write_sql!(f, fmt, "({v})");
72						} else if let Expr::Binary {
73							left,
74							op: BinaryOperator::Equal,
75							..
76						} = v && let Expr::Param(_) = **left
77						{
78							write_sql!(f, fmt, "({v})");
79						} else {
80							v.fmt_sql(f, fmt);
81						}
82						f.push(';');
83					}
84					f.push('\n');
85					if let SqlFormat::Indented(level) = fmt
86						&& level > 0
87					{
88						for _ in 0..(level - 1) {
89							f.push('\t');
90						}
91					}
92					f.push('}')
93				} else {
94					f.push_str("{ ");
95					for (i, v) in self.0.iter().enumerate() {
96						if i > 0 {
97							f.push(' ');
98						}
99						if i == 0
100							&& let Expr::Literal(Literal::RecordId(_)) = v
101						{
102							write_sql!(f, fmt, "({v})");
103						} else if let Expr::Binary {
104							left,
105							op: BinaryOperator::Equal,
106							..
107						} = v && let Expr::Param(_) = **left
108						{
109							write_sql!(f, fmt, "({v})");
110						} else {
111							v.fmt_sql(f, fmt);
112						}
113						f.push(';');
114					}
115					f.push_str(" }")
116				}
117			}
118		}
119	}
120}