use cheetah_string::CheetahString;
use rocketmq_common::common::message::message_queue::MessageQueue;
use crate::consumer::allocate_message_queue_strategy::AllocateMessageQueueStrategy;
use crate::consumer::rebalance_strategy::check;
pub struct AllocateMessageQueueAveragely;
impl AllocateMessageQueueStrategy for AllocateMessageQueueAveragely {
fn allocate(
&self,
consumer_group: &CheetahString,
current_cid: &CheetahString,
mq_all: &[MessageQueue],
cid_all: &[CheetahString],
) -> rocketmq_error::RocketMQResult<Vec<MessageQueue>> {
let mut result = Vec::new();
if !check(consumer_group, current_cid, mq_all, cid_all)? {
return Ok(result);
}
let index = cid_all.iter().position(|cid| cid == current_cid).unwrap_or(0);
let mod_val = mq_all.len() % cid_all.len();
let average_size = if mq_all.len() <= cid_all.len() {
1
} else if mod_val > 0 && index < mod_val {
mq_all.len() / cid_all.len() + 1
} else {
mq_all.len() / cid_all.len()
};
let start_index = if mod_val > 0 && index < mod_val {
index * average_size
} else {
index * average_size + mod_val
};
let mut range: usize = 0;
if mq_all.len() > start_index {
range = average_size.min(mq_all.len() - start_index);
}
for i in 0..range {
result.push(mq_all[start_index + i].clone());
}
Ok(result)
}
fn get_name(&self) -> &'static str {
"AVG"
}
}