use syn::{Expr, Ident, Type};
#[allow(clippy::large_enum_variant)]
pub(crate) enum LinqInput {
Query(QueryInput),
Value(ValueInput),
}
pub(crate) struct QueryInput {
pub source: Option<Expr>,
pub entity: Type,
pub where_param: Option<Ident>,
pub where_body: Option<Expr>,
pub order: Option<LinqOrder>,
pub clauses: Vec<LinqClause>,
}
pub(crate) struct LinqOrder {
pub body: Expr,
pub descending: bool,
}
pub(crate) enum ValueInput {
Filter {
entity: Type,
param: Ident,
body: Expr,
},
Index { entity: Type, fields: Vec<Expr> },
Key { entity: Type, fields: Vec<Expr> },
}
#[allow(clippy::large_enum_variant)]
pub(crate) enum LinqClause {
Include { primary: Expr, nested: Vec<Expr> },
OrderBy { field: Expr, descending: bool },
GroupBy { fields: Vec<Expr> },
Select { fields: Vec<Expr> },
HavingExpr { expr: HavingExprAst },
Sum(Expr),
Avg(Expr),
Min(Expr),
Max(Expr),
Count,
Distinct,
Set { field: Expr, value: Expr },
InnerJoin {
params: Vec<(Ident, Type)>,
left: Expr,
right: Expr,
},
LeftJoin {
params: Vec<(Ident, Type)>,
left: Expr,
right: Expr,
},
RightJoin {
params: Vec<(Ident, Type)>,
left: Expr,
right: Expr,
},
FullJoin {
params: Vec<(Ident, Type)>,
left: Expr,
right: Expr,
},
CrossJoin {
#[allow(
dead_code,
reason = "parsed from syntax for future select-binding support; cross_join_internal currently only needs the table name"
)]
param: Ident,
entity: Type,
},
Union(Expr),
UnionAll(Expr),
Intersect(Expr),
Except(Expr),
ExecuteUpdate,
Take(Expr),
Skip(Expr),
Window {
func: String,
column: Option<Expr>,
partition_by: Vec<Expr>,
order_by: Vec<(Expr, bool)>,
alias: String,
},
With {
name: String,
entity: Type,
param: Ident,
body: Expr,
recursive: bool,
link: Option<(Expr, Expr)>,
},
From { name: String },
}
#[derive(Debug)]
pub(crate) enum HavingExprAst {
Compare {
agg: String,
col: Expr,
op: String,
value: Expr,
},
And(Box<HavingExprAst>, Box<HavingExprAst>),
Or(Box<HavingExprAst>, Box<HavingExprAst>),
Not(Box<HavingExprAst>),
CompareAgg {
left_agg: String,
left_col: Expr,
op: String,
right_agg: String,
right_col: Expr,
},
}