use std::collections::VecDeque;
use std::sync::Arc;
use crate::PartitionedFile;
use crate::file_groups::FileGroup;
use crate::file_scan_config::FileScanConfig;
use parking_lot::Mutex;
#[derive(Debug, Clone)]
pub(super) enum WorkSource {
Local(VecDeque<PartitionedFile>),
Shared(SharedWorkSource),
}
impl WorkSource {
pub(super) fn pop_front(&mut self) -> Option<PartitionedFile> {
match self {
Self::Local(files) => files.pop_front(),
Self::Shared(shared) => shared.pop_front(),
}
}
pub(super) fn skipped_on_limit(&self) -> usize {
match self {
Self::Local(files) => files.len(),
Self::Shared(_) => 0,
}
}
}
#[derive(Debug, Clone)]
pub(crate) struct SharedWorkSource {
inner: Arc<SharedWorkSourceInner>,
}
#[derive(Debug, Default)]
pub(super) struct SharedWorkSourceInner {
files: Mutex<VecDeque<PartitionedFile>>,
}
impl SharedWorkSource {
pub(crate) fn new(files: impl IntoIterator<Item = PartitionedFile>) -> Self {
let files = files.into_iter().collect();
Self {
inner: Arc::new(SharedWorkSourceInner {
files: Mutex::new(files),
}),
}
}
pub(crate) fn from_config(config: &FileScanConfig) -> Self {
let files: Vec<_> = config
.file_groups
.iter()
.flat_map(FileGroup::iter)
.cloned()
.collect();
let files = config.file_source.reorder_files(files);
Self::new(files)
}
fn pop_front(&self) -> Option<PartitionedFile> {
self.inner.files.lock().pop_front()
}
}