use serde::{Deserialize, Serialize};
use super::condition::CompareOp;
use super::values::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum AggregateType {
Count,
Sum,
Avg,
Min,
Max,
First,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum AggregateArg {
Wildcard,
Column(String),
Score,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AggregateFunction {
pub function_type: AggregateType,
pub argument: AggregateArg,
pub alias: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct GroupByClause {
pub columns: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum LogicalOp {
And,
Or,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct HavingClause {
pub conditions: Vec<HavingCondition>,
#[serde(default)]
pub operators: Vec<LogicalOp>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HavingCondition {
pub aggregate: AggregateFunction,
pub operator: CompareOp,
pub value: Value,
}