use crate::{
db::predicate::{CompareOp, Predicate},
value::Value,
};
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlStatement {
Select(SqlSelectStatement),
Delete(SqlDeleteStatement),
Explain(SqlExplainStatement),
Describe(SqlDescribeStatement),
ShowIndexes(SqlShowIndexesStatement),
ShowColumns(SqlShowColumnsStatement),
ShowEntities(SqlShowEntitiesStatement),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlProjection {
All,
Items(Vec<SqlSelectItem>),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlSelectItem {
Field(String),
Aggregate(SqlAggregateCall),
TextFunction(SqlTextFunctionCall),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlHavingSymbol {
Field(String),
Aggregate(SqlAggregateCall),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlHavingClause {
pub(crate) symbol: SqlHavingSymbol,
pub(crate) op: CompareOp,
pub(crate) value: Value,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum SqlAggregateKind {
Count,
Sum,
Avg,
Min,
Max,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlAggregateCall {
pub(crate) kind: SqlAggregateKind,
pub(crate) field: Option<String>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum SqlTextFunction {
Trim,
Ltrim,
Rtrim,
Lower,
Upper,
Length,
Left,
Right,
StartsWith,
EndsWith,
Contains,
Position,
Replace,
Substring,
}
impl SqlTextFunction {
#[must_use]
pub(crate) fn from_identifier(identifier: &str) -> Option<Self> {
const SUPPORTED_TEXT_FUNCTIONS: [(&str, SqlTextFunction); 14] = [
("trim", SqlTextFunction::Trim),
("ltrim", SqlTextFunction::Ltrim),
("rtrim", SqlTextFunction::Rtrim),
("lower", SqlTextFunction::Lower),
("upper", SqlTextFunction::Upper),
("length", SqlTextFunction::Length),
("left", SqlTextFunction::Left),
("right", SqlTextFunction::Right),
("starts_with", SqlTextFunction::StartsWith),
("ends_with", SqlTextFunction::EndsWith),
("contains", SqlTextFunction::Contains),
("position", SqlTextFunction::Position),
("replace", SqlTextFunction::Replace),
("substring", SqlTextFunction::Substring),
];
for (name, function) in SUPPORTED_TEXT_FUNCTIONS {
if identifier.eq_ignore_ascii_case(name) {
return Some(function);
}
}
None
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlTextFunctionCall {
pub(crate) function: SqlTextFunction,
pub(crate) field: String,
pub(crate) literal: Option<Value>,
pub(crate) literal2: Option<Value>,
pub(crate) literal3: Option<Value>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum SqlOrderDirection {
Asc,
Desc,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlOrderTerm {
pub(crate) field: String,
pub(crate) direction: SqlOrderDirection,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlSelectStatement {
pub(crate) entity: String,
pub(crate) projection: SqlProjection,
pub(crate) predicate: Option<Predicate>,
pub(crate) distinct: bool,
pub(crate) group_by: Vec<String>,
pub(crate) having: Vec<SqlHavingClause>,
pub(crate) order_by: Vec<SqlOrderTerm>,
pub(crate) limit: Option<u32>,
pub(crate) offset: Option<u32>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlDeleteStatement {
pub(crate) entity: String,
pub(crate) predicate: Option<Predicate>,
pub(crate) order_by: Vec<SqlOrderTerm>,
pub(crate) limit: Option<u32>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum SqlExplainMode {
Plan,
Execution,
Json,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlExplainTarget {
Select(SqlSelectStatement),
Delete(SqlDeleteStatement),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlExplainStatement {
pub(crate) mode: SqlExplainMode,
pub(crate) statement: SqlExplainTarget,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlDescribeStatement {
pub(crate) entity: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlShowIndexesStatement {
pub(crate) entity: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlShowColumnsStatement {
pub(crate) entity: String,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlShowEntitiesStatement;