in core/server/src/streaming/segments/indexes/indexes_mut.rs [292:328]
fn binary_search_position_for_timestamp_sync(&self, target_timestamp: u64) -> Option<u32> {
if self.count() == 0 {
return None;
}
let last_index = self.get(self.count() - 1)?;
if target_timestamp > last_index.timestamp() {
return Some(self.count() - 1);
}
let first_index = self.get(0)?;
if target_timestamp <= first_index.timestamp() {
return Some(0);
}
let mut low = 0;
let mut high = self.count() - 1;
while low <= high {
let mid = low + (high - low) / 2;
let mid_index = self.get(mid)?;
let mid_timestamp = mid_index.timestamp();
match mid_timestamp.cmp(&target_timestamp) {
std::cmp::Ordering::Equal => return Some(mid),
std::cmp::Ordering::Less => low = mid + 1,
std::cmp::Ordering::Greater => {
if mid == 0 {
break;
}
high = mid - 1;
}
}
}
Some(low)
}