use crate::ast::expr::{Expression, Identifier, TableName};
use core::range::Range;
use oak_core::source::{SourceBuffer, ToSource};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InsertStatement {
pub table_name: TableName,
pub columns: Vec<Identifier>,
pub values: Vec<Expression>,
#[serde(with = "oak_core::serde_range")]
pub span: Range<usize>,
}
impl ToSource for InsertStatement {
fn to_source(&self, buffer: &mut SourceBuffer) {
buffer.push("INSERT");
buffer.push("INTO");
self.table_name.to_source(buffer);
if !self.columns.is_empty() {
buffer.push("(");
for (i, col) in self.columns.iter().enumerate() {
if i > 0 {
buffer.push(",");
}
col.to_source(buffer);
}
buffer.push(")");
}
buffer.push("VALUES");
buffer.push("(");
for (i, val) in self.values.iter().enumerate() {
if i > 0 {
buffer.push(",");
}
val.to_source(buffer);
}
buffer.push(")");
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UpdateStatement {
pub table_name: TableName,
pub assignments: Vec<Assignment>,
pub selection: Option<Expression>, #[serde(with = "oak_core::serde_range")]
pub span: Range<usize>,
}
impl ToSource for UpdateStatement {
fn to_source(&self, buffer: &mut SourceBuffer) {
buffer.push("UPDATE");
self.table_name.to_source(buffer);
buffer.push("SET");
for (i, assignment) in self.assignments.iter().enumerate() {
if i > 0 {
buffer.push(",");
}
assignment.to_source(buffer);
}
if let Some(selection) = &self.selection {
buffer.push("WHERE");
selection.to_source(buffer);
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Assignment {
pub column: Identifier,
pub value: Expression,
#[serde(with = "oak_core::serde_range")]
pub span: Range<usize>,
}
impl ToSource for Assignment {
fn to_source(&self, buffer: &mut SourceBuffer) {
self.column.to_source(buffer);
buffer.push("=");
self.value.to_source(buffer);
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct DeleteStatement {
pub table_name: TableName,
pub selection: Option<Expression>, #[serde(with = "oak_core::serde_range")]
pub span: Range<usize>,
}
impl ToSource for DeleteStatement {
fn to_source(&self, buffer: &mut SourceBuffer) {
buffer.push("DELETE");
buffer.push("FROM");
self.table_name.to_source(buffer);
if let Some(selection) = &self.selection {
buffer.push("WHERE");
selection.to_source(buffer);
}
}
}