surrealdb_sql/
graph.rs

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	/// Convert the graph edge to a raw String
32	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}