use serde::{Deserialize, Serialize};
use super::fusion::FusionConfig;
use super::values::{Value, VectorExpr};
use crate::sparse_index::SparseVector;
use crate::velesql::GraphPattern;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Condition {
VectorSearch(VectorSearch),
VectorFusedSearch(VectorFusedSearch),
SparseVectorSearch(SparseVectorSearch),
Similarity(SimilarityCondition),
Comparison(Comparison),
In(InCondition),
Between(BetweenCondition),
Like(LikeCondition),
IsNull(IsNullCondition),
Match(MatchCondition),
GraphMatch(GraphMatchPredicate),
And(Box<Condition>, Box<Condition>),
Or(Box<Condition>, Box<Condition>),
Not(Box<Condition>),
Group(Box<Condition>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GraphMatchPredicate {
pub pattern: GraphPattern,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VectorSearch {
pub vector: VectorExpr,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VectorFusedSearch {
pub vectors: Vec<VectorExpr>,
pub fusion: FusionConfig,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SparseVectorSearch {
pub vector: SparseVectorExpr,
pub index_name: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SparseVectorExpr {
Literal(SparseVector),
Parameter(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SimilarityCondition {
pub field: String,
pub vector: VectorExpr,
pub operator: CompareOp,
pub threshold: f64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Comparison {
pub column: String,
pub operator: CompareOp,
pub value: Value,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum CompareOp {
Eq,
NotEq,
Gt,
Gte,
Lt,
Lte,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InCondition {
pub column: String,
pub values: Vec<Value>,
#[serde(default)]
pub negated: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BetweenCondition {
pub column: String,
pub low: Value,
pub high: Value,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LikeCondition {
pub column: String,
pub pattern: String,
#[serde(default)]
pub case_insensitive: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IsNullCondition {
pub column: String,
pub is_null: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MatchCondition {
pub column: String,
pub query: String,
}