use crate::database::{DatabaseConnection, QueryBuilder};
use crate::error::Result;
use scirs2_core::ndarray::ArrayView2;
#[derive(Debug, Clone)]
pub struct BulkInsertConfig {
pub batch_size: usize,
pub commit_interval: Option<usize>,
pub on_conflict: ConflictStrategy,
}
#[derive(Debug, Clone, Copy)]
pub enum ConflictStrategy {
Ignore,
Replace,
Error,
}
impl Default for BulkInsertConfig {
fn default() -> Self {
Self {
batch_size: 1000,
commit_interval: Some(10000),
on_conflict: ConflictStrategy::Error,
}
}
}
pub fn bulk_insert(
conn: &dyn DatabaseConnection,
table: &str,
data: ArrayView2<f64>,
columns: &[&str],
config: &BulkInsertConfig,
) -> Result<usize> {
let mut total_inserted = 0;
let row_count = data.nrows();
for chunk_start in (0..row_count).step_by(config.batch_size) {
let chunk_end = (chunk_start + config.batch_size).min(row_count);
let chunk = data.slice(scirs2_core::ndarray::s![chunk_start..chunk_end, ..]);
total_inserted += conn.insert_array(table, chunk, columns)?;
if let Some(interval) = config.commit_interval {
if total_inserted % interval == 0 {
}
}
}
Ok(total_inserted)
}
pub fn bulk_update(
conn: &dyn DatabaseConnection,
table: &str,
data: ArrayView2<f64>,
key_columns: &[&str],
value_columns: &[&str],
) -> Result<usize> {
conn.insert_array(table, data, &[key_columns, value_columns].concat())
}