mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-26 20:44:23 +01:00
52 lines
1.3 KiB
Rust
52 lines
1.3 KiB
Rust
use limbo_sqlite3_parser::ast::SortOrder;
|
|
|
|
use crate::types::{compare_immutable, ImmutableRecord, IndexKeySortOrder};
|
|
|
|
pub struct Sorter {
|
|
records: Vec<ImmutableRecord>,
|
|
current: Option<ImmutableRecord>,
|
|
order: IndexKeySortOrder,
|
|
key_len: usize,
|
|
}
|
|
|
|
impl Sorter {
|
|
pub fn new(order: &[SortOrder]) -> Self {
|
|
Self {
|
|
records: Vec::new(),
|
|
current: None,
|
|
key_len: order.len(),
|
|
order: IndexKeySortOrder::from_list(order),
|
|
}
|
|
}
|
|
pub fn is_empty(&self) -> bool {
|
|
self.records.is_empty()
|
|
}
|
|
|
|
pub fn has_more(&self) -> bool {
|
|
self.current.is_some()
|
|
}
|
|
|
|
// We do the sorting here since this is what is called by the SorterSort instruction
|
|
pub fn sort(&mut self) {
|
|
self.records.sort_by(|a, b| {
|
|
compare_immutable(
|
|
&a.values[..self.key_len],
|
|
&b.values[..self.key_len],
|
|
self.order,
|
|
)
|
|
});
|
|
self.records.reverse();
|
|
self.next()
|
|
}
|
|
pub fn next(&mut self) {
|
|
self.current = self.records.pop();
|
|
}
|
|
pub fn record(&self) -> Option<&ImmutableRecord> {
|
|
self.current.as_ref()
|
|
}
|
|
|
|
pub fn insert(&mut self, record: &ImmutableRecord) {
|
|
self.records.push(record.clone());
|
|
}
|
|
}
|