Skip to main content

surql_parser/upstream/sql/statements/
select.rs

1use crate::upstream::fmt::{CoverStmts, Fmt};
2use crate::upstream::sql::order::Ordering;
3use crate::upstream::sql::{
4	Cond, Explain, Expr, Fetchs, Fields, Groups, Limit, Literal, Splits, Start, With,
5};
6use surrealdb_types::{SqlFormat, ToSql, write_sql};
7#[derive(Clone, Debug, Eq, PartialEq)]
8pub struct SelectStatement {
9	/// The foo,bar part in SELECT foo,bar FROM baz.
10	pub fields: Fields,
11	pub omit: Vec<Expr>,
12	pub only: bool,
13	/// The baz part in SELECT foo,bar FROM baz.
14	pub what: Vec<Expr>,
15	pub with: Option<With>,
16	pub cond: Option<Cond>,
17	pub split: Option<Splits>,
18	pub group: Option<Groups>,
19	pub order: Option<Ordering>,
20	pub limit: Option<Limit>,
21	pub start: Option<Start>,
22	pub fetch: Option<Fetchs>,
23	pub version: Expr,
24	pub timeout: Expr,
25	pub explain: Option<Explain>,
26	pub tempfiles: bool,
27}
28impl ToSql for SelectStatement {
29	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
30		write_sql!(f, fmt, "SELECT {}", self.fields);
31		if !self.omit.is_empty() {
32			write_sql!(
33				f,
34				fmt,
35				" OMIT {}",
36				Fmt::comma_separated(self.omit.iter().map(CoverStmts))
37			);
38		}
39		write_sql!(f, fmt, " FROM");
40		if self.only {
41			write_sql!(f, fmt, " ONLY");
42		}
43		write_sql!(
44			f,
45			fmt,
46			" {}",
47			Fmt::comma_separated(self.what.iter().map(CoverStmts))
48		);
49		if let Some(ref v) = self.with {
50			write_sql!(f, fmt, " {v}");
51		}
52		if let Some(ref v) = self.cond {
53			write_sql!(f, fmt, " {v}");
54		}
55		if let Some(ref v) = self.split {
56			write_sql!(f, fmt, " {v}");
57		}
58		if let Some(ref v) = self.group {
59			write_sql!(f, fmt, " {v}");
60		}
61		if let Some(ref v) = self.order {
62			write_sql!(f, fmt, " {v}");
63		}
64		if let Some(ref v) = self.limit {
65			write_sql!(f, fmt, " {v}");
66		}
67		if let Some(ref v) = self.start {
68			write_sql!(f, fmt, " {v}");
69		}
70		if let Some(ref v) = self.fetch {
71			write_sql!(f, fmt, " {v}");
72		}
73		if !matches!(self.version, Expr::Literal(Literal::None)) {
74			write_sql!(f, fmt, " VERSION {}", CoverStmts(&self.version));
75		}
76		if !matches!(self.timeout, Expr::Literal(Literal::None)) {
77			write_sql!(f, fmt, " TIMEOUT {}", CoverStmts(&self.timeout));
78		}
79		if let Some(ref v) = self.explain {
80			write_sql!(f, fmt, " {v}");
81		}
82	}
83}