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 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}