use crate::{
db::predicate::{CompareOp, Predicate},
value::Value,
};
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlStatement {
Select(SqlSelectStatement),
Delete(SqlDeleteStatement),
Insert(SqlInsertStatement),
Update(SqlUpdateStatement),
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),
Arithmetic(SqlArithmeticProjectionCall),
Round(SqlRoundProjectionCall),
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum SqlArithmeticProjectionOp {
Add,
Sub,
Mul,
Div,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlArithmeticProjectionCall {
pub(crate) field: String,
pub(crate) op: SqlArithmeticProjectionOp,
pub(crate) rhs: SqlArithmeticProjectionOperand,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlArithmeticProjectionOperand {
Field(String),
Literal(Value),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlRoundProjectionInput {
Field(String),
Arithmetic(SqlArithmeticProjectionCall),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlRoundProjectionCall {
pub(crate) input: SqlRoundProjectionInput,
pub(crate) scale: Value,
}
#[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>,
pub(crate) distinct: bool,
}
#[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) projection_aliases: Vec<Option<String>>,
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>,
}
impl SqlSelectStatement {
#[must_use]
pub(crate) fn projection_alias(&self, index: usize) -> Option<&str> {
self.projection_aliases
.get(index)
.and_then(Option::as_deref)
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlReturningProjection {
All,
Fields(Vec<String>),
}
#[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>,
pub(crate) offset: Option<u32>,
pub(crate) returning: Option<SqlReturningProjection>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) enum SqlInsertSource {
Values(Vec<Vec<Value>>),
Select(Box<SqlSelectStatement>),
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlInsertStatement {
pub(crate) entity: String,
pub(crate) columns: Vec<String>,
pub(crate) source: SqlInsertSource,
pub(crate) returning: Option<SqlReturningProjection>,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlAssignment {
pub(crate) field: String,
pub(crate) value: Value,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub(crate) struct SqlUpdateStatement {
pub(crate) entity: String,
pub(crate) assignments: Vec<SqlAssignment>,
pub(crate) predicate: Option<Predicate>,
pub(crate) order_by: Vec<SqlOrderTerm>,
pub(crate) limit: Option<u32>,
pub(crate) offset: Option<u32>,
pub(crate) returning: Option<SqlReturningProjection>,
}
#[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;