gluesql_core/query_builder/
table_access.rs1mod 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}