use crate::{Chord, Group, Signature};
use serde_json::Value;
pub fn create_dynamic_batches(
task_name: &str,
items: Vec<Value>,
target_batch_size: usize,
) -> Chord {
let mut group = Group::new();
let batch_size = if target_batch_size == 0 {
1
} else {
target_batch_size
};
for chunk in items.chunks(batch_size) {
let batch = Value::Array(chunk.to_vec());
group = group.add(task_name, vec![batch]);
}
Chord {
header: group,
body: Signature::new("batch_complete".to_string()),
}
}
pub fn create_adaptive_batches(
task_name: &str,
items: Vec<Value>,
min_batch_size: usize,
max_batch_size: usize,
) -> Chord {
let mut group = Group::new();
let batch_size = if items.len() < min_batch_size {
items.len()
} else if items.len() > max_batch_size * 10 {
max_batch_size
} else {
let calculated = (items.len() as f64).sqrt() as usize;
calculated.clamp(min_batch_size, max_batch_size)
};
for chunk in items.chunks(batch_size.max(1)) {
let batch = Value::Array(chunk.to_vec());
group = group.add(task_name, vec![batch]);
}
Chord {
header: group,
body: Signature::new("batch_complete".to_string()),
}
}
pub fn create_prioritized_batches(
task_name: &str,
priority_items: (Vec<Value>, Vec<Value>, Vec<Value>),
batch_size: usize,
) -> Group {
let (high_priority, medium_priority, low_priority) = priority_items;
let mut group = Group::new();
for chunk in high_priority.chunks(batch_size.max(1)) {
let batch = Value::Array(chunk.to_vec());
let mut sig = Signature::new(task_name.to_string()).with_args(vec![batch]);
sig.options.priority = Some(9);
group.tasks.push(sig);
}
for chunk in medium_priority.chunks(batch_size.max(1)) {
let batch = Value::Array(chunk.to_vec());
let mut sig = Signature::new(task_name.to_string()).with_args(vec![batch]);
sig.options.priority = Some(5);
group.tasks.push(sig);
}
for chunk in low_priority.chunks(batch_size.max(1)) {
let batch = Value::Array(chunk.to_vec());
let mut sig = Signature::new(task_name.to_string()).with_args(vec![batch]);
sig.options.priority = Some(1);
group.tasks.push(sig);
}
group
}