Skip to main content

veclite_sql/
executor.rs

1use crate::planner::LogicalPlan;
2use veclite_core::VecLite;
3
4#[derive(Debug, PartialEq)]
5pub enum QueryResult {
6    Inserted { id: String },
7    Rows(Vec<(String, f32)>),
8    Ok,
9}
10
11pub struct Executor;
12
13impl Executor {
14    pub fn execute(db: &mut VecLite, plan: LogicalPlan) -> Result<QueryResult, String> {
15        match plan {
16            LogicalPlan::Insert {
17                table: _,
18                id,
19                vector,
20                metadata,
21            } => {
22                let meta_val = match metadata {
23                    Some(m) => serde_json::from_str(&m)
24                        .map_err(|e| format!("Invalid metadata JSON: {}", e))?,
25                    None => None,
26                };
27
28                db.insert(&id, vector, meta_val)
29                    .map_err(|e| e.to_string())?;
30                Ok(QueryResult::Inserted { id })
31            }
32            LogicalPlan::Search {
33                table: _,
34                query_vector,
35                limit,
36                filter: _,
37            } => {
38                let results = db.search(&query_vector, limit).map_err(|e| e.to_string())?;
39                let rows = results.into_iter().map(|r| (r.id, r.score)).collect();
40                Ok(QueryResult::Rows(rows))
41            }
42            LogicalPlan::CreateTable { name: _ } => {
43                // Ignore CreateTable for now as VecLite is single-file
44                Ok(QueryResult::Rows(vec![]))
45            }
46            LogicalPlan::Compact { table: _ } => {
47                println!("Compaction skipped");
48                Ok(QueryResult::Ok)
49            }
50            LogicalPlan::RetentionPolicy {
51                table: _,
52                interval: _,
53            } => Ok(QueryResult::Ok),
54        }
55    }
56}