Skip to main content

gluesql_core/plan/statement/query/
values.rs

1use {
2    crate::{
3        ast,
4        plan::{ExprPlan, OrderByExprPlan},
5    },
6    serde::{Deserialize, Serialize},
7};
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
10pub struct ValuesPlan(pub Vec<Vec<ExprPlan>>);
11
12#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub struct ValuesOrderByPlan {
14    pub input: ValuesPlan,
15    pub exprs: Vec<OrderByExprPlan>,
16}
17
18impl From<ast::Values> for ValuesPlan {
19    fn from(values: ast::Values) -> Self {
20        Self(
21            values
22                .0
23                .into_iter()
24                .map(|exprs| exprs.into_iter().map(Into::into).collect())
25                .collect(),
26        )
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use {
33        super::{ValuesOrderByPlan, ValuesPlan},
34        crate::{
35            ast::Literal,
36            plan::{ExprPlan, OrderByExprPlan},
37        },
38    };
39
40    #[test]
41    fn order_by_accepts_values_input() {
42        let plan = ValuesOrderByPlan {
43            input: ValuesPlan(Vec::new()),
44            exprs: vec![OrderByExprPlan {
45                expr: ExprPlan::Literal(Literal::Number(1.into())),
46                asc: Some(false),
47            }],
48        };
49
50        assert!(
51            plan.input == ValuesPlan(Vec::new())
52                && plan.exprs.len() == 1
53                && plan.exprs[0].asc == Some(false)
54        );
55    }
56}