1use crate::ast::statements::query::SelectStatement;
2use core::range::Range;
3use oak_core::source::{SourceBuffer, ToSource};
4use std::sync::Arc;
5
6#[derive(Debug, Clone)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub enum Expression {
10 Identifier(Identifier),
12 Literal(Literal),
14 Binary {
16 left: Box<Expression>,
18 op: BinaryOperator,
20 right: Box<Expression>,
22 #[serde(with = "oak_core::serde_range")]
24 span: Range<usize>,
25 },
26 Unary {
28 op: UnaryOperator,
30 expr: Box<Expression>,
32 #[serde(with = "oak_core::serde_range")]
34 span: Range<usize>,
35 },
36 FunctionCall {
38 name: Identifier,
40 args: Vec<Expression>,
42 #[serde(with = "oak_core::serde_range")]
44 span: Range<usize>,
45 },
46 InList {
48 expr: Box<Expression>,
50 list: Vec<Expression>,
52 negated: bool,
54 #[serde(with = "oak_core::serde_range")]
56 span: Range<usize>,
57 },
58 Between {
60 expr: Box<Expression>,
62 low: Box<Expression>,
64 high: Box<Expression>,
66 negated: bool,
68 #[serde(with = "oak_core::serde_range")]
70 span: Range<usize>,
71 },
72 Subquery {
74 query: Box<SelectStatement>,
76 #[serde(with = "oak_core::serde_range")]
78 span: Range<usize>,
79 },
80 InSubquery {
82 expr: Box<Expression>,
84 query: Box<SelectStatement>,
86 negated: bool,
88 #[serde(with = "oak_core::serde_range")]
90 span: Range<usize>,
91 },
92 Error {
94 message: Arc<str>,
96 #[serde(with = "oak_core::serde_range")]
98 span: Range<usize>,
99 },
100}
101
102impl Expression {
103 pub fn span(&self) -> Range<usize> {
104 match self {
105 Expression::Identifier(id) => id.span.clone(),
106 Expression::Literal(lit) => lit.span().clone(),
107 Expression::Binary { span, .. } => span.clone(),
108 Expression::Unary { span, .. } => span.clone(),
109 Expression::FunctionCall { span, .. } => span.clone(),
110 Expression::InList { span, .. } => span.clone(),
111 Expression::Between { span, .. } => span.clone(),
112 Expression::Subquery { span, .. } => span.clone(),
113 Expression::InSubquery { span, .. } => span.clone(),
114 Expression::Error { span, .. } => span.clone(),
115 }
116 }
117}
118
119impl ToSource for Expression {
120 fn to_source(&self, buffer: &mut SourceBuffer) {
121 match self {
122 Expression::Identifier(id) => id.to_source(buffer),
123 Expression::Literal(lit) => lit.to_source(buffer),
124 Expression::Binary { left, op, right, .. } => {
125 left.to_source(buffer);
126 op.to_source(buffer);
127 right.to_source(buffer);
128 }
129 Expression::Unary { op, expr, .. } => {
130 op.to_source(buffer);
131 expr.to_source(buffer);
132 }
133 Expression::FunctionCall { name, args, .. } => {
134 name.to_source(buffer);
135 buffer.push("(");
136 for (i, arg) in args.iter().enumerate() {
137 if i > 0 {
138 buffer.push(",");
139 }
140 arg.to_source(buffer);
141 }
142 buffer.push(")");
143 }
144 Expression::InList { expr, list, negated, .. } => {
145 expr.to_source(buffer);
146 if *negated {
147 buffer.push("NOT");
148 }
149 buffer.push("IN");
150 buffer.push("(");
151 for (i, item) in list.iter().enumerate() {
152 if i > 0 {
153 buffer.push(",");
154 }
155 item.to_source(buffer);
156 }
157 buffer.push(")");
158 }
159 Expression::Between { expr, low, high, negated, .. } => {
160 expr.to_source(buffer);
161 if *negated {
162 buffer.push("NOT");
163 }
164 buffer.push("BETWEEN");
165 low.to_source(buffer);
166 buffer.push("AND");
167 high.to_source(buffer);
168 }
169 Expression::Subquery { query, .. } => {
170 buffer.push("(");
171 query.to_source(buffer);
172 buffer.push(")");
173 }
174 Expression::InSubquery { expr, query, negated, .. } => {
175 expr.to_source(buffer);
176 if *negated {
177 buffer.push("NOT");
178 }
179 buffer.push("IN");
180 buffer.push("(");
181 query.to_source(buffer);
182 buffer.push(")");
183 }
184 Expression::Error { message, .. } => {
185 buffer.push("/* EXPR ERROR: ");
186 buffer.push(message);
187 buffer.push(" */");
188 }
189 }
190 }
191}
192
193#[derive(Debug, Clone, Copy, PartialEq, Eq)]
195#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
196pub enum BinaryOperator {
197 Plus,
199 Minus,
201 Star,
203 Slash,
205 Percent,
207 And,
209 Or,
211 Equal,
213 NotEqual,
215 Less,
217 Greater,
219 LessEqual,
221 GreaterEqual,
223 Like,
225}
226
227impl ToSource for BinaryOperator {
228 fn to_source(&self, buffer: &mut SourceBuffer) {
229 match self {
230 BinaryOperator::Plus => buffer.push("+"),
231 BinaryOperator::Minus => buffer.push("-"),
232 BinaryOperator::Star => buffer.push("*"),
233 BinaryOperator::Slash => buffer.push("/"),
234 BinaryOperator::Percent => buffer.push("%"),
235 BinaryOperator::And => buffer.push("AND"),
236 BinaryOperator::Or => buffer.push("OR"),
237 BinaryOperator::Equal => buffer.push("="),
238 BinaryOperator::NotEqual => buffer.push("<>"),
239 BinaryOperator::Less => buffer.push("<"),
240 BinaryOperator::Greater => buffer.push(">"),
241 BinaryOperator::LessEqual => buffer.push("<="),
242 BinaryOperator::GreaterEqual => buffer.push(">="),
243 BinaryOperator::Like => buffer.push("LIKE"),
244 }
245 }
246}
247
248#[derive(Debug, Clone, Copy, PartialEq, Eq)]
250#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
251pub enum UnaryOperator {
252 Plus,
254 Minus,
256 Not,
258}
259
260impl ToSource for UnaryOperator {
261 fn to_source(&self, buffer: &mut SourceBuffer) {
262 match self {
263 UnaryOperator::Plus => buffer.push("+"),
264 UnaryOperator::Minus => buffer.push("-"),
265 UnaryOperator::Not => buffer.push("NOT"),
266 }
267 }
268}
269
270#[derive(Debug, Clone)]
272#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
273pub enum Literal {
274 Number(Arc<str>, #[serde(with = "oak_core::serde_range")] Range<usize>),
276 String(Arc<str>, #[serde(with = "oak_core::serde_range")] Range<usize>),
278 Boolean(bool, #[serde(with = "oak_core::serde_range")] Range<usize>),
280 Null(#[serde(with = "oak_core::serde_range")] Range<usize>),
282}
283
284impl Literal {
285 pub fn span(&self) -> Range<usize> {
286 match self {
287 Literal::Number(_, span) => span.clone(),
288 Literal::String(_, span) => span.clone(),
289 Literal::Boolean(_, span) => span.clone(),
290 Literal::Null(span) => span.clone(),
291 }
292 }
293}
294
295impl ToSource for Literal {
296 fn to_source(&self, buffer: &mut SourceBuffer) {
297 match self {
298 Literal::Number(n, _) => buffer.push(n),
299 Literal::String(s, _) => {
300 buffer.push("'");
301 buffer.push(s);
302 buffer.push("'");
303 }
304 Literal::Boolean(b, _) => buffer.push(if *b { "TRUE" } else { "FALSE" }),
305 Literal::Null(_) => buffer.push("NULL"),
306 }
307 }
308}
309
310#[derive(Debug, Clone)]
312#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
313pub struct Identifier {
314 pub name: Arc<str>,
316 #[serde(with = "oak_core::serde_range")]
318 pub span: Range<usize>,
319}
320
321impl ToSource for Identifier {
322 fn to_source(&self, buffer: &mut SourceBuffer) {
323 buffer.push(&self.name);
324 }
325}
326
327#[derive(Debug, Clone)]
329#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
330pub struct TableName {
331 pub name: Identifier,
333 #[serde(with = "oak_core::serde_range")]
335 pub span: Range<usize>,
336}
337
338impl ToSource for TableName {
339 fn to_source(&self, buffer: &mut SourceBuffer) {
340 self.name.to_source(buffer);
341 }
342}
343
344#[derive(Debug, Clone)]
346#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
347pub struct ColumnName {
348 pub name: Identifier,
350 #[serde(with = "oak_core::serde_range")]
352 pub span: Range<usize>,
353}
354
355impl ToSource for ColumnName {
356 fn to_source(&self, buffer: &mut SourceBuffer) {
357 self.name.to_source(buffer);
358 }
359}