gluesql_core/plan/statement/query/
values.rs1use {
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}