surql_parser/upstream/sql/
block.rs1use 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}