use super::super::projection::projected_field_names;
use crate::pipeline::FIELD_NAMES;
const COL_TYPES: &[&str] = &[
"TEXT NOT NULL", "INTEGER NOT NULL", "TEXT NOT NULL", "TEXT NOT NULL", "TEXT NOT NULL", "TEXT NOT NULL", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT NOT NULL", "INTEGER", "INTEGER", "INTEGER", "TEXT", ];
pub(super) fn build_insert_sql(table_name: &str, ordered_indices: &[usize]) -> String {
if ordered_indices.len() == FIELD_NAMES.len() {
return format!(
"INSERT INTO \"{table_name}\" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
);
}
let cols = projected_field_names(ordered_indices);
let placeholders = vec!["?"; ordered_indices.len()].join(", ");
format!(
"INSERT INTO \"{table_name}\" ({}) VALUES ({placeholders})",
cols.join(", ")
)
}
pub(super) fn build_create_sql(table_name: &str, ordered_indices: &[usize]) -> String {
let cols: Vec<String> = ordered_indices
.iter()
.map(|&i| format!("{} {}", FIELD_NAMES[i], COL_TYPES[i]))
.collect();
format!(
"CREATE TABLE IF NOT EXISTS \"{table_name}\" ({})",
cols.join(", ")
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_build_insert_sql_ordered() {
let sql = build_insert_sql("t", &[10, 4]);
assert_eq!(sql, "INSERT INTO \"t\" (sql, username) VALUES (?, ?)");
}
#[test]
fn test_build_create_sql_ordered() {
let sql = build_create_sql("t", &[10, 4]);
assert_eq!(
sql,
"CREATE TABLE IF NOT EXISTS \"t\" (sql TEXT NOT NULL, username TEXT NOT NULL)"
);
}
#[test]
fn test_build_insert_sql_full_fast_path() {
let all_indices: Vec<usize> = (0..15).collect();
let sql = build_insert_sql("t", &all_indices);
assert_eq!(
sql,
"INSERT INTO \"t\" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
);
}
}