Skip to main content

gluesql_core/query_builder/
table_access.rs

1mod index_predicate;
2mod non_clustered;
3mod primary_key;
4
5use {
6    super::ExprNode,
7    crate::{
8        ast::IndexOperator,
9        plan::{IndexPredicatePlan, TableAccessPlan},
10    },
11};
12pub use {
13    crate::result::Result,
14    index_predicate::IndexPredicateNode,
15    non_clustered::{NonClusteredNode, non_clustered},
16    primary_key::{PrimaryKeyNode, primary_key},
17};
18
19#[derive(Clone, Debug)]
20pub enum TableAccessNode<'a> {
21    FullScan,
22    Index {
23        name: String,
24        asc: Option<bool>,
25        predicate: Option<(IndexOperator, ExprNode<'a>)>,
26    },
27    PrimaryKey(ExprNode<'a>),
28}
29
30impl<'a> From<IndexPredicateNode<'a>> for TableAccessNode<'a> {
31    fn from(predicate: IndexPredicateNode<'a>) -> Self {
32        let IndexPredicateNode {
33            index_name,
34            operator,
35            expr,
36        } = predicate;
37
38        TableAccessNode::Index {
39            name: index_name,
40            asc: None,
41            predicate: Some((operator, expr)),
42        }
43    }
44}
45
46impl From<NonClusteredNode> for TableAccessNode<'_> {
47    fn from(non_clustered: NonClusteredNode) -> Self {
48        TableAccessNode::Index {
49            name: non_clustered.index_name,
50            asc: None,
51            predicate: None,
52        }
53    }
54}
55
56impl TableAccessNode<'_> {
57    pub(super) fn build_table_access_plan(self) -> Result<TableAccessPlan> {
58        match self {
59            Self::FullScan => Ok(TableAccessPlan::FullScan),
60            Self::Index {
61                name,
62                asc,
63                predicate,
64            } => Ok(TableAccessPlan::Index {
65                name,
66                asc,
67                predicate: predicate
68                    .map(|(operator, expr)| {
69                        expr.build_expr_plan()
70                            .map(|expr| IndexPredicatePlan { operator, expr })
71                    })
72                    .transpose()?,
73            }),
74            Self::PrimaryKey(expr) => Ok(TableAccessPlan::PrimaryKey {
75                expr: expr.build_expr_plan()?,
76            }),
77        }
78    }
79}