gluesql_core/ast_builder/
table_factor.rs

1use {
2    super::{ExprNode, IndexItemNode, QueryNode, SelectNode},
3    crate::ast::Dictionary,
4};
5
6#[derive(Clone, Debug)]
7pub enum TableType<'a> {
8    Table,
9    Series(ExprNode<'a>),
10    Dictionary(Dictionary),
11    Derived {
12        subquery: Box<QueryNode<'a>>,
13        alias: String,
14    },
15}
16
17#[derive(Clone, Debug)]
18pub struct TableFactorNode<'a> {
19    pub table_name: String,
20    pub table_type: TableType<'a>,
21    pub table_alias: Option<String>,
22    pub index: Option<IndexItemNode<'a>>,
23}
24
25impl<'a> TableFactorNode<'a> {
26    pub fn select(self) -> SelectNode<'a> {
27        SelectNode::new(self)
28    }
29}
30
31pub fn glue_objects() -> TableFactorNode<'static> {
32    TableFactorNode {
33        table_name: "GLUE_OBJECTS".to_owned(),
34        table_type: TableType::Dictionary(Dictionary::GlueObjects),
35        table_alias: None,
36        index: None,
37    }
38}
39
40pub fn glue_tables() -> TableFactorNode<'static> {
41    TableFactorNode {
42        table_name: "GLUE_TABLES".to_owned(),
43        table_type: TableType::Dictionary(Dictionary::GlueTables),
44        table_alias: None,
45        index: None,
46    }
47}
48
49pub fn glue_indexes() -> TableFactorNode<'static> {
50    TableFactorNode {
51        table_name: "GLUE_INDEXES".to_owned(),
52        table_type: TableType::Dictionary(Dictionary::GlueIndexes),
53        table_alias: None,
54        index: None,
55    }
56}
57
58pub fn glue_table_columns() -> TableFactorNode<'static> {
59    TableFactorNode {
60        table_name: "GLUE_TABLE_COLUMNS".to_owned(),
61        table_type: TableType::Dictionary(Dictionary::GlueTableColumns),
62        table_alias: None,
63        index: None,
64    }
65}
66
67pub fn series<'a, T: Into<ExprNode<'a>>>(args: T) -> TableFactorNode<'a> {
68    TableFactorNode {
69        table_name: "SERIES".to_owned(),
70        table_type: TableType::Series(args.into()),
71        table_alias: None,
72        index: None,
73    }
74}