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 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
24 span: Range<usize>,
25 },
26 Unary {
28 op: UnaryOperator,
30 expr: Box<Expression>,
32 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
34 span: Range<usize>,
35 },
36 FunctionCall {
38 name: Identifier,
40 args: Vec<Expression>,
42 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
44 span: Range<usize>,
45 },
46 Vector {
48 elements: Vec<Expression>,
50 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
52 span: Range<usize>,
53 },
54 InList {
56 expr: Box<Expression>,
58 list: Vec<Expression>,
60 negated: bool,
62 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
64 span: Range<usize>,
65 },
66 Between {
68 expr: Box<Expression>,
70 low: Box<Expression>,
72 high: Box<Expression>,
74 negated: bool,
76 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
78 span: Range<usize>,
79 },
80 Subquery {
82 query: Box<SelectStatement>,
84 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
86 span: Range<usize>,
87 },
88 InSubquery {
90 expr: Box<Expression>,
92 query: Box<SelectStatement>,
94 negated: bool,
96 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
98 span: Range<usize>,
99 },
100 Error {
102 message: Arc<str>,
104 #[serde(with = "oak_core::serde_range")]
106 span: Range<usize>,
107 },
108}
109
110impl Expression {
111 pub fn span(&self) -> Range<usize> {
113 match self {
114 Expression::Identifier(id) => id.span.clone(),
115 Expression::Literal(lit) => lit.span().clone(),
116 Expression::Binary { span, .. } => span.clone(),
117 Expression::Unary { span, .. } => span.clone(),
118 Expression::FunctionCall { span, .. } => span.clone(),
119 Expression::InList { span, .. } => span.clone(),
120 Expression::Between { span, .. } => span.clone(),
121 Expression::Subquery { span, .. } => span.clone(),
122 Expression::InSubquery { span, .. } => span.clone(),
123 Expression::Vector { span, .. } => span.clone(),
124 Expression::Error { span, .. } => span.clone(),
125 }
126 }
127}
128
129impl ToSource for Expression {
130 fn to_source(&self, buffer: &mut SourceBuffer) {
131 match self {
132 Expression::Identifier(id) => id.to_source(buffer),
133 Expression::Literal(lit) => lit.to_source(buffer),
134 Expression::Binary { left, op, right, .. } => {
135 left.to_source(buffer);
136 op.to_source(buffer);
137 right.to_source(buffer);
138 }
139 Expression::Unary { op, expr, .. } => {
140 op.to_source(buffer);
141 expr.to_source(buffer);
142 }
143 Expression::FunctionCall { name, args, .. } => {
144 name.to_source(buffer);
145 buffer.push("(");
146 for (i, arg) in args.iter().enumerate() {
147 if i > 0 {
148 buffer.push(",");
149 }
150 arg.to_source(buffer);
151 }
152 buffer.push(")");
153 }
154 Expression::Vector { elements, .. } => {
155 buffer.push("[");
156 for (i, elem) in elements.iter().enumerate() {
157 if i > 0 {
158 buffer.push(", ");
159 }
160 elem.to_source(buffer);
161 }
162 buffer.push("]");
163 }
164 Expression::InList { expr, list, negated, .. } => {
165 expr.to_source(buffer);
166 if *negated {
167 buffer.push("NOT");
168 }
169 buffer.push("IN");
170 buffer.push("(");
171 for (i, item) in list.iter().enumerate() {
172 if i > 0 {
173 buffer.push(",");
174 }
175 item.to_source(buffer);
176 }
177 buffer.push(")");
178 }
179 Expression::Between { expr, low, high, negated, .. } => {
180 expr.to_source(buffer);
181 if *negated {
182 buffer.push("NOT");
183 }
184 buffer.push("BETWEEN");
185 low.to_source(buffer);
186 buffer.push("AND");
187 high.to_source(buffer);
188 }
189 Expression::Subquery { query, .. } => {
190 buffer.push("(");
191 query.to_source(buffer);
192 buffer.push(")");
193 }
194 Expression::InSubquery { expr, query, negated, .. } => {
195 expr.to_source(buffer);
196 if *negated {
197 buffer.push("NOT");
198 }
199 buffer.push("IN");
200 buffer.push("(");
201 query.to_source(buffer);
202 buffer.push(")");
203 }
204 Expression::Error { message, .. } => {
205 buffer.push("/* EXPR ERROR: ");
206 buffer.push(message);
207 buffer.push(" */");
208 }
209 }
210 }
211}
212
213#[derive(Debug, Clone, Copy, PartialEq, Eq)]
215#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
216pub enum BinaryOperator {
217 Plus,
219 Minus,
221 Star,
223 Slash,
225 Percent,
227 And,
229 Or,
231 Equal,
233 NotEqual,
235 Less,
237 Greater,
239 LessEqual,
241 GreaterEqual,
243 Like,
245}
246
247impl ToSource for BinaryOperator {
248 fn to_source(&self, buffer: &mut SourceBuffer) {
249 match self {
250 BinaryOperator::Plus => buffer.push("+"),
251 BinaryOperator::Minus => buffer.push("-"),
252 BinaryOperator::Star => buffer.push("*"),
253 BinaryOperator::Slash => buffer.push("/"),
254 BinaryOperator::Percent => buffer.push("%"),
255 BinaryOperator::And => buffer.push("AND"),
256 BinaryOperator::Or => buffer.push("OR"),
257 BinaryOperator::Equal => buffer.push("="),
258 BinaryOperator::NotEqual => buffer.push("<>"),
259 BinaryOperator::Less => buffer.push("<"),
260 BinaryOperator::Greater => buffer.push(">"),
261 BinaryOperator::LessEqual => buffer.push("<="),
262 BinaryOperator::GreaterEqual => buffer.push(">="),
263 BinaryOperator::Like => buffer.push("LIKE"),
264 }
265 }
266}
267
268#[derive(Debug, Clone, Copy, PartialEq, Eq)]
270#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
271pub enum UnaryOperator {
272 Plus,
274 Minus,
276 Not,
278}
279
280impl ToSource for UnaryOperator {
281 fn to_source(&self, buffer: &mut SourceBuffer) {
282 match self {
283 UnaryOperator::Plus => buffer.push("+"),
284 UnaryOperator::Minus => buffer.push("-"),
285 UnaryOperator::Not => buffer.push("NOT"),
286 }
287 }
288}
289
290#[derive(Debug, Clone)]
292#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
293pub enum Literal {
294 Number(Arc<str>, #[serde(with = "oak_core::serde_range")] Range<usize>),
296 String(Arc<str>, #[serde(with = "oak_core::serde_range")] Range<usize>),
298 Boolean(bool, #[serde(with = "oak_core::serde_range")] Range<usize>),
300 Null(#[serde(with = "oak_core::serde_range")] Range<usize>),
302}
303
304impl Literal {
305 pub fn span(&self) -> Range<usize> {
307 match self {
308 Literal::Number(_, span) => span.clone(),
309 Literal::String(_, span) => span.clone(),
310 Literal::Boolean(_, span) => span.clone(),
311 Literal::Null(span) => span.clone(),
312 }
313 }
314}
315
316impl ToSource for Literal {
317 fn to_source(&self, buffer: &mut SourceBuffer) {
318 match self {
319 Literal::Number(n, _) => buffer.push(n),
320 Literal::String(s, _) => {
321 buffer.push("'");
322 buffer.push(s);
323 buffer.push("'");
324 }
325 Literal::Boolean(b, _) => buffer.push(if *b { "TRUE" } else { "FALSE" }),
326 Literal::Null(_) => buffer.push("NULL"),
327 }
328 }
329}
330
331#[derive(Debug, Clone)]
333#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
334pub struct Identifier {
335 pub name: Arc<str>,
337 #[serde(with = "oak_core::serde_range")]
339 pub span: Range<usize>,
340}
341
342impl ToSource for Identifier {
343 fn to_source(&self, buffer: &mut SourceBuffer) {
344 buffer.push(&self.name);
345 }
346}
347
348#[derive(Debug, Clone)]
350#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
351pub struct TableName {
352 pub name: Identifier,
354 #[serde(with = "oak_core::serde_range")]
356 pub span: Range<usize>,
357}
358
359impl ToSource for TableName {
360 fn to_source(&self, buffer: &mut SourceBuffer) {
361 self.name.to_source(buffer);
362 }
363}
364
365#[derive(Debug, Clone)]
367#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
368pub struct ColumnName {
369 pub name: Identifier,
371 #[serde(with = "oak_core::serde_range")]
373 pub span: Range<usize>,
374}
375
376impl ToSource for ColumnName {
377 fn to_source(&self, buffer: &mut SourceBuffer) {
378 self.name.to_source(buffer);
379 }
380}