// AST types for SQL statements use serde::{Deserialize, Serialize}; /// SQL statement types #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum SqlStatement { /// CREATE TABLE name (columns) CreateTable { name: String, columns: Vec }, /// INSERT INTO table (columns) VALUES (values) Insert { table: String, columns: Vec, values: Vec, }, /// SELECT columns FROM table WHERE condition ORDER BY ... LIMIT k Select { columns: Vec, from: String, where_clause: Option, order_by: Option, limit: Option, }, /// DROP TABLE name Drop { table: String }, } /// Column definition for CREATE TABLE #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Column { pub name: String, pub data_type: DataType, } /// Data types supported in SQL #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum DataType { /// TEXT type for strings Text, /// INTEGER type Integer, /// REAL/FLOAT type Real, /// VECTOR(dimensions) type for vector data Vector(usize), } /// Column selector in SELECT #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum SelectColumn { /// SELECT * Wildcard, /// SELECT column_name Name(String), /// SELECT expression AS alias Expression { expr: Expression, alias: Option, }, } /// SQL expressions #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum Expression { /// Column reference Column(String), /// Literal value Literal(Value), /// Binary operation (e.g., a = b, a > b) BinaryOp { left: Box, op: BinaryOperator, right: Box, }, /// Logical AND And(Box, Box), /// Logical OR Or(Box, Box), /// NOT expression Not(Box), /// Function call Function { name: String, args: Vec }, /// Vector literal [1.0, 2.0, 3.0] VectorLiteral(Vec), /// Distance operation: column <-> vector /// Used for ORDER BY embedding <-> $vector Distance { column: String, metric: DistanceMetric, vector: Vec, }, } /// Binary operators #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum BinaryOperator { /// = Eq, /// != NotEq, /// > Gt, /// >= GtEq, /// < Lt, /// <= LtEq, /// LIKE Like, } /// Distance metrics for vector similarity #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum DistanceMetric { /// L2 distance: <-> L2, /// Cosine distance: <=> Cosine, /// Dot product: <#> DotProduct, } /// ORDER BY clause #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct OrderBy { pub expression: Expression, pub direction: OrderDirection, } /// Sort direction #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum OrderDirection { Asc, Desc, } /// SQL values #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum Value { Null, Text(String), Integer(i64), Real(f64), Vector(Vec), Boolean(bool), } impl Value { /// Convert to JSON value for metadata storage pub fn to_json(&self) -> serde_json::Value { match self { Value::Null => serde_json::Value::Null, Value::Text(s) => serde_json::Value::String(s.clone()), Value::Integer(i) => serde_json::Value::Number((*i).into()), Value::Real(f) => { serde_json::Value::Number(serde_json::Number::from_f64(*f).unwrap_or(0.into())) } Value::Vector(v) => serde_json::Value::Array( v.iter() .map(|f| { serde_json::Value::Number( serde_json::Number::from_f64(*f as f64).unwrap_or(0.into()), ) }) .collect(), ), Value::Boolean(b) => serde_json::Value::Bool(*b), } } /// Parse from JSON value pub fn from_json(json: &serde_json::Value) -> Self { match json { serde_json::Value::Null => Value::Null, serde_json::Value::Bool(b) => Value::Boolean(*b), serde_json::Value::Number(n) => { if let Some(i) = n.as_i64() { Value::Integer(i) } else if let Some(f) = n.as_f64() { Value::Real(f) } else { Value::Null } } serde_json::Value::String(s) => Value::Text(s.clone()), serde_json::Value::Array(arr) => { // Try to parse as vector let floats: Option> = arr.iter().map(|v| v.as_f64().map(|f| f as f32)).collect(); if let Some(vec) = floats { Value::Vector(vec) } else { Value::Null } } serde_json::Value::Object(_) => Value::Null, } } } impl std::fmt::Display for Value { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Value::Null => write!(f, "NULL"), Value::Text(s) => write!(f, "'{}'", s), Value::Integer(i) => write!(f, "{}", i), Value::Real(r) => write!(f, "{}", r), Value::Vector(v) => write!( f, "[{}]", v.iter() .map(|x| x.to_string()) .collect::>() .join(", ") ), Value::Boolean(b) => write!(f, "{}", b), } } }