use crate::parser::ast::{DeleteStmt, DeleteTarget};
use linkrs_core::Value;
use super::{render_contextual, ContextualExpression};
pub(crate) fn render_delete(delete: &DeleteStmt, values: &mut Vec<Value>) -> Option<String> {
let mut out = if delete.detach {
String::from("DETACH DELETE ")
} else {
String::from("DELETE ")
};
match &delete.target {
DeleteTarget::Vertices { tag, vids } => {
out.push_str("VERTEX ");
out.push_str(tag);
out.push_str(" FROM ");
render_expr_list(&mut out, values, vids)?;
}
DeleteTarget::Edges { edge_type, edges } => {
let edge_type = edge_type.as_deref()?;
out.push_str("EDGE ");
out.push_str(edge_type);
for (edge_index, (src, dst, rank)) in edges.iter().enumerate() {
out.push(' ');
if edge_index > 0 {
out.push_str(", ");
}
render_contextual(&mut out, values, src)?;
out.push_str(" -> ");
render_contextual(&mut out, values, dst)?;
if let Some(rank) = rank {
out.push_str(" @");
render_contextual(&mut out, values, rank)?;
}
}
}
DeleteTarget::Index(name) => {
out.push_str("INDEX ");
out.push_str(name);
}
}
if delete.with_edge {
out.push_str(" WITH EDGE");
}
Some(out)
}
fn render_expr_list(
out: &mut String,
values: &mut Vec<Value>,
exprs: &[ContextualExpression],
) -> Option<()> {
for (index, expr) in exprs.iter().enumerate() {
if index > 0 {
out.push_str(", ");
}
render_contextual(out, values, expr)?;
}
Some(())
}