1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use std::fmt;
use super::expression::{BExpression, Expression};
use super::return_value::{ReturnKind, ReturnValue};
use super::misc::{Span, Subquery};
#[derive(Debug, PartialEq, Clone)]
pub struct Group {
pub expression: BExpression,
pub subquery: Option<Subquery>,
pub span: Option<Span>
}
impl Group {
pub fn new(expression: Expression) -> Self {
Group {
expression: Box::new(expression),
subquery: None,
span: None
}
}
pub fn subquery(mut self, subquery: Subquery) -> Self {
self.subquery = Some(subquery);
self
}
pub fn clear_subquery(mut self) -> Self {
self.subquery = None;
self
}
pub fn span<S: Into<Span>>(mut self, span: S) -> Self {
self.span = Some(span.into());
self
}
pub fn wrap(self) -> Expression {
Expression::Group(self)
}
pub fn return_value(&self) -> ReturnValue {
let mut ret = self.expression.return_value();
if self.subquery.is_some() {
ret.kind = match ret.kind {
ReturnKind::InstantVector => ReturnKind::RangeVector,
_ => ReturnKind::unknown(
format!("subquery on inner expression returning {:?} is invalid", ret.kind),
self.clone().wrap()
)
};
}
ret
}
}
impl fmt::Display for Group {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({})", self.expression)?;
if let Some(subquery) = &self.subquery {
write!(f, "{}", subquery)?;
}
Ok(())
}
}