1use crate::cond::Cond;
2use crate::dir::Dir;
3use crate::field::Fields;
4use crate::group::Groups;
5use crate::idiom::Idiom;
6use crate::limit::Limit;
7use crate::order::Orders;
8use crate::split::Splits;
9use crate::start::Start;
10use crate::table::Tables;
11use revision::revisioned;
12use serde::{Deserialize, Serialize};
13use std::fmt::{self, Display, Formatter, Write};
14
15#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
16#[revisioned(revision = 1)]
17pub struct Graph {
18 pub dir: Dir,
19 pub expr: Fields,
20 pub what: Tables,
21 pub cond: Option<Cond>,
22 pub split: Option<Splits>,
23 pub group: Option<Groups>,
24 pub order: Option<Orders>,
25 pub limit: Option<Limit>,
26 pub start: Option<Start>,
27 pub alias: Option<Idiom>,
28}
29
30impl Graph {
31 pub fn to_raw(&self) -> String {
33 self.to_string()
34 }
35}
36
37impl Display for Graph {
38 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
39 if self.what.0.len() <= 1 && self.cond.is_none() && self.alias.is_none() {
40 Display::fmt(&self.dir, f)?;
41 match self.what.len() {
42 0 => f.write_char('?'),
43 _ => Display::fmt(&self.what, f),
44 }
45 } else {
46 write!(f, "{}(", self.dir)?;
47 match self.what.len() {
48 0 => f.write_char('?'),
49 _ => Display::fmt(&self.what, f),
50 }?;
51 if let Some(ref v) = self.cond {
52 write!(f, " {v}")?
53 }
54 if let Some(ref v) = self.split {
55 write!(f, " {v}")?
56 }
57 if let Some(ref v) = self.group {
58 write!(f, " {v}")?
59 }
60 if let Some(ref v) = self.order {
61 write!(f, " {v}")?
62 }
63 if let Some(ref v) = self.limit {
64 write!(f, " {v}")?
65 }
66 if let Some(ref v) = self.start {
67 write!(f, " {v}")?
68 }
69 if let Some(ref v) = self.alias {
70 write!(f, " AS {v}")?
71 }
72 f.write_char(')')
73 }
74 }
75}