use crate::ast::common::TableRef;
use crate::ast::expressions::Expr;
use crate::ast::ObjectName;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct SelectStmt {
pub from_clause: Option<FromNode>,
pub applies: Vec<ApplyClause>,
pub projection: Vec<SelectItem>,
pub into_table: Option<ObjectName>,
pub distinct: bool,
pub top: Option<TopSpec>,
pub selection: Option<Expr>,
pub group_by: Vec<Expr>,
pub having: Option<Expr>,
pub order_by: Vec<OrderByExpr>,
pub offset: Option<Expr>,
pub fetch: Option<Expr>,
pub set_op: Option<Box<SetOpClause>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum FromNode {
Table(TableRef),
Aliased {
source: Box<FromNode>,
alias: String,
},
Join {
left: Box<FromNode>,
join_type: JoinType,
right: Box<FromNode>,
on: Option<Expr>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct JoinClause {
pub join_type: JoinType,
pub table: TableRef,
pub on: Option<Expr>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum JoinType {
Inner,
Left,
Right,
Full,
Cross,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ApplyClause {
pub apply_type: ApplyType,
pub subquery: SelectStmt,
pub alias: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ApplyType {
Cross,
Outer,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct SelectItem {
pub expr: Expr,
pub alias: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct TopSpec {
pub value: Expr,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct OrderByExpr {
pub expr: Expr,
pub asc: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct SetOpClause {
pub kind: SetOpKind,
pub right: SelectStmt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SetOpKind {
Union,
UnionAll,
Intersect,
Except,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SetOpStmt {
pub left: Box<crate::ast::Statement>,
pub op: SetOpKind,
pub right: Box<crate::ast::Statement>,
}