use crate::{
errors::ExecutorError,
select::vectorized::{
filter_record_batch_simd, record_batch_to_rows, rows_to_record_batch, VECTORIZE_THRESHOLD,
},
};
pub(super) fn try_simd_filter(
rows: Vec<vibesql_storage::Row>,
where_expr: &vibesql_ast::Expression,
schema: &crate::schema::CombinedSchema,
) -> Result<(Vec<vibesql_storage::Row>, bool), ExecutorError> {
if rows.len() < VECTORIZE_THRESHOLD {
return Ok((rows, false));
}
let mut column_names = vec![String::new(); schema.total_columns];
for (start_idx, table_schema) in schema.table_schemas.values() {
for (col_idx, col) in table_schema.columns.iter().enumerate() {
column_names[start_idx + col_idx] = col.name.clone();
}
}
let batch = match rows_to_record_batch(&rows, &column_names) {
Ok(batch) => batch,
Err(_) => {
return Ok((rows, false));
}
};
let filtered_batch = match filter_record_batch_simd(&batch, where_expr) {
Ok(filtered) => filtered,
Err(_) => {
return Ok((rows, false));
}
};
let filtered_rows = record_batch_to_rows(&filtered_batch)?;
Ok((filtered_rows, true))
}