use serde::{Deserialize, Serialize};
use super::aggregation::{AggregateFunction, GroupByClause, HavingClause};
use super::condition::Condition;
use super::fusion::FusionClause;
use super::join::JoinClause;
use super::values::VectorExpr;
use super::with_clause::WithClause;
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub enum DistinctMode {
#[default]
None,
All,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SelectStatement {
#[serde(default)]
pub distinct: DistinctMode,
pub columns: SelectColumns,
pub from: String,
#[serde(default)]
pub from_alias: Vec<String>,
#[serde(default)]
pub joins: Vec<JoinClause>,
pub where_clause: Option<Condition>,
pub order_by: Option<Vec<SelectOrderBy>>,
pub limit: Option<u64>,
pub offset: Option<u64>,
pub with_clause: Option<WithClause>,
#[serde(default)]
pub group_by: Option<GroupByClause>,
#[serde(default)]
pub having: Option<HavingClause>,
#[serde(default)]
pub fusion_clause: Option<FusionClause>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SelectColumns {
All,
Columns(Vec<Column>),
Aggregations(Vec<AggregateFunction>),
Mixed {
columns: Vec<Column>,
aggregations: Vec<AggregateFunction>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
similarity_scores: Vec<SimilarityScoreExpr>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
qualified_wildcards: Vec<String>,
},
SimilarityScore(SimilarityScoreExpr),
QualifiedWildcard(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SimilarityScoreExpr {
pub alias: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Column {
pub name: String,
pub alias: Option<String>,
}
impl Column {
#[must_use]
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
alias: None,
}
}
#[must_use]
pub fn with_alias(name: impl Into<String>, alias: impl Into<String>) -> Self {
Self {
name: name.into(),
alias: Some(alias.into()),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SelectOrderBy {
pub expr: OrderByExpr,
pub descending: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum OrderByExpr {
Field(String),
Similarity(SimilarityOrderBy),
SimilarityBare,
Aggregate(AggregateFunction),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SimilarityOrderBy {
pub field: String,
pub vector: VectorExpr,
}
impl SelectStatement {
#[must_use]
pub fn empty() -> Self {
Self {
distinct: DistinctMode::None,
columns: SelectColumns::All,
from: String::new(),
from_alias: Vec::new(),
joins: Vec::new(),
where_clause: None,
order_by: None,
limit: None,
offset: None,
with_clause: None,
group_by: None,
having: None,
fusion_clause: None,
}
}
}