surrealdb_sql/
operator.rs

1use crate::idx::ft::MatchRef;
2use revision::revisioned;
3use serde::{Deserialize, Serialize};
4use std::fmt;
5use std::fmt::Write;
6
7/// Binary operators.
8#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
9#[revisioned(revision = 1)]
10pub enum Operator {
11	//
12	Neg, // -
13	Not, // !
14	//
15	Or,  // ||
16	And, // &&
17	Tco, // ?: Ternary conditional operator
18	Nco, // ?? Null coalescing operator
19	//
20	Add, // +
21	Sub, // -
22	Mul, // *
23	Div, // /
24	Pow, // **
25	Inc, // +=
26	Dec, // -=
27	Ext, // +?=
28	//
29	Equal,    // =
30	Exact,    // ==
31	NotEqual, // !=
32	AllEqual, // *=
33	AnyEqual, // ?=
34	//
35	Like,                      // ~
36	NotLike,                   // !~
37	AllLike,                   // *~
38	AnyLike,                   // ?~
39	Matches(Option<MatchRef>), // @{ref}@
40	//
41	LessThan,        // <
42	LessThanOrEqual, // <=
43	MoreThan,        // >
44	MoreThanOrEqual, // >=
45	//
46	Contain,     // ∋
47	NotContain,  // ∌
48	ContainAll,  // ⊇
49	ContainAny,  // ⊃
50	ContainNone, // ⊅
51	Inside,      // ∈
52	NotInside,   // ∉
53	AllInside,   // ⊆
54	AnyInside,   // ⊂
55	NoneInside,  // ⊄
56	//
57	Outside,
58	Intersects,
59	//
60	Knn(u32), // <{k}>
61}
62
63impl Default for Operator {
64	fn default() -> Self {
65		Self::Equal
66	}
67}
68
69impl Operator {
70	#[inline]
71	pub fn precedence(&self) -> u8 {
72		match self {
73			Self::Or => 1,
74			Self::And => 2,
75			Self::Tco => 3,
76			Self::Nco => 4,
77			Self::Sub => 6,
78			Self::Add => 7,
79			Self::Mul => 8,
80			Self::Div => 9,
81			_ => 5,
82		}
83	}
84}
85
86impl fmt::Display for Operator {
87	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
88		match self {
89			Self::Neg => f.write_str("-"),
90			Self::Not => f.write_str("!"),
91			Self::Or => f.write_str("OR"),
92			Self::And => f.write_str("AND"),
93			Self::Tco => f.write_str("?:"),
94			Self::Nco => f.write_str("??"),
95			Self::Add => f.write_str("+"),
96			Self::Sub => f.write_char('-'),
97			Self::Mul => f.write_char('*'),
98			Self::Div => f.write_char('/'),
99			Self::Pow => f.write_str("**"),
100			Self::Inc => f.write_str("+="),
101			Self::Dec => f.write_str("-="),
102			Self::Ext => f.write_str("+?="),
103			Self::Equal => f.write_char('='),
104			Self::Exact => f.write_str("=="),
105			Self::NotEqual => f.write_str("!="),
106			Self::AllEqual => f.write_str("*="),
107			Self::AnyEqual => f.write_str("?="),
108			Self::Like => f.write_char('~'),
109			Self::NotLike => f.write_str("!~"),
110			Self::AllLike => f.write_str("*~"),
111			Self::AnyLike => f.write_str("?~"),
112			Self::LessThan => f.write_char('<'),
113			Self::LessThanOrEqual => f.write_str("<="),
114			Self::MoreThan => f.write_char('>'),
115			Self::MoreThanOrEqual => f.write_str(">="),
116			Self::Contain => f.write_str("CONTAINS"),
117			Self::NotContain => f.write_str("CONTAINSNOT"),
118			Self::ContainAll => f.write_str("CONTAINSALL"),
119			Self::ContainAny => f.write_str("CONTAINSANY"),
120			Self::ContainNone => f.write_str("CONTAINSNONE"),
121			Self::Inside => f.write_str("INSIDE"),
122			Self::NotInside => f.write_str("NOTINSIDE"),
123			Self::AllInside => f.write_str("ALLINSIDE"),
124			Self::AnyInside => f.write_str("ANYINSIDE"),
125			Self::NoneInside => f.write_str("NONEINSIDE"),
126			Self::Outside => f.write_str("OUTSIDE"),
127			Self::Intersects => f.write_str("INTERSECTS"),
128			Self::Matches(reference) => {
129				if let Some(r) = reference {
130					write!(f, "@{}@", r)
131				} else {
132					f.write_str("@@")
133				}
134			}
135			Self::Knn(k) => write!(f, "<{}>", k),
136		}
137	}
138}