surql_parser/upstream/sql/statements/
select.rs1use 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 pub fields: Fields,
11 pub omit: Vec<Expr>,
12 pub only: bool,
13 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}