use std::{collections::VecDeque, ops::Range};
use crate::decoder::{
FilterExpression, NextDecodeTask, PriorityRange, ScheduledScanLine, SchedulerContext,
};
use arrow_schema::DataType;
use futures::future::BoxFuture;
use lance_core::{Error, Result};
pub trait SchedulingJob: std::fmt::Debug {
fn schedule_next(
&mut self,
context: &mut SchedulerContext,
priority: &dyn PriorityRange,
) -> Result<ScheduledScanLine>;
fn num_rows(&self) -> u64;
}
pub trait FieldScheduler: Send + Sync + std::fmt::Debug {
fn initialize<'a>(
&'a self,
filter: &'a FilterExpression,
context: &'a SchedulerContext,
) -> BoxFuture<'a, Result<()>>;
fn schedule_ranges<'a>(
&'a self,
ranges: &[Range<u64>],
filter: &FilterExpression,
) -> Result<Box<dyn SchedulingJob + 'a>>;
fn num_rows(&self) -> u64;
}
#[derive(Debug)]
pub struct DecoderReady {
pub decoder: Box<dyn LogicalPageDecoder>,
pub path: VecDeque<u32>,
}
pub trait LogicalPageDecoder: std::fmt::Debug + Send {
fn accept_child(&mut self, _child: DecoderReady) -> Result<()> {
Err(Error::internal(format!(
"The decoder {:?} does not expect children but received a child",
self
)))
}
fn wait_for_loaded(&'_ mut self, loaded_need: u64) -> BoxFuture<'_, Result<()>>;
fn rows_loaded(&self) -> u64;
fn rows_unloaded(&self) -> u64 {
self.num_rows() - self.rows_loaded()
}
fn num_rows(&self) -> u64;
fn rows_drained(&self) -> u64;
fn rows_left(&self) -> u64 {
self.num_rows() - self.rows_drained()
}
fn drain(&mut self, num_rows: u64) -> Result<NextDecodeTask>;
fn data_type(&self) -> &DataType;
}